701a5d6b79
Adjust Database{Location} to only attempt to create a mimetype when actually necessary, and fail otherwise if a writable version doesn't yet exist. Correspondingly, adjust callers such as DatabaseLocation::DeleteAttribute(). Fixes a problem where a caller asking to perform a mimeset could fail early due to SetSupportedTypes() attempting to update the read-only mime database entry supplied by a package, and consequently most of the mimeset operations would be skipped.
120 lines
3.3 KiB
C++
120 lines
3.3 KiB
C++
/*
|
|
* Copyright 2013, Haiku, Inc. All Rights Reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*
|
|
* Authors:
|
|
* Ingo Weinhold <ingo_weinhold@gmx.de>
|
|
*/
|
|
#ifndef _MIME_DATABASE_LOCATION_H
|
|
#define _MIME_DATABASE_LOCATION_H
|
|
|
|
|
|
#include <Mime.h>
|
|
#include <StringList.h>
|
|
|
|
|
|
namespace BPrivate {
|
|
namespace Storage {
|
|
namespace Mime {
|
|
|
|
|
|
class DatabaseLocation {
|
|
public:
|
|
DatabaseLocation();
|
|
~DatabaseLocation();
|
|
|
|
bool AddDirectory(const BString& directory);
|
|
|
|
// paths
|
|
|
|
const BStringList& Directories() const
|
|
{ return fDirectories; }
|
|
BString WritableDirectory() const
|
|
{ return fDirectories.StringAt(0); }
|
|
|
|
BString WritablePathForType(const char* type) const
|
|
{ return _TypeToFilename(type, 0); }
|
|
|
|
// opening type nodes
|
|
|
|
status_t OpenType(const char* type, BNode& _node) const;
|
|
status_t OpenWritableType(const char* type,
|
|
BNode& _node, bool create,
|
|
bool* _didCreate = NULL) const;
|
|
|
|
// generic type attributes access
|
|
|
|
ssize_t ReadAttribute(const char* type,
|
|
const char* attribute, void* data,
|
|
size_t length, type_code datatype) const;
|
|
status_t ReadMessageAttribute(const char* type,
|
|
const char* attribute, BMessage& _message)
|
|
const;
|
|
status_t ReadStringAttribute(const char* type,
|
|
const char* attribute, BString& _string)
|
|
const;
|
|
|
|
status_t WriteAttribute(const char* type,
|
|
const char* attribute, const void* data,
|
|
size_t length, type_code datatype,
|
|
bool* _didCreate) const;
|
|
status_t WriteMessageAttribute(const char* type,
|
|
const char* attribute,
|
|
const BMessage& message, bool* _didCreate)
|
|
const;
|
|
|
|
status_t DeleteAttribute(const char* type,
|
|
const char* attribute) const;
|
|
|
|
// type attribute convenience getters
|
|
|
|
status_t GetAppHint(const char* type, entry_ref& _ref);
|
|
status_t GetAttributesInfo(const char* type,
|
|
BMessage& _info);
|
|
status_t GetShortDescription(const char* type,
|
|
char* description);
|
|
status_t GetLongDescription(const char* type,
|
|
char* description);
|
|
status_t GetFileExtensions(const char* type,
|
|
BMessage& _extensions);
|
|
status_t GetIcon(const char* type, BBitmap& _icon,
|
|
icon_size size);
|
|
status_t GetIcon(const char* type, uint8*& _data,
|
|
size_t& _size);
|
|
status_t GetIconForType(const char* type,
|
|
const char* fileType, BBitmap& _icon,
|
|
icon_size which);
|
|
status_t GetIconForType(const char* type,
|
|
const char* fileType, uint8*& _data,
|
|
size_t& _size);
|
|
status_t GetPreferredApp(const char* type,
|
|
char* signature, app_verb verb);
|
|
status_t GetSnifferRule(const char* type,
|
|
BString& _result);
|
|
status_t GetSupportedTypes(const char* type,
|
|
BMessage& _types);
|
|
|
|
bool IsInstalled(const char* type);
|
|
|
|
private:
|
|
BString _TypeToFilename(const char* type, int32 index)
|
|
const;
|
|
status_t _OpenType(const char* type, BNode& _node,
|
|
int32& _index) const;
|
|
status_t _CreateTypeNode(const char* type, BNode& _node)
|
|
const;
|
|
status_t _CopyTypeNode(BNode& source, const char* type,
|
|
BNode& _target) const;
|
|
|
|
private:
|
|
BStringList fDirectories;
|
|
};
|
|
|
|
|
|
} // namespace Mime
|
|
} // namespace Storage
|
|
} // namespace BPrivate
|
|
|
|
|
|
#endif // _MIME_DATABASE_LOCATION_H
|