mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
Syncing uppdev
git-svn-id: svn://ultimatepp.org/upp/trunk@1813 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
f4a72cf31b
commit
31dcfb1af2
11 changed files with 431 additions and 0 deletions
13
uppdev/NewXmlRpc/NewXmlRpc.upp
Normal file
13
uppdev/NewXmlRpc/NewXmlRpc.upp
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
uses
|
||||
Core;
|
||||
|
||||
file
|
||||
XmlRpc.h,
|
||||
Value.cpp,
|
||||
XmlRpcParser.cpp,
|
||||
main.cpp,
|
||||
request.txt;
|
||||
|
||||
mainconfig
|
||||
"" = "";
|
||||
|
||||
94
uppdev/NewXmlRpc/Value.cpp
Normal file
94
uppdev/NewXmlRpc/Value.cpp
Normal 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
82
uppdev/NewXmlRpc/XmlRpc.h
Normal 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
|
||||
72
uppdev/NewXmlRpc/XmlRpcParser.cpp
Normal file
72
uppdev/NewXmlRpc/XmlRpcParser.cpp
Normal 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
4
uppdev/NewXmlRpc/init
Normal 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
104
uppdev/NewXmlRpc/main.cpp
Normal 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);
|
||||
}
|
||||
43
uppdev/NewXmlRpc/request.txt
Normal file
43
uppdev/NewXmlRpc/request.txt
Normal 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>
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
6
uppdev/XmlRpcTest/XmlRpcTest.upp
Normal file
6
uppdev/XmlRpcTest/XmlRpcTest.upp
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
uses
|
||||
Core;
|
||||
|
||||
file
|
||||
main.cpp;
|
||||
|
||||
4
uppdev/XmlRpcTest/init
Normal file
4
uppdev/XmlRpcTest/init
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#ifndef _XmlRpcTest_icpp_init_stub
|
||||
#define _XmlRpcTest_icpp_init_stub
|
||||
#include "Core/init"
|
||||
#endif
|
||||
8
uppdev/XmlRpcTest/main.cpp
Normal file
8
uppdev/XmlRpcTest/main.cpp
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
|
||||
|
||||
struct Data {
|
||||
String s;
|
||||
int q;
|
||||
|
||||
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue