From 31dcfb1af2b5535481adfc74f0d987bf28c186d2 Mon Sep 17 00:00:00 2001 From: cxl Date: Tue, 15 Dec 2009 09:56:54 +0000 Subject: [PATCH] Syncing uppdev git-svn-id: svn://ultimatepp.org/upp/trunk@1813 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppdev/NewXmlRpc/NewXmlRpc.upp | 13 ++++ uppdev/NewXmlRpc/Value.cpp | 94 +++++++++++++++++++++++++++ uppdev/NewXmlRpc/XmlRpc.h | 82 +++++++++++++++++++++++ uppdev/NewXmlRpc/XmlRpcParser.cpp | 72 +++++++++++++++++++++ uppdev/NewXmlRpc/init | 4 ++ uppdev/NewXmlRpc/main.cpp | 104 ++++++++++++++++++++++++++++++ uppdev/NewXmlRpc/request.txt | 43 ++++++++++++ uppdev/RpcTest/RpcTest.lay | 1 + uppdev/XmlRpcTest/XmlRpcTest.upp | 6 ++ uppdev/XmlRpcTest/init | 4 ++ uppdev/XmlRpcTest/main.cpp | 8 +++ 11 files changed, 431 insertions(+) create mode 100644 uppdev/NewXmlRpc/NewXmlRpc.upp create mode 100644 uppdev/NewXmlRpc/Value.cpp create mode 100644 uppdev/NewXmlRpc/XmlRpc.h create mode 100644 uppdev/NewXmlRpc/XmlRpcParser.cpp create mode 100644 uppdev/NewXmlRpc/init create mode 100644 uppdev/NewXmlRpc/main.cpp create mode 100644 uppdev/NewXmlRpc/request.txt create mode 100644 uppdev/XmlRpcTest/XmlRpcTest.upp create mode 100644 uppdev/XmlRpcTest/init create mode 100644 uppdev/XmlRpcTest/main.cpp diff --git a/uppdev/NewXmlRpc/NewXmlRpc.upp b/uppdev/NewXmlRpc/NewXmlRpc.upp new file mode 100644 index 000000000..1add0e1e5 --- /dev/null +++ b/uppdev/NewXmlRpc/NewXmlRpc.upp @@ -0,0 +1,13 @@ +uses + Core; + +file + XmlRpc.h, + Value.cpp, + XmlRpcParser.cpp, + main.cpp, + request.txt; + +mainconfig + "" = ""; + diff --git a/uppdev/NewXmlRpc/Value.cpp b/uppdev/NewXmlRpc/Value.cpp new file mode 100644 index 000000000..eccf3257a --- /dev/null +++ b/uppdev/NewXmlRpc/Value.cpp @@ -0,0 +1,94 @@ +#include "XmlRpc.h" + +void ValueCheck(bool b) +{ + if(!b) + throw ValueTypeMismatch(); +} + +void ValueGet(int& n, const Value& v) +{ + ValueCheck(IsNumber(v)); + n = v; +} + +void ValueGet(String& s, const Value& v) +{ + ValueCheck(IsString(s)); + s = v; +} + +void ValueGet(double& x, const Value& v) +{ + ValueCheck(IsNumber(v)); + x = v; +} + +void ValueGet(Date& x, const Value& v) +{ + ValueCheck(IsDateTime(v)); + x = v; +} + +void ValueGet(Time& x, const Value& v) +{ + ValueCheck(IsDateTime(v)); + x = v; +} + +void ValueGet(Value& t, const Value& v) +{ + t = v; +} + +void ValueGet(ValueArray& va, const Value& v) +{ + ValueCheck(IsValueArray(v)); + va = v; +} + +void ValueGet(ValueMap& vm, const Value& v) +{ + ValueCheck(IsValueMap(v)); + vm = v; +} + +void ValuePut(Value& v, int& n) +{ + v = n; +} + +void ValuePut(Value& v, String& s) +{ + v = s; +} + +void ValuePut(Value& v, double& x) +{ + v = x; +} + +void ValuePut(Value& v, Date& x) +{ + v = x; +} + +void ValuePut(Value& v, Time& x) +{ + v = x; +} + +void ValuePut(Value& v, Value& t) +{ + v = t; +} + +void ValuePut(Value& v, ValueArray& va) +{ + v = va; +} + +void ValuePut(Value& v, ValueMap& vm) +{ + v = vm; +} diff --git a/uppdev/NewXmlRpc/XmlRpc.h b/uppdev/NewXmlRpc/XmlRpc.h new file mode 100644 index 000000000..067bbf20d --- /dev/null +++ b/uppdev/NewXmlRpc/XmlRpc.h @@ -0,0 +1,82 @@ +#ifndef _NewXmlRpc_XmlRpc_h_ +#define _NewXmlRpc_XmlRpc_h_ + +#include + +using namespace Upp; + +struct ValueTypeMismatch {}; + +void ValueCheck(bool b); + +void ValueGet(int& n, const Value& v); +void ValueGet(String& s, const Value& v); +void ValueGet(double& x, const Value& v); +void ValueGet(Date& x, const Value& v); +void ValueGet(Time& x, const Value& v); +void ValueGet(Value& t, const Value& v); +void ValueGet(ValueArray& va, const Value& v); +void ValueGet(ValueMap& vm, const Value& v); + +template +void ValueGet(Array& x, Value v) { + ValueCheck(IsValueArray(v)); + ValueArray va = v; + x.SetCount(va.GetCount()); + for(int i = 0; i < va.GetCount(); i++) + ValueGet(x[i], va[i]); +} + +template +void ValueGet(Vector& x, Value v) { + ValueCheck(IsValueArray(v)); + ValueArray va = v; + x.SetCount(va.GetCount()); + for(int i = 0; i < va.GetCount(); i++) + ValueGet(x[i], va[i]); +} + +void ValuePut(Value& v, int& n); +void ValuePut(Value& v, String& s); +void ValuePut(Value& v, double& x); +void ValuePut(Value& v, Date& x); +void ValuePut(Value& v, Time& x); +void ValuePut(Value& v, Value& t); +void ValuePut(Value& v, ValueArray& va); +void ValuePut(Value& v, ValueMap& vm); + +struct ValueMapper { + ValueMap map; + bool get; + + template + ValueMapper& operator()(const char *name, T& x) { + if(get) + ValueGet(x, map[name]); + else + ValuePut(map[name], x); + return *this; + } + + ValueMapper(ValueMap m) : map(m) {} +}; + +template +void ValueGet(T& x, const Value& v) { + ValueMapper m(v); + m.get = true; + x.Map(m); +} + +template +void ValuePut(Value& v, T& x) { + ValueMapper m(v); + m.get = false; + x.Map(m); +} + +Value ParseXmlRpcValue(XmlParser& p); +Value ParseXmlRpcParam(XmlParser& p); +ValueArray ParseXmlRpcParams(XmlParser& p); + +#endif diff --git a/uppdev/NewXmlRpc/XmlRpcParser.cpp b/uppdev/NewXmlRpc/XmlRpcParser.cpp new file mode 100644 index 000000000..055643024 --- /dev/null +++ b/uppdev/NewXmlRpc/XmlRpcParser.cpp @@ -0,0 +1,72 @@ +#include "XmlRpc.h" + +Value ParseXmlRpcValue(XmlParser& p) +{ + Value r; + p.PassTag("value"); + if(p.Tag("int") || p.Tag("i4")) { + int n = StrInt(p.ReadText()); + if(IsNull(n)) + throw XmlError("integer expected"); + r = n; + } + else + if(p.Tag("boolean")) { + int n = StrInt(p.ReadText()); + if(n != 0 && n != 1) + throw XmlError("boolean expected"); + r = n; + } + else + if(p.Tag("string") || p.Tag("base64")) + r = p.ReadText(); + else + if(p.Tag("dateTime.iso8601")) { + String s = TrimBoth(p.ReadText()); + // 19980717T14:08:55 + // 01234567890123456 + if(s.GetCount() != 16 || s[8] != 'T' || s[11] != ':' || s[14] != ':') + throw XmlError("invalid dateTime format"); + Time tm; + tm.year = atoi(s.Mid(0, 4)); + tm.month = atoi(s.Mid(4, 2)); + tm.day = atoi(s.Mid(6, 2)); + tm.hour = atoi(s.Mid(9, 2)); + tm.minute = atoi(s.Mid(12, 2)); + tm.second = atoi(s.Mid(15, 2)); + r = tm; + } + else + if(p.Tag("array")) { + ValueArray va; + p.PassTag("data"); + while(!p.End()) + va.Add(ParseXmlRpcValue(p)); + r = va; + } + else + if(p.Tag("struct")) { + ValueMap vm; + while(p.Tag("member")) { + p.PassTag("name"); + String name = p.ReadText(); + p.PassEnd(); + vm.Add((Value)name, ParseXmlRpcValue(p)); + p.PassEnd(); + } + r = vm; + } + else + throw XmlError("unknown value type"); + p.PassEnd(); + p.PassEnd(); + return r; +} + +Value ParseXmlRpcParam(XmlParser& p) +{ + p.PassTag("param"); + Value v = ParseXmlRpcValue(p); + p.PassEnd(); + return v; +} diff --git a/uppdev/NewXmlRpc/init b/uppdev/NewXmlRpc/init new file mode 100644 index 000000000..3eeb1bdf1 --- /dev/null +++ b/uppdev/NewXmlRpc/init @@ -0,0 +1,4 @@ +#ifndef _NewXmlRpc_icpp_init_stub +#define _NewXmlRpc_icpp_init_stub +#include "Core/init" +#endif diff --git a/uppdev/NewXmlRpc/main.cpp b/uppdev/NewXmlRpc/main.cpp new file mode 100644 index 000000000..0b17964da --- /dev/null +++ b/uppdev/NewXmlRpc/main.cpp @@ -0,0 +1,104 @@ +#include "XmlRpc.h" + +using namespace Upp; + +/* +void Method(XmlRpcIO& rpc) +{ + int n1, n2; + String op; + rpc >> n1 >> op >> n2; + DUMP(n1); + DUMP(op); + DUMP(n2); + switch(*op) { + case '+': + rpc << n1 + n2; + break; + case '-': + rpc << n1 - n2; + break; + } +} +*/ + +struct TestMap { + String a; + int b; + + String ToString() const { return a + AsString(b); } + + void Map(ValueMapper& m) { + m("first", a)("second", b); + } +}; + +CONSOLE_APP_MAIN +{ + ValueArray va; + va.Add("Hello"); + va.Add("world"); + + Array a; + ValueGet(a, va); + DUMPC(a); + + Vector b; + ValueGet(b, va); + DUMPC(b); + + ValueMap m; + m.Add("first", "Number is "); + m.Add("second", 123); + + TestMap tm; + ValueGet(tm, m); + + DUMP(tm.a); + DUMP(tm.b); + + va.Clear(); + for(int i = 0; i < 10; i++) { + ValueMap m; + m.Add("first", "Number is "); + m.Add("second", i); + va.Add(m); + } + + Array tmm; + ValueGet(tmm, va); + DUMPC(tmm); + +/* + XmlRpcRequest qq; + qq.va.Add(123); + qq.va.Add(va); + + int x; + qq >> x >> tmm; + DUMP(x); + DUMPC(tmm); +*/ + String result; + String r = LoadFile(GetDataFile("request.txt")); + XmlParser p(r); + try { + p.ReadPI(); + p.PassTag("methodCall"); + p.PassTag("methodName"); + LOG("method name: " << p.ReadText()); + p.PassEnd(); + ValueArray param; + if(p.Tag("params")) { + while(!p.End()) { + param.Add(ParseXmlRpcParam(p)); + } + } + DUMP(param); + p.PassEnd(); + } + catch(XmlError e) { + LOG("XmlError " << e << ": " << p.GetPtr()); + } + LOG("Result: " << result); +} diff --git a/uppdev/NewXmlRpc/request.txt b/uppdev/NewXmlRpc/request.txt new file mode 100644 index 000000000..e4d0d118a --- /dev/null +++ b/uppdev/NewXmlRpc/request.txt @@ -0,0 +1,43 @@ + + + examples.getStateName + + + 41 + + + + + + + 42 + + + + + + 1 + 2 + 3 + 4 + 5 + test + + + + + + + + + first + Hello world + + + second + 42 + + + + + + diff --git a/uppdev/RpcTest/RpcTest.lay b/uppdev/RpcTest/RpcTest.lay index 5deeb323d..13c06f83d 100644 --- a/uppdev/RpcTest/RpcTest.lay +++ b/uppdev/RpcTest/RpcTest.lay @@ -42,3 +42,4 @@ LAYOUT(RpcTestMethodHelpLayout, 400, 228) ITEM(DocEdit, text, LeftPosZ(4, 392).TopPosZ(8, 184)) ITEM(Button, ok, SetLabel(t_("ok")).LeftPosZ(328, 63).TopPosZ(204, 17)) END_LAYOUT + diff --git a/uppdev/XmlRpcTest/XmlRpcTest.upp b/uppdev/XmlRpcTest/XmlRpcTest.upp new file mode 100644 index 000000000..5c1813b1e --- /dev/null +++ b/uppdev/XmlRpcTest/XmlRpcTest.upp @@ -0,0 +1,6 @@ +uses + Core; + +file + main.cpp; + diff --git a/uppdev/XmlRpcTest/init b/uppdev/XmlRpcTest/init new file mode 100644 index 000000000..c2b3da2de --- /dev/null +++ b/uppdev/XmlRpcTest/init @@ -0,0 +1,4 @@ +#ifndef _XmlRpcTest_icpp_init_stub +#define _XmlRpcTest_icpp_init_stub +#include "Core/init" +#endif diff --git a/uppdev/XmlRpcTest/main.cpp b/uppdev/XmlRpcTest/main.cpp new file mode 100644 index 000000000..3521c6607 --- /dev/null +++ b/uppdev/XmlRpcTest/main.cpp @@ -0,0 +1,8 @@ + + +struct Data { + String s; + int q; + + +}; \ No newline at end of file