summaryrefslogtreecommitdiff
path: root/orkbasecxx
diff options
context:
space:
mode:
authorHenri Herscher <henri@oreka.org>2007-02-28 17:05:06 +0000
committerHenri Herscher <henri@oreka.org>2007-02-28 17:05:06 +0000
commit24ff9679ca23c8dce3edc3fec2370f8d33a257a2 (patch)
tree357d15660e4447585719a24ec7c7aaa26ee878df /orkbasecxx
parent4a90ec83bc7de4103220f1d4e8663dc41a08f443 (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.cpp4
-rw-r--r--orkbasecxx/serializers/Serializer.cpp13
-rw-r--r--orkbasecxx/serializers/Serializer.h3
-rw-r--r--orkbasecxx/serializers/SingleLineSerializer.cpp4
-rw-r--r--orkbasecxx/serializers/UrlSerializer.cpp56
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)