diff options
author | Henri Herscher <henri@oreka.org> | 2007-02-28 17:05:06 +0000 |
---|---|---|
committer | Henri Herscher <henri@oreka.org> | 2007-02-28 17:05:06 +0000 |
commit | 24ff9679ca23c8dce3edc3fec2370f8d33a257a2 (patch) | |
tree | 357d15660e4447585719a24ec7c7aaa26ee878df /orkbasecxx | |
parent | 4a90ec83bc7de4103220f1d4e8663dc41a08f443 (diff) |
1. Added EscapeUrl and UnescapeURL methods to UrlSerializer so that HTTP client and server can handle special characters.
2. UrlSerializer does not lowercase input anymore.
3. Centralized DeSerialize process in Serializer base class.
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@421 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orkbasecxx')
-rw-r--r-- | orkbasecxx/serializers/DomSerializer.cpp | 4 | ||||
-rw-r--r-- | orkbasecxx/serializers/Serializer.cpp | 13 | ||||
-rw-r--r-- | orkbasecxx/serializers/Serializer.h | 3 | ||||
-rw-r--r-- | orkbasecxx/serializers/SingleLineSerializer.cpp | 4 | ||||
-rw-r--r-- | orkbasecxx/serializers/UrlSerializer.cpp | 56 |
5 files changed, 64 insertions, 16 deletions
diff --git a/orkbasecxx/serializers/DomSerializer.cpp b/orkbasecxx/serializers/DomSerializer.cpp index 84f66d0..a91d11d 100644 --- a/orkbasecxx/serializers/DomSerializer.cpp +++ b/orkbasecxx/serializers/DomSerializer.cpp @@ -162,9 +162,7 @@ void DomSerializer::Serialize(XERCES_CPP_NAMESPACE::DOMDocument* doc) void DomSerializer::DeSerialize(DOMNode* node) { m_node = node; - m_deSerialize = true; // Set DeSerialize mode - m_object->Define(this); - m_object->Validate(); + Serializer::DeSerialize(); } CStdString DomSerializer::XMLStringToLocal(const XMLCh* const toTranscode) diff --git a/orkbasecxx/serializers/Serializer.cpp b/orkbasecxx/serializers/Serializer.cpp index 6706d6f..fd1b316 100644 --- a/orkbasecxx/serializers/Serializer.cpp +++ b/orkbasecxx/serializers/Serializer.cpp @@ -25,6 +25,19 @@ Serializer::Serializer(Object* object) m_object = object; } +void Serializer::SetObject(Object* object) +{ + m_object = object; +} + +void Serializer::DeSerialize() +{ + m_deSerialize = true; // Set DeSerialize mode + m_object->Define(this); + m_object->Validate(); +} + + void Serializer::IntValue(const char* key, int& value, bool required) { if (m_deSerialize == true) diff --git a/orkbasecxx/serializers/Serializer.h b/orkbasecxx/serializers/Serializer.h index c92220f..9c281f3 100644 --- a/orkbasecxx/serializers/Serializer.h +++ b/orkbasecxx/serializers/Serializer.h @@ -35,6 +35,9 @@ class DLL_IMPORT_EXPORT_ORKBASE Serializer { public: Serializer(Object* object); + void SetObject(Object* object); + + void DeSerialize(); void IntValue(const char* key, int& value, bool required = false); void DoubleValue(const char* key, double& value, bool required = false); diff --git a/orkbasecxx/serializers/SingleLineSerializer.cpp b/orkbasecxx/serializers/SingleLineSerializer.cpp index 11b60d9..9dc12f3 100644 --- a/orkbasecxx/serializers/SingleLineSerializer.cpp +++ b/orkbasecxx/serializers/SingleLineSerializer.cpp @@ -119,9 +119,7 @@ void SingleLineSerializer::DeSerialize(CStdString& input) } } // for(int i=0; i<input.length() && state!= SingleLineErrorState; i++) - m_deSerialize = true; // Set DeSerialize mode - m_object->Define(this); - m_object->Validate(); + Serializer::DeSerialize(); } // Escape the space, colon and percent characters for serializing to Key-Value-Pair text diff --git a/orkbasecxx/serializers/UrlSerializer.cpp b/orkbasecxx/serializers/UrlSerializer.cpp index 084664d..b80024a 100644 --- a/orkbasecxx/serializers/UrlSerializer.cpp +++ b/orkbasecxx/serializers/UrlSerializer.cpp @@ -16,6 +16,10 @@ #include "UrlSerializer.h" +static char url_ok_chars[] = "*-.0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"; +static char hex_digits[17] = "0123456789ABCDEF"; + + void UrlSerializer::AddString(const char* key, CStdString& value) { CStdString pair; @@ -43,7 +47,6 @@ void UrlSerializer::DeSerialize(CStdString& input) CStdString errorDescription; input.Trim(); - //input.ToLower(); for(int i=0; i<input.length() && state!= UrlErrorState; i++) { @@ -119,23 +122,56 @@ void UrlSerializer::DeSerialize(CStdString& input) } } // for(int i=0; i<input.length() && state!= UrlErrorState; i++) - m_deSerialize = true; // Set DeSerialize mode - m_object->Define(this); - m_object->Validate(); + Serializer::DeSerialize(); } -// Escape the space, colon and percent characters for serializing to Key-Value-Pair text void UrlSerializer::EscapeUrl(CStdString& in, CStdString& out) { - //####### fixme, need unescaping - out = in; + // Translates all the characters that are not in url_ok_chars string into %xx sequences + // %xx specifies the character ascii code in hexadecimal + out = ""; + for (int i = 0 ; i<in.size() ; i++) + { + if (in.GetAt(i) == ' ') + out += '+'; + else if (strchr(url_ok_chars, in.GetAt(i))) + out += in.GetAt(i); + else + { + out += '%'; + out += hex_digits[((unsigned char) in.GetAt(i)) >> 4]; + out += hex_digits[in.GetAt(i) & 0x0F]; + } + } } -// Unescape the space, colon and percent characters for serializing to Key-Value-Pair text void UrlSerializer::UnEscapeUrl(CStdString& in, CStdString& out) { - // ###### fixme, need escaping - out = in; + // Translates all %xx escaped sequences to corresponding ascii characters + out = ""; + char pchHex[3]; + for (int i = 0; i<in.size(); i++) + { + switch (in.GetAt(i)) + { + case '+': + out += ' '; + break; + case '%': + if (in.GetAt(++i) == '%') + { + out += '%'; + break; + } + pchHex[0] = in.GetAt(i); + pchHex[1] = in.GetAt(++i); + pchHex[2] = 0; + out += (char)strtol(pchHex, NULL, 16); + break; + default: + out += in.GetAt(i); + } + } } CStdString UrlSerializer::FindClass(CStdString& input) |