hrev46407 adds 3 changesets to branch 'master' old head: eb539d59e7d26369ad2cbb9b3780cfdbc78a8a37 new head: 2b76973fa2401f7a5edf68e6470f3d3210cbcff3 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=2b76973+%5Eeb539d5 ---------------------------------------------------------------------------- 85835e4: registrar: Move more classes to libstorage_kit_mime.a Move MimeSnifferAddon, MimeSnifferAddonManager, and TextSnifferAddon to libstorage_kit_mime.a, so we can reuse them. 6140f89: 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. 2b76973: mimeset: Use TextSnifferAddon when using a custom MIME DB That addresses the problem that packaged text files aren't correctly identified (ticket #9972). All concerned packages have to be rebuilt, of course. [ Ingo Weinhold <ingo_weinhold@xxxxxx> ] ---------------------------------------------------------------------------- 16 files changed, 140 insertions(+), 64 deletions(-) build/jam/BuildSetup | 1 + .../os/add-ons/registrar/MimeSnifferAddon.h | 1 + .../storage/mime/MimeSnifferAddonManager.h | 1 + .../private/storage/mime/TextSnifferAddon.h | 1 + .../storage}/mime/MimeSnifferAddonManager.h | 14 +++--- headers/private/storage/mime/TextSnifferAddon.h | 44 ++++++++++++++++++ src/bin/mimeset.cpp | 17 ++++++- src/build/libbe/storage/Jamfile | 3 ++ src/kits/storage/mime/Jamfile | 3 ++ .../storage}/mime/MimeSnifferAddon.cpp | 8 ++-- .../storage}/mime/MimeSnifferAddonManager.cpp | 26 +++++++---- .../storage/mime}/TextSnifferAddon.cpp | 47 ++++++++++++++------ .../registrar => kits/storage/mime}/names.h | 0 src/servers/registrar/Jamfile | 3 -- src/servers/registrar/MIMEManager.cpp | 11 +++-- src/servers/registrar/TextSnifferAddon.h | 24 ---------- ############################################################################ Commit: 85835e41862b98714845fd143a4df5b2c7369dd9 URL: http://cgit.haiku-os.org/haiku/commit/?id=85835e4 Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Fri Nov 22 10:14:19 2013 UTC registrar: Move more classes to libstorage_kit_mime.a Move MimeSnifferAddon, MimeSnifferAddonManager, and TextSnifferAddon to libstorage_kit_mime.a, so we can reuse them. ---------------------------------------------------------------------------- diff --git a/src/servers/registrar/mime/MimeSnifferAddonManager.h b/headers/private/storage/mime/MimeSnifferAddonManager.h similarity index 79% rename from src/servers/registrar/mime/MimeSnifferAddonManager.h rename to headers/private/storage/mime/MimeSnifferAddonManager.h index ccf016e..de06251 100644 --- a/src/servers/registrar/mime/MimeSnifferAddonManager.h +++ b/headers/private/storage/mime/MimeSnifferAddonManager.h @@ -1,13 +1,15 @@ /* - * Copyright 2006, Ingo Weinhold <bonefish@xxxxxxxxxxxxxxx>. - * All rights reserved. Distributed under the terms of the MIT License. + * Copyright 2006-2013, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Distributed under the terms of the MIT License. */ -#ifndef MIME_SNIFFER_ADDON_MANAGER_H -#define MIME_SNIFFER_ADDON_MANAGER_H +#ifndef _MINE_MIME_SNIFFER_ADDON_MANAGER_H +#define _MINE_MIME_SNIFFER_ADDON_MANAGER_H + #include <List.h> #include <Locker.h> + #include <mime/MimeSniffer.h> @@ -15,6 +17,7 @@ class BFile; class BMimeSnifferAddon; class BMimeType; + namespace BPrivate { namespace Storage { namespace Mime { @@ -59,7 +62,6 @@ private: } // namespace Storage } // namespace BPrivate -using BPrivate::Storage::Mime::MimeSnifferAddonManager; -#endif // MIME_SNIFFER_ADDON_MANAGER_H +#endif // _MINE_MIME_SNIFFER_ADDON_MANAGER_H diff --git a/src/servers/registrar/TextSnifferAddon.h b/headers/private/storage/mime/TextSnifferAddon.h similarity index 53% rename from src/servers/registrar/TextSnifferAddon.h rename to headers/private/storage/mime/TextSnifferAddon.h index 300f808..4a0adb8 100644 --- a/src/servers/registrar/TextSnifferAddon.h +++ b/headers/private/storage/mime/TextSnifferAddon.h @@ -1,12 +1,19 @@ /* - * Copyright 2006, Ingo Weinhold <bonefish@xxxxxxxxxxxxxxx>. - * All rights reserved. Distributed under the terms of the MIT License. + * Copyright 2006-2013, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Distributed under the terms of the MIT License. */ -#ifndef TEXT_SNIFFER_ADDON_H -#define TEXT_SNIFFER_ADDON_H +#ifndef _MIME_TEXT_SNIFFER_ADDON_H +#define _MIME_TEXT_SNIFFER_ADDON_H + #include <MimeSnifferAddon.h> + +namespace BPrivate { +namespace Storage { +namespace Mime { + + class TextSnifferAddon : public BMimeSnifferAddon { public: TextSnifferAddon(); @@ -21,4 +28,10 @@ public: BMimeType* type); }; -#endif // TEXT_SNIFFER_ADDON_H + +} // namespace Mime +} // namespace Storage +} // namespace BPrivate + + +#endif // _MIME_TEXT_SNIFFER_ADDON_H diff --git a/src/kits/storage/mime/Jamfile b/src/kits/storage/mime/Jamfile index a09277d..37de22d 100644 --- a/src/kits/storage/mime/Jamfile +++ b/src/kits/storage/mime/Jamfile @@ -20,9 +20,12 @@ for architectureObject in [ MultiArchSubDirSetup ] { MimeEntryProcessor.cpp MimeInfoUpdater.cpp MimeSniffer.cpp + MimeSnifferAddon.cpp + MimeSnifferAddonManager.cpp SnifferRules.cpp Supertype.cpp SupportingApps.cpp + TextSnifferAddon.cpp ; } } diff --git a/src/servers/registrar/mime/MimeSnifferAddon.cpp b/src/kits/storage/mime/MimeSnifferAddon.cpp similarity index 73% rename from src/servers/registrar/mime/MimeSnifferAddon.cpp rename to src/kits/storage/mime/MimeSnifferAddon.cpp index 1460bbd..0a53ebc 100644 --- a/src/servers/registrar/mime/MimeSnifferAddon.cpp +++ b/src/kits/storage/mime/MimeSnifferAddon.cpp @@ -1,9 +1,11 @@ /* - * Copyright 2006, Ingo Weinhold <bonefish@xxxxxxxxxxxxxxx>. - * All rights reserved. Distributed under the terms of the MIT License. + * Copyright 2006-2013, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Distributed under the terms of the MIT License. */ -#include "MimeSnifferAddon.h" + +#include <MimeSnifferAddon.h> + // constructor BMimeSnifferAddon::BMimeSnifferAddon() diff --git a/src/servers/registrar/mime/MimeSnifferAddonManager.cpp b/src/kits/storage/mime/MimeSnifferAddonManager.cpp similarity index 88% rename from src/servers/registrar/mime/MimeSnifferAddonManager.cpp rename to src/kits/storage/mime/MimeSnifferAddonManager.cpp index 5f3d433..58272fc 100644 --- a/src/servers/registrar/mime/MimeSnifferAddonManager.cpp +++ b/src/kits/storage/mime/MimeSnifferAddonManager.cpp @@ -1,18 +1,22 @@ /* - * Copyright 2006, Ingo Weinhold <bonefish@xxxxxxxxxxxxxxx>. - * All rights reserved. Distributed under the terms of the MIT License. + * Copyright 2006-2013, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Distributed under the terms of the MIT License. */ -#include "MimeSnifferAddonManager.h" + +#include <mime/MimeSnifferAddonManager.h> #include <new> #include <Autolock.h> #include <MimeType.h> -#include "MimeSnifferAddon.h" +#include <MimeSnifferAddon.h> + -using std::nothrow; +namespace BPrivate { +namespace Storage { +namespace Mime { // singleton instance @@ -78,7 +82,8 @@ MimeSnifferAddonManager::Default() status_t MimeSnifferAddonManager::CreateDefault() { - MimeSnifferAddonManager* manager = new(nothrow) MimeSnifferAddonManager; + MimeSnifferAddonManager* manager + = new(std::nothrow) MimeSnifferAddonManager; if (!manager) return B_NO_MEMORY; @@ -109,7 +114,7 @@ MimeSnifferAddonManager::AddMimeSnifferAddon(BMimeSnifferAddon* addon) return B_ERROR; // create a reference for the addon - AddonReference* reference = new(nothrow) AddonReference(addon); + AddonReference* reference = new(std::nothrow) AddonReference(addon); if (!reference) return B_NO_MEMORY; @@ -202,7 +207,7 @@ MimeSnifferAddonManager::_GetAddons(AddonReference**& references, int32& count) return B_ERROR; count = fAddons.CountItems(); - references = new(nothrow) AddonReference*[count]; + references = new(std::nothrow) AddonReference*[count]; if (!references) return B_NO_MEMORY; @@ -223,3 +228,8 @@ MimeSnifferAddonManager::_PutAddons(AddonReference** references, int32 count) delete[] references; } + + +} // namespace Mime +} // namespace Storage +} // namespace BPrivate diff --git a/src/servers/registrar/TextSnifferAddon.cpp b/src/kits/storage/mime/TextSnifferAddon.cpp similarity index 98% rename from src/servers/registrar/TextSnifferAddon.cpp rename to src/kits/storage/mime/TextSnifferAddon.cpp index 1773eab..9120c51 100644 --- a/src/servers/registrar/TextSnifferAddon.cpp +++ b/src/kits/storage/mime/TextSnifferAddon.cpp @@ -1,13 +1,19 @@ /* - * Copyright 2006, Ingo Weinhold <bonefish@xxxxxxxxxxxxxxx>. - * All rights reserved. Distributed under the terms of the MIT License. + * Copyright 2006-2013, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Distributed under the terms of the MIT License. */ -#include "TextSnifferAddon.h" + +#include <mime/TextSnifferAddon.h> #include <MimeType.h> +namespace BPrivate { +namespace Storage { +namespace Mime { + + static int file_ascmagic(const unsigned char *buf, size_t nbytes, BMimeType* mimeType); @@ -686,3 +692,8 @@ from_ebcdic(const unsigned char *buf, size_t nbytes, unsigned char *out) out[i] = ebcdic_to_ascii[buf[i]]; } } + + +} // namespace Mime +} // namespace Storage +} // namespace BPrivate diff --git a/src/servers/registrar/names.h b/src/kits/storage/mime/names.h similarity index 100% rename from src/servers/registrar/names.h rename to src/kits/storage/mime/names.h diff --git a/src/servers/registrar/Jamfile b/src/servers/registrar/Jamfile index bf02ee4..40b3416 100644 --- a/src/servers/registrar/Jamfile +++ b/src/servers/registrar/Jamfile @@ -34,15 +34,12 @@ Server registrar RosterAppInfo.cpp RosterSettingsCharStream.cpp ShutdownProcess.cpp - TextSnifferAddon.cpp TRoster.cpp Watcher.cpp WatchingService.cpp # mime CreateAppMetaMimeThread.cpp - MimeSnifferAddon.cpp - MimeSnifferAddonManager.cpp MimeUpdateThread.cpp RegistrarThread.cpp RegistrarThreadManager.cpp diff --git a/src/servers/registrar/MIMEManager.cpp b/src/servers/registrar/MIMEManager.cpp index 89d6ef1..2021448 100644 --- a/src/servers/registrar/MIMEManager.cpp +++ b/src/servers/registrar/MIMEManager.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009, Haiku Inc. + * Copyright 2002-2013, Haiku Inc. * Distributed under the terms of the MIT License. * * Authors: @@ -23,16 +23,18 @@ #include <mime/AppMetaMimeCreator.h> #include <mime/database_support.h> +#include <mime/MimeSnifferAddonManager.h> +#include <mime/TextSnifferAddon.h> #include "CreateAppMetaMimeThread.h" #include "MessageDeliverer.h" -#include "MimeSnifferAddonManager.h" -#include "TextSnifferAddon.h" #include "UpdateMimeInfoThread.h" using namespace std; using namespace BPrivate; +using BPrivate::Storage::Mime::MimeSnifferAddonManager; +using BPrivate::Storage::Mime::TextSnifferAddon; /*! \class MIMEManager ############################################################################ Commit: 6140f897d4bb393fd0fd1ca82261b7a0d440aab0 URL: http://cgit.haiku-os.org/haiku/commit/?id=6140f89 Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Fri Nov 22 11:14:34 2013 UTC 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. ---------------------------------------------------------------------------- diff --git a/headers/private/storage/mime/TextSnifferAddon.h b/headers/private/storage/mime/TextSnifferAddon.h index 4a0adb8..7ef924e 100644 --- a/headers/private/storage/mime/TextSnifferAddon.h +++ b/headers/private/storage/mime/TextSnifferAddon.h @@ -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; }; diff --git a/src/kits/storage/mime/TextSnifferAddon.cpp b/src/kits/storage/mime/TextSnifferAddon.cpp index 9120c51..3dd02f5 100644 --- a/src/kits/storage/mime/TextSnifferAddon.cpp +++ b/src/kits/storage/mime/TextSnifferAddon.cpp @@ -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"); diff --git a/src/servers/registrar/MIMEManager.cpp b/src/servers/registrar/MIMEManager.cpp index 2021448..7be789b 100644 --- a/src/servers/registrar/MIMEManager.cpp +++ b/src/servers/registrar/MIMEManager.cpp @@ -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; } ############################################################################ Revision: hrev46407 Commit: 2b76973fa2401f7a5edf68e6470f3d3210cbcff3 URL: http://cgit.haiku-os.org/haiku/commit/?id=2b76973 Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Fri Nov 22 11:20:39 2013 UTC Ticket: https://dev.haiku-os.org/ticket/9972 mimeset: Use TextSnifferAddon when using a custom MIME DB That addresses the problem that packaged text files aren't correctly identified (ticket #9972). All concerned packages have to be rebuilt, of course. ---------------------------------------------------------------------------- diff --git a/build/jam/BuildSetup b/build/jam/BuildSetup index 858fb07..a435ee5 100644 --- a/build/jam/BuildSetup +++ b/build/jam/BuildSetup @@ -599,6 +599,7 @@ if $(HOST_PLATFORM) = freebsd { HOST_BE_API_HEADERS = [ FDirName $(HAIKU_TOP) headers build ] [ FDirName $(HAIKU_TOP) headers build os ] + [ FDirName $(HAIKU_TOP) headers build os add-ons registrar ] [ FDirName $(HAIKU_TOP) headers build os app ] [ FDirName $(HAIKU_TOP) headers build os drivers ] [ FDirName $(HAIKU_TOP) headers build os kernel ] diff --git a/headers/build/os/add-ons/registrar/MimeSnifferAddon.h b/headers/build/os/add-ons/registrar/MimeSnifferAddon.h new file mode 100644 index 0000000..70a0364 --- /dev/null +++ b/headers/build/os/add-ons/registrar/MimeSnifferAddon.h @@ -0,0 +1 @@ +#include <../os/add-ons/registrar/MimeSnifferAddon.h> diff --git a/headers/build/private/storage/mime/MimeSnifferAddonManager.h b/headers/build/private/storage/mime/MimeSnifferAddonManager.h new file mode 100644 index 0000000..6e654ca --- /dev/null +++ b/headers/build/private/storage/mime/MimeSnifferAddonManager.h @@ -0,0 +1 @@ +#include <../../../private/storage/mime/MimeSnifferAddonManager.h> diff --git a/headers/build/private/storage/mime/TextSnifferAddon.h b/headers/build/private/storage/mime/TextSnifferAddon.h new file mode 100644 index 0000000..4cd3774 --- /dev/null +++ b/headers/build/private/storage/mime/TextSnifferAddon.h @@ -0,0 +1 @@ +#include <../../../private/storage/mime/TextSnifferAddon.h> diff --git a/src/bin/mimeset.cpp b/src/bin/mimeset.cpp index 17c0d36..18f5b76 100644 --- a/src/bin/mimeset.cpp +++ b/src/bin/mimeset.cpp @@ -17,6 +17,8 @@ #include <mime/Database.h> #include <mime/DatabaseLocation.h> #include <mime/MimeInfoUpdater.h> +#include <mime/MimeSnifferAddonManager.h> +#include <mime/TextSnifferAddon.h> using namespace BPrivate::Storage::Mime; @@ -204,13 +206,24 @@ main(int argc, const char** argv) for (int32 i = 0; i < count; i++) databaseLocation.AddDirectory(databaseDirectories.StringAt(i)); - sDatabase = new(std::nothrow) Database(&databaseLocation, NULL, NULL); + status_t error = MimeSnifferAddonManager::CreateDefault(); + if (error != B_OK) { + fprintf(stderr, "%s: Failed to create MIME sniffer add-on " + "manager: %s\n", sProgramName, strerror(error)); + exit(1); + } + MimeSnifferAddonManager* manager = MimeSnifferAddonManager::Default(); + manager->AddMimeSnifferAddon( + new(std::nothrow) TextSnifferAddon(&databaseLocation)); + + sDatabase = new(std::nothrow) Database(&databaseLocation, manager, + NULL); if (sDatabase == NULL) { fprintf(stderr, "%s: Out of memory!\n", sProgramName); exit(1); } - status_t error = sDatabase->InitCheck(); + error = sDatabase->InitCheck(); if (error != B_OK) { fprintf(stderr, "%s: Failed to init MIME DB: %s\n", sProgramName, strerror(error)); diff --git a/src/build/libbe/storage/Jamfile b/src/build/libbe/storage/Jamfile index 27d02b1..da3e194 100644 --- a/src/build/libbe/storage/Jamfile +++ b/src/build/libbe/storage/Jamfile @@ -45,9 +45,12 @@ BuildPlatformMergeObjectPIC <libbe_build>storage_kit.o : MimeEntryProcessor.cpp MimeInfoUpdater.cpp MimeSniffer.cpp + MimeSnifferAddon.cpp + MimeSnifferAddonManager.cpp SnifferRules.cpp Supertype.cpp SupportingApps.cpp + TextSnifferAddon.cpp # sniffer CharStream.cpp