2006-02-16 22:27:39 +03:00
|
|
|
/*
|
|
|
|
* Copyright 2002-2006, Haiku.
|
|
|
|
* Distributed under the terms of the MIT License.
|
|
|
|
*
|
|
|
|
* Authors:
|
|
|
|
* Tyler Dauwalder
|
|
|
|
*/
|
After implementing the BMimeType::GetInstalled[Super]Types()
functionality, it became apparent that some restructuring was
needed if I wanted to keep things clean and managble.
storage/MimeDatabase.{h,cpp} have been broken into:
storage/mime/database_support.{h,cpp}
+ MIME database constants
+ high-level database access functions like open_type(),
read_mime_attr(), etc.
storage/mime/database_access.{h,cpp}
+ atomic read functions
+ is_installed()
+ get_icon_data()
storage/mime/Database.{h,cpp}
+ Mime::Database class, which is responsible for all write,
non-atomic read, and mime monitor functionality.
storage/mime/InstalledTypes.{h,cpp}
+ Helper class for Mime::Database::GetInstalled[Super]Types()
storage/mime/Supertype.{h,cpp}
+ Helper class for Mime::InstalledTypes
I haven't merged my intial, somewhat cludgy GetInstalled[Super]Types
implementation into the new setup yet. That comes next, and it ought
to be a more graceful implementation now.
I also implemented BMimeType::Get/SetSupportingTypes(), though
they haven't been tested yet (sorry).
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@862 a95241bf-73f2-0310-859d-f6bbb57e9c96
2002-08-24 09:04:02 +04:00
|
|
|
#ifndef _MIME_DATABASE_H
|
|
|
|
#define _MIME_DATABASE_H
|
|
|
|
|
2008-01-12 01:45:06 +03:00
|
|
|
#include <map>
|
|
|
|
#include <set>
|
|
|
|
#include <string>
|
2006-02-16 22:27:39 +03:00
|
|
|
|
2008-05-31 04:07:32 +04:00
|
|
|
#include <List.h>
|
|
|
|
#include <Locker.h>
|
2002-09-24 09:36:03 +04:00
|
|
|
#include <Mime.h>
|
After implementing the BMimeType::GetInstalled[Super]Types()
functionality, it became apparent that some restructuring was
needed if I wanted to keep things clean and managble.
storage/MimeDatabase.{h,cpp} have been broken into:
storage/mime/database_support.{h,cpp}
+ MIME database constants
+ high-level database access functions like open_type(),
read_mime_attr(), etc.
storage/mime/database_access.{h,cpp}
+ atomic read functions
+ is_installed()
+ get_icon_data()
storage/mime/Database.{h,cpp}
+ Mime::Database class, which is responsible for all write,
non-atomic read, and mime monitor functionality.
storage/mime/InstalledTypes.{h,cpp}
+ Helper class for Mime::Database::GetInstalled[Super]Types()
storage/mime/Supertype.{h,cpp}
+ Helper class for Mime::InstalledTypes
I haven't merged my intial, somewhat cludgy GetInstalled[Super]Types
implementation into the new setup yet. That comes next, and it ought
to be a more graceful implementation now.
I also implemented BMimeType::Get/SetSupportingTypes(), though
they haven't been tested yet (sorry).
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@862 a95241bf-73f2-0310-859d-f6bbb57e9c96
2002-08-24 09:04:02 +04:00
|
|
|
#include <Messenger.h>
|
|
|
|
#include <StorageDefs.h>
|
|
|
|
|
2013-05-07 19:54:29 +04:00
|
|
|
#include <mime/AssociatedTypes.h>
|
|
|
|
#include <mime/InstalledTypes.h>
|
|
|
|
#include <mime/SnifferRules.h>
|
|
|
|
#include <mime/SupportingApps.h>
|
2008-01-12 01:45:06 +03:00
|
|
|
|
After implementing the BMimeType::GetInstalled[Super]Types()
functionality, it became apparent that some restructuring was
needed if I wanted to keep things clean and managble.
storage/MimeDatabase.{h,cpp} have been broken into:
storage/mime/database_support.{h,cpp}
+ MIME database constants
+ high-level database access functions like open_type(),
read_mime_attr(), etc.
storage/mime/database_access.{h,cpp}
+ atomic read functions
+ is_installed()
+ get_icon_data()
storage/mime/Database.{h,cpp}
+ Mime::Database class, which is responsible for all write,
non-atomic read, and mime monitor functionality.
storage/mime/InstalledTypes.{h,cpp}
+ Helper class for Mime::Database::GetInstalled[Super]Types()
storage/mime/Supertype.{h,cpp}
+ Helper class for Mime::InstalledTypes
I haven't merged my intial, somewhat cludgy GetInstalled[Super]Types
implementation into the new setup yet. That comes next, and it ought
to be a more graceful implementation now.
I also implemented BMimeType::Get/SetSupportingTypes(), though
they haven't been tested yet (sorry).
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@862 a95241bf-73f2-0310-859d-f6bbb57e9c96
2002-08-24 09:04:02 +04:00
|
|
|
|
|
|
|
class BNode;
|
|
|
|
class BBitmap;
|
|
|
|
class BMessage;
|
2002-09-24 09:36:03 +04:00
|
|
|
class BString;
|
|
|
|
|
|
|
|
struct entry_ref;
|
After implementing the BMimeType::GetInstalled[Super]Types()
functionality, it became apparent that some restructuring was
needed if I wanted to keep things clean and managble.
storage/MimeDatabase.{h,cpp} have been broken into:
storage/mime/database_support.{h,cpp}
+ MIME database constants
+ high-level database access functions like open_type(),
read_mime_attr(), etc.
storage/mime/database_access.{h,cpp}
+ atomic read functions
+ is_installed()
+ get_icon_data()
storage/mime/Database.{h,cpp}
+ Mime::Database class, which is responsible for all write,
non-atomic read, and mime monitor functionality.
storage/mime/InstalledTypes.{h,cpp}
+ Helper class for Mime::Database::GetInstalled[Super]Types()
storage/mime/Supertype.{h,cpp}
+ Helper class for Mime::InstalledTypes
I haven't merged my intial, somewhat cludgy GetInstalled[Super]Types
implementation into the new setup yet. That comes next, and it ought
to be a more graceful implementation now.
I also implemented BMimeType::Get/SetSupportingTypes(), though
they haven't been tested yet (sorry).
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@862 a95241bf-73f2-0310-859d-f6bbb57e9c96
2002-08-24 09:04:02 +04:00
|
|
|
|
|
|
|
namespace BPrivate {
|
|
|
|
namespace Storage {
|
|
|
|
namespace Mime {
|
|
|
|
|
2013-05-08 01:15:36 +04:00
|
|
|
|
|
|
|
class DatabaseLocation;
|
2013-05-07 19:54:29 +04:00
|
|
|
class MimeSniffer;
|
|
|
|
|
2013-05-08 01:15:36 +04:00
|
|
|
|
2002-09-29 11:12:42 +04:00
|
|
|
// types of mime update functions that may be run asynchronously
|
|
|
|
typedef enum {
|
|
|
|
B_REG_UPDATE_MIME_INFO,
|
|
|
|
B_REG_CREATE_APP_META_MIME,
|
|
|
|
} mime_update_function;
|
|
|
|
|
2006-02-16 22:27:39 +03:00
|
|
|
class Database {
|
|
|
|
public:
|
2013-05-07 19:54:29 +04:00
|
|
|
class NotificationListener;
|
|
|
|
|
|
|
|
public:
|
2013-05-08 01:15:36 +04:00
|
|
|
Database(DatabaseLocation* databaseLocation, MimeSniffer* mimeSniffer,
|
2013-05-07 19:54:29 +04:00
|
|
|
NotificationListener* notificationListener);
|
2006-02-16 22:27:39 +03:00
|
|
|
~Database();
|
2013-05-08 01:15:36 +04:00
|
|
|
|
2006-02-16 22:27:39 +03:00
|
|
|
status_t InitCheck() const;
|
After implementing the BMimeType::GetInstalled[Super]Types()
functionality, it became apparent that some restructuring was
needed if I wanted to keep things clean and managble.
storage/MimeDatabase.{h,cpp} have been broken into:
storage/mime/database_support.{h,cpp}
+ MIME database constants
+ high-level database access functions like open_type(),
read_mime_attr(), etc.
storage/mime/database_access.{h,cpp}
+ atomic read functions
+ is_installed()
+ get_icon_data()
storage/mime/Database.{h,cpp}
+ Mime::Database class, which is responsible for all write,
non-atomic read, and mime monitor functionality.
storage/mime/InstalledTypes.{h,cpp}
+ Helper class for Mime::Database::GetInstalled[Super]Types()
storage/mime/Supertype.{h,cpp}
+ Helper class for Mime::InstalledTypes
I haven't merged my intial, somewhat cludgy GetInstalled[Super]Types
implementation into the new setup yet. That comes next, and it ought
to be a more graceful implementation now.
I also implemented BMimeType::Get/SetSupportingTypes(), though
they haven't been tested yet (sorry).
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@862 a95241bf-73f2-0310-859d-f6bbb57e9c96
2002-08-24 09:04:02 +04:00
|
|
|
|
2013-05-08 01:15:36 +04:00
|
|
|
DatabaseLocation* Location() const { return fLocation; }
|
|
|
|
|
2006-02-16 22:27:39 +03:00
|
|
|
// Type management
|
|
|
|
status_t Install(const char *type);
|
|
|
|
status_t Delete(const char *type);
|
2013-05-08 01:15:36 +04:00
|
|
|
|
2006-02-16 22:27:39 +03:00
|
|
|
// Set()
|
|
|
|
status_t SetAppHint(const char *type, const entry_ref *ref);
|
|
|
|
status_t SetAttrInfo(const char *type, const BMessage *info);
|
|
|
|
status_t SetShortDescription(const char *type, const char *description);
|
|
|
|
status_t SetLongDescription(const char *type, const char *description);
|
|
|
|
status_t SetFileExtensions(const char *type, const BMessage *extensions);
|
2014-01-25 14:53:47 +04:00
|
|
|
status_t SetIcon(const char* type, const BBitmap* icon,
|
|
|
|
icon_size which);
|
2006-02-16 22:27:39 +03:00
|
|
|
status_t SetIcon(const char *type, const void *data, size_t dataSize,
|
|
|
|
icon_size which);
|
2006-08-29 21:06:23 +04:00
|
|
|
status_t SetIcon(const char *type, const void *data, size_t dataSize);
|
2014-01-25 14:53:47 +04:00
|
|
|
status_t SetIconForType(const char* type, const char* fileType,
|
|
|
|
const BBitmap* icon, icon_size which);
|
2006-08-29 21:06:23 +04:00
|
|
|
status_t SetIconForType(const char *type, const char *fileType,
|
|
|
|
const void *data, size_t dataSize, icon_size which);
|
|
|
|
status_t SetIconForType(const char *type, const char *fileType,
|
|
|
|
const void *data, size_t dataSize);
|
2006-02-16 22:27:39 +03:00
|
|
|
status_t SetPreferredApp(const char *type, const char *signature,
|
|
|
|
app_verb verb = B_OPEN);
|
|
|
|
status_t SetSnifferRule(const char *type, const char *rule);
|
|
|
|
status_t SetSupportedTypes(const char *type, const BMessage *types, bool fullSync);
|
|
|
|
|
|
|
|
// Non-atomic Get()
|
|
|
|
status_t GetInstalledSupertypes(BMessage *super_types);
|
|
|
|
status_t GetInstalledTypes(BMessage *types);
|
|
|
|
status_t GetInstalledTypes(const char *super_type,
|
|
|
|
BMessage *subtypes);
|
|
|
|
status_t GetSupportingApps(const char *type, BMessage *signatures);
|
|
|
|
status_t GetAssociatedTypes(const char *extension, BMessage *types);
|
|
|
|
|
|
|
|
// Sniffer
|
|
|
|
status_t GuessMimeType(const entry_ref *file, BString *result);
|
|
|
|
status_t GuessMimeType(const void *buffer, int32 length, BString *result);
|
|
|
|
status_t GuessMimeType(const char *filename, BString *result);
|
|
|
|
|
|
|
|
// Monitor
|
|
|
|
status_t StartWatching(BMessenger target);
|
|
|
|
status_t StopWatching(BMessenger target);
|
|
|
|
|
|
|
|
// Delete()
|
|
|
|
status_t DeleteAppHint(const char *type);
|
|
|
|
status_t DeleteAttrInfo(const char *type);
|
|
|
|
status_t DeleteShortDescription(const char *type);
|
|
|
|
status_t DeleteLongDescription(const char *type);
|
|
|
|
status_t DeleteFileExtensions(const char *type);
|
|
|
|
status_t DeleteIcon(const char *type, icon_size size);
|
2006-08-29 21:06:23 +04:00
|
|
|
status_t DeleteIcon(const char *type);
|
2006-02-16 22:27:39 +03:00
|
|
|
status_t DeleteIconForType(const char *type, const char *fileType,
|
|
|
|
icon_size which);
|
2006-08-29 21:06:23 +04:00
|
|
|
status_t DeleteIconForType(const char *type, const char *fileType);
|
2006-02-16 22:27:39 +03:00
|
|
|
status_t DeletePreferredApp(const char *type, app_verb verb = B_OPEN);
|
|
|
|
status_t DeleteSnifferRule(const char *type);
|
|
|
|
status_t DeleteSupportedTypes(const char *type, bool fullSync);
|
|
|
|
|
2008-05-31 04:07:32 +04:00
|
|
|
// deferred notifications
|
|
|
|
void DeferInstallNotification(const char* type);
|
|
|
|
void UndeferInstallNotification(const char* type);
|
|
|
|
|
2006-02-16 22:27:39 +03:00
|
|
|
private:
|
2008-05-31 04:07:32 +04:00
|
|
|
struct DeferredInstallNotification {
|
|
|
|
char type[B_MIME_TYPE_LENGTH];
|
|
|
|
bool notify;
|
|
|
|
};
|
|
|
|
|
2006-02-16 22:27:39 +03:00
|
|
|
status_t _SetStringValue(const char *type, int32 what,
|
|
|
|
const char* attribute, type_code attributeType,
|
|
|
|
size_t maxLength, const char *value);
|
|
|
|
|
|
|
|
// Functions to send monitor notifications
|
|
|
|
status_t _SendInstallNotification(const char *type);
|
|
|
|
status_t _SendDeleteNotification(const char *type);
|
|
|
|
status_t _SendMonitorUpdate(int32 which, const char *type,
|
|
|
|
const char *extraType, bool largeIcon, int32 action);
|
|
|
|
status_t _SendMonitorUpdate(int32 which, const char *type,
|
|
|
|
const char *extraType, int32 action);
|
|
|
|
status_t _SendMonitorUpdate(int32 which, const char *type,
|
|
|
|
bool largeIcon, int32 action);
|
|
|
|
status_t _SendMonitorUpdate(int32 which, const char *type,
|
|
|
|
int32 action);
|
|
|
|
status_t _SendMonitorUpdate(BMessage &msg);
|
|
|
|
|
2008-05-31 04:07:32 +04:00
|
|
|
DeferredInstallNotification* _FindDeferredInstallNotification(
|
|
|
|
const char* type, bool remove = false);
|
|
|
|
bool _CheckDeferredInstallNotification(int32 which, const char* type);
|
|
|
|
|
2006-02-16 22:27:39 +03:00
|
|
|
private:
|
|
|
|
status_t fStatus;
|
2013-05-08 01:15:36 +04:00
|
|
|
DatabaseLocation* fLocation;
|
2013-05-07 19:54:29 +04:00
|
|
|
NotificationListener* fNotificationListener;
|
2006-02-16 22:27:39 +03:00
|
|
|
std::set<BMessenger> fMonitorMessengers;
|
|
|
|
AssociatedTypes fAssociatedTypes;
|
|
|
|
InstalledTypes fInstalledTypes;
|
|
|
|
SnifferRules fSnifferRules;
|
|
|
|
SupportingApps fSupportingApps;
|
2008-05-31 04:07:32 +04:00
|
|
|
|
|
|
|
BLocker fDeferredInstallNotificationsLocker;
|
|
|
|
BList fDeferredInstallNotifications;
|
|
|
|
};
|
|
|
|
|
|
|
|
class InstallNotificationDeferrer {
|
|
|
|
public:
|
|
|
|
InstallNotificationDeferrer(Database* database, const char* type)
|
|
|
|
:
|
|
|
|
fDatabase(database),
|
|
|
|
fType(type)
|
|
|
|
{
|
|
|
|
if (fDatabase != NULL && fType != NULL)
|
|
|
|
fDatabase->DeferInstallNotification(fType);
|
|
|
|
}
|
|
|
|
|
|
|
|
~InstallNotificationDeferrer()
|
|
|
|
{
|
|
|
|
if (fDatabase != NULL && fType != NULL)
|
|
|
|
fDatabase->UndeferInstallNotification(fType);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
Database* fDatabase;
|
|
|
|
const char* fType;
|
After implementing the BMimeType::GetInstalled[Super]Types()
functionality, it became apparent that some restructuring was
needed if I wanted to keep things clean and managble.
storage/MimeDatabase.{h,cpp} have been broken into:
storage/mime/database_support.{h,cpp}
+ MIME database constants
+ high-level database access functions like open_type(),
read_mime_attr(), etc.
storage/mime/database_access.{h,cpp}
+ atomic read functions
+ is_installed()
+ get_icon_data()
storage/mime/Database.{h,cpp}
+ Mime::Database class, which is responsible for all write,
non-atomic read, and mime monitor functionality.
storage/mime/InstalledTypes.{h,cpp}
+ Helper class for Mime::Database::GetInstalled[Super]Types()
storage/mime/Supertype.{h,cpp}
+ Helper class for Mime::InstalledTypes
I haven't merged my intial, somewhat cludgy GetInstalled[Super]Types
implementation into the new setup yet. That comes next, and it ought
to be a more graceful implementation now.
I also implemented BMimeType::Get/SetSupportingTypes(), though
they haven't been tested yet (sorry).
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@862 a95241bf-73f2-0310-859d-f6bbb57e9c96
2002-08-24 09:04:02 +04:00
|
|
|
};
|
|
|
|
|
2013-05-07 19:54:29 +04:00
|
|
|
|
|
|
|
class Database::NotificationListener {
|
|
|
|
public:
|
|
|
|
virtual ~NotificationListener();
|
|
|
|
|
|
|
|
virtual status_t Notify(BMessage* message,
|
|
|
|
const BMessenger& target) = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
After implementing the BMimeType::GetInstalled[Super]Types()
functionality, it became apparent that some restructuring was
needed if I wanted to keep things clean and managble.
storage/MimeDatabase.{h,cpp} have been broken into:
storage/mime/database_support.{h,cpp}
+ MIME database constants
+ high-level database access functions like open_type(),
read_mime_attr(), etc.
storage/mime/database_access.{h,cpp}
+ atomic read functions
+ is_installed()
+ get_icon_data()
storage/mime/Database.{h,cpp}
+ Mime::Database class, which is responsible for all write,
non-atomic read, and mime monitor functionality.
storage/mime/InstalledTypes.{h,cpp}
+ Helper class for Mime::Database::GetInstalled[Super]Types()
storage/mime/Supertype.{h,cpp}
+ Helper class for Mime::InstalledTypes
I haven't merged my intial, somewhat cludgy GetInstalled[Super]Types
implementation into the new setup yet. That comes next, and it ought
to be a more graceful implementation now.
I also implemented BMimeType::Get/SetSupportingTypes(), though
they haven't been tested yet (sorry).
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@862 a95241bf-73f2-0310-859d-f6bbb57e9c96
2002-08-24 09:04:02 +04:00
|
|
|
} // namespace Mime
|
|
|
|
} // namespace Storage
|
|
|
|
} // namespace BPrivate
|
|
|
|
|
|
|
|
#endif // _MIME_DATABASE_H
|