Author: sayer
Date: 2010-05-25 11:57:44 +0200 (Tue, 25 May 2010)
New Revision: 1927

Modified:
   trunk/apps/dsm/DSMCall.cpp
   trunk/apps/dsm/DSMSession.h
Log:
decode nested request/response data of json-rpc calls into vars

Modified: trunk/apps/dsm/DSMCall.cpp
===================================================================
--- trunk/apps/dsm/DSMCall.cpp  2010-05-25 08:37:56 UTC (rev 1926)
+++ trunk/apps/dsm/DSMCall.cpp  2010-05-25 09:57:44 UTC (rev 1927)
@@ -332,6 +332,31 @@
   }
 }
 
+static void varPrintArg(const AmArg& a, map<string, string>& dst, const 
string& name) {
+  switch (a.getType()) {
+  case AmArg::Undef: dst[name] =  "null"; return;
+  case AmArg::Int: dst[name] =  a.asInt()<0 ? 
+      "-"+int2str(abs(a.asInt())):int2str(abs(a.asInt())); return;
+  case AmArg::Bool:
+     dst[name] = a.asBool()?"true":"false"; return;     
+  case AmArg::Double:
+    dst[name] = double2str(a.asDouble()); return;
+  case AmArg::CStr:
+    dst[name] = a.asCStr(); return;
+  case AmArg::Array:
+    for (size_t i = 0; i < a.size(); i ++)
+      varPrintArg(a.get(i), dst, name+"["+int2str(i)+"]");
+    return;
+  case AmArg::Struct:
+    for (AmArg::ValueStruct::const_iterator it = a.asStruct()->begin();
+        it != a.asStruct()->end(); it ++) {
+      varPrintArg(it->second, dst, name+"."+it->first);
+    }
+    return;
+  default: dst[name] = "<UNKONWN TYPE>"; return;
+  }
+}
+
 void DSMCall::process(AmEvent* event)
 {
 
@@ -382,24 +407,16 @@
       params["id"] = resp_ev->response.id;
       params["is_error"] = resp_ev->response.is_error ? 
        "true":"false";
-      if (isArgStruct(resp_ev->response.data)) {
-       AmArg::ValueStruct::const_iterator it = resp_ev->response.data.begin();
-        while (it != resp_ev->response.data.end()) {
-         if (isArgCStr(it->second))
-           params[it->first] = it->second.asCStr();
-         else
-           params[it->first] = AmArg::print(it->second);
-         it++;
-       }
-      } else if (isArgArray(resp_ev->response.data)) {
-       vector<string> strs =  resp_ev->response.data.asStringVector();
-       for (vector<string>::iterator it = 
-              strs.begin(); it != strs.end(); it++) {
-         params[int2str(it-strs.begin())] = *it;
-       }
-      }
 
+      // decode result for easy use from script
+      varPrintArg(resp_ev->response.data, params, resp_ev->response.is_error ? 
"error": "result");
+
+      // save reference to full parameters
+      avar[DSM_AVAR_JSONRPCRESPONEDATA] = AmArg(&resp_ev->response.data);
+
       engine.runEvent(this, DSMCondition::JsonRpcResponse, &params);
+
+      avar.erase(DSM_AVAR_JSONRPCRESPONEDATA);
       return;
     }
 
@@ -413,30 +430,21 @@
       params["method"] = req_ev->method;
       if (!req_ev->id.empty())
        params["id"] = req_ev->id;
-      if (isArgStruct(req_ev->params)) {
-       AmArg::ValueStruct::const_iterator it = req_ev->params.begin();
-        while (it != req_ev->params.end()) {
-         if (isArgCStr(it->second))
-           params[it->first] = it->second.asCStr();
-         else
-           params[it->first] = AmArg::print(it->second);
-         it++;
-       }
-      } else if (isArgArray(req_ev->params)) {
-       vector<string> strs =  req_ev->params.asStringVector();
-       for (vector<string>::iterator it = 
-              strs.begin(); it != strs.end(); it++) {
-         params[int2str(it-strs.begin())] = *it;
-       }
-      }
+
+      // decode request params result for easy use from script
+      varPrintArg(req_ev->params, params, "params");
+
+      // save reference to full parameters
+      avar[DSM_AVAR_JSONRPCREQUESTDATA] = AmArg(&req_ev->params);
+
       engine.runEvent(this, DSMCondition::JsonRpcRequest, &params);
+
+      avar.erase(DSM_AVAR_JSONRPCREQUESTDATA);
       return;
     }
 
   }
 
-
-
   AmB2BCallerSession::process(event);
 }
 

Modified: trunk/apps/dsm/DSMSession.h
===================================================================
--- trunk/apps/dsm/DSMSession.h 2010-05-25 08:37:56 UTC (rev 1926)
+++ trunk/apps/dsm/DSMSession.h 2010-05-25 09:57:44 UTC (rev 1927)
@@ -62,6 +62,9 @@
 #define DSM_AVAR_REQUEST "request"
 #define DSM_AVAR_REPLY   "reply"
 
+#define DSM_AVAR_JSONRPCREQUESTDATA "JsonRpcRequestParameters"
+#define DSM_AVAR_JSONRPCRESPONEDATA "JsonRpcResponseParameters"
+
 #define DSM_ERRNO_FILE        "file"
 #define DSM_ERRNO_UNKNOWN_ARG "arg"
 #define DSM_ERRNO_SCRIPT      "script"

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to