1 | /* |
---|
2 | * ====================================================================== |
---|
3 | * Rappture::Serializable |
---|
4 | * |
---|
5 | * AUTHOR: Michael McLennan, Purdue University |
---|
6 | * Carol X Song, Purdue University |
---|
7 | * |
---|
8 | * Copyright (c) 2004-2006 Purdue Research Foundation |
---|
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 | |
---|
16 | using namespace Rappture; |
---|
17 | |
---|
18 | // initialize the global lists of registered serialization helper funcs |
---|
19 | Serializable::Name2ConvFuncsMap* Serializable::_name2convFuncs = NULL; |
---|
20 | |
---|
21 | Serializable::Serializable() |
---|
22 | { |
---|
23 | } |
---|
24 | |
---|
25 | Serializable::~Serializable() |
---|
26 | { |
---|
27 | } |
---|
28 | |
---|
29 | void |
---|
30 | Serializable::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 | |
---|
43 | Outcome |
---|
44 | Serializable::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 | |
---|
69 | SerialConversion::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 | } |
---|