From 7500f29455264aee6cdff3334b9657d6a3928b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 28 Feb 2006 01:27:22 +0000 Subject: [PATCH] CreateAppMetaMimeThread::DoMimeUpdate() now also updates the supported types of an application as well as the their icons. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16541 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/storage/MimeType.h | 219 ++++++++---------- src/kits/storage/MimeType.cpp | 15 +- .../storage/mime/CreateAppMetaMimeThread.cpp | 168 +++++++++----- src/kits/storage/mime/SupportingApps.cpp | 2 +- 4 files changed, 215 insertions(+), 189 deletions(-) diff --git a/headers/os/storage/MimeType.h b/headers/os/storage/MimeType.h index b370b2722e..89d8070f67 100644 --- a/headers/os/storage/MimeType.h +++ b/headers/os/storage/MimeType.h @@ -1,14 +1,11 @@ -//---------------------------------------------------------------------- -// This software is part of the OpenBeOS distribution and is covered -// by the OpenBeOS license. -//--------------------------------------------------------------------- -/*! - \file MimeType.h - BMimeType interface declarations. -*/ +/* + * Copyright 2002-2006, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + */ #ifndef _MIME_TYPE_H #define _MIME_TYPE_H + #include #include @@ -24,6 +21,11 @@ class BMessenger; namespace BPrivate { class MimeDatabase; + namespace Storage { + namespace Mime { + class CreateAppMetaMimeThread; + } + } } enum app_verb { @@ -83,141 +85,120 @@ enum { \version 0.0.0 */ class BMimeType { -public: - BMimeType(); - BMimeType(const char *mimeType); - virtual ~BMimeType(); + public: + BMimeType(); + BMimeType(const char *mimeType); + virtual ~BMimeType(); - status_t SetTo(const char *mimeType); - void Unset(); - status_t InitCheck() const; + status_t SetTo(const char *mimeType); + void Unset(); + status_t InitCheck() const; - /* these functions simply perform string manipulations*/ - const char *Type() const; - bool IsValid() const; - bool IsSupertypeOnly() const; - status_t GetSupertype(BMimeType *superType) const; + /* these functions simply perform string manipulations*/ + const char *Type() const; + bool IsValid() const; + bool IsSupertypeOnly() const; + status_t GetSupertype(BMimeType *superType) const; - bool operator==(const BMimeType &type) const; - bool operator==(const char *type) const; + bool operator==(const BMimeType &type) const; + bool operator==(const char *type) const; - bool Contains(const BMimeType *type) const; + bool Contains(const BMimeType *type) const; - /* These functions are for managing data in the meta mime file*/ - status_t Install(); - status_t Delete(); - bool IsInstalled() const; - status_t GetIcon(BBitmap *icon, icon_size size) const; - status_t GetPreferredApp(char *signature, app_verb verb = B_OPEN) const; - status_t GetAttrInfo(BMessage *info) const; - status_t GetFileExtensions(BMessage *extensions) const; - status_t GetShortDescription(char *description) const; - status_t GetLongDescription(char *description) const; - status_t GetSupportingApps(BMessage *signatures) const; + /* These functions are for managing data in the meta mime file */ + status_t Install(); + status_t Delete(); + bool IsInstalled() const; + status_t GetIcon(BBitmap *icon, icon_size size) const; + status_t GetPreferredApp(char *signature, app_verb verb = B_OPEN) const; + status_t GetAttrInfo(BMessage *info) const; + status_t GetFileExtensions(BMessage *extensions) const; + status_t GetShortDescription(char *description) const; + status_t GetLongDescription(char *description) const; + status_t GetSupportingApps(BMessage *signatures) const; - status_t SetIcon(const BBitmap *icon, icon_size size); - status_t SetPreferredApp(const char *signature, app_verb verb = B_OPEN); - status_t SetAttrInfo(const BMessage *info); - status_t SetFileExtensions(const BMessage *extensions); - status_t SetShortDescription(const char *description); - status_t SetLongDescription(const char *description); + status_t SetIcon(const BBitmap *icon, icon_size size); + status_t SetPreferredApp(const char *signature, app_verb verb = B_OPEN); + status_t SetAttrInfo(const BMessage *info); + status_t SetFileExtensions(const BMessage *extensions); + status_t SetShortDescription(const char *description); + status_t SetLongDescription(const char *description); - static status_t GetInstalledSupertypes(BMessage *supertypes); - static status_t GetInstalledTypes(BMessage *types); - static status_t GetInstalledTypes(const char *supertype, - BMessage *subtypes); - static status_t GetWildcardApps(BMessage *wild_ones); - static bool IsValid(const char *mimeType); + static status_t GetInstalledSupertypes(BMessage *supertypes); + static status_t GetInstalledTypes(BMessage *types); + static status_t GetInstalledTypes(const char* supertype, + BMessage* subtypes); + static status_t GetWildcardApps(BMessage* wildcardApps); + static bool IsValid(const char *mimeType); - status_t GetAppHint(entry_ref *ref) const; - status_t SetAppHint(const entry_ref *ref); + status_t GetAppHint(entry_ref *ref) const; + status_t SetAppHint(const entry_ref *ref); - /* for application signatures only.*/ - status_t GetIconForType(const char *type, BBitmap *icon, + /* for application signatures only. */ + status_t GetIconForType(const char *type, BBitmap *icon, icon_size which) const; - status_t SetIconForType(const char *type, const BBitmap *icon, + status_t SetIconForType(const char *type, const BBitmap *icon, icon_size which); - /* sniffer rule manipulation */ - status_t GetSnifferRule(BString *result) const; - status_t SetSnifferRule(const char *); - static status_t CheckSnifferRule(const char *rule, BString *parseError); + /* sniffer rule manipulation */ + status_t GetSnifferRule(BString *result) const; + status_t SetSnifferRule(const char *); + static status_t CheckSnifferRule(const char *rule, BString *parseError); - /* calls to ask the sniffer to identify the MIME type of a file or data in - memory */ - static status_t GuessMimeType(const entry_ref *file, BMimeType *type); - static status_t GuessMimeType(const void *buffer, int32 length, - BMimeType *type); - static status_t GuessMimeType(const char *filename, BMimeType *type); + /* calls to ask the sniffer to identify the MIME type of a file or data in + memory */ + static status_t GuessMimeType(const entry_ref *file, BMimeType *type); + static status_t GuessMimeType(const void *buffer, int32 length, + BMimeType *type); + static status_t GuessMimeType(const char *filename, BMimeType *type); - static status_t StartWatching(BMessenger target); - static status_t StopWatching(BMessenger target); + static status_t StartWatching(BMessenger target); + static status_t StopWatching(BMessenger target); - /* Deprecated Use SetTo instead. */ - status_t SetType(const char *mimeType); + /* Deprecated. Use SetTo() instead. */ + status_t SetType(const char *mimeType); - /* Brand new Delete() methods */ - status_t DeleteAppHint(); - status_t DeleteAttrInfo(); - status_t DeleteShortDescription(); - status_t DeleteLongDescription(); - status_t DeleteFileExtensions(); - status_t DeleteIcon(icon_size size); - status_t DeleteIconForType(const char *type, icon_size which); - status_t DeletePreferredApp(app_verb verb = B_OPEN); - status_t DeleteSnifferRule(); - status_t DeleteSupportedTypes(bool fullSync = true); + /* Brand new Delete() methods */ + status_t DeleteAppHint(); + status_t DeleteAttrInfo(); + status_t DeleteShortDescription(); + status_t DeleteLongDescription(); + status_t DeleteFileExtensions(); + status_t DeleteIcon(icon_size size); + status_t DeleteIconForType(const char *type, icon_size which); + status_t DeletePreferredApp(app_verb verb = B_OPEN); + status_t DeleteSnifferRule(); + status_t DeleteSupportedTypes(bool fullSync = true); -private: - BMimeType(const char *mimeType, const char *mimePath); - // if mimePath is NULL, defaults to "/boot/home/config/settings/beos_mime/" - - friend class MimeTypeTest; + private: + BMimeType(const char *mimeType, const char *mimePath); + // if mimePath is NULL, defaults to "/boot/home/config/settings/beos_mime/" -// Uncomment, when needed... + friend class MimeTypeTest; + // for testing only - friend class BAppFileInfo; -// friend class BRoster; -// friend class TRosterApp; -// friend class TMimeWorker; + friend class BAppFileInfo; + friend class BPrivate::Storage::Mime::CreateAppMetaMimeThread; -// friend status_t _update_mime_info_(const char *, int32); -// friend status_t _real_update_app_(BAppFileInfo *, const char *, bool); + virtual void _ReservedMimeType1(); + virtual void _ReservedMimeType2(); + virtual void _ReservedMimeType3(); -// static void _set_local_dispatch_target_(BMessenger *, void (*)(BMessage *)); -// void _touch_(); + BMimeType &operator=(const BMimeType &); + BMimeType(const BMimeType &); - virtual void _ReservedMimeType1(); - virtual void _ReservedMimeType2(); - virtual void _ReservedMimeType3(); - - BMimeType &operator=(const BMimeType &); - BMimeType(const BMimeType &); - - -// void InitData(const char *type); -// void InitData(const char *type); -// status_t OpenFile(bool create_file = false, dev_t dev = -1) const; -// status_t CloseFile() const; - status_t GetSupportedTypes(BMessage *types); - status_t SetSupportedTypes(const BMessage *types, bool fullSync = true); + status_t GetSupportedTypes(BMessage* types); + status_t SetSupportedTypes(const BMessage* types, bool fullSync = true); - static status_t GetAssociatedTypes(const char *extension, BMessage *types); - -// void MimeChanged(int32 w, const char *type = NULL, -// bool large = true) const; + static status_t GetAssociatedTypes(const char *extension, BMessage *types); - - char *fType; - BFile *fMeta; - void *_unused; - entry_ref fRef; - int fWhere; - status_t fCStatus; - uint32 _reserved[3]; + private: + char* fType; + BFile* fMeta; + void* _unused; + entry_ref fRef; + status_t fCStatus; + uint32 _reserved[4]; }; - #endif // _MIME_TYPE_H - - diff --git a/src/kits/storage/MimeType.cpp b/src/kits/storage/MimeType.cpp index d4cb6fe721..1ba74e32d1 100644 --- a/src/kits/storage/MimeType.cpp +++ b/src/kits/storage/MimeType.cpp @@ -46,8 +46,9 @@ const char *B_APP_MIME_TYPE = B_ELF_APP_MIME_TYPE; /*! \brief Creates an uninitialized BMimeType object. */ BMimeType::BMimeType() - : fType(NULL) - , fCStatus(B_NO_INIT) + : + fType(NULL), + fCStatus(B_NO_INIT) { } @@ -59,8 +60,9 @@ BMimeType::BMimeType() \param mimeType The MIME string. */ BMimeType::BMimeType(const char *mimeType) - : fType(NULL) - , fCStatus(B_NO_INIT) + : + fType(NULL), + fCStatus(B_NO_INIT) { SetTo(mimeType); } @@ -102,7 +104,7 @@ BMimeType::SetTo(const char *mimeType) fCStatus = B_BAD_VALUE; } else { Unset(); - fType = new(std::nothrow) char[strlen(mimeType)+1]; + fType = new(std::nothrow) char[strlen(mimeType) + 1]; if (fType) { strcpy(fType, mimeType); fCStatus = B_OK; @@ -119,8 +121,7 @@ BMimeType::SetTo(const char *mimeType) void BMimeType::Unset() { - if (fType) - delete [] fType; + delete [] fType; fType = NULL; fCStatus = B_NO_INIT; } diff --git a/src/kits/storage/mime/CreateAppMetaMimeThread.cpp b/src/kits/storage/mime/CreateAppMetaMimeThread.cpp index 7725fe64d8..6269f23cc1 100644 --- a/src/kits/storage/mime/CreateAppMetaMimeThread.cpp +++ b/src/kits/storage/mime/CreateAppMetaMimeThread.cpp @@ -1,28 +1,32 @@ -//---------------------------------------------------------------------- -// This software is part of the OpenBeOS distribution and is covered -// by the OpenBeOS license. -//--------------------------------------------------------------------- -/*! - \file CreateAppMetaMimeThread.h - CreateAppMetaMimeThread implementation -*/ +/* + * Copyright 2002-2006, Haiku. + * Distributed under the terms of the MIT License. + * + * Authors: + * Tyler Dauwalder + * Axel Dörfler, axeld@pinc-software.de + */ + #include "mime/CreateAppMetaMimeThread.h" +#include "mime/database_support.h" +#include #include #include #include -#include #include #include #include #include + namespace BPrivate { namespace Storage { namespace Mime { + CreateAppMetaMimeThread::CreateAppMetaMimeThread(const char *name, int32 priority, BMessenger managerMessenger, const entry_ref *root, bool recursive, int32 force, BMessage *replyee) @@ -31,67 +35,107 @@ CreateAppMetaMimeThread::CreateAppMetaMimeThread(const char *name, { } + status_t -CreateAppMetaMimeThread::DoMimeUpdate(const entry_ref *entry, bool *entryIsDir) +CreateAppMetaMimeThread::DoMimeUpdate(const entry_ref* ref, bool* _entryIsDir) { - status_t err = entry ? B_OK : B_BAD_VALUE; - BNode node; - BString sig; - BMimeType mime; - BPath path; - attr_info info; - BBitmap miniIcon(BRect(0,0,15,15), B_BITMAP_NO_SERVER_LINK, B_CMAP8); + if (ref == NULL) + return B_BAD_VALUE; + BNode typeNode; - if (!err) - err = node.SetTo(entry); - if (!err && entryIsDir) - *entryIsDir = node.IsDirectory(); + BFile file; + status_t status = file.SetTo(ref, B_READ_ONLY); + if (status < B_OK) + return status; + + BAppFileInfo appInfo(&file); + status = appInfo.InitCheck(); + if (status < B_OK) + return status; + + BPath path; + status = path.SetTo(ref); + if (status < B_OK) + return status; + // Read the app sig (which consequently keeps us from updating // non-applications, since we get an error if the file has no // app sig) - if (!err) - err = node.ReadAttrString("BEOS:APP_SIG", &sig); - if (!err) { - sig.ToLower(); - // Init our various objects - err = mime.SetTo(sig.String()); - if (!err && !mime.IsInstalled()) - mime.Install(); - if (!err) { - char metaMimePath[B_PATH_NAME_LENGTH]; - sprintf(metaMimePath, "%s/%s", kDatabaseDir.c_str(), sig.String()); - err = typeNode.SetTo(metaMimePath); - } - if (!err) - err = path.SetTo(entry); - - // Preferred App - if (!err && (fForce || typeNode.GetAttrInfo(kPreferredAppAttr, &info) == B_ENTRY_NOT_FOUND)) { - err = mime.SetPreferredApp(sig.String()); - } - // Short Description - if (!err && (fForce || typeNode.GetAttrInfo(kShortDescriptionAttr, &info) == B_ENTRY_NOT_FOUND)) { - err = mime.SetShortDescription(path.Leaf()); - } - // App Hint - if (!err && (fForce || typeNode.GetAttrInfo(kAppHintAttr, &info) == B_ENTRY_NOT_FOUND)) { - err = mime.SetAppHint(entry); - } - // Mini icon - if (!err && (fForce || typeNode.GetAttrInfo(kMiniIconAttr, &info) == B_ENTRY_NOT_FOUND)) { - err = node.GetAttrInfo("BEOS:M:STD_ICON", &info); - if (!err) - err = info.size == 16*16 ? B_OK : B_BAD_VALUE; - if (!err) { - ssize_t bytes = node.ReadAttr("BEOS:M:STD_ICON", kMiniIconType, 0, miniIcon.Bits(), 16*16); - err = bytes == 16*16 ? (status_t)B_OK : (status_t)B_FILE_ERROR; - } - if (!err) - err = mime.SetIcon(&miniIcon, B_MINI_ICON); - } + BString signature; + status = file.ReadAttrString("BEOS:APP_SIG", &signature); + if (status < B_OK) + return B_BAD_TYPE; + + signature.ToLower(); + // Signatures and MIME types are case insensitive + + // Init our various objects + + BMimeType mime; + status = mime.SetTo(signature.String()); + if (status < B_OK) + return status; + + if (!mime.IsInstalled()) + mime.Install(); + + char metaMimePath[B_PATH_NAME_LENGTH]; + sprintf(metaMimePath, "%s/%s", kDatabaseDir.c_str(), signature.String()); + + status = typeNode.SetTo(metaMimePath); + if (status < B_OK) + return status; + + // Preferred App + attr_info info; + if (status == B_OK && (fForce || typeNode.GetAttrInfo(kPreferredAppAttr, &info) != B_OK)) { + status = mime.SetPreferredApp(signature.String()); } - return err; + // Short Description (name of the application) + if (status == B_OK && (fForce || typeNode.GetAttrInfo(kShortDescriptionAttr, &info) != B_OK)) { + status = mime.SetShortDescription(path.Leaf()); + } + // App Hint + if (status == B_OK && (fForce || typeNode.GetAttrInfo(kAppHintAttr, &info) != B_OK)) { + status = mime.SetAppHint(ref); + } + + // Mini Icon + BBitmap miniIcon(BRect(0, 0, 15, 15), B_BITMAP_NO_SERVER_LINK, B_CMAP8); + if (status == B_OK && (fForce || typeNode.GetAttrInfo(kMiniIconAttr, &info) != B_OK)) { + if (appInfo.GetIcon(&miniIcon, B_MINI_ICON) == B_OK) + status = mime.SetIcon(&miniIcon, B_MINI_ICON); + } + // Large Icon + BBitmap largeIcon(BRect(0, 0, 31, 31), B_BITMAP_NO_SERVER_LINK, B_CMAP8); + if (status == B_OK && (fForce || typeNode.GetAttrInfo(kLargeIconAttr, &info) != B_OK)) { + if (appInfo.GetIcon(&miniIcon, B_LARGE_ICON) == B_OK) + status = mime.SetIcon(&miniIcon, B_LARGE_ICON); + } + + // Supported Types + BMessage supportedTypes; + if (status == B_OK && (fForce || typeNode.GetAttrInfo(kSupportedTypesAttr, &info) != B_OK)) { + if (appInfo.GetSupportedTypes(&supportedTypes) == B_OK) + status = mime.SetSupportedTypes(&supportedTypes); + } + + // Icons for supported types + const char* type; + for (int32 i = 0; supportedTypes.FindString("types", i, &type) == B_OK; i++) { + // mini icon + if (status == B_OK && appInfo.GetIconForType(type, &miniIcon, B_MINI_ICON) == B_OK) + status = mime.SetIconForType(type, &miniIcon, B_MINI_ICON); + // large icon + if (status == B_OK && appInfo.GetIconForType(type, &largeIcon, B_LARGE_ICON) == B_OK) + status = mime.SetIconForType(type, &largeIcon, B_LARGE_ICON); + } + + if (status == B_OK && _entryIsDir != NULL) + *_entryIsDir = file.IsDirectory(); + + return status; } } // namespace Mime diff --git a/src/kits/storage/mime/SupportingApps.cpp b/src/kits/storage/mime/SupportingApps.cpp index b46b1d9c0a..174f6348c3 100644 --- a/src/kits/storage/mime/SupportingApps.cpp +++ b/src/kits/storage/mime/SupportingApps.cpp @@ -301,7 +301,7 @@ SupportingApps::BuildSupportingAppsTable() for (int i = 0; msg.FindString(kTypesField, i, &type) == B_OK; i++) { supportedTypes.insert(type); AddSupportingApp(type, appSig); - } + } } } }