From 99f1724a10f8a892cb354d827fff7d21050eb8f3 Mon Sep 17 00:00:00 2001 From: Henri Herscher Date: Thu, 5 Apr 2007 18:31:51 +0000 Subject: Added csv map serialization/deserialization capability. git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@435 09dcff7a-b715-0410-9601-b79a96267cd0 --- orkbasecxx/serializers/Serializer.cpp | 181 +++++++++++++++++++++++++++++++++- 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& value, bool re } } +void Serializer::CsvMapValue(const char* key, std::map& 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& value) csvString += ","; } first = false; - csvString += *it; + CStdString escapedValue; + EscapeCsv(*it, escapedValue); + csvString += escapedValue; } AddString(key, csvString); } +void Serializer::AddCsvMap(const char* key, std::map& value) +{ + CStdString csvMapString; + bool first = true; + for(std::map::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& 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& 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& value, bool required) +{ + std::list cvsList; + GetCsv(key, cvsList, required); + + for(std::list::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& value, bool required = false); + void CsvMapValue(const char* key, std::map& value, bool required = false); void DateValue(const char* key, time_t& value, bool required = false); virtual void ListValue(const char* key, std::list& 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& value); + void AddCsvMap(const char* key, std::map& 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& value, bool required = false); + void GetCsvMap(const char* key, std::map& 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; -- cgit v1.2.3