TextSnifferAddon: Use MIME DB directly
A DatabaseLocation is passed to the constructor and used to verify that the sniffed MIME type is installed instead of BMimeType::IsInstalled(). This makes the add-on independent of the default MIME DB.
This commit is contained in:
parent
85835e4186
commit
6140f897d4
|
@ -14,9 +14,13 @@ namespace Storage {
|
|||
namespace Mime {
|
||||
|
||||
|
||||
class DatabaseLocation;
|
||||
|
||||
|
||||
class TextSnifferAddon : public BMimeSnifferAddon {
|
||||
public:
|
||||
TextSnifferAddon();
|
||||
TextSnifferAddon(
|
||||
DatabaseLocation* databaseLocation);
|
||||
virtual ~TextSnifferAddon();
|
||||
|
||||
virtual size_t MinimalBufferSize();
|
||||
|
@ -26,6 +30,9 @@ public:
|
|||
virtual float GuessMimeType(BFile* file,
|
||||
const void* buffer, int32 length,
|
||||
BMimeType* type);
|
||||
|
||||
private:
|
||||
DatabaseLocation* fDatabaseLocation;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -8,18 +8,22 @@
|
|||
|
||||
#include <MimeType.h>
|
||||
|
||||
#include <mime/DatabaseLocation.h>
|
||||
|
||||
|
||||
namespace BPrivate {
|
||||
namespace Storage {
|
||||
namespace Mime {
|
||||
|
||||
|
||||
static int file_ascmagic(const unsigned char *buf, size_t nbytes,
|
||||
BMimeType* mimeType);
|
||||
static int file_ascmagic(DatabaseLocation* databaseLocation,
|
||||
const unsigned char *buf, size_t nbytes, BMimeType* mimeType);
|
||||
|
||||
|
||||
// constructor
|
||||
TextSnifferAddon::TextSnifferAddon()
|
||||
TextSnifferAddon::TextSnifferAddon(DatabaseLocation* databaseLocation)
|
||||
:
|
||||
fDatabaseLocation(databaseLocation)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -48,7 +52,8 @@ float
|
|||
TextSnifferAddon::GuessMimeType(BFile* file, const void* buffer, int32 length,
|
||||
BMimeType* type)
|
||||
{
|
||||
if (file_ascmagic((const unsigned char*)buffer, length, type)) {
|
||||
if (file_ascmagic(fDatabaseLocation, (const unsigned char*)buffer, length,
|
||||
type)) {
|
||||
// If the buffer is very short, we return a lower priority. Maybe
|
||||
// someone else knows better.
|
||||
if (length < 20)
|
||||
|
@ -128,7 +133,8 @@ static int ascmatch(const unsigned char *, const my_unichar *, size_t);
|
|||
|
||||
|
||||
static int
|
||||
file_ascmagic(const unsigned char *buf, size_t nbytes, BMimeType* mimeType)
|
||||
file_ascmagic(DatabaseLocation* databaseLocation, const unsigned char *buf,
|
||||
size_t nbytes, BMimeType* mimeType)
|
||||
{
|
||||
size_t i;
|
||||
unsigned char *nbuf = NULL;
|
||||
|
@ -330,15 +336,17 @@ done:
|
|||
|
||||
bool found = false;
|
||||
if (subtypeMimeSpecific != NULL) {
|
||||
if (databaseLocation->IsInstalled(subtypeMimeSpecific)) {
|
||||
mimeType->SetTo(subtypeMimeSpecific);
|
||||
if (mimeType->IsInstalled())
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (!found && subtypeMimeGeneric != NULL) {
|
||||
if (databaseLocation->IsInstalled(subtypeMimeGeneric)) {
|
||||
mimeType->SetTo(subtypeMimeGeneric);
|
||||
if (mimeType->IsInstalled())
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
mimeType->SetTo("text/plain");
|
||||
}
|
||||
|
|
|
@ -51,7 +51,8 @@ init_mime_sniffer_add_on_manager()
|
|||
return NULL;
|
||||
|
||||
MimeSnifferAddonManager* manager = MimeSnifferAddonManager::Default();
|
||||
manager->AddMimeSnifferAddon(new(nothrow) TextSnifferAddon());
|
||||
manager->AddMimeSnifferAddon(new(nothrow) TextSnifferAddon(
|
||||
BPrivate::Storage::Mime::default_database_location()));
|
||||
return manager;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue