summaryrefslogtreecommitdiff
path: root/orkbasecxx/serializers/SingleLineSerializer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'orkbasecxx/serializers/SingleLineSerializer.cpp')
-rw-r--r--orkbasecxx/serializers/SingleLineSerializer.cpp203
1 files changed, 203 insertions, 0 deletions
diff --git a/orkbasecxx/serializers/SingleLineSerializer.cpp b/orkbasecxx/serializers/SingleLineSerializer.cpp
new file mode 100644
index 0000000..11b60d9
--- /dev/null
+++ b/orkbasecxx/serializers/SingleLineSerializer.cpp
@@ -0,0 +1,203 @@
+/*
+ * Oreka -- A media capture and retrieval platform
+ *
+ * Copyright (C) 2005, orecx LLC
+ *
+ * http://www.orecx.com
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License.
+ * Please refer to http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#include "ace/OS_NS_ctype.h"
+#include "Utils.h"
+#include "SingleLineSerializer.h"
+
+
+void SingleLineSerializer::AddString(const char* key, CStdString& value)
+{
+ CStdString pair;
+ CStdString escapedValue;
+ EscapeSingleLine(value, escapedValue);
+ pair.Format("%s=%s ", key, (PCSTR)escapedValue);
+ m_output += pair;
+}
+
+CStdString SingleLineSerializer::Serialize()
+{
+ m_deSerialize = false; // Set Serialize mode
+ m_object->Define(this);
+ return m_output;
+}
+
+typedef enum {SingleLineStartState, SingleLineKeyState, SingleLineValueState, SingleLineErrorState} SingleLineState;
+
+void SingleLineSerializer::DeSerialize(CStdString& input)
+{
+ // read string and extract values into map
+ SingleLineState state = SingleLineStartState;
+ CStdString key;
+ CStdString value;
+ // #### Additionally, errorDescription should be converted to Exceptions
+ CStdString errorDescription;
+
+ input.Trim();
+
+ for(int i=0; i<input.length() && state!= SingleLineErrorState; i++)
+ {
+ TCHAR character = input[i];
+
+ switch(state)
+ {
+ case SingleLineStartState:
+ if(character == ' ')
+ {
+ ; // ignore spaces
+ }
+ else if ( ACE_OS::ace_isalnum(character) )
+ {
+ state = SingleLineKeyState;
+ key = character;
+ }
+ else
+ {
+ state = SingleLineErrorState;
+ errorDescription = "Cannot find key start, keys must be alphanum";
+ }
+ break;
+ case SingleLineKeyState:
+ if( ACE_OS::ace_isalnum(character) )
+ {
+ key += character;
+ }
+ else if (character == '=')
+ {
+ state = SingleLineValueState;
+ value.Empty();
+ }
+ else
+ {
+ state = SingleLineErrorState;
+ errorDescription = "Invalid key character, keys must be alphanum";
+ }
+ break;
+ case SingleLineValueState:
+ if( character == '=')
+ {
+ state = SingleLineErrorState;
+ errorDescription = "Value followed by = sign, value should always be followed by space sign";
+ }
+ else if (character == ' ')
+ {
+ state = SingleLineStartState;
+ }
+ else
+ {
+ value += character;
+ }
+ break;
+ default:
+ state = SingleLineErrorState;
+ errorDescription = "Non-existing state";
+ } // switch(state)
+
+ if ( (state == SingleLineStartState) || (i == (input.length()-1)) )
+ {
+ if (!key.IsEmpty())
+ {
+ // SingleLine unescape
+ CStdString unescapedValue;
+ UnEscapeSingleLine(value, unescapedValue);
+
+ // Add pair to key-value map
+ m_map.insert(std::make_pair(key, unescapedValue));
+ key.Empty();
+ value.Empty();
+ }
+ }
+ } // for(int i=0; i<input.length() && state!= SingleLineErrorState; i++)
+
+ m_deSerialize = true; // Set DeSerialize mode
+ m_object->Define(this);
+ m_object->Validate();
+}
+
+// Escape the space, colon and percent characters for serializing to Key-Value-Pair text
+void SingleLineSerializer::EscapeSingleLine(CStdString& in, CStdString& out)
+{
+ for(int i=0; i<in.length();i++)
+ {
+ TCHAR c = in[i];
+ if (c == ' ')
+ {
+ out+= "%s";
+ }
+ else if (c == ':')
+ {
+ out+= "%c";
+ }
+ else if (c == '%')
+ {
+ out+= "%p";
+ }
+ else
+ {
+ out+= c;
+ }
+ }
+}
+
+// Unescape the space, colon and percent characters for serializing to Key-Value-Pair text
+void SingleLineSerializer::UnEscapeSingleLine(CStdString& in, CStdString& out)
+{
+ int iin = 0;
+
+ while(iin<in.length())
+ {
+ if ( in[iin] == '%')
+ {
+ iin++;
+
+ switch (in[iin])
+ {
+ case 's':
+ out += ' ';
+ break;
+ case 'c':
+ out += ':';
+ break;
+ case 'p':
+ out += '%';
+ break;
+ }
+ }
+ else
+ {
+ out += in[iin];
+ }
+ iin++;
+ }
+}
+
+CStdString SingleLineSerializer::FindClass(CStdString& input)
+{
+ CStdString result;
+ int equalsPostion = input.Find('=');
+ if (equalsPostion != -1)
+ {
+ int spacePostion = input.Find(' ');
+ if (spacePostion > equalsPostion)
+ {
+ result = input.Mid(equalsPostion+1, spacePostion-equalsPostion-1);
+ }
+ else
+ {
+ result = input.Mid(equalsPostion+1, input.GetLength() - equalsPostion - 1);
+ }
+ }
+ result.ToLower();
+ return result;
+}
+