static int recur_build_response_array( xmlrpc_env * env, struct mi_node * tree, str * buf ) { for ( ; tree ; tree = tree->next ) { if (!(tree->flags & MI_WRITTEN)) { if ( xr_write_node( buf, tree ) != 0 ) { LM_ERR("failed to get MI node data!\n"); return -1; } /* we are sure that this node has been written * => avoid writing it again */ tree->flags |= MI_WRITTEN; } reply_buffer[reply_buffer_len-buf->len] = 0; reply_item = xmlrpc_build_value(env, "s", reply_buffer); xmlrpc_array_append_item(env, xr_response, reply_item); buf->s = reply_buffer; buf->len = reply_buffer_len; if ( tree->kids ) { if ( recur_build_response_array(env, tree->kids, buf) != 0 ) return -1; } } return 0; }
int xr_build_response_array( xmlrpc_env * env, struct mi_root * tree ) { str buf; buf.s = reply_buffer; buf.len = reply_buffer_len; /* test if mi root value is 200 OK (if not no point to continue) */ if ( tree->code<200 || tree->code>=300 ) { LM_DBG("command processing failure: %s\n", tree->reason.s); if (tree->reason.s) xmlrpc_env_set_fault(env, tree->code, tree->reason.s); else xmlrpc_env_set_fault(env, tree->code, "Error"); goto error; } if ( recur_build_response_array(env, (&tree->node)->kids, &buf) != 0 ) { LM_ERR("failed to read from the MI tree!\n"); xmlrpc_env_set_fault(env, 500, "Failed to write reply"); goto error; } return 0; error: if ( reply_buffer ) pkg_free(reply_buffer); return -1; }
static int recur_build_response_array( xmlrpc_env * env, struct mi_node * tree, str * buf ) { for ( ; tree ; tree = tree->next ) { if ( xr_write_node( buf, tree ) != 0 ) { LM_ERR("failed to get MI node data!\n"); return -1; } reply_buffer[reply_buffer_len-buf->len] = 0; reply_item = xmlrpc_build_value(env, "s", reply_buffer); xmlrpc_array_append_item(env, xr_response, reply_item); buf->s = reply_buffer; buf->len = reply_buffer_len; if ( tree->kids ) { if ( recur_build_response_array(env, tree->kids, buf) != 0 ) return -1; } } return 0; }