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, ¶ms);
+
+ 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, ¶ms);
+
+ 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