Moved Add* through AddData, Find* through FindData, Replace* through ReplaceData

I think BMessageBody::FindData<>, BMessageBody::AddData<>, BMessageBody::ReplaceData<> could be untemplatized
Works here, not unit tested though
Axel, please review this.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13653 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval 2005-07-12 23:21:29 +00:00
parent ef36c64242
commit b0ba19ba3a
1 changed files with 43 additions and 164 deletions

View File

@ -1224,14 +1224,18 @@ status_t BMessage::PopSpecifier()
#define DEFINE_FUNCTIONS(TYPE, fnName, TYPESPEC) \
status_t BMessage::Add ## fnName(const char* name, TYPE val) \
{ return fBody->AddData<TYPE>(name, val, TYPESPEC); } \
{ return AddData(name, TYPESPEC, &val, sizeof(TYPE)); } \
status_t BMessage::Find ## fnName(const char* name, TYPE* p) const \
{ return Find ## fnName(name, 0, p); } \
status_t BMessage::Find ## fnName(const char* name, int32 index, TYPE* p) const \
{ \
*p = TYPE(); \
return fBody->FindData<TYPE>(name, index, p, TYPESPEC); \
} \
{ \
void* ptr = NULL; ssize_t bytes = 0; status_t err = B_OK;\
*p = TYPE(); \
err = FindData(name, TYPESPEC, index, (const void**)&ptr, &bytes); \
if (err == B_OK) \
memcpy(p, ptr, sizeof(TYPE)); \
return err; \
} \
status_t BMessage::Replace ## fnName(const char* name, TYPE val) \
{ return Replace ## fnName(name, 0, val); } \
status_t BMessage::Replace ## fnName(const char *name, int32 index, TYPE val) \
@ -1286,22 +1290,23 @@ DEFINE_LAZY_FIND_FUNCTION(const char* , String)
//------------------------------------------------------------------------------
status_t BMessage::AddString(const char* name, const char* a_string)
{
return fBody->AddData<BString>(name, a_string, B_STRING_TYPE);
return AddData(name, B_STRING_TYPE, a_string, strlen(a_string));
}
//------------------------------------------------------------------------------
status_t BMessage::AddString(const char* name, const BString& a_string)
{
return AddString(name, a_string.String());
return AddData(name, B_STRING_TYPE, a_string.String(), a_string.Length());
//return AddString(name, a_string.String());
}
//------------------------------------------------------------------------------
status_t BMessage::AddPointer(const char* name, const void* ptr)
{
return fBody->AddData<void*>(name, (void*)ptr, B_POINTER_TYPE);
return AddData(name, B_POINTER_TYPE, &ptr, sizeof(ptr));
}
//------------------------------------------------------------------------------
status_t BMessage::AddMessenger(const char* name, BMessenger messenger)
{
return fBody->AddData<BMessenger>(name, messenger, B_MESSENGER_TYPE);
return AddData(name, B_MESSENGER_TYPE, &messenger, sizeof(messenger));
}
//------------------------------------------------------------------------------
status_t BMessage::AddRef(const char* name, const entry_ref* ref)
@ -1311,8 +1316,7 @@ status_t BMessage::AddRef(const char* name, const entry_ref* ref)
status_t err = entry_ref_flatten(buffer, &size, ref);
if (!err)
{
BDataBuffer DB((void*)buffer, size);
err = fBody->AddData<BDataBuffer>(name, DB, B_REF_TYPE);
err = AddData(name, B_REF_TYPE, (void*)buffer, size);
}
return err;
@ -1328,8 +1332,7 @@ status_t BMessage::AddMessage(const char* name, const BMessage* msg)
err = msg->Flatten(buffer, size);
if (!err)
{
BDataBuffer DB((void*)buffer, size);
err = fBody->AddData<BDataBuffer>(name, DB, B_MESSAGE_TYPE);
err = AddData(name, B_MESSAGE_TYPE, (void*)buffer, size);
}
}
else
@ -1382,71 +1385,8 @@ status_t BMessage::AddData(const char* name, type_code type, const void* data,
// avoid having to specialize BMessageBody::AddData().
//--------------------------------------------------------------------------
// TODO: Fix this horrible hack
status_t err = B_OK;
switch (type)
{
case B_BOOL_TYPE:
err = AddBool(name, *(bool*)data);
break;
case B_INT8_TYPE:
case B_UINT8_TYPE:
err = AddInt8(name, *(int8*)data);
break;
case B_INT16_TYPE:
case B_UINT16_TYPE:
err = AddInt16(name, *(int16*)data);
break;
case B_INT32_TYPE:
case B_UINT32_TYPE:
err = AddInt32(name, *(int32*)data);
break;
case B_INT64_TYPE:
case B_UINT64_TYPE:
err = AddInt64(name, *(int64*)data);
break;
case B_FLOAT_TYPE:
err = AddFloat(name, *(float*)data);
break;
case B_DOUBLE_TYPE:
err = AddDouble(name, *(double*)data);
break;
case B_POINT_TYPE:
err = AddPoint(name, *(BPoint*)data);
break;
case B_RECT_TYPE:
err = AddRect(name, *(BRect*)data);
break;
case B_REF_TYPE:
{
BDataBuffer DB((void*)data, numBytes, true);
err = fBody->AddData<BDataBuffer>(name, DB, type);
break;
}
case B_MESSAGE_TYPE:
{
BDataBuffer DB((void*)data, numBytes, true);
err = fBody->AddData<BDataBuffer>(name, DB, type);
break;
}
case B_MESSENGER_TYPE:
err = AddMessenger(name, *(BMessenger*)data);
break;
case B_POINTER_TYPE:
err = AddPointer(name, *(void**)data);
break;
case B_STRING_TYPE:
err = AddString(name, (const char*)data);
break;
default:
// TODO: test
// Using the mythical BDataBuffer
BDataBuffer DB((void*)data, numBytes, true);
err = fBody->AddData<BDataBuffer>(name, DB, type);
break;
}
return err;
BDataBuffer DB((void*)data, numBytes, true);
return fBody->AddData<BDataBuffer>(name, DB, type);
}
//------------------------------------------------------------------------------
status_t BMessage::RemoveData(const char* name, int32 index)
@ -1501,8 +1441,8 @@ status_t BMessage::FindPointer(const char* name, void** ptr) const
//------------------------------------------------------------------------------
status_t BMessage::FindPointer(const char* name, int32 index, void** ptr) const
{
*ptr = NULL;
return fBody->FindData<void*>(name, index, ptr, B_POINTER_TYPE);
ssize_t size = 0;
return FindData(name, B_POINTER_TYPE, index, (const void**)ptr, &size);
}
//------------------------------------------------------------------------------
status_t BMessage::FindMessenger(const char* name, BMessenger* m) const
@ -1512,7 +1452,12 @@ status_t BMessage::FindMessenger(const char* name, BMessenger* m) const
//------------------------------------------------------------------------------
status_t BMessage::FindMessenger(const char* name, int32 index, BMessenger* m) const
{
return fBody->FindData<BMessenger>(name, index, m, B_MESSENGER_TYPE);
void* data = NULL;
ssize_t size = 0;
status_t err = FindData(name, B_MESSENGER_TYPE, index, (const void **)&data, &size);
if (err == B_OK)
memcpy(m, data, sizeof(BMessenger));
return err;
}
//------------------------------------------------------------------------------
status_t BMessage::FindRef(const char* name, entry_ref* ref) const
@ -1525,11 +1470,8 @@ status_t BMessage::FindRef(const char* name, int32 index, entry_ref* ref) const
void* data = NULL;
ssize_t size = 0;
status_t err = FindData(name, B_REF_TYPE, index, (const void**)&data, &size);
if (!err)
{
if (err == B_OK)
err = entry_ref_unflatten(ref, (char*)data, size);
}
return err;
}
//------------------------------------------------------------------------------
@ -1542,8 +1484,7 @@ status_t BMessage::FindMessage(const char* name, int32 index, BMessage* msg) con
{
void* data = NULL;
ssize_t size = 0;
status_t err = FindData(name, B_MESSAGE_TYPE, index,
(const void**)&data, &size);
status_t err = FindData(name, B_MESSAGE_TYPE, index, (const void**)&data, &size);
if (!err)
{
err = msg->Unflatten((const char*)data);
@ -1560,14 +1501,13 @@ status_t BMessage::FindFlat(const char* name, BFlattenable* obj) const
status_t BMessage::FindFlat(const char* name, int32 index,
BFlattenable* obj) const
{
const void* data;
ssize_t numBytes;
status_t err = FindData(name, obj->TypeCode(), index, &data, &numBytes);
void* data = NULL;
ssize_t numBytes = 0;
status_t err = FindData(name, obj->TypeCode(), index, (const void**)&data, &numBytes);
if (!err)
{
err = obj->Unflatten(obj->TypeCode(), data, numBytes);
}
return err;
}
//------------------------------------------------------------------------------
@ -1592,10 +1532,9 @@ status_t BMessage::ReplaceString(const char* name, const char* string)
return ReplaceString(name, 0, string);
}
//------------------------------------------------------------------------------
status_t BMessage::ReplaceString(const char* name, int32 index,
const char* string)
status_t BMessage::ReplaceString(const char* name, int32 index, const char* string)
{
return fBody->ReplaceData<BString>(name, index, string, B_STRING_TYPE);
return ReplaceData(name, B_STRING_TYPE, index, string, strlen(string));
}
//------------------------------------------------------------------------------
status_t BMessage::ReplaceString(const char* name, const BString& string)
@ -1605,7 +1544,7 @@ status_t BMessage::ReplaceString(const char* name, const BString& string)
//------------------------------------------------------------------------------
status_t BMessage::ReplaceString(const char* name, int32 index, const BString& string)
{
return fBody->ReplaceData<BString>(name, index, string, B_STRING_TYPE);
return ReplaceData(name, B_STRING_TYPE, index, string.String(), string.Length());
}
//------------------------------------------------------------------------------
status_t BMessage::ReplacePointer(const char* name, const void* ptr)
@ -1613,22 +1552,19 @@ status_t BMessage::ReplacePointer(const char* name, const void* ptr)
return ReplacePointer(name, 0, ptr);
}
//------------------------------------------------------------------------------
status_t BMessage::ReplacePointer(const char* name, int32 index,
const void* ptr)
status_t BMessage::ReplacePointer(const char* name, int32 index, const void* ptr)
{
return fBody->ReplaceData<void*>(name, index, (void*)ptr, B_POINTER_TYPE);
return ReplaceData(name, B_POINTER_TYPE, index, &ptr, sizeof(ptr));
}
//------------------------------------------------------------------------------
status_t BMessage::ReplaceMessenger(const char* name, BMessenger messenger)
{
// Don't want to copy the BMessenger
return fBody->ReplaceData<BMessenger>(name, 0, messenger, B_MESSENGER_TYPE);
return ReplaceData(name, B_MESSENGER_TYPE, 0, &messenger, sizeof(BMessenger));
}
//------------------------------------------------------------------------------
status_t BMessage::ReplaceMessenger(const char* name, int32 index,
BMessenger msngr)
status_t BMessage::ReplaceMessenger(const char* name, int32 index, BMessenger messenger)
{
return fBody->ReplaceData<BMessenger>(name, index, msngr, B_MESSENGER_TYPE);
return ReplaceData(name, B_MESSENGER_TYPE, index, &messenger, sizeof(BMessenger));
}
//------------------------------------------------------------------------------
status_t BMessage::ReplaceRef(const char* name, const entry_ref* ref)
@ -1645,8 +1581,7 @@ status_t BMessage::ReplaceRef(const char* name, int32 index, const entry_ref* re
status_t err = entry_ref_flatten(buffer, &size, ref);
if (!err)
{
BDataBuffer DB((void*)buffer, size);
err = fBody->ReplaceData<BDataBuffer>(name, index, DB, B_REF_TYPE);
err = ReplaceData(name, B_REF_TYPE, index, (void*)buffer, size);
}
return err;
@ -1668,9 +1603,7 @@ status_t BMessage::ReplaceMessage(const char* name, int32 index,
err = msg->Flatten(buffer, size);
if (!err)
{
BDataBuffer DB((void*)buffer, size);
err = fBody->ReplaceData<BDataBuffer>(name, index, DB,
B_MESSAGE_TYPE);
err = ReplaceData(name, B_MESSAGE_TYPE, index, (void*)buffer, size);
}
}
else
@ -1714,62 +1647,8 @@ status_t BMessage::ReplaceData(const char* name, type_code type,
status_t BMessage::ReplaceData(const char* name, type_code type, int32 index,
const void* data, ssize_t data_size)
{
// TODO: Fix this horrible hack
status_t err = B_OK;
switch (type)
{
case B_BOOL_TYPE:
err = ReplaceBool(name, index, *(bool*)data);
break;
case B_INT8_TYPE:
case B_UINT8_TYPE:
err = ReplaceInt8(name, index, *(int8*)data);
break;
case B_INT16_TYPE:
case B_UINT16_TYPE:
err = ReplaceInt16(name, index, *(int16*)data);
break;
case B_INT32_TYPE:
case B_UINT32_TYPE:
err = ReplaceInt32(name, index, *(int32*)data);
break;
case B_INT64_TYPE:
case B_UINT64_TYPE:
err = ReplaceInt64(name, index, *(int64*)data);
break;
case B_FLOAT_TYPE:
err = ReplaceFloat(name, index, *(float*)data);
break;
case B_DOUBLE_TYPE:
err = ReplaceDouble(name, index, *(double*)data);
break;
case B_POINT_TYPE:
err = ReplacePoint(name, index, *(BPoint*)data);
break;
case B_RECT_TYPE:
err = ReplaceRect(name, index, *(BRect*)data);
break;
case B_REF_TYPE:
err = ReplaceRef(name, index, (entry_ref*)data);
break;
case B_MESSAGE_TYPE:
err = ReplaceMessage(name, index, (BMessage*)data);
break;
case B_MESSENGER_TYPE:
err = ReplaceMessenger(name, index, *(BMessenger*)data);
break;
case B_POINTER_TYPE:
err = ReplacePointer(name, index, (void**)data);
break;
default:
// TODO: test
// Using the mythical BDataBuffer
BDataBuffer DB((void*)data, data_size, true);
err = fBody->ReplaceData<BDataBuffer>(name, index, DB, type);
break;
}
return err;
BDataBuffer DB((void*)data, data_size, true);
return fBody->ReplaceData<BDataBuffer>(name, index, DB, type);
}
//------------------------------------------------------------------------------
void* BMessage::operator new(size_t size)