Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
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;
}