diff options
author | Henri Herscher <henri@oreka.org> | 2006-07-11 19:00:34 +0000 |
---|---|---|
committer | Henri Herscher <henri@oreka.org> | 2006-07-11 19:00:34 +0000 |
commit | f1e0b21098f7c46e49f50494ebba617a74a38cee (patch) | |
tree | 65cac81b8225459c05fa13084400e8e85a44e197 /orkbasecxx/serializers | |
parent | 90f521dfe34909672ebfead5ef2ba87742c33cdd (diff) |
Added "Object List" deserialization capabilities to recursive serializers.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@299 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orkbasecxx/serializers')
-rw-r--r-- | orkbasecxx/serializers/DomSerializer.cpp | 59 | ||||
-rw-r--r-- | orkbasecxx/serializers/DomSerializer.h | 4 | ||||
-rw-r--r-- | orkbasecxx/serializers/Serializer.cpp | 5 | ||||
-rw-r--r-- | orkbasecxx/serializers/Serializer.h | 3 |
4 files changed, 71 insertions, 0 deletions
diff --git a/orkbasecxx/serializers/DomSerializer.cpp b/orkbasecxx/serializers/DomSerializer.cpp index 348819e..84f66d0 100644 --- a/orkbasecxx/serializers/DomSerializer.cpp +++ b/orkbasecxx/serializers/DomSerializer.cpp @@ -34,6 +34,18 @@ void DomSerializer::ObjectValue(const char* key, Object& value, bool required) } } +void DomSerializer::ListValue(const char* key, std::list<ObjectRef>& value, Object& model, bool required) +{ + if (m_deSerialize == true) + { + GetList(key, value, model, required); + } + else + { + AddList(key, value); + } +} + void DomSerializer::GetString(const char* key, CStdString& value, bool required) { // Find the right node @@ -71,11 +83,58 @@ void DomSerializer::GetObject(const char* key, Object& value, bool required) } } +void DomSerializer::GetList(const char* key, std::list<ObjectRef>& value, Object& model, bool required) +{ + // Find the node corresponding to the object list wanting to be populated + DOMNode* listNode = FindElementByName(m_node, CStdString(key)); + + // Create a new serializer and affect it to this object + if (listNode) + { + // Iterate over the nodes ##### + DOMNode* node = listNode->getFirstChild(); + while(node) + { + // Create a new object instance + ObjectRef newObject = model.NewInstance(); + try + { + DomSerializer serializer(newObject.get()); + serializer.DeSerialize(node); + value.push_back(newObject); + + } + catch (CStdString& e) + { + // For now, do not interrupt the deserialization process. + // in the future, we might let this exception go through if the node has been + // recognized to bear the proper tag name + ; + } + node = node->getNextSibling(); + } + + } + else if (required) + { + throw(CStdString("DomSerializer::GetList: required node missing:") + key); + } +} + + void DomSerializer::AddObject(const char* key, Object& value) { + // Not yet implemented #### ; } +void DomSerializer::AddList(const char* key, std::list<ObjectRef>& value) +{ + // Not yet implemented #### + ; +} + + void DomSerializer::AddString(const char* key, CStdString& value) { DOMElement* newElem = m_document->createElement(XStr(key).unicodeForm()); diff --git a/orkbasecxx/serializers/DomSerializer.h b/orkbasecxx/serializers/DomSerializer.h index 1e2b264..253fb0c 100644 --- a/orkbasecxx/serializers/DomSerializer.h +++ b/orkbasecxx/serializers/DomSerializer.h @@ -32,14 +32,18 @@ public: DomSerializer(Object* object) : Serializer(object){}; void ObjectValue(const char* key, Object& value, bool required = false); + void ListValue(const char* key, std::list<ObjectRef>& value, Object& model, bool required = false); + void AddInt(const char* key, int value); void AddString(const char* key, CStdString& value); void AddObject(const char* key, Object& value); + void AddList(const char* key, std::list<ObjectRef>& value); void Serialize(XERCES_CPP_NAMESPACE::DOMDocument* node); void GetString(const char* key, CStdString& value, bool required = false); void GetObject(const char* key, Object& value, bool required = false); + void GetList(const char* key, std::list<ObjectRef>& value, Object& model, bool required = false); void DeSerialize(DOMNode* node); static CStdString XMLStringToLocal(const XMLCh* const toTranscode); diff --git a/orkbasecxx/serializers/Serializer.cpp b/orkbasecxx/serializers/Serializer.cpp index 8e571ed..6706d6f 100644 --- a/orkbasecxx/serializers/Serializer.cpp +++ b/orkbasecxx/serializers/Serializer.cpp @@ -310,3 +310,8 @@ void KeyValueSerializer::ObjectValue(const char* key, Object& value, bool requir throw CStdString(CStdString("KeyValueSerializer::ObjectValue: Nested objects not allowed for key-value serializers")); } +void KeyValueSerializer::ListValue(const char* key, std::list<ObjectRef>& value, Object& model, bool required ) +{ + throw CStdString(CStdString("KeyValueSerializer::ListValue: Nested objects not allowed for key-value serializers")); +} + diff --git a/orkbasecxx/serializers/Serializer.h b/orkbasecxx/serializers/Serializer.h index e7ea659..c92220f 100644 --- a/orkbasecxx/serializers/Serializer.h +++ b/orkbasecxx/serializers/Serializer.h @@ -27,6 +27,7 @@ typedef int (*StringToEnumFunction)(CStdString&); typedef CStdString (*EnumToStringFunction)(int); class Object; +typedef boost::shared_ptr<Object> ObjectRef; /** Base class for serializing Objects. */ @@ -43,6 +44,7 @@ public: virtual void ObjectValue(const char* key, Object& value, bool required = false) = 0; void CsvValue(const char* key, std::list<CStdString>& value, bool required = false); void DateValue(const char* key, time_t& value, bool required = false); + virtual void ListValue(const char* key, std::list<ObjectRef>& value, Object& model, bool required = false) = 0; void AddInt(const char* key, int value); void AddDouble(const char* key, double value); @@ -76,6 +78,7 @@ public: KeyValueSerializer(Object* object) : Serializer(object), m_numParams(0){}; void ObjectValue(const char* key, Object& value, bool required = false); + void ListValue(const char* key, std::list<ObjectRef>& value, Object& model, bool required = false); void GetString(const char* key, CStdString& value, bool required = false); |