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:
Ingo Weinhold 2013-11-22 12:14:34 +01:00
parent 85835e4186
commit 6140f897d4
3 changed files with 29 additions and 13 deletions

View File

@ -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;
};

View File

@ -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,14 +336,16 @@ done:
bool found = false;
if (subtypeMimeSpecific != NULL) {
mimeType->SetTo(subtypeMimeSpecific);
if (mimeType->IsInstalled())
found = true;
if (databaseLocation->IsInstalled(subtypeMimeSpecific)) {
mimeType->SetTo(subtypeMimeSpecific);
found = true;
}
}
if (!found && subtypeMimeGeneric != NULL) {
mimeType->SetTo(subtypeMimeGeneric);
if (mimeType->IsInstalled())
found = true;
if (databaseLocation->IsInstalled(subtypeMimeGeneric)) {
mimeType->SetTo(subtypeMimeGeneric);
found = true;
}
}
if (!found)
mimeType->SetTo("text/plain");

View File

@ -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;
}