Author: sayer
Date: 2009-03-13 18:28:41 +0100 (Fri, 13 Mar 2009)
New Revision: 1316
Modified:
trunk/apps/xmlrpc2di/XMLRPC2DI.cpp
trunk/apps/xmlrpc2di/XMLRPC2DI.h
trunk/apps/xmlrpc2di/etc/xmlrpc2di.conf
Log:
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
Modified: trunk/apps/xmlrpc2di/XMLRPC2DI.cpp
===================================================================
--- trunk/apps/xmlrpc2di/XMLRPC2DI.cpp 2009-03-13 17:26:28 UTC (rev 1315)
+++ trunk/apps/xmlrpc2di/XMLRPC2DI.cpp 2009-03-13 17:28:41 UTC (rev 1316)
@@ -44,6 +44,9 @@
// 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 @@
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 @@
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 @@
// 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 @@
}
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 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 @@
}
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);
Modified: trunk/apps/xmlrpc2di/XMLRPC2DI.h
===================================================================
--- trunk/apps/xmlrpc2di/XMLRPC2DI.h 2009-03-13 17:26:28 UTC (rev 1315)
+++ trunk/apps/xmlrpc2di/XMLRPC2DI.h 2009-03-13 17:28:41 UTC (rev 1316)
@@ -101,8 +101,8 @@
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 @@
static unsigned int ServerRetryAfter;
static double ServerTimeout;
-
+
+ static bool DebugServerParams;
+ static bool DebugServerResult;
};
#endif
Modified: trunk/apps/xmlrpc2di/etc/xmlrpc2di.conf
===================================================================
--- trunk/apps/xmlrpc2di/etc/xmlrpc2di.conf 2009-03-13 17:26:28 UTC (rev
1315)
+++ trunk/apps/xmlrpc2di/etc/xmlrpc2di.conf 2009-03-13 17:28:41 UTC (rev
1316)
@@ -29,3 +29,10 @@
# 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
_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev