summaryrefslogtreecommitdiff
path: root/orkbasecxx/serializers
diff options
context:
space:
mode:
authorHenri Herscher <henri@oreka.org>2006-07-11 19:00:34 +0000
committerHenri Herscher <henri@oreka.org>2006-07-11 19:00:34 +0000
commitf1e0b21098f7c46e49f50494ebba617a74a38cee (patch)
tree65cac81b8225459c05fa13084400e8e85a44e197 /orkbasecxx/serializers
parent90f521dfe34909672ebfead5ef2ba87742c33cdd (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.cpp59
-rw-r--r--orkbasecxx/serializers/DomSerializer.h4
-rw-r--r--orkbasecxx/serializers/Serializer.cpp5
-rw-r--r--orkbasecxx/serializers/Serializer.h3
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);