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

Reply via email to