diff --git a/src/servers/registrar/mime/AssociatedTypes.h b/headers/private/storage/mime/AssociatedTypes.h similarity index 91% rename from src/servers/registrar/mime/AssociatedTypes.h rename to headers/private/storage/mime/AssociatedTypes.h index 41370ed340..3f484371b8 100644 --- a/src/servers/registrar/mime/AssociatedTypes.h +++ b/headers/private/storage/mime/AssociatedTypes.h @@ -21,9 +21,12 @@ namespace BPrivate { namespace Storage { namespace Mime { +class MimeSniffer; + + class AssociatedTypes { public: - AssociatedTypes(); + AssociatedTypes(MimeSniffer* mimeSniffer); ~AssociatedTypes(); status_t GetAssociatedTypes(const char *extension, BMessage *types); @@ -45,8 +48,10 @@ private: std::map > fFileExtensions; // mime type => set of associated file extensions std::map > fAssociatedTypes; // file extension => set of associated mime types - - bool fHaveDoneFullBuild; + +private: + MimeSniffer* fMimeSniffer; + bool fHaveDoneFullBuild; }; } // namespace Mime diff --git a/src/servers/registrar/mime/Database.h b/headers/private/storage/mime/Database.h similarity index 91% rename from src/servers/registrar/mime/Database.h rename to headers/private/storage/mime/Database.h index c9ffbd16f0..de5d061a36 100644 --- a/src/servers/registrar/mime/Database.h +++ b/headers/private/storage/mime/Database.h @@ -18,12 +18,11 @@ #include #include +#include #include - -#include "AssociatedTypes.h" -#include "InstalledTypes.h" -#include "SnifferRules.h" -#include "SupportingApps.h" +#include +#include +#include class BNode; @@ -37,6 +36,8 @@ namespace BPrivate { namespace Storage { namespace Mime { +class MimeSniffer; + // types of mime update functions that may be run asynchronously typedef enum { B_REG_UPDATE_MIME_INFO, @@ -45,7 +46,11 @@ typedef enum { class Database { public: - Database(); + class NotificationListener; + + public: + Database(MimeSniffer* mimeSniffer, + NotificationListener* notificationListener); ~Database(); status_t InitCheck() const; @@ -137,6 +142,7 @@ class Database { private: status_t fStatus; + NotificationListener* fNotificationListener; std::set fMonitorMessengers; AssociatedTypes fAssociatedTypes; InstalledTypes fInstalledTypes; @@ -169,6 +175,16 @@ class InstallNotificationDeferrer { const char* fType; }; + +class Database::NotificationListener { +public: + virtual ~NotificationListener(); + + virtual status_t Notify(BMessage* message, + const BMessenger& target) = 0; +}; + + } // namespace Mime } // namespace Storage } // namespace BPrivate diff --git a/src/servers/registrar/mime/DatabaseDirectory.h b/headers/private/storage/mime/DatabaseDirectory.h similarity index 84% rename from src/servers/registrar/mime/DatabaseDirectory.h rename to headers/private/storage/mime/DatabaseDirectory.h index 6bfcfb0008..4642f2f2d4 100644 --- a/src/servers/registrar/mime/DatabaseDirectory.h +++ b/headers/private/storage/mime/DatabaseDirectory.h @@ -12,6 +12,11 @@ #include +namespace BPrivate { +namespace Storage { +namespace Mime { + + class DatabaseDirectory : public BMergedDirectory { public: DatabaseDirectory(); @@ -29,4 +34,9 @@ private: }; +} // namespace Mime +} // namespace Storage +} // namespace BPrivate + + #endif // DATABASE_DIRECTORY_H diff --git a/src/servers/registrar/mime/InstalledTypes.h b/headers/private/storage/mime/InstalledTypes.h similarity index 98% rename from src/servers/registrar/mime/InstalledTypes.h rename to headers/private/storage/mime/InstalledTypes.h index 1710f689fa..fa32f10942 100644 --- a/src/servers/registrar/mime/InstalledTypes.h +++ b/headers/private/storage/mime/InstalledTypes.h @@ -10,11 +10,14 @@ #ifndef _MIME_INSTALLED_TYPES_H #define _MIME_INSTALLED_TYPES_H -#include "Supertype.h" + +#include +#include + #include -#include -#include +#include + class BMessage; diff --git a/headers/private/storage/mime/MimeSniffer.h b/headers/private/storage/mime/MimeSniffer.h new file mode 100644 index 0000000000..c27e475a99 --- /dev/null +++ b/headers/private/storage/mime/MimeSniffer.h @@ -0,0 +1,43 @@ +/* + * Copyright 2013, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Ingo Weinhold + */ +#ifndef _MIME_MIME_SNIFFER_H +#define _MIME_MIME_SNIFFER_H + + +#include + + +class BFile; +class BMimeType; + + +namespace BPrivate { +namespace Storage { +namespace Mime { + + +class MimeSniffer { +public: + virtual ~MimeSniffer(); + + virtual size_t MinimalBufferSize() = 0; + + virtual float GuessMimeType(const char* fileName, + BMimeType* type) = 0; + virtual float GuessMimeType(BFile* file, + const void* buffer, int32 length, + BMimeType* type) = 0; +}; + + +} // namespace Mime +} // namespace Storage +} // namespace BPrivate + + +#endif // _MIME_MIME_SNIFFER_H diff --git a/src/servers/registrar/mime/SnifferRules.h b/headers/private/storage/mime/SnifferRules.h similarity index 89% rename from src/servers/registrar/mime/SnifferRules.h rename to headers/private/storage/mime/SnifferRules.h index e45cea09d9..e9c68460a2 100644 --- a/src/servers/registrar/mime/SnifferRules.h +++ b/headers/private/storage/mime/SnifferRules.h @@ -25,9 +25,12 @@ namespace Sniffer { namespace Mime { +class MimeSniffer; + + class SnifferRules { public: - SnifferRules(); + SnifferRules(MimeSniffer* mimeSniffer); ~SnifferRules(); status_t GuessMimeType(const entry_ref *ref, BString *type); @@ -54,8 +57,11 @@ private: status_t ProcessType(const char *type, ssize_t *bytesNeeded); std::list fRuleList; - ssize_t fMaxBytesNeeded; - bool fHaveDoneFullBuild; + +private: + MimeSniffer* fMimeSniffer; + ssize_t fMaxBytesNeeded; + bool fHaveDoneFullBuild; }; } // namespace Mime diff --git a/src/servers/registrar/mime/Supertype.h b/headers/private/storage/mime/Supertype.h similarity index 100% rename from src/servers/registrar/mime/Supertype.h rename to headers/private/storage/mime/Supertype.h diff --git a/src/servers/registrar/mime/SupportingApps.h b/headers/private/storage/mime/SupportingApps.h similarity index 100% rename from src/servers/registrar/mime/SupportingApps.h rename to headers/private/storage/mime/SupportingApps.h diff --git a/src/kits/Jamfile b/src/kits/Jamfile index 952701f0f5..bc6ffe2596 100644 --- a/src/kits/Jamfile +++ b/src/kits/Jamfile @@ -35,6 +35,8 @@ SharedLibrary libbe.so : : storage_kit.o support_kit.o + libstorage_kit_mime.a + libicon.a libagg.a diff --git a/src/kits/storage/Jamfile b/src/kits/storage/Jamfile index 41c7f7e44e..6a053c7ec2 100644 --- a/src/kits/storage/Jamfile +++ b/src/kits/storage/Jamfile @@ -44,10 +44,6 @@ MergeObject storage_kit.o : VolumeRoster.cpp storage_support.cpp - # mime - database_access.cpp - database_support.cpp - # sniffer CharStream.cpp Err.cpp @@ -90,3 +86,5 @@ MergeObject storage_kit.o : SetStringJob.cpp UninitializeJob.cpp ; + +HaikuSubInclude mime ; diff --git a/src/servers/registrar/mime/AssociatedTypes.cpp b/src/kits/storage/mime/AssociatedTypes.cpp similarity index 96% rename from src/servers/registrar/mime/AssociatedTypes.cpp rename to src/kits/storage/mime/AssociatedTypes.cpp index 8550839d35..c292f495e0 100644 --- a/src/servers/registrar/mime/AssociatedTypes.cpp +++ b/src/kits/storage/mime/AssociatedTypes.cpp @@ -7,7 +7,7 @@ AssociatedTypes class implementation */ -#include "AssociatedTypes.h" +#include #include @@ -16,15 +16,14 @@ #include #include #include +#include +#include +#include #include #include #include -#include #include -#include "DatabaseDirectory.h" -#include "MimeSnifferAddonManager.h" - #define DBG(x) x //#define DBG(x) @@ -41,8 +40,10 @@ namespace Mime { // Constructor //! Constructs a new AssociatedTypes object -AssociatedTypes::AssociatedTypes() - : fHaveDoneFullBuild(false) +AssociatedTypes::AssociatedTypes(MimeSniffer* mimeSniffer) + : + fMimeSniffer(mimeSniffer), + fHaveDoneFullBuild(false) { } @@ -106,16 +107,13 @@ AssociatedTypes::GuessMimeType(const char *filename, BString *result) if (!err && !fHaveDoneFullBuild) err = BuildAssociatedTypesTable(); - // if we have an MimeSnifferAddonManager, let's give it a shot first - if (!err) { - MimeSnifferAddonManager* manager = MimeSnifferAddonManager::Default(); - if (manager) { - BMimeType mimeType; - float priority = manager->GuessMimeType(filename, &mimeType); - if (priority >= 0) { - *result = mimeType.Type(); - return B_OK; - } + // if we have a mime sniffer, let's give it a shot first + if (!err && fMimeSniffer != NULL) { + BMimeType mimeType; + float priority = fMimeSniffer->GuessMimeType(filename, &mimeType); + if (priority >= 0) { + *result = mimeType.Type(); + return B_OK; } } diff --git a/src/servers/registrar/mime/Database.cpp b/src/kits/storage/mime/Database.cpp similarity index 99% rename from src/servers/registrar/mime/Database.cpp rename to src/kits/storage/mime/Database.cpp index 96fb8822e2..c653979d10 100644 --- a/src/servers/registrar/mime/Database.cpp +++ b/src/kits/storage/mime/Database.cpp @@ -8,7 +8,7 @@ */ -#include "Database.h" +#include #include #include @@ -34,7 +34,6 @@ #include #include -#include "MessageDeliverer.h" //#define DBG(x) x #define DBG(x) @@ -45,6 +44,12 @@ namespace BPrivate { namespace Storage { namespace Mime { + +Database::NotificationListener::~NotificationListener() +{ +} + + /*! \class Database \brief Mime::Database is the master of the MIME data base. @@ -59,9 +64,13 @@ namespace Mime { // constructor /*! \brief Creates and initializes a Mime::Database object. */ -Database::Database() +Database::Database(MimeSniffer* mimeSniffer, + NotificationListener* notificationListener) : fStatus(B_NO_INIT), + fNotificationListener(notificationListener), + fAssociatedTypes(mimeSniffer), + fSnifferRules(mimeSniffer), fDeferredInstallNotificationsLocker("deferred install notifications"), fDeferredInstallNotifications() { @@ -1472,16 +1481,17 @@ Database::_SendMonitorUpdate(int32 which, const char *type, int32 action) status_t Database::_SendMonitorUpdate(BMessage &msg) { -// DBG(OUT("Database::_SendMonitorUpdate(BMessage&)\n")); + if (fNotificationListener == NULL) + return B_OK; + status_t err; std::set::const_iterator i; for (i = fMonitorMessengers.begin(); i != fMonitorMessengers.end(); i++) { - status_t err = MessageDeliverer::Default()->DeliverMessage(&msg, *i); + status_t err = fNotificationListener->Notify(&msg, *i); if (err) { DBG(OUT("Database::_SendMonitorUpdate(BMessage&): DeliverMessage failed, 0x%lx\n", err)); } } -// DBG(OUT("Database::_SendMonitorUpdate(BMessage&) done\n")); err = B_OK; return err; } diff --git a/src/servers/registrar/mime/DatabaseDirectory.cpp b/src/kits/storage/mime/DatabaseDirectory.cpp similarity index 88% rename from src/servers/registrar/mime/DatabaseDirectory.cpp rename to src/kits/storage/mime/DatabaseDirectory.cpp index 2c4699dd16..1f62a509f8 100644 --- a/src/servers/registrar/mime/DatabaseDirectory.cpp +++ b/src/kits/storage/mime/DatabaseDirectory.cpp @@ -7,7 +7,7 @@ */ -#include "DatabaseDirectory.h" +#include #include #include @@ -16,6 +16,11 @@ #include +namespace BPrivate { +namespace Storage { +namespace Mime { + + DatabaseDirectory::DatabaseDirectory() : BMergedDirectory(B_COMPARE) @@ -67,3 +72,8 @@ DatabaseDirectory::_IsValidMimeTypeEntry(const entry_ref& entry) return node.SetTo(&entry) == B_OK && node.GetAttrInfo(BPrivate::Storage::Mime::kTypeAttr, &info) == B_OK; } + + +} // namespace Mime +} // namespace Storage +} // namespace BPrivate diff --git a/src/servers/registrar/mime/InstalledTypes.cpp b/src/kits/storage/mime/InstalledTypes.cpp similarity index 99% rename from src/servers/registrar/mime/InstalledTypes.cpp rename to src/kits/storage/mime/InstalledTypes.cpp index 0bd602ad50..b4dbd3842a 100644 --- a/src/servers/registrar/mime/InstalledTypes.cpp +++ b/src/kits/storage/mime/InstalledTypes.cpp @@ -9,7 +9,7 @@ */ -#include "InstalledTypes.h" +#include #include @@ -22,10 +22,9 @@ #include #include +#include #include -#include "DatabaseDirectory.h" - #define DBG(x) x //#define DBG(x) diff --git a/src/kits/storage/mime/Jamfile b/src/kits/storage/mime/Jamfile new file mode 100644 index 0000000000..0ee32705cc --- /dev/null +++ b/src/kits/storage/mime/Jamfile @@ -0,0 +1,23 @@ +SubDir HAIKU_TOP src kits storage mime ; + +SetSubDirSupportedPlatforms haiku libbe_test ; + +UsePrivateHeaders app shared storage ; +#UsePrivateHeaders app libroot shared storage ; +#UsePrivateSystemHeaders ; + +# for libbe_test +#UsePublicHeaders [ FDirName add-ons registrar ] ; + +StaticLibrary libstorage_kit_mime.a : + AssociatedTypes.cpp + Database.cpp + DatabaseDirectory.cpp + database_access.cpp + database_support.cpp + InstalledTypes.cpp + MimeSniffer.cpp + SnifferRules.cpp + Supertype.cpp + SupportingApps.cpp +; diff --git a/src/kits/storage/mime/MimeSniffer.cpp b/src/kits/storage/mime/MimeSniffer.cpp new file mode 100644 index 0000000000..1937a29da2 --- /dev/null +++ b/src/kits/storage/mime/MimeSniffer.cpp @@ -0,0 +1,25 @@ +/* + * Copyright 2013, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Ingo Weinhold + */ + + +#include + + +namespace BPrivate { +namespace Storage { +namespace Mime { + + +MimeSniffer::~MimeSniffer() +{ +} + + +} // namespace Mime +} // namespace Storage +} // namespace BPrivate diff --git a/src/servers/registrar/mime/SnifferRules.cpp b/src/kits/storage/mime/SnifferRules.cpp similarity index 96% rename from src/servers/registrar/mime/SnifferRules.cpp rename to src/kits/storage/mime/SnifferRules.cpp index b71857364f..119d5e0416 100644 --- a/src/servers/registrar/mime/SnifferRules.cpp +++ b/src/kits/storage/mime/SnifferRules.cpp @@ -12,7 +12,7 @@ SnifferRules class implementation */ -#include "SnifferRules.h" +#include #include #include @@ -22,14 +22,14 @@ #include #include #include +#include +#include #include #include #include #include #include -#include "DatabaseDirectory.h" -#include "MimeSnifferAddonManager.h" #define DBG(x) x //#define DBG(x) @@ -112,8 +112,11 @@ bool operator<(SnifferRules::sniffer_rule &left, SnifferRules::sniffer_rule &rig // Constructor //! Constructs a new SnifferRules object -SnifferRules::SnifferRules() - : fHaveDoneFullBuild(false) +SnifferRules::SnifferRules(MimeSniffer* mimeSniffer) + : + fMimeSniffer(mimeSniffer), + fMaxBytesNeeded(0), + fHaveDoneFullBuild(false) { } @@ -449,15 +452,12 @@ SnifferRules::GuessMimeType(BFile* file, const void *buffer, int32 length, if (!err && !fHaveDoneFullBuild) err = BuildRuleList(); - // first ask the MimeSnifferAddonManager for a suitable type + // first ask the MIME sniffer for a suitable type float addonPriority = -1; BMimeType mimeType; - if (!err) { - MimeSnifferAddonManager* manager = MimeSnifferAddonManager::Default(); - if (manager) { - addonPriority = manager->GuessMimeType(file, buffer, length, - &mimeType); - } + if (!err && fMimeSniffer != NULL) { + addonPriority = fMimeSniffer->GuessMimeType(file, buffer, length, + &mimeType); } if (!err) { @@ -520,10 +520,10 @@ SnifferRules::MaxBytesNeeded() ssize_t err = fHaveDoneFullBuild ? B_OK : BuildRuleList(); if (!err) { err = fMaxBytesNeeded; - MimeSnifferAddonManager* manager = MimeSnifferAddonManager::Default(); - if (manager) { + + if (fMimeSniffer != NULL) { fMaxBytesNeeded = max_c(fMaxBytesNeeded, - (ssize_t)manager->MinimalBufferSize()); + (ssize_t)fMimeSniffer->MinimalBufferSize()); } } return err; diff --git a/src/servers/registrar/mime/Supertype.cpp b/src/kits/storage/mime/Supertype.cpp similarity index 99% rename from src/servers/registrar/mime/Supertype.cpp rename to src/kits/storage/mime/Supertype.cpp index 43342fabd7..969568df3a 100644 --- a/src/servers/registrar/mime/Supertype.cpp +++ b/src/kits/storage/mime/Supertype.cpp @@ -7,7 +7,7 @@ Supertype class implementation */ -#include "Supertype.h" +#include #include #include diff --git a/src/servers/registrar/mime/SupportingApps.cpp b/src/kits/storage/mime/SupportingApps.cpp similarity index 99% rename from src/servers/registrar/mime/SupportingApps.cpp rename to src/kits/storage/mime/SupportingApps.cpp index 4caf6f5e91..7f1f8b94be 100644 --- a/src/servers/registrar/mime/SupportingApps.cpp +++ b/src/kits/storage/mime/SupportingApps.cpp @@ -9,7 +9,7 @@ */ -#include "SupportingApps.h" +#include #include @@ -23,10 +23,9 @@ #include #include +#include #include -#include "DatabaseDirectory.h" - #define DBG(x) x //#define DBG(x) diff --git a/src/kits/storage/mime/database_access.cpp b/src/kits/storage/mime/database_access.cpp index 17b5906ca4..b227a182d2 100644 --- a/src/kits/storage/mime/database_access.cpp +++ b/src/kits/storage/mime/database_access.cpp @@ -12,6 +12,8 @@ Mime database atomic read functions */ +#include + #include #include #include @@ -30,7 +32,6 @@ #include #include -#include "mime/database_access.h" #define DBG(x) x //#define DBG(x) diff --git a/src/servers/registrar/Jamfile b/src/servers/registrar/Jamfile index eba9ad50ff..13a3540767 100644 --- a/src/servers/registrar/Jamfile +++ b/src/servers/registrar/Jamfile @@ -40,21 +40,15 @@ Server registrar WatchingService.cpp # mime - AssociatedTypes.cpp CreateAppMetaMimeThread.cpp - Database.cpp - DatabaseDirectory.cpp - InstalledTypes.cpp MimeSnifferAddon.cpp MimeSnifferAddonManager.cpp MimeUpdateThread.cpp RegistrarThread.cpp RegistrarThreadManager.cpp - SnifferRules.cpp - Supertype.cpp - SupportingApps.cpp UpdateMimeInfoThread.cpp : + libstorage_kit_mime.a be $(TARGET_LIBSTDC++) $(HAIKU_LOCALE_LIBS) diff --git a/src/servers/registrar/MIMEManager.cpp b/src/servers/registrar/MIMEManager.cpp index e357fb9e4e..8332422fbc 100644 --- a/src/servers/registrar/MIMEManager.cpp +++ b/src/servers/registrar/MIMEManager.cpp @@ -22,6 +22,7 @@ #include #include "CreateAppMetaMimeThread.h" +#include "MessageDeliverer.h" #include "MimeSnifferAddonManager.h" #include "TextSnifferAddon.h" #include "UpdateMimeInfoThread.h" @@ -38,23 +39,27 @@ using namespace BPrivate; */ +static MimeSnifferAddonManager* +init_mime_sniffer_add_on_manager() +{ + if (MimeSnifferAddonManager::CreateDefault() != B_OK) + return NULL; + + MimeSnifferAddonManager* manager = MimeSnifferAddonManager::Default(); + manager->AddMimeSnifferAddon(new(nothrow) TextSnifferAddon()); + return manager; +} + + /*! \brief Creates and initializes a MIMEManager. */ MIMEManager::MIMEManager() : BLooper("main_mime"), - fDatabase(), + fDatabase(init_mime_sniffer_add_on_manager(), this), fThreadManager() { AddHandler(&fThreadManager); - - // prepare the MimeSnifferAddonManager and the built-in add-ons - status_t error = MimeSnifferAddonManager::CreateDefault(); - if (error == B_OK) { - MimeSnifferAddonManager* addonManager - = MimeSnifferAddonManager::Default(); - addonManager->AddMimeSnifferAddon(new(nothrow) TextSnifferAddon()); - } } @@ -298,6 +303,13 @@ MIMEManager::MessageReceived(BMessage *message) } +status_t +MIMEManager::Notify(BMessage* message, const BMessenger& target) +{ + return MessageDeliverer::Default()->DeliverMessage(message, target); +} + + //! Handles all B_REG_MIME_SET_PARAM messages void MIMEManager::HandleSetParam(BMessage *message) diff --git a/src/servers/registrar/MIMEManager.h b/src/servers/registrar/MIMEManager.h index 05317b75ca..f1cc8564ff 100644 --- a/src/servers/registrar/MIMEManager.h +++ b/src/servers/registrar/MIMEManager.h @@ -5,15 +5,23 @@ #include -#include "Database.h" +#include + #include "RegistrarThreadManager.h" -class MIMEManager : public BLooper { + +class MIMEManager : public BLooper, + private BPrivate::Storage::Mime::Database::NotificationListener { public: MIMEManager(); virtual ~MIMEManager(); virtual void MessageReceived(BMessage *message); + +private: + // Database::NotificationListener + virtual status_t Notify(BMessage* message, const BMessenger& target); + private: void HandleSetParam(BMessage *message); void HandleDeleteParam(BMessage *message); diff --git a/src/servers/registrar/mime/CreateAppMetaMimeThread.cpp b/src/servers/registrar/mime/CreateAppMetaMimeThread.cpp index 3c38281bc0..18164cfda9 100644 --- a/src/servers/registrar/mime/CreateAppMetaMimeThread.cpp +++ b/src/servers/registrar/mime/CreateAppMetaMimeThread.cpp @@ -21,10 +21,9 @@ #include #include +#include #include -#include "Database.h" - namespace BPrivate { namespace Storage { diff --git a/src/servers/registrar/mime/MimeSnifferAddonManager.h b/src/servers/registrar/mime/MimeSnifferAddonManager.h index ebe58899f2..ccf016efb2 100644 --- a/src/servers/registrar/mime/MimeSnifferAddonManager.h +++ b/src/servers/registrar/mime/MimeSnifferAddonManager.h @@ -8,6 +8,9 @@ #include #include +#include + + class BFile; class BMimeSnifferAddon; class BMimeType; @@ -17,7 +20,7 @@ namespace Storage { namespace Mime { -class MimeSnifferAddonManager { +class MimeSnifferAddonManager : public BPrivate::Storage::Mime::MimeSniffer { private: MimeSnifferAddonManager(); ~MimeSnifferAddonManager(); @@ -29,14 +32,14 @@ public: status_t AddMimeSnifferAddon(BMimeSnifferAddon* addon); - size_t MinimalBufferSize(); + virtual size_t MinimalBufferSize(); - float GuessMimeType(const char* fileName, + virtual float GuessMimeType(const char* fileName, BMimeType* type); - float GuessMimeType(BFile* file, + virtual float GuessMimeType(BFile* file, const void* buffer, int32 length, BMimeType* type); - + private: struct AddonReference;