summaryrefslogtreecommitdiff
path: root/orkbasecxx
diff options
context:
space:
mode:
authorHenri Herscher <henri@oreka.org>2007-04-05 18:31:51 +0000
committerHenri Herscher <henri@oreka.org>2007-04-05 18:31:51 +0000
commit99f1724a10f8a892cb354d827fff7d21050eb8f3 (patch)
treec35eb053dfd1572a43132c3e237588b48badadbd /orkbasecxx
parenta8610d8f625bc68dd37757128345265b9f49bdd4 (diff)
Added csv map serialization/deserialization capability.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@435 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orkbasecxx')
-rw-r--r--orkbasecxx/serializers/Serializer.cpp181
-rw-r--r--orkbasecxx/serializers/Serializer.h8
2 files changed, 186 insertions, 3 deletions
diff --git a/orkbasecxx/serializers/Serializer.cpp b/orkbasecxx/serializers/Serializer.cpp
index fd1b316..b337070 100644
--- a/orkbasecxx/serializers/Serializer.cpp
+++ b/orkbasecxx/serializers/Serializer.cpp
@@ -110,6 +110,18 @@ void Serializer::CsvValue(const char* key, std::list<CStdString>& value, bool re
}
}
+void Serializer::CsvMapValue(const char* key, std::map<CStdString, CStdString>& value, bool required)
+{
+ if (m_deSerialize == true)
+ {
+ GetCsvMap(key, value, required);
+ }
+ else
+ {
+ AddCsvMap(key, value);
+ }
+}
+
void Serializer::DateValue(const char* key, time_t& value, bool required)
{
if (m_deSerialize == true)
@@ -174,11 +186,40 @@ void Serializer::AddCsv(const char* key, std::list<CStdString>& value)
csvString += ",";
}
first = false;
- csvString += *it;
+ CStdString escapedValue;
+ EscapeCsv(*it, escapedValue);
+ csvString += escapedValue;
}
AddString(key, csvString);
}
+void Serializer::AddCsvMap(const char* key, std::map<CStdString, CStdString>& value)
+{
+ CStdString csvMapString;
+ bool first = true;
+ for(std::map<CStdString, CStdString>::iterator pair = value.begin(); pair!=value.end(); pair++)
+ {
+ if(!first)
+ {
+ csvMapString += ",";
+ }
+ first = false;
+
+ CStdString pairKey = pair->first;
+ CStdString escapedPairKey;
+ EscapePair(pairKey, escapedPairKey);
+ CStdString pairVal = pair->second;
+ CStdString escapedPairVal;
+ EscapePair(pairVal, escapedPairVal);
+
+ CStdString csvElement = escapedPairKey + ":" + escapedPairVal;
+ CStdString escapedCsvElement;
+ EscapeCsv(csvElement, escapedCsvElement);
+ csvMapString += escapedCsvElement;
+ }
+ AddString(key, csvMapString);
+}
+
void Serializer::AddDate(const char* key, time_t value)
{
struct tm date;
@@ -271,7 +312,9 @@ void Serializer::GetCsv(const char* key, std::list<CStdString>& value, bool req
value.clear();
}
element.Trim();
- value.push_back(element);
+ CStdString unescapedElement;
+ UnEscapeCsv(element, unescapedElement);
+ value.push_back(unescapedElement);
element.Empty();
}
else
@@ -287,7 +330,37 @@ void Serializer::GetCsv(const char* key, std::list<CStdString>& value, bool req
value.clear();
}
element.Trim();
- value.push_back(element);
+ CStdString unescapedElement;
+ UnEscapeCsv(element, unescapedElement);
+ value.push_back(unescapedElement);
+ }
+}
+
+void Serializer::GetCsvMap(const char* key, std::map<CStdString, CStdString>& value, bool required)
+{
+ std::list<CStdString> cvsList;
+ GetCsv(key, cvsList, required);
+
+ for(std::list<CStdString>::iterator it = cvsList.begin(); it != cvsList.end(); it++)
+ {
+ CStdString keyValuePair = *it;
+ int colonPos = keyValuePair.Find(':');
+ if(colonPos != -1)
+ {
+ CStdString key = keyValuePair.Left(colonPos);
+ CStdString val = keyValuePair.Right(keyValuePair.size() - colonPos - 1);
+
+ CStdString unescapedKey;
+ UnEscapePair(key, unescapedKey);
+ CStdString unescapedVal;
+ UnEscapePair(val, unescapedVal);
+
+ value.insert(std::make_pair(unescapedKey, unescapedVal));
+ }
+ else
+ {
+ throw(CStdString("DeSerializer: GetCsvMap: missing colon in map element"));
+ }
}
}
@@ -303,6 +376,108 @@ void Serializer::GetDate(const char* key, time_t& value, bool required)
}
}
+//-------------------------------------------------------------------------
+// Escape the comma and percent characters for adding string to csv list
+void Serializer::EscapeCsv(CStdString& in, CStdString& out)
+{
+ for(int i=0; i<in.length();i++)
+ {
+ TCHAR c = in[i];
+ if (c == ',')
+ {
+ out+= "%c";
+ }
+ else if (c == '%')
+ {
+ out+= "%p";
+ }
+ else
+ {
+ out+= c;
+ }
+ }
+}
+
+// Unescape the comma and percent characters when retrieving from csv list
+void Serializer::UnEscapeCsv(CStdString& in, CStdString& out)
+{
+ int iin = 0;
+
+ while(iin<in.length())
+ {
+ if ( in[iin] == '%')
+ {
+ iin++;
+
+ switch (in[iin])
+ {
+ case 'c':
+ out += ',';
+ break;
+ case 'p':
+ out += '%';
+ break;
+ }
+ }
+ else
+ {
+ out += in[iin];
+ }
+ iin++;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+// Escape the colon and percent characters for adding string to a pair of the form "key:value"
+void Serializer::EscapePair(CStdString& in, CStdString& out)
+{
+ for(int i=0; i<in.length();i++)
+ {
+ TCHAR c = in[i];
+ if (c == ':')
+ {
+ out+= "%k";
+ }
+ else if (c == '%')
+ {
+ out+= "%p";
+ }
+ else
+ {
+ out+= c;
+ }
+ }
+}
+
+// UnEscape the colon and percent characters after retrieving a key or value from a pair of the form "key:value"
+void Serializer::UnEscapePair(CStdString& in, CStdString& out)
+{
+ int iin = 0;
+
+ while(iin<in.length())
+ {
+ if ( in[iin] == '%')
+ {
+ iin++;
+
+ switch (in[iin])
+ {
+ case 'k':
+ out += ':';
+ break;
+ case 'p':
+ out += '%';
+ break;
+ }
+ }
+ else
+ {
+ out += in[iin];
+ }
+ iin++;
+ }
+}
+
//==========================================================
void KeyValueSerializer::GetString(const char* key, CStdString& value, bool required)
diff --git a/orkbasecxx/serializers/Serializer.h b/orkbasecxx/serializers/Serializer.h
index 9c281f3..c8c3a43 100644
--- a/orkbasecxx/serializers/Serializer.h
+++ b/orkbasecxx/serializers/Serializer.h
@@ -46,6 +46,7 @@ public:
void EnumValue(const char* key, int& value, StringToEnumFunction, EnumToStringFunction, bool required = false);
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 CsvMapValue(const char* key, std::map<CStdString, 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;
@@ -54,6 +55,7 @@ public:
void AddBool(const char* key, bool value);
void AddEnum(const char* key, int value, EnumToStringFunction);
void AddCsv(const char* key, std::list<CStdString>& value);
+ void AddCsvMap(const char* key, std::map<CStdString, CStdString>& value);
void AddDate(const char* key, time_t value);
virtual void AddString(const char* key, CStdString& value) = 0;
@@ -62,9 +64,15 @@ public:
void GetBool(const char* key, bool& value, bool required = false);
void GetEnum(const char* key, int& value, StringToEnumFunction, bool required = false);
void GetCsv(const char* key, std::list<CStdString>& value, bool required = false);
+ void GetCsvMap(const char* key, std::map<CStdString, CStdString>& value, bool required = false);
void GetDate(const char* key, time_t& value, bool required = false);
virtual void GetString(const char* key, CStdString& value, bool required = false) = 0;
+ void Serializer::EscapeCsv(CStdString& in, CStdString& out);
+ void Serializer::UnEscapeCsv(CStdString& in, CStdString& out);
+ void Serializer::EscapePair(CStdString& in, CStdString& out);
+ void Serializer::UnEscapePair(CStdString& in, CStdString& out);
+
protected:
Object* m_object;