static int ki_isup_to_json(sip_msg_t *_m, int proto) { struct isup_state isup_state = { 0, }; const uint8_t *data; int opc, dpc, mtp_type, int_len, rc; size_t len; free((char *) isup_last); srjson_DeleteDoc(isup_json); isup_last = NULL; isup_json = NULL; mtp_type = 0; data = fetch_payload(_m, "$var(payload)", &int_len); if (!data) return -1; if (int_len < 0) { LM_ERR("Payload length low %d\n", int_len); return -1; } len = int_len; data = ss7_extract_payload(data, &len, proto, &opc, &dpc, &mtp_type); if (!data) return -1; if (mtp_type != MTP_ISUP) { LM_DBG("Non ISUP payload %d\n", mtp_type); return -1; } /* parse isup... */ isup_state.json = srjson_NewDoc(NULL); if (!isup_state.json) { LM_ERR("Failed to allocate JSON document\n"); return -1; } isup_state.json->root = srjson_CreateObject(isup_state.json); if (!isup_state.json->root) { LM_ERR("Failed to allocate JSON object\n"); srjson_DeleteDoc(isup_state.json); return -1; } rc = isup_parse(data, len, &isup_state); if (rc != 0) { srjson_DeleteDoc(isup_state.json); return rc; } srjson_AddNumberToObject(isup_state.json, isup_state.json->root, "opc", opc); srjson_AddNumberToObject(isup_state.json, isup_state.json->root, "dpc", dpc); isup_last = srjson_PrintUnformatted(isup_state.json, isup_state.json->root); isup_json = isup_state.json; return 1; }
/** Initialize jsonrpc reply data structure. * * This function initializes the data structure that contains all data related * to the jsonrpc reply being created. The function must be called before any * other function that adds data to the reply. * @param ctx jsonrpc_ctx_t structure to be initialized. * @return 0 on success, a negative number on error. */ static int jsonrpc_init_reply(jsonrpc_ctx_t *ctx) { ctx->http_code = 200; ctx->http_text = JSONRPC_REASON_OK; ctx->jrpl = srjson_NewDoc(NULL); if(ctx->jrpl==NULL) { LM_ERR("Failed to init the reply json document\n"); return -1; } ctx->jrpl->root = srjson_CreateObject(ctx->jrpl); if(ctx->jrpl->root==NULL) { LM_ERR("Failed to init the reply json root node\n"); return -1; } srjson_AddStrStrToObject(ctx->jrpl, ctx->jrpl->root, "jsonrpc", 7, "2.0", 3); return 0; }
int rtjson_init_routes(sip_msg_t *msg, str *rdoc) { srjson_Hooks jhooks; srjson_doc_t *tdoc = NULL; sr_data_t *xdata = NULL; rtjson_data_t *rdata = NULL; sr_xavp_t *xavp=NULL; str xname; sr_xval_t xval; memset(&jhooks, 0, sizeof(srjson_Hooks)); jhooks.malloc_fn = rtjson_malloc; jhooks.free_fn = rtjson_free; tdoc = srjson_NewDoc(&jhooks); if(tdoc==NULL) { LM_ERR("no more shm\n"); return -1; } tdoc->root = srjson_Parse(tdoc, rdoc->s); if(tdoc->root == NULL) { LM_ERR("invalid json doc [[%s]]\n", rdoc->s); srjson_DeleteDoc(tdoc); return -1; } xdata = shm_malloc(sizeof(sr_data_t)); if(xdata==NULL) { LM_ERR("no more shm\n"); srjson_DeleteDoc(tdoc); return -1; } memset(xdata, 0, sizeof(sr_data_t)); rdata = shm_malloc(sizeof(rtjson_data_t)); if(rdata==NULL) { LM_ERR("no more shm\n"); srjson_DeleteDoc(tdoc); shm_free(xdata); return -1; } memset(rdata, 0, sizeof(rtjson_data_t)); rdata->jdoc = tdoc; xdata->p = rdata; xdata->pfree = rtjson_data_free; memset(&xval, 0, sizeof(sr_xval_t)); xval.type = SR_XTYPE_STR; xval.v.s = *rdoc; xname.s = "json"; xname.len = 4; if(xavp_add_value(&xname, &xval, &xavp)==NULL) { goto error; } memset(&xval, 0, sizeof(sr_xval_t)); xval.type = SR_XTYPE_DATA; xval.v.data = xdata; xname.s = "data"; xname.len = 4; if(xavp_add_value(&xname, &xval, &xavp)==NULL) { goto error; } /* reset pointers - they are linked inside xavp now */ tdoc = NULL; xdata = NULL; rdata = NULL; memset(&xval, 0, sizeof(sr_xval_t)); xval.type = SR_XTYPE_XAVP; xval.v.xavp = xavp; if(xavp_add_value(&_rtjson_xavp_name, &xval, NULL)==NULL) { goto error; } return 0; error: if(xavp) xavp_destroy_list(&xavp); if(rdata) shm_free(rdata); if(xdata) shm_free(xdata); if(tdoc) srjson_DeleteDoc(tdoc); return -1; }