diff --git a/src/servers/registrar/MIMEManager.cpp b/src/servers/registrar/MIMEManager.cpp index 55e98822dd..f01f10b57d 100644 --- a/src/servers/registrar/MIMEManager.cpp +++ b/src/servers/registrar/MIMEManager.cpp @@ -1,7 +1,11 @@ // MIMEManager.cpp +#include +#include #include #include +#include + #include #include @@ -9,9 +13,9 @@ /*! \class MIMEManager - \brief MIMEManager is the master of the MIME data base. + \brief MIMEManager handles communication between BMimeType and the system-wide + MimeDatabase object for BMimeType's write and non-atomic read functions. - All write and non-atomic read accesses are carried out by this class. */ // constructor @@ -43,42 +47,8 @@ MIMEManager::MessageReceived(BMessage *message) switch (message->what) { case B_REG_MIME_SET_PARAM: - { - int32 which; - const char *type; - - err = message->FindString("type", &type); - if (!err) - err = message->FindInt32("which", &which); - if (!err) { - switch (which) { - case B_REG_MIME_DESCRIPTION: - { - bool isLong; - const char *description; - err = message->FindBool("long", &isLong); - if (!err) - err = message->FindString("description", &description); - if (!err) { - err = (isLong - ? fMimeDatabase.SetLongDescription(type, description) - : fMimeDatabase.SetShortDescription(type, description)); - } - break; - } - - default: - err = B_BAD_VALUE; - break; - } - - reply.what = B_SIMPLE_DATA; - reply.AddInt32("result", err); - message->SendReply(&reply, this); - } - + HandleSetParam(message); break; - } case B_REG_MIME_START_WATCHING: case B_REG_MIME_STOP_WATCHING: @@ -91,7 +61,7 @@ MIMEManager::MessageReceived(BMessage *message) : fMimeDatabase.StopWatching(messenger); } - reply.what = B_SIMPLE_DATA; + reply.what = B_REG_RESULT; reply.AddInt32("result", err); message->SendReply(&reply, this); break; @@ -106,7 +76,7 @@ MIMEManager::MessageReceived(BMessage *message) err = message->what == B_REG_MIME_INSTALL ? fMimeDatabase.Install(type) : fMimeDatabase.Delete(type); - reply.what = B_SIMPLE_DATA; + reply.what = B_REG_RESULT; reply.AddInt32("result", err); message->SendReply(&reply, this); break; @@ -119,3 +89,103 @@ MIMEManager::MessageReceived(BMessage *message) } } +// HandleSetParam +//! Handles all B_REG_MIME_SET_PARAM messages +void +MIMEManager::HandleSetParam(BMessage *message) +{ + status_t err; + int32 which; + const char *type; + + err = message->FindString("type", &type); + if (!err) + err = message->FindInt32("which", &which); + if (!err) { + switch (which) { + case B_REG_MIME_APP_HINT: + { + entry_ref ref; + err = message->FindRef("app hint", &ref); + if (!err) + err = fMimeDatabase.SetAppHint(type, &ref); + break; + } + + case B_REG_MIME_DESCRIPTION: + { + bool isLong; + const char *description; + err = message->FindBool("long", &isLong); + if (!err) + err = message->FindString("description", &description); + if (!err) + err = (isLong + ? fMimeDatabase.SetLongDescription(type, description) + : fMimeDatabase.SetShortDescription(type, description)); + break; + } + + case B_REG_MIME_PREFERRED_APP: + { + const char *signature; + int32 verb; + err = message->FindString("signature", &signature); + if (!err) + err = message->FindInt32("app verb", &verb); + if (!err) + err = fMimeDatabase.SetPreferredApp(type, signature, (app_verb)verb); + break; + } + + case B_REG_MIME_ICON: + { + // Begin temporary fix code + const void *data; + ssize_t dataSize; + int32 size; + err = message->FindData("icon data", B_RAW_TYPE, &data, &dataSize); + if (!err) + err = message->FindInt32("icon size", &size); + if (!err) + err = fMimeDatabase.SetIcon(type, (icon_size)size, data, dataSize); + break; + // End temporary fix code + +/* This is the code I was using until BBitmap::Instantiate blew up on me. + + BMessage iconArchive; + int32 size; + err = message->FindMessage("icon archive", &iconArchive); + if (!err) + err = message->FindInt32("size", &size); + iconArchive.PrintToStream(); + if (!err) { + BArchivable *unarchived = instantiate_object(&iconArchive); + if (unarchived) { + BBitmap *icon = cast_as(unarchived, BBitmap); + if (icon) { + err = icon->InitCheck(); + if (!err) + err = fMimeDatabase.SetIcon(type, icon, (icon_size)size); + delete icon; + } else + err = B_BAD_VALUE; + + } else + err = B_NO_MEMORY; + } + break; +*/ + } + + default: + err = B_BAD_VALUE; + break; + } + } + + BMessage reply(B_REG_RESULT); + reply.AddInt32("result", err); + message->SendReply(&reply, this); +} \ No newline at end of file diff --git a/src/servers/registrar/MIMEManager.h b/src/servers/registrar/MIMEManager.h index d843e480de..2c389fe3b3 100644 --- a/src/servers/registrar/MIMEManager.h +++ b/src/servers/registrar/MIMEManager.h @@ -13,6 +13,7 @@ public: virtual void MessageReceived(BMessage *message); private: + void HandleSetParam(BMessage *message); BPrivate::MimeDatabase fMimeDatabase; };