Syncing uppdev

git-svn-id: svn://ultimatepp.org/upp/trunk@1813 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2009-12-15 09:56:54 +00:00
parent f4a72cf31b
commit 31dcfb1af2
11 changed files with 431 additions and 0 deletions

View file

@ -0,0 +1,13 @@
uses
Core;
file
XmlRpc.h,
Value.cpp,
XmlRpcParser.cpp,
main.cpp,
request.txt;
mainconfig
"" = "";

View file

@ -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;
}

82
uppdev/NewXmlRpc/XmlRpc.h Normal file
View file

@ -0,0 +1,82 @@
#ifndef _NewXmlRpc_XmlRpc_h_
#define _NewXmlRpc_XmlRpc_h_
#include <Core/Core.h>
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 <class T>
void ValueGet(Array<T>& 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 <class T>
void ValueGet(Vector<T>& 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 <class T>
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 <class T>
void ValueGet(T& x, const Value& v) {
ValueMapper m(v);
m.get = true;
x.Map(m);
}
template <class T>
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

View file

@ -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;
}

4
uppdev/NewXmlRpc/init Normal file
View file

@ -0,0 +1,4 @@
#ifndef _NewXmlRpc_icpp_init_stub
#define _NewXmlRpc_icpp_init_stub
#include "Core/init"
#endif

104
uppdev/NewXmlRpc/main.cpp Normal file
View file

@ -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<String> a;
ValueGet(a, va);
DUMPC(a);
Vector<String> 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<TestMap> 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);
}

View file

@ -0,0 +1,43 @@
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
<param>
<value><string>+</string></value>
</param>
<param>
<value><int>42</int></value>
</param>
<param>
<value>
<array>
<data>
<value><i4>1</i4></value>
<value><i4>2</i4></value>
<value><i4>3</i4></value>
<value><i4>4</i4></value>
<value><i4>5</i4></value>
<value><string>test</string></value>
</data>
</array>
</value>
</param>
<param>
<value>
<struct>
<member>
<name>first</name>
<value><string>Hello world</string></value>
</member>
<member>
<name>second</name>
<value><int>42</int></value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>

View file

@ -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

View file

@ -0,0 +1,6 @@
uses
Core;
file
main.cpp;

4
uppdev/XmlRpcTest/init Normal file
View file

@ -0,0 +1,4 @@
#ifndef _XmlRpcTest_icpp_init_stub
#define _XmlRpcTest_icpp_init_stub
#include "Core/init"
#endif

View file

@ -0,0 +1,8 @@
struct Data {
String s;
int q;
};