source: branches/1.5/src/core2/RpSerializable.cc @ 6036

Last change on this file since 6036 was 5679, checked in by ldelgass, 9 years ago

Full merge 1.3 branch to uq branch to sync. Fixed partial subdirectory merge
by removing mergeinfo from lang/python/Rappture directory.

  • Property svn:eol-style set to native
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.