diff options
author | Henri Herscher <henri@oreka.org> | 2007-04-05 18:31:51 +0000 |
---|---|---|
committer | Henri Herscher <henri@oreka.org> | 2007-04-05 18:31:51 +0000 |
commit | 99f1724a10f8a892cb354d827fff7d21050eb8f3 (patch) | |
tree | c35eb053dfd1572a43132c3e237588b48badadbd /orkbasecxx | |
parent | a8610d8f625bc68dd37757128345265b9f49bdd4 (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.cpp | 181 | ||||
-rw-r--r-- | orkbasecxx/serializers/Serializer.h | 8 |
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; |