2002-07-21 22:40:07 +00:00
|
|
|
// MIMEManager.cpp
|
|
|
|
|
2002-08-19 08:42:14 +00:00
|
|
|
#include <Bitmap.h>
|
|
|
|
#include <ClassInfo.h>
|
2002-07-21 22:40:07 +00:00
|
|
|
#include <Message.h>
|
2002-08-16 22:08:49 +00:00
|
|
|
#include <RegistrarDefs.h>
|
2002-08-19 08:42:14 +00:00
|
|
|
#include <TypeConstants.h>
|
|
|
|
|
2002-08-16 22:08:49 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string>
|
2002-07-21 22:40:07 +00:00
|
|
|
|
|
|
|
#include "MIMEManager.h"
|
|
|
|
|
2002-07-28 13:37:26 +00:00
|
|
|
/*!
|
|
|
|
\class MIMEManager
|
2002-08-19 08:42:14 +00:00
|
|
|
\brief MIMEManager handles communication between BMimeType and the system-wide
|
|
|
|
MimeDatabase object for BMimeType's write and non-atomic read functions.
|
2002-07-28 13:37:26 +00:00
|
|
|
|
|
|
|
*/
|
|
|
|
|
2002-07-21 22:40:07 +00:00
|
|
|
// constructor
|
2002-07-28 13:37:26 +00:00
|
|
|
/*! \brief Creates and initializes a MIMEManager.
|
|
|
|
*/
|
2002-07-21 22:40:07 +00:00
|
|
|
MIMEManager::MIMEManager()
|
|
|
|
: BLooper("main_mime")
|
2002-08-16 22:08:49 +00:00
|
|
|
, fMimeDatabase()
|
2002-07-21 22:40:07 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
// destructor
|
2002-07-28 13:37:26 +00:00
|
|
|
/*! \brief Frees all resources associate with this object.
|
|
|
|
*/
|
2002-07-21 22:40:07 +00:00
|
|
|
MIMEManager::~MIMEManager()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
// MessageReceived
|
2002-07-28 13:37:26 +00:00
|
|
|
/*! \brief Overrides the super class version to handle the MIME specific
|
|
|
|
messages.
|
|
|
|
\param message The message to be handled
|
|
|
|
*/
|
2002-07-21 22:40:07 +00:00
|
|
|
void
|
|
|
|
MIMEManager::MessageReceived(BMessage *message)
|
|
|
|
{
|
2002-08-16 22:08:49 +00:00
|
|
|
BMessage reply;
|
|
|
|
status_t err;
|
|
|
|
|
2002-07-21 22:40:07 +00:00
|
|
|
switch (message->what) {
|
2002-08-16 22:08:49 +00:00
|
|
|
case B_REG_MIME_SET_PARAM:
|
2002-08-19 08:42:14 +00:00
|
|
|
HandleSetParam(message);
|
2002-08-20 09:37:04 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case B_REG_MIME_DELETE_PARAM:
|
|
|
|
HandleDeleteParam(message);
|
|
|
|
break;
|
2002-08-16 22:08:49 +00:00
|
|
|
|
|
|
|
case B_REG_MIME_START_WATCHING:
|
|
|
|
case B_REG_MIME_STOP_WATCHING:
|
|
|
|
{
|
|
|
|
BMessenger messenger;
|
|
|
|
err = message->FindMessenger("target", &messenger);
|
|
|
|
if (!err) {
|
|
|
|
err = message->what == B_REG_MIME_START_WATCHING
|
|
|
|
? fMimeDatabase.StartWatching(messenger)
|
|
|
|
: fMimeDatabase.StopWatching(messenger);
|
|
|
|
}
|
|
|
|
|
2002-08-19 08:42:14 +00:00
|
|
|
reply.what = B_REG_RESULT;
|
2002-08-16 22:08:49 +00:00
|
|
|
reply.AddInt32("result", err);
|
|
|
|
message->SendReply(&reply, this);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case B_REG_MIME_INSTALL:
|
|
|
|
case B_REG_MIME_DELETE:
|
|
|
|
{
|
|
|
|
const char *type;
|
|
|
|
err = message->FindString("type", &type);
|
|
|
|
if (!err)
|
|
|
|
err = message->what == B_REG_MIME_INSTALL
|
|
|
|
? fMimeDatabase.Install(type)
|
|
|
|
: fMimeDatabase.Delete(type);
|
2002-08-19 08:42:14 +00:00
|
|
|
reply.what = B_REG_RESULT;
|
2002-08-16 22:08:49 +00:00
|
|
|
reply.AddInt32("result", err);
|
|
|
|
message->SendReply(&reply, this);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2002-07-21 22:40:07 +00:00
|
|
|
default:
|
2002-08-16 22:08:49 +00:00
|
|
|
printf("MIMEMan: msg->what == %.4s\n", &(message->what));
|
2002-07-21 22:40:07 +00:00
|
|
|
BLooper::MessageReceived(message);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-08-20 09:37:04 +00:00
|
|
|
// HandleSetParam
|
2002-08-19 08:42:14 +00:00
|
|
|
//! 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;
|
|
|
|
}
|
|
|
|
|
2002-08-21 10:55:20 +00:00
|
|
|
case B_REG_MIME_ATTR_INFO:
|
|
|
|
{
|
|
|
|
BMessage info;
|
|
|
|
err = message->FindMessage("attr info", &info);
|
|
|
|
if (!err)
|
|
|
|
err = fMimeDatabase.SetAttrInfo(type, &info);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2002-08-19 08:42:14 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2002-08-21 10:55:20 +00:00
|
|
|
case B_REG_MIME_FILE_EXTENSIONS:
|
2002-08-19 08:42:14 +00:00
|
|
|
{
|
2002-08-21 10:55:20 +00:00
|
|
|
BMessage extensions;
|
|
|
|
err = message->FindMessage("extensions", &extensions);
|
2002-08-19 08:42:14 +00:00
|
|
|
if (!err)
|
2002-08-21 10:55:20 +00:00
|
|
|
err = fMimeDatabase.SetFileExtensions(type, &extensions);
|
2002-08-19 08:42:14 +00:00
|
|
|
break;
|
|
|
|
}
|
2002-08-21 10:55:20 +00:00
|
|
|
|
|
|
|
|
2002-08-19 08:42:14 +00:00
|
|
|
case B_REG_MIME_ICON:
|
2002-08-20 09:37:04 +00:00
|
|
|
case B_REG_MIME_ICON_FOR_TYPE:
|
2002-08-19 08:42:14 +00:00
|
|
|
{
|
|
|
|
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);
|
2002-08-20 09:37:04 +00:00
|
|
|
if (which == B_REG_MIME_ICON_FOR_TYPE) {
|
|
|
|
const char *fileType;
|
|
|
|
if (!err)
|
|
|
|
err = message->FindString("file type", &fileType);
|
|
|
|
if (!err)
|
|
|
|
err = fMimeDatabase.SetIconForType(type, fileType, data,
|
|
|
|
dataSize, (icon_size)size);
|
|
|
|
} else {
|
|
|
|
if (!err)
|
|
|
|
err = fMimeDatabase.SetIcon(type, data, dataSize,
|
|
|
|
(icon_size)size);
|
|
|
|
}
|
2002-08-19 08:42:14 +00:00
|
|
|
break;
|
|
|
|
// End temporary fix code
|
2002-08-21 10:55:20 +00:00
|
|
|
}
|
2002-08-19 08:42:14 +00:00
|
|
|
|
2002-08-21 10:55:20 +00:00
|
|
|
case B_REG_MIME_PREFERRED_APP:
|
|
|
|
{
|
|
|
|
const char *signature;
|
|
|
|
int32 verb;
|
|
|
|
err = message->FindString("signature", &signature);
|
2002-08-19 08:42:14 +00:00
|
|
|
if (!err)
|
2002-08-21 10:55:20 +00:00
|
|
|
err = message->FindInt32("app verb", &verb);
|
|
|
|
if (!err)
|
|
|
|
err = fMimeDatabase.SetPreferredApp(type, signature, (app_verb)verb);
|
2002-08-19 08:42:14 +00:00
|
|
|
break;
|
2002-08-21 10:55:20 +00:00
|
|
|
}
|
2002-08-19 08:42:14 +00:00
|
|
|
|
|
|
|
default:
|
|
|
|
err = B_BAD_VALUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BMessage reply(B_REG_RESULT);
|
|
|
|
reply.AddInt32("result", err);
|
|
|
|
message->SendReply(&reply, this);
|
2002-08-20 09:37:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// HandleSetParam
|
|
|
|
//! Handles all B_REG_MIME_SET_PARAM messages
|
|
|
|
void
|
|
|
|
MIMEManager::HandleDeleteParam(BMessage *message)
|
|
|
|
{
|
|
|
|
// using BPrivate::MimeDatabase;
|
|
|
|
|
|
|
|
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:
|
2002-08-21 10:55:20 +00:00
|
|
|
err = fMimeDatabase.DeleteAppHint(type);
|
2002-08-20 09:37:04 +00:00
|
|
|
break;
|
|
|
|
|
2002-08-21 10:55:20 +00:00
|
|
|
case B_REG_MIME_ATTR_INFO:
|
|
|
|
err = fMimeDatabase.DeleteAttrInfo(type);
|
|
|
|
break;
|
|
|
|
|
2002-08-20 09:37:04 +00:00
|
|
|
case B_REG_MIME_DESCRIPTION:
|
|
|
|
{
|
|
|
|
bool isLong;
|
|
|
|
err = message->FindBool("long", &isLong);
|
|
|
|
if (!err)
|
2002-08-21 10:55:20 +00:00
|
|
|
err = isLong
|
|
|
|
? fMimeDatabase.DeleteLongDescription(type)
|
|
|
|
: fMimeDatabase.DeleteShortDescription(type);
|
2002-08-20 09:37:04 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2002-08-21 10:55:20 +00:00
|
|
|
case B_REG_MIME_FILE_EXTENSIONS:
|
|
|
|
err = fMimeDatabase.DeleteFileExtensions(type);
|
|
|
|
break;
|
|
|
|
|
2002-08-20 09:37:04 +00:00
|
|
|
case B_REG_MIME_ICON:
|
|
|
|
case B_REG_MIME_ICON_FOR_TYPE:
|
|
|
|
{
|
|
|
|
int32 size;
|
|
|
|
err = message->FindInt32("icon size", &size);
|
|
|
|
if (which == B_REG_MIME_ICON_FOR_TYPE) {
|
|
|
|
const char *fileType;
|
|
|
|
if (!err)
|
|
|
|
err = message->FindString("file type", &fileType);
|
2002-08-21 10:55:20 +00:00
|
|
|
if (!err)
|
|
|
|
err = fMimeDatabase.DeleteIconForType(type, fileType, (icon_size)size);
|
2002-08-20 09:37:04 +00:00
|
|
|
} else {
|
2002-08-21 10:55:20 +00:00
|
|
|
if (!err)
|
|
|
|
err = fMimeDatabase.DeleteIcon(type, (icon_size)size);
|
2002-08-20 09:37:04 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2002-08-21 10:55:20 +00:00
|
|
|
case B_REG_MIME_PREFERRED_APP:
|
|
|
|
{
|
|
|
|
int32 verb;
|
|
|
|
err = message->FindInt32("app verb", &verb);
|
|
|
|
if (!err)
|
|
|
|
err = fMimeDatabase.DeletePreferredApp(type, (app_verb)verb);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case B_REG_MIME_SNIFFER_RULE:
|
|
|
|
err = fMimeDatabase.DeleteSnifferRule(type);
|
|
|
|
break;
|
|
|
|
|
2002-08-20 09:37:04 +00:00
|
|
|
default:
|
|
|
|
err = B_BAD_VALUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BMessage reply(B_REG_RESULT);
|
|
|
|
reply.AddInt32("result", err);
|
|
|
|
message->SendReply(&reply, this);
|
|
|
|
}
|
|
|
|
|