#include <mime/Supertype.h>
#include <Message.h>
#include <mime/database_support.h>
#include <new>
#include <stdio.h>
#define DBG(x) x
#define OUT printf
namespace BPrivate {
namespace Storage {
namespace Mime {
Supertype::Supertype(const char *super)
: fCachedMessage(NULL)
, fName(super ? super : "")
{
}
Supertype::~Supertype()
{
delete fCachedMessage;
}
status_t
Supertype::GetInstalledSubtypes(BMessage *types)
{
status_t err = types ? B_OK : B_BAD_VALUE;
if (!err && !fCachedMessage) {
err = CreateMessageWithTypes(&fCachedMessage);
}
if (!err) {
*types = *fCachedMessage;
}
return err;
}
status_t
Supertype::AddSubtype(const char *sub)
{
status_t err = sub ? B_OK : B_BAD_VALUE;
if (!err)
err = fSubtypes.insert(sub).second ? B_OK : B_NAME_IN_USE;
if (!err && fCachedMessage) {
char type[B_PATH_NAME_LENGTH];
sprintf(type, "%s/%s", fName.c_str(), sub);
err = fCachedMessage->AddString("types", type);
}
return err;
}
status_t
Supertype::RemoveSubtype(const char *sub)
{
status_t err = sub ? B_OK : B_BAD_VALUE;
if (!err)
err = fSubtypes.erase(sub) == 1 ? B_OK : B_NAME_NOT_FOUND;
if (!err && fCachedMessage) {
delete fCachedMessage;
fCachedMessage = NULL;
}
return err;
}
void
Supertype::SetName(const char *super)
{
if (super)
fName = super;
}
const char*
Supertype::GetName()
{
return fName.c_str();
}
status_t
Supertype::FillMessageWithTypes(BMessage &msg) const
{
status_t err = B_OK;
std::set<std::string>::const_iterator i;
for (i = fSubtypes.begin(); i != fSubtypes.end() && !err; i++) {
char type[B_PATH_NAME_LENGTH];
sprintf(type, "%s/%s", fName.c_str(), (*i).c_str());
err = msg.AddString(kTypesField, type);
}
return err;
}
status_t
Supertype::CreateMessageWithTypes(BMessage **result) const
{
status_t err = result ? B_OK : B_BAD_VALUE;
if (!err) {
try {
*result = new BMessage();
} catch (std::bad_alloc&) {
err = B_NO_MEMORY;
}
}
if (!err)
err = FillMessageWithTypes(**result);
return err;
}
}
}
}