| 314 | } |
| 315 | |
| 316 | static int mi_xmlrpc_get_param(xmlNodePtr value_node, mi_item_t *req_params_item, |
| 317 | const char *name) |
| 318 | { |
| 319 | static str esc_buf = {NULL, 0}; |
| 320 | str val = {NULL, 0}, esc_val = {NULL, 0}; |
| 321 | xmlNodePtr string_node = NULL; |
| 322 | xmlNodePtr int_node = NULL; |
| 323 | xmlNodePtr array_node = NULL; |
| 324 | int intval; |
| 325 | mi_item_t *param_item; |
| 326 | |
| 327 | string_node = mi_xmlNodeGetNodeByName(value_node->children, |
| 328 | MI_XMLRPC_XML_STRING_NODE); |
| 329 | if (string_node) { |
| 330 | val.s = (char*)xmlNodeGetContent(string_node); |
| 331 | if(val.s==NULL){ |
| 332 | LM_ERR("No content for node [%s]\n", |
| 333 | string_node->name); |
| 334 | return 1; |
| 335 | } |
| 336 | val.len = strlen(val.s); |
| 337 | if(val.len==0){ |
| 338 | LM_ERR("Empty content for node [%s]\n", |
| 339 | string_node->name); |
| 340 | return 1; |
| 341 | } |
| 342 | |
| 343 | if (val.len > esc_buf.len) { |
| 344 | esc_buf.s = shm_realloc(esc_buf.s, val.len); |
| 345 | if (!esc_buf.s) { |
| 346 | LM_ERR("No more shm memory\n"); |
| 347 | esc_buf.len = 0; |
| 348 | return -1; |
| 349 | } |
| 350 | esc_buf.len = val.len; |
| 351 | } |
| 352 | |
| 353 | esc_val.s = esc_buf.s; |
| 354 | esc_val.len = unescape_xml(esc_val.s, val.s, val.len); |
| 355 | LM_DBG("got escaped string param [%.*s]\n", esc_val.len, esc_val.s); |
| 356 | |
| 357 | xmlFree(val.s); |
| 358 | |
| 359 | param_item = cJSON_CreateStr(esc_val.s, esc_val.len); |
| 360 | if (!param_item) { |
| 361 | LM_ERR("Failed to create string item in temporary json request\n"); |
| 362 | return -1; |
| 363 | } |
| 364 | |
| 365 | if (name) |
| 366 | cJSON_AddItemToObject(req_params_item, name, param_item); |
| 367 | else |
| 368 | cJSON_AddItemToArray(req_params_item, param_item); |
| 369 | |
| 370 | return 0; |
| 371 | } |
| 372 | |
| 373 | int_node = mi_xmlNodeGetNodeByName(value_node->children, |
no test coverage detected