From 7f1ed2371deb9e225598d14ab7fc99c3d937da68 Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Fri, 13 Mar 2009 17:28:41 +0000 Subject: [PATCH] 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 --- apps/xmlrpc2di/XMLRPC2DI.cpp | 98 +++++++++++++++++++++---------- apps/xmlrpc2di/XMLRPC2DI.h | 8 ++- apps/xmlrpc2di/etc/xmlrpc2di.conf | 7 +++ 3 files changed, 79 insertions(+), 34 deletions(-) diff --git a/apps/xmlrpc2di/XMLRPC2DI.cpp b/apps/xmlrpc2di/XMLRPC2DI.cpp index ad4980f5..2886abdc 100644 --- a/apps/xmlrpc2di/XMLRPC2DI.cpp +++ b/apps/xmlrpc2di/XMLRPC2DI.cpp @@ -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; iA 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(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); diff --git a/apps/xmlrpc2di/XMLRPC2DI.h b/apps/xmlrpc2di/XMLRPC2DI.h index bb497abc..f7d231c2 100644 --- a/apps/xmlrpc2di/XMLRPC2DI.h +++ b/apps/xmlrpc2di/XMLRPC2DI.h @@ -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 diff --git a/apps/xmlrpc2di/etc/xmlrpc2di.conf b/apps/xmlrpc2di/etc/xmlrpc2di.conf index 2758d25e..5a49aba6 100644 --- a/apps/xmlrpc2di/etc/xmlrpc2di.conf +++ b/apps/xmlrpc2di/etc/xmlrpc2di.conf @@ -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 +# \ No newline at end of file