Author: bonefish Date: 2009-11-05 18:24:58 +0100 (Thu, 05 Nov 2009) New Revision: 33901 Changeset: http://dev.haiku-os.org/changeset/33901/haiku Modified: haiku/trunk/headers/private/shared/Variant.h haiku/trunk/src/kits/shared/Variant.cpp Log: Added methods AddToMessage() and SetFromMessage() to add the value of the variant as a field to a message, respectively initialize the variant from one. Modified: haiku/trunk/headers/private/shared/Variant.h =================================================================== --- haiku/trunk/headers/private/shared/Variant.h 2009-11-05 17:22:14 UTC (rev 33900) +++ haiku/trunk/headers/private/shared/Variant.h 2009-11-05 17:24:58 UTC (rev 33901) @@ -19,6 +19,9 @@ }; +class BMessage; + + class BVariant { public: inline BVariant(); @@ -95,6 +98,11 @@ // has effect only on scalar types (pointer // counting as scalar, not string, though) + status_t AddToMessage(BMessage& message, + const char* fieldName) const; + status_t SetFromMessage(const BMessage& message, + const char* fieldName); + static size_t SizeOfType(type_code type); static bool TypeIsNumber(type_code type); static bool TypeIsInteger(type_code type, Modified: haiku/trunk/src/kits/shared/Variant.cpp =================================================================== --- haiku/trunk/src/kits/shared/Variant.cpp 2009-11-05 17:22:14 UTC (rev 33900) +++ haiku/trunk/src/kits/shared/Variant.cpp 2009-11-05 17:24:58 UTC (rev 33901) @@ -10,6 +10,7 @@ #include <string.h> #include <ByteOrder.h> +#include <Message.h> template<typename NumberType> @@ -356,6 +357,65 @@ } +status_t +BVariant::AddToMessage(BMessage& message, const char* fieldName) const +{ + switch (fType) { + case B_BOOL_TYPE: + return message.AddBool(fieldName, fBool); + case B_INT8_TYPE: + return fInt8 != 0; + return message.AddInt8(fieldName, fInt8); + case B_UINT8_TYPE: + return message.AddUInt8(fieldName, fUInt8); + case B_INT16_TYPE: + return message.AddInt16(fieldName, fInt16); + case B_UINT16_TYPE: + return message.AddUInt16(fieldName, fUInt16); + case B_INT32_TYPE: + return message.AddInt32(fieldName, fInt32); + case B_UINT32_TYPE: + return message.AddUInt32(fieldName, fUInt32); + case B_INT64_TYPE: + return message.AddInt64(fieldName, fInt64); + case B_UINT64_TYPE: + return message.AddUInt64(fieldName, fUInt64); + case B_FLOAT_TYPE: + return message.AddFloat(fieldName, fFloat); + case B_DOUBLE_TYPE: + return message.AddDouble(fieldName, fDouble); + case B_POINTER_TYPE: + return message.AddPointer(fieldName, fPointer); + case B_STRING_TYPE: + return message.AddString(fieldName, fString); + default: + return B_UNSUPPORTED; + } +} + + +status_t +BVariant::SetFromMessage(const BMessage& message, const char* fieldName) +{ + // get the message field info + type_code type; + int32 count; + status_t error = message.GetInfo(fieldName, &type, &count); + if (error != B_OK) + return error; + + // get the data + const void* data; + ssize_t numBytes; + error = message.FindData(fieldName, type, &data, &numBytes); + if (error != B_OK) + return error; + + // init the object + return SetToTypedData(data, type); +} + + /*static*/ size_t BVariant::SizeOfType(type_code type) {