o fixed xmlrpcvalue -> AmArg conversion:

- result of xmlrpc client call is now not packed into extra AmArg Array
 - nested arrays and structs work as expected

o added optional logging of xmlrpc server call parameters and result




git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1316 8eb893ce-cfd4-0310-b710-fb5ebe64c474
sayer/1.4-spce2.6
Stefan Sayer 18 years ago
parent 1d4c9017f7
commit 7f1ed2371d

@ -44,6 +44,9 @@ XMLRPC2DI* XMLRPC2DI::_instance=0;
// retry a failed server after 10 seconds
unsigned int XMLRPC2DI::ServerRetryAfter = 10;
bool XMLRPC2DI::DebugServerParams = false;
bool XMLRPC2DI::DebugServerResult = false;
double XMLRPC2DI::ServerTimeout = -1;
XMLRPC2DI* XMLRPC2DI::instance()
@ -75,6 +78,9 @@ int XMLRPC2DI::load() {
string multithreaded = cfg.getParameter("multithreaded", "yes");
DebugServerResult = cfg.getParameter("debug_server_result", "no") == "yes";
DebugServerParams = cfg.getParameter("debug_server_params", "no") == "yes";
XmlRpcServer* s;
bool multi_threaded = false;
unsigned int threads = 0;
@ -277,8 +283,7 @@ void XMLRPC2DI::sendRequestList(const AmArg& args, AmArg& ret) {
method.c_str(), srv->server.c_str(), srv->port);
ret.push(0);
ret.push("OK");
// ret.assertArray(3);
XMLRPC2DIServer::xmlrpcval2amarg(x_result, ret, 0);
XMLRPC2DIServer::xmlrpcval2amarg(x_result, ret);
return;
} else {
DBG("executing method %s failed on server %s:%d\n",
@ -447,8 +452,12 @@ void XMLRPC2DIServerDIMethod::execute(XmlRpcValue& params, XmlRpcValue& result)
// get args
AmArg args;
XMLRPC2DIServer::xmlrpcval2amarg(params, args, 2);
XMLRPC2DIServer::xmlrpcval2amargarray(params, args, 2);
if (XMLRPC2DI::DebugServerParams) {
DBG(" params: <%s>\n", AmArg::print(args).c_str());
}
AmDynInvokeFactory* di_f = AmPlugIn::instance()->getFactory4Di(fact_name);
if(!di_f){
throw XmlRpcException("could not get factory", 500);
@ -459,6 +468,11 @@ void XMLRPC2DIServerDIMethod::execute(XmlRpcValue& params, XmlRpcValue& result)
}
AmArg ret;
di->invoke(fct_name, args, ret);
if (XMLRPC2DI::DebugServerResult) {
DBG(" result: <%s>\n", AmArg::print(ret).c_str());
}
XMLRPC2DIServer::amarg2xmlrpcval(ret, result);
@ -479,37 +493,50 @@ void XMLRPC2DIServerDIMethod::execute(XmlRpcValue& params, XmlRpcValue& result)
}
}
void XMLRPC2DIServer::xmlrpcval2amarg(XmlRpcValue& v, AmArg& a,
unsigned int start_index) {
void XMLRPC2DIServer::xmlrpcval2amargarray(XmlRpcValue& v, AmArg& a,
unsigned int start_index) {
if (v.valid()) {
a.assertArray();
size_t a_array_pos = a.size();
for (int i=start_index; i<v.size();i++) {
switch (v[i].getType()) {
case XmlRpcValue::TypeInt: { /* DBG("X->A INT\n");*/ a.push(AmArg((int)v[i])); } break;
case XmlRpcValue::TypeDouble:{ /* DBG("X->A DBL\n");*/ a.push(AmArg((double)v[i])); } break;
case XmlRpcValue::TypeString:{ /* DBG("X->A STR\n");*/ a.push(AmArg(((string)v[i]).c_str())); } break;
case XmlRpcValue::TypeArray: {
// DBG("X->A ARR\n");
a.push(AmArg());
a[a.size()-1].assertArray(0);
AmArg arr;
xmlrpcval2amarg(v[i], a[a.size()-1], 0);
} break;
xmlrpcval2amarg(v[i], a[a_array_pos]);
a_array_pos++;
}
}
}
void XMLRPC2DIServer::xmlrpcval2amarg(XmlRpcValue& v, AmArg& a) {
if (v.valid()) {
switch (v.getType()) {
case XmlRpcValue::TypeInt: { /* DBG("X->A INT\n"); */ a = (int)v; } break;
case XmlRpcValue::TypeDouble:{ /* DBG("X->A DBL\n"); */ a = (double)v; } break;
case XmlRpcValue::TypeString:{ /* DBG("X->A STR\n"); */ a = ((string)v).c_str(); } break;
case XmlRpcValue::TypeArray: {
/* DBG("X->A ARR\n"); */
a.assertArray();
xmlrpcval2amargarray(v, a, 0);
} break;
#ifdef XMLRPCPP_SUPPORT_STRUCT_ACCESS
case XmlRpcValue::TypeStruct: {
for (XmlRpc::XmlRpcValue::ValueStruct::iterator it=
((XmlRpcValue::ValueStruct)v).begin();
it != ((XmlRpcValue::ValueStruct)v).end(); it++) {
a[it->first] = AmArg();
xmlrpcval2amarg(it->second, a[it->first], 0);
}
} break;
case XmlRpcValue::TypeStruct: {
/* DBG("X->A STR\n"); */
a.assertStruct();
const XmlRpc::XmlRpcValue::ValueStruct& xvs =
(XmlRpc::XmlRpcValue::ValueStruct)v;
for (XmlRpc::XmlRpcValue::ValueStruct::const_iterator it=
xvs.begin(); it != xvs.end(); it++) {
// not nice but cast operators in XmlRpcValue are not const
XmlRpcValue& var = const_cast<XmlRpcValue&>(it->second);
a[it->first] = AmArg();
xmlrpcval2amarg(var, a[it->first]);
}
} break;
#endif
// TODO: support more types (datetime, struct, ...)
default: throw XmlRpcException("unsupported parameter type", 400);
};
}
}
// TODO: support more types (datetime, struct, ...)
default: throw XmlRpcException("unsupported parameter type", 400);
};
}
}
void XMLRPC2DIServer::amarg2xmlrpcval(const AmArg& a,
@ -573,13 +600,22 @@ void DIMethodProxy::execute(XmlRpcValue& params,
}
AmArg args, ret;
XMLRPC2DIServer::xmlrpcval2amarg(params, args);
DBG("XMLRPC2DI '%s': function '%s'\n",
server_method_name.c_str(),
di_method_name.c_str());
XMLRPC2DIServer::xmlrpcval2amarg(params, args);
if (XMLRPC2DI::DebugServerParams) {
DBG(" params: <%s>\n", AmArg::print(args).c_str());
}
di->invoke(di_method_name, args, ret);
if (XMLRPC2DI::DebugServerResult) {
DBG(" result: <%s>\n", AmArg::print(ret).c_str());
}
XMLRPC2DIServer::amarg2xmlrpcval(ret, result);

@ -101,8 +101,8 @@ class XMLRPC2DIServer : public AmThread {
void run();
void on_stop();
static void xmlrpcval2amarg(XmlRpcValue& v, AmArg& a,
unsigned int start_index = 0);
static void xmlrpcval2amargarray(XmlRpcValue& v, AmArg& a, unsigned int start_index);
static void xmlrpcval2amarg(XmlRpcValue& v, AmArg& a);
/** convert all args in a into result*/
static void amarg2xmlrpcval(const AmArg& a, XmlRpcValue& result);
@ -158,7 +158,9 @@ class XMLRPC2DI
static unsigned int ServerRetryAfter;
static double ServerTimeout;
static bool DebugServerParams;
static bool DebugServerResult;
};
#endif

@ -29,3 +29,10 @@ xmlrpc_port=8090
# timeout for client requests, in milliseconds (0 to disable)
#
# server_timeout=500
# print parameters of XMLRPC server calls into debug log [yes|no]
# debug_server_params=yes
#
# print result of XMLRPC server calls into debug log [yes|no]
# debug_server_result=yes
#
Loading…
Cancel
Save