Move MIME DB code back from registrar to src/kits/storage/mime

* Together with database_{access,support}.cpp it is built into a static
  library.
* Add new interfaces MimeSniffer and Database::NotificationListener for
  plugging in registrar specific functionality (the sniffer add-on
  support and the notification mechanism).
This commit is contained in:
Ingo Weinhold
2013-05-07 17:54:29 +02:00
parent a625f557c5
commit 9cda9c9905
25 changed files with 255 additions and 91 deletions
@@ -21,9 +21,12 @@ namespace BPrivate {
namespace Storage { namespace Storage {
namespace Mime { namespace Mime {
class MimeSniffer;
class AssociatedTypes { class AssociatedTypes {
public: public:
AssociatedTypes(); AssociatedTypes(MimeSniffer* mimeSniffer);
~AssociatedTypes(); ~AssociatedTypes();
status_t GetAssociatedTypes(const char *extension, BMessage *types); status_t GetAssociatedTypes(const char *extension, BMessage *types);
@@ -45,8 +48,10 @@ private:
std::map<std::string, std::set<std::string> > fFileExtensions; // mime type => set of associated file extensions std::map<std::string, std::set<std::string> > fFileExtensions; // mime type => set of associated file extensions
std::map<std::string, std::set<std::string> > fAssociatedTypes; // file extension => set of associated mime types std::map<std::string, std::set<std::string> > fAssociatedTypes; // file extension => set of associated mime types
bool fHaveDoneFullBuild; private:
MimeSniffer* fMimeSniffer;
bool fHaveDoneFullBuild;
}; };
} // namespace Mime } // namespace Mime
@@ -18,12 +18,11 @@
#include <Messenger.h> #include <Messenger.h>
#include <StorageDefs.h> #include <StorageDefs.h>
#include <mime/AssociatedTypes.h>
#include <mime/database_access.h> #include <mime/database_access.h>
#include <mime/InstalledTypes.h>
#include "AssociatedTypes.h" #include <mime/SnifferRules.h>
#include "InstalledTypes.h" #include <mime/SupportingApps.h>
#include "SnifferRules.h"
#include "SupportingApps.h"
class BNode; class BNode;
@@ -37,6 +36,8 @@ namespace BPrivate {
namespace Storage { namespace Storage {
namespace Mime { namespace Mime {
class MimeSniffer;
// types of mime update functions that may be run asynchronously // types of mime update functions that may be run asynchronously
typedef enum { typedef enum {
B_REG_UPDATE_MIME_INFO, B_REG_UPDATE_MIME_INFO,
@@ -45,7 +46,11 @@ typedef enum {
class Database { class Database {
public: public:
Database(); class NotificationListener;
public:
Database(MimeSniffer* mimeSniffer,
NotificationListener* notificationListener);
~Database(); ~Database();
status_t InitCheck() const; status_t InitCheck() const;
@@ -137,6 +142,7 @@ class Database {
private: private:
status_t fStatus; status_t fStatus;
NotificationListener* fNotificationListener;
std::set<BMessenger> fMonitorMessengers; std::set<BMessenger> fMonitorMessengers;
AssociatedTypes fAssociatedTypes; AssociatedTypes fAssociatedTypes;
InstalledTypes fInstalledTypes; InstalledTypes fInstalledTypes;
@@ -169,6 +175,16 @@ class InstallNotificationDeferrer {
const char* fType; const char* fType;
}; };
class Database::NotificationListener {
public:
virtual ~NotificationListener();
virtual status_t Notify(BMessage* message,
const BMessenger& target) = 0;
};
} // namespace Mime } // namespace Mime
} // namespace Storage } // namespace Storage
} // namespace BPrivate } // namespace BPrivate
@@ -12,6 +12,11 @@
#include <MergedDirectory.h> #include <MergedDirectory.h>
namespace BPrivate {
namespace Storage {
namespace Mime {
class DatabaseDirectory : public BMergedDirectory { class DatabaseDirectory : public BMergedDirectory {
public: public:
DatabaseDirectory(); DatabaseDirectory();
@@ -29,4 +34,9 @@ private:
}; };
} // namespace Mime
} // namespace Storage
} // namespace BPrivate
#endif // DATABASE_DIRECTORY_H #endif // DATABASE_DIRECTORY_H
@@ -10,11 +10,14 @@
#ifndef _MIME_INSTALLED_TYPES_H #ifndef _MIME_INSTALLED_TYPES_H
#define _MIME_INSTALLED_TYPES_H #define _MIME_INSTALLED_TYPES_H
#include "Supertype.h"
#include <map>
#include <string>
#include <SupportDefs.h> #include <SupportDefs.h>
#include <string> #include <mime/Supertype.h>
#include <map>
class BMessage; class BMessage;
@@ -0,0 +1,43 @@
/*
* Copyright 2013, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Ingo Weinhold <[email protected]>
*/
#ifndef _MIME_MIME_SNIFFER_H
#define _MIME_MIME_SNIFFER_H
#include <SupportDefs.h>
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
@@ -25,9 +25,12 @@ namespace Sniffer {
namespace Mime { namespace Mime {
class MimeSniffer;
class SnifferRules { class SnifferRules {
public: public:
SnifferRules(); SnifferRules(MimeSniffer* mimeSniffer);
~SnifferRules(); ~SnifferRules();
status_t GuessMimeType(const entry_ref *ref, BString *type); status_t GuessMimeType(const entry_ref *ref, BString *type);
@@ -54,8 +57,11 @@ private:
status_t ProcessType(const char *type, ssize_t *bytesNeeded); status_t ProcessType(const char *type, ssize_t *bytesNeeded);
std::list<sniffer_rule> fRuleList; std::list<sniffer_rule> fRuleList;
ssize_t fMaxBytesNeeded;
bool fHaveDoneFullBuild; private:
MimeSniffer* fMimeSniffer;
ssize_t fMaxBytesNeeded;
bool fHaveDoneFullBuild;
}; };
} // namespace Mime } // namespace Mime
+2
View File
@@ -35,6 +35,8 @@ SharedLibrary libbe.so : :
<libbe>storage_kit.o <libbe>storage_kit.o
<libbe>support_kit.o <libbe>support_kit.o
libstorage_kit_mime.a
libicon.a libicon.a
libagg.a libagg.a
+2 -4
View File
@@ -44,10 +44,6 @@ MergeObject <libbe>storage_kit.o :
VolumeRoster.cpp VolumeRoster.cpp
storage_support.cpp storage_support.cpp
# mime
database_access.cpp
database_support.cpp
# sniffer # sniffer
CharStream.cpp CharStream.cpp
Err.cpp Err.cpp
@@ -90,3 +86,5 @@ MergeObject <libbe>storage_kit.o :
SetStringJob.cpp SetStringJob.cpp
UninitializeJob.cpp UninitializeJob.cpp
; ;
HaikuSubInclude mime ;
@@ -7,7 +7,7 @@
AssociatedTypes class implementation AssociatedTypes class implementation
*/ */
#include "AssociatedTypes.h" #include <mime/AssociatedTypes.h>
#include <stdio.h> #include <stdio.h>
@@ -16,15 +16,14 @@
#include <Directory.h> #include <Directory.h>
#include <Entry.h> #include <Entry.h>
#include <Message.h> #include <Message.h>
#include <mime/database_support.h>
#include <mime/DatabaseDirectory.h>
#include <mime/MimeSniffer.h>
#include <MimeType.h> #include <MimeType.h>
#include <Path.h> #include <Path.h>
#include <String.h> #include <String.h>
#include <mime/database_support.h>
#include <storage_support.h> #include <storage_support.h>
#include "DatabaseDirectory.h"
#include "MimeSnifferAddonManager.h"
#define DBG(x) x #define DBG(x) x
//#define DBG(x) //#define DBG(x)
@@ -41,8 +40,10 @@ namespace Mime {
// Constructor // Constructor
//! Constructs a new AssociatedTypes object //! Constructs a new AssociatedTypes object
AssociatedTypes::AssociatedTypes() AssociatedTypes::AssociatedTypes(MimeSniffer* mimeSniffer)
: fHaveDoneFullBuild(false) :
fMimeSniffer(mimeSniffer),
fHaveDoneFullBuild(false)
{ {
} }
@@ -106,16 +107,13 @@ AssociatedTypes::GuessMimeType(const char *filename, BString *result)
if (!err && !fHaveDoneFullBuild) if (!err && !fHaveDoneFullBuild)
err = BuildAssociatedTypesTable(); err = BuildAssociatedTypesTable();
// if we have an MimeSnifferAddonManager, let's give it a shot first // if we have a mime sniffer, let's give it a shot first
if (!err) { if (!err && fMimeSniffer != NULL) {
MimeSnifferAddonManager* manager = MimeSnifferAddonManager::Default(); BMimeType mimeType;
if (manager) { float priority = fMimeSniffer->GuessMimeType(filename, &mimeType);
BMimeType mimeType; if (priority >= 0) {
float priority = manager->GuessMimeType(filename, &mimeType); *result = mimeType.Type();
if (priority >= 0) { return B_OK;
*result = mimeType.Type();
return B_OK;
}
} }
} }
@@ -8,7 +8,7 @@
*/ */
#include "Database.h" #include <mime/Database.h>
#include <stdio.h> #include <stdio.h>
#include <string> #include <string>
@@ -34,7 +34,6 @@
#include <mime/database_support.h> #include <mime/database_support.h>
#include <storage_support.h> #include <storage_support.h>
#include "MessageDeliverer.h"
//#define DBG(x) x //#define DBG(x) x
#define DBG(x) #define DBG(x)
@@ -45,6 +44,12 @@ namespace BPrivate {
namespace Storage { namespace Storage {
namespace Mime { namespace Mime {
Database::NotificationListener::~NotificationListener()
{
}
/*! /*!
\class Database \class Database
\brief Mime::Database is the master of the MIME data base. \brief Mime::Database is the master of the MIME data base.
@@ -59,9 +64,13 @@ namespace Mime {
// constructor // constructor
/*! \brief Creates and initializes a Mime::Database object. /*! \brief Creates and initializes a Mime::Database object.
*/ */
Database::Database() Database::Database(MimeSniffer* mimeSniffer,
NotificationListener* notificationListener)
: :
fStatus(B_NO_INIT), fStatus(B_NO_INIT),
fNotificationListener(notificationListener),
fAssociatedTypes(mimeSniffer),
fSnifferRules(mimeSniffer),
fDeferredInstallNotificationsLocker("deferred install notifications"), fDeferredInstallNotificationsLocker("deferred install notifications"),
fDeferredInstallNotifications() fDeferredInstallNotifications()
{ {
@@ -1472,16 +1481,17 @@ Database::_SendMonitorUpdate(int32 which, const char *type, int32 action)
status_t status_t
Database::_SendMonitorUpdate(BMessage &msg) Database::_SendMonitorUpdate(BMessage &msg)
{ {
// DBG(OUT("Database::_SendMonitorUpdate(BMessage&)\n")); if (fNotificationListener == NULL)
return B_OK;
status_t err; status_t err;
std::set<BMessenger>::const_iterator i; std::set<BMessenger>::const_iterator i;
for (i = fMonitorMessengers.begin(); i != fMonitorMessengers.end(); 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) { if (err) {
DBG(OUT("Database::_SendMonitorUpdate(BMessage&): DeliverMessage failed, 0x%lx\n", err)); DBG(OUT("Database::_SendMonitorUpdate(BMessage&): DeliverMessage failed, 0x%lx\n", err));
} }
} }
// DBG(OUT("Database::_SendMonitorUpdate(BMessage&) done\n"));
err = B_OK; err = B_OK;
return err; return err;
} }
@@ -7,7 +7,7 @@
*/ */
#include "DatabaseDirectory.h" #include <mime/DatabaseDirectory.h>
#include <fs_attr.h> #include <fs_attr.h>
#include <Node.h> #include <Node.h>
@@ -16,6 +16,11 @@
#include <mime/database_support.h> #include <mime/database_support.h>
namespace BPrivate {
namespace Storage {
namespace Mime {
DatabaseDirectory::DatabaseDirectory() DatabaseDirectory::DatabaseDirectory()
: :
BMergedDirectory(B_COMPARE) BMergedDirectory(B_COMPARE)
@@ -67,3 +72,8 @@ DatabaseDirectory::_IsValidMimeTypeEntry(const entry_ref& entry)
return node.SetTo(&entry) == B_OK return node.SetTo(&entry) == B_OK
&& node.GetAttrInfo(BPrivate::Storage::Mime::kTypeAttr, &info) == B_OK; && node.GetAttrInfo(BPrivate::Storage::Mime::kTypeAttr, &info) == B_OK;
} }
} // namespace Mime
} // namespace Storage
} // namespace BPrivate
@@ -9,7 +9,7 @@
*/ */
#include "InstalledTypes.h" #include <mime/InstalledTypes.h>
#include <stdio.h> #include <stdio.h>
@@ -22,10 +22,9 @@
#include <String.h> #include <String.h>
#include <mime/database_support.h> #include <mime/database_support.h>
#include <mime/DatabaseDirectory.h>
#include <storage_support.h> #include <storage_support.h>
#include "DatabaseDirectory.h"
#define DBG(x) x #define DBG(x) x
//#define DBG(x) //#define DBG(x)
+23
View File
@@ -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
;
+25
View File
@@ -0,0 +1,25 @@
/*
* Copyright 2013, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Ingo Weinhold <[email protected]>
*/
#include <mime/MimeSniffer.h>
namespace BPrivate {
namespace Storage {
namespace Mime {
MimeSniffer::~MimeSniffer()
{
}
} // namespace Mime
} // namespace Storage
} // namespace BPrivate
@@ -12,7 +12,7 @@
SnifferRules class implementation SnifferRules class implementation
*/ */
#include "SnifferRules.h" #include <mime/SnifferRules.h>
#include <stdio.h> #include <stdio.h>
#include <sys/stat.h> #include <sys/stat.h>
@@ -22,14 +22,14 @@
#include <File.h> #include <File.h>
#include <MimeType.h> #include <MimeType.h>
#include <mime/database_support.h> #include <mime/database_support.h>
#include <mime/DatabaseDirectory.h>
#include <mime/MimeSniffer.h>
#include <sniffer/Parser.h> #include <sniffer/Parser.h>
#include <sniffer/Rule.h> #include <sniffer/Rule.h>
#include <StorageDefs.h> #include <StorageDefs.h>
#include <storage_support.h> #include <storage_support.h>
#include <String.h> #include <String.h>
#include "DatabaseDirectory.h"
#include "MimeSnifferAddonManager.h"
#define DBG(x) x #define DBG(x) x
//#define DBG(x) //#define DBG(x)
@@ -112,8 +112,11 @@ bool operator<(SnifferRules::sniffer_rule &left, SnifferRules::sniffer_rule &rig
// Constructor // Constructor
//! Constructs a new SnifferRules object //! Constructs a new SnifferRules object
SnifferRules::SnifferRules() SnifferRules::SnifferRules(MimeSniffer* mimeSniffer)
: fHaveDoneFullBuild(false) :
fMimeSniffer(mimeSniffer),
fMaxBytesNeeded(0),
fHaveDoneFullBuild(false)
{ {
} }
@@ -449,15 +452,12 @@ SnifferRules::GuessMimeType(BFile* file, const void *buffer, int32 length,
if (!err && !fHaveDoneFullBuild) if (!err && !fHaveDoneFullBuild)
err = BuildRuleList(); err = BuildRuleList();
// first ask the MimeSnifferAddonManager for a suitable type // first ask the MIME sniffer for a suitable type
float addonPriority = -1; float addonPriority = -1;
BMimeType mimeType; BMimeType mimeType;
if (!err) { if (!err && fMimeSniffer != NULL) {
MimeSnifferAddonManager* manager = MimeSnifferAddonManager::Default(); addonPriority = fMimeSniffer->GuessMimeType(file, buffer, length,
if (manager) { &mimeType);
addonPriority = manager->GuessMimeType(file, buffer, length,
&mimeType);
}
} }
if (!err) { if (!err) {
@@ -520,10 +520,10 @@ SnifferRules::MaxBytesNeeded()
ssize_t err = fHaveDoneFullBuild ? B_OK : BuildRuleList(); ssize_t err = fHaveDoneFullBuild ? B_OK : BuildRuleList();
if (!err) { if (!err) {
err = fMaxBytesNeeded; err = fMaxBytesNeeded;
MimeSnifferAddonManager* manager = MimeSnifferAddonManager::Default();
if (manager) { if (fMimeSniffer != NULL) {
fMaxBytesNeeded = max_c(fMaxBytesNeeded, fMaxBytesNeeded = max_c(fMaxBytesNeeded,
(ssize_t)manager->MinimalBufferSize()); (ssize_t)fMimeSniffer->MinimalBufferSize());
} }
} }
return err; return err;
@@ -7,7 +7,7 @@
Supertype class implementation Supertype class implementation
*/ */
#include "Supertype.h" #include <mime/Supertype.h>
#include <Message.h> #include <Message.h>
#include <mime/database_support.h> #include <mime/database_support.h>
@@ -9,7 +9,7 @@
*/ */
#include "SupportingApps.h" #include <mime/SupportingApps.h>
#include <stdio.h> #include <stdio.h>
@@ -23,10 +23,9 @@
#include <String.h> #include <String.h>
#include <mime/database_support.h> #include <mime/database_support.h>
#include <mime/DatabaseDirectory.h>
#include <storage_support.h> #include <storage_support.h>
#include "DatabaseDirectory.h"
#define DBG(x) x #define DBG(x) x
//#define DBG(x) //#define DBG(x)
+2 -1
View File
@@ -12,6 +12,8 @@
Mime database atomic read functions Mime database atomic read functions
*/ */
#include <mime/database_access.h>
#include <Bitmap.h> #include <Bitmap.h>
#include <Entry.h> #include <Entry.h>
#include <Directory.h> #include <Directory.h>
@@ -30,7 +32,6 @@
#include <stdio.h> #include <stdio.h>
#include <string> #include <string>
#include "mime/database_access.h"
#define DBG(x) x #define DBG(x) x
//#define DBG(x) //#define DBG(x)
+1 -7
View File
@@ -40,21 +40,15 @@ Server registrar
WatchingService.cpp WatchingService.cpp
# mime # mime
AssociatedTypes.cpp
CreateAppMetaMimeThread.cpp CreateAppMetaMimeThread.cpp
Database.cpp
DatabaseDirectory.cpp
InstalledTypes.cpp
MimeSnifferAddon.cpp MimeSnifferAddon.cpp
MimeSnifferAddonManager.cpp MimeSnifferAddonManager.cpp
MimeUpdateThread.cpp MimeUpdateThread.cpp
RegistrarThread.cpp RegistrarThread.cpp
RegistrarThreadManager.cpp RegistrarThreadManager.cpp
SnifferRules.cpp
Supertype.cpp
SupportingApps.cpp
UpdateMimeInfoThread.cpp UpdateMimeInfoThread.cpp
: :
libstorage_kit_mime.a
be be
$(TARGET_LIBSTDC++) $(TARGET_LIBSTDC++)
$(HAIKU_LOCALE_LIBS) $(HAIKU_LOCALE_LIBS)
+21 -9
View File
@@ -22,6 +22,7 @@
#include <TypeConstants.h> #include <TypeConstants.h>
#include "CreateAppMetaMimeThread.h" #include "CreateAppMetaMimeThread.h"
#include "MessageDeliverer.h"
#include "MimeSnifferAddonManager.h" #include "MimeSnifferAddonManager.h"
#include "TextSnifferAddon.h" #include "TextSnifferAddon.h"
#include "UpdateMimeInfoThread.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. /*! \brief Creates and initializes a MIMEManager.
*/ */
MIMEManager::MIMEManager() MIMEManager::MIMEManager()
: :
BLooper("main_mime"), BLooper("main_mime"),
fDatabase(), fDatabase(init_mime_sniffer_add_on_manager(), this),
fThreadManager() fThreadManager()
{ {
AddHandler(&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 //! Handles all B_REG_MIME_SET_PARAM messages
void void
MIMEManager::HandleSetParam(BMessage *message) MIMEManager::HandleSetParam(BMessage *message)
+10 -2
View File
@@ -5,15 +5,23 @@
#include <Looper.h> #include <Looper.h>
#include "Database.h" #include <mime/Database.h>
#include "RegistrarThreadManager.h" #include "RegistrarThreadManager.h"
class MIMEManager : public BLooper {
class MIMEManager : public BLooper,
private BPrivate::Storage::Mime::Database::NotificationListener {
public: public:
MIMEManager(); MIMEManager();
virtual ~MIMEManager(); virtual ~MIMEManager();
virtual void MessageReceived(BMessage *message); virtual void MessageReceived(BMessage *message);
private:
// Database::NotificationListener
virtual status_t Notify(BMessage* message, const BMessenger& target);
private: private:
void HandleSetParam(BMessage *message); void HandleSetParam(BMessage *message);
void HandleDeleteParam(BMessage *message); void HandleDeleteParam(BMessage *message);
@@ -21,10 +21,9 @@
#include <Path.h> #include <Path.h>
#include <String.h> #include <String.h>
#include <mime/Database.h>
#include <mime/database_support.h> #include <mime/database_support.h>
#include "Database.h"
namespace BPrivate { namespace BPrivate {
namespace Storage { namespace Storage {
@@ -8,6 +8,9 @@
#include <List.h> #include <List.h>
#include <Locker.h> #include <Locker.h>
#include <mime/MimeSniffer.h>
class BFile; class BFile;
class BMimeSnifferAddon; class BMimeSnifferAddon;
class BMimeType; class BMimeType;
@@ -17,7 +20,7 @@ namespace Storage {
namespace Mime { namespace Mime {
class MimeSnifferAddonManager { class MimeSnifferAddonManager : public BPrivate::Storage::Mime::MimeSniffer {
private: private:
MimeSnifferAddonManager(); MimeSnifferAddonManager();
~MimeSnifferAddonManager(); ~MimeSnifferAddonManager();
@@ -29,14 +32,14 @@ public:
status_t AddMimeSnifferAddon(BMimeSnifferAddon* addon); 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); BMimeType* type);
float GuessMimeType(BFile* file, virtual float GuessMimeType(BFile* file,
const void* buffer, int32 length, const void* buffer, int32 length,
BMimeType* type); BMimeType* type);
private: private:
struct AddonReference; struct AddonReference;