Utility functionality for archiving/unarchiving.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31726 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2009-07-24 02:21:06 +00:00
parent a63980d9b7
commit 2d350c1010
2 changed files with 103 additions and 0 deletions
+37
View File
@@ -0,0 +1,37 @@
/*
* Copyright 2009, Ingo Weinhold, [email protected]. All Rights Reserved.
* Distributed under the terms of the MIT License.
*/
#include "ArchivingUtils.h"
#include <Message.h>
/*static*/ status_t
ArchivingUtils::ArchiveChild(BArchivable* object, BMessage& parentArchive,
const char* fieldName)
{
if (object == NULL)
return B_BAD_VALUE;
BMessage archive;
status_t error = object->Archive(&archive, true);
if (error != B_OK)
return error;
return parentArchive.AddMessage(fieldName, &archive);
}
/*static*/ BArchivable*
ArchivingUtils::UnarchiveChild(const BMessage& parentArchive,
const char* fieldName, int32 index)
{
BMessage archive;
if (parentArchive.FindMessage(fieldName, index, &archive) != B_OK)
return NULL;
return instantiate_object(&archive);
}
+66
View File
@@ -0,0 +1,66 @@
/*
* Copyright 2009, Ingo Weinhold, [email protected]. All Rights Reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef ARCHIVABLE_UTILS_H
#define ARCHIVABLE_UTILS_H
#include <Archivable.h>
class ArchivingUtils {
public:
template<typename ObjectType>
static ObjectType* CastOrDelete(BArchivable* archivable);
template<typename ObjectType>
static ObjectType* Unarchive(const BMessage& archive);
static status_t ArchiveChild(BArchivable* object,
BMessage& parentArchive,
const char* fieldName);
static BArchivable* UnarchiveChild(const BMessage& parentArchive,
const char* fieldName, int32 index = 0);
template<typename ObjectType>
static ObjectType* UnarchiveChild(const BMessage& archive,
const char* fieldName, int32 index = 0);
};
template<typename ObjectType>
/*static*/ ObjectType*
ArchivingUtils::CastOrDelete(BArchivable* archivable)
{
if (archivable == NULL)
return NULL;
ObjectType* object = dynamic_cast<ObjectType*>(archivable);
if (object == NULL)
delete archivable;
return object;
}
template<typename ObjectType>
/*static*/ ObjectType*
ArchivingUtils::Unarchive(const BMessage& archive)
{
return CastOrDelete<ObjectType>(instantiate_object(
const_cast<BMessage*>(&archive)));
}
template<typename ObjectType>
/*static*/ ObjectType*
ArchivingUtils::UnarchiveChild(const BMessage& archive, const char* fieldName,
int32 index)
{
return CastOrDelete<ObjectType>(UnarchiveChild(archive, fieldName, index));
}
#endif // ARCHIVABLE_UTILS_H