From 6faf1bf3f937fc9d109a0e0376bb3e9c2529d5d1 Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Tue, 25 May 2010 09:57:44 +0000 Subject: [PATCH] decode nested request/response data of json-rpc calls into vars git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@1927 8eb893ce-cfd4-0310-b710-fb5ebe64c474 --- apps/dsm/DSMCall.cpp | 76 ++++++++++++++++++++++++------------------- apps/dsm/DSMSession.h | 3 ++ 2 files changed, 45 insertions(+), 34 deletions(-) diff --git a/apps/dsm/DSMCall.cpp b/apps/dsm/DSMCall.cpp index a1e9e562..a58f78e4 100644 --- a/apps/dsm/DSMCall.cpp +++ b/apps/dsm/DSMCall.cpp @@ -332,6 +332,31 @@ void DSMCall::onSipReply(const AmSipReply& reply, int old_dlg_status) { } } +static void varPrintArg(const AmArg& a, map& 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] = ""; return; + } +} + void DSMCall::process(AmEvent* event) { @@ -382,24 +407,16 @@ void DSMCall::process(AmEvent* event) 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 strs = resp_ev->response.data.asStringVector(); - for (vector::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 @@ void DSMCall::process(AmEvent* event) 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 strs = req_ev->params.asStringVector(); - for (vector::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); } diff --git a/apps/dsm/DSMSession.h b/apps/dsm/DSMSession.h index 926398b0..f396461d 100644 --- a/apps/dsm/DSMSession.h +++ b/apps/dsm/DSMSession.h @@ -62,6 +62,9 @@ using std::map; #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"