haiku/headers/private/storage/mime/DatabaseLocation.h
Rene Gollent 701a5d6b79 Resolve #10435.
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.
2014-01-20 20:52:32 -05:00

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