source: trunk/src/core2/RpSerializable.cc @ 4503

Last change on this file since 4503 was 3177, checked in by mmc, 12 years ago

Updated all of the copyright notices to reference the transfer to
the new HUBzero Foundation, LLC.

File size: 3.6 KB
Line 
1/*
2 * ======================================================================
3 *  Rappture::Serializable
4 *
5 *  AUTHOR:  Michael McLennan, Purdue University
6 *           Carol X Song, Purdue University
7 *
8 *  Copyright (c) 2004-2012  HUBzero Foundation, LLC
9 * ----------------------------------------------------------------------
10 *  See the file "license.terms" for information on usage and
11 *  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
12 * ======================================================================
13 */
14#include "RpSerializable.h"
15
16using namespace Rappture;
17
18// initialize the global lists of registered serialization helper funcs
19Serializable::Name2ConvFuncsMap* Serializable::_name2convFuncs = NULL;
20
21Serializable::Serializable()
22{
23}
24
25Serializable::~Serializable()
26{
27}
28
29void
30Serializable::serialize(SerialBuffer& buffer) const
31{
32    buffer.writeString( serializerType() );
33    buffer.writeChar( serializerVersion() );
34
35    std::string cname( serializerType() );
36    cname += ":";
37    cname += serializerVersion();
38
39    Serializable::ConversionFuncs& cfuncs = (*_name2convFuncs)[cname];
40    (this->*(cfuncs.serialMethod))(buffer);
41}
42
43Outcome
44Serializable::deserialize(SerialBuffer& buffer, Ptr<Serializable>* objPtrPtr)
45{
46    Outcome result;
47
48    std::string type = buffer.readString();
49    char version = buffer.readChar();
50    type += ":";
51    type += version;
52
53    Name2ConvFuncsMap::iterator iter = _name2convFuncs->find(type);
54    if (iter == _name2convFuncs->end()) {
55        std::string errmsg("can't deserialize object: ");
56        errmsg += "unrecognized type \"";
57        errmsg += type;
58        errmsg += "\"";
59        return result.error(errmsg.data());
60    }
61
62    ConversionFuncs& cfuncs = (*_name2convFuncs)[type];
63    *objPtrPtr = (cfuncs.createFunc)();
64
65    Serializable *objPtr = objPtrPtr->pointer();
66    return (objPtr->*(cfuncs.deserialMethod))(buffer);
67}
68
69SerialConversion::SerialConversion(const char *className, char version,
70    Serializable::serializeObjectMethod serMethod,
71    Serializable::createObjectFunc createFunc,
72    Serializable::deserializeObjectMethod desMethod)
73{
74    if (Serializable::_name2convFuncs == NULL) {
75        Serializable::_name2convFuncs = new Serializable::Name2ConvFuncsMap();
76    }
77
78    // register the conversion functions for this version
79    std::string vname(className);
80    vname += ":";
81    vname += version;
82
83    Serializable::ConversionFuncs& funcs
84        = (*Serializable::_name2convFuncs)[vname];
85
86    funcs.version = version;
87    funcs.serialMethod = serMethod;
88    funcs.createFunc = createFunc;
89    funcs.deserialMethod = desMethod;
90
91    // if this is the latest version, register it as "current"
92    std::string cname(className);
93    cname += ":current";
94
95    Serializable::Name2ConvFuncsMap::iterator iter
96        = Serializable::_name2convFuncs->find(cname);
97
98    if (iter == Serializable::_name2convFuncs->end()) {
99        // this is the first -- register it as "current"
100        Serializable::ConversionFuncs& cfuncs
101            = (*Serializable::_name2convFuncs)[cname];
102        cfuncs.version = version;
103        cfuncs.serialMethod = serMethod;
104        cfuncs.createFunc = createFunc;
105        cfuncs.deserialMethod = desMethod;
106    } else {
107        Serializable::ConversionFuncs& cfuncs
108            = (*Serializable::_name2convFuncs)[cname];
109
110        if (cfuncs.version < version) {
111            // this is the latest -- register it as "current"
112            cfuncs.version = version;
113            cfuncs.serialMethod = serMethod;
114            cfuncs.createFunc = createFunc;
115            cfuncs.deserialMethod = desMethod;
116        }
117    }
118}
Note: See TracBrowser for help on using the repository browser.