char* xr_build_response( xmlrpc_env * env, struct mi_root * tree ) { str buf; buf.s = reply_buffer; buf.len = reply_buffer_len; 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"); return 0; } if ( recur_build_response(env, (&tree->node)->kids, &buf) != 0 ) { LM_ERR("failed to read from the MI tree!\n"); xmlrpc_env_set_fault(env, 500, "Failed to build reply"); return 0; } reply_buffer[reply_buffer_len-buf.len] = 0; return reply_buffer; }
static int recur_build_response( xmlrpc_env * env, struct mi_node * tree, str * buf ) { for ( ; tree ; tree = tree->next ) { if ( xr_write_node( buf, tree ) != 0 ) { reply_buffer = (char*) pkg_realloc ( reply_buffer, 2*reply_buffer_len); if ( !reply_buffer ){ LM_ERR("pkg_realloc cannot reallocate any more memory!\n"); return -1; } buf->s = reply_buffer +(reply_buffer_len - buf->len); buf->len += reply_buffer_len; reply_buffer_len *=2 ; if ( xr_write_node( buf, tree ) != 0 ) { LM_ERR("failed to get MI node data!\n"); return -1; } } if ( tree->kids ) { if ( recur_build_response(env, tree->kids, buf) != 0 ) return -1; } } return 0; }
static int recur_build_response( 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 ) { reply_buffer = (char*) pkg_realloc ( reply_buffer, 2*reply_buffer_len); if ( !reply_buffer ) { LM_ERR("pkg_realloc cannot reallocate any more memory!\n"); return -1; } buf->s = reply_buffer +(reply_buffer_len - buf->len); buf->len += reply_buffer_len; reply_buffer_len *=2 ; 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; } } if ( tree->kids ) { if ( recur_build_response(env, tree->kids, buf) != 0 ) return -1; } } return 0; }