⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlrpc.c

📁 The Kannel Open Source WAP and SMS gateway works as both an SMS gateway, for implementing keyword b
💻 C
📖 第 1 页 / 共 5 页
字号:
      /* call for the parser function of the node type. */    switch (node->type) {        case XML_ELEMENT_NODE:            /* a <param> can only have one value element type */            if ((*n) > 0) {                xrdoc->parse_status = XMLRPC_PARSING_FAILED;                xrdoc->parse_error = octstr_format("XML-RPC compiler: param may only have one value!");                return -1;            }            status = parse_param_element(doc, node, xrdoc, params);            (*n)++;            break;        case XML_TEXT_NODE:        case XML_COMMENT_NODE:        case XML_PI_NODE:            /* Text nodes, comments and PIs are ignored. */            break;           /*            * XML has also many other node types, these are not needed with             * XML-RPC. Therefore they are assumed to be an error.            */        default:            xrdoc->parse_status = XMLRPC_PARSING_FAILED;            xrdoc->parse_error = octstr_format("XML-RPC compiler: Unknown XML node in the XML-RPC source.");            return -1;            break;    }       if (node->next != NULL)        if (parse_param(doc, node->next, xrdoc, params, n) == -1)            return -1;    return status;}static int parse_param_element(xmlDocPtr doc, xmlNodePtr node,                                XMLRPCDocument *xrdoc, List *params){    Octstr *name;    size_t i;    XMLRPCValue *value;    /*     * check if the element is allowed at this level      */    if (node->name == NULL) {        error(0, "XMLRPC: XML param element nodes without name!");        xrdoc->parse_status = XMLRPC_XMLPARSE_FAILED;        xrdoc->parse_error = octstr_format("XML-RPC compiler: bad XML");        return -1;    }    name = octstr_create(node->name);    if (octstr_len(name) == 0) {        octstr_destroy(name);        return -1;    }    i = 0;    while (i < NUMBER_OF_PARAM_ELEMENTS) {        if (octstr_case_compare(name, octstr_imm(param_elements[i].name)) == 0)            break;        ++i;    }    if (i == NUMBER_OF_PARAM_ELEMENTS) {        xrdoc->parse_status = XMLRPC_PARSING_FAILED;        xrdoc->parse_error = octstr_format("XML-RPC compiler: unknown tag '%s' "                                           "in XML source at level <param>",                                            octstr_get_cstr(name));        octstr_destroy(name);        return -1;    }     octstr_destroy(name);    /*      * now check which type it is and process      *     * valid tags at this level are:     *   value [0]     */    if (i == 0) {        /* this has been a <param> tag */        value = xmlrpc_value_create();        if (parse_value(doc, node->xmlChildrenNode, xrdoc, value) == -1) {            xmlrpc_value_destroy(value);            return -1;        }        list_append(params, value);    } else {        /* we should never be here */        xrdoc->parse_status = XMLRPC_PARSING_FAILED;        xrdoc->parse_error = octstr_format("XML-RPC compiler: bogus parsing exception in parse_param!");        return -1;    }    return 0;}static int parse_value(xmlDocPtr doc, xmlNodePtr node,                        XMLRPCDocument *xrdoc, XMLRPCValue *value){    int status = 0;      /* call for the parser function of the node type. */    switch (node->type) {        case XML_ELEMENT_NODE:            status = parse_value_element(doc, node, xrdoc, value);            break;        case XML_TEXT_NODE:        case XML_COMMENT_NODE:        case XML_PI_NODE:            /* Text nodes, comments and PIs are ignored. */            break;           /*            * XML has also many other node types, these are not needed with             * XML-RPC. Therefore they are assumed to be an error.            */        default:            xrdoc->parse_status = XMLRPC_PARSING_FAILED;            xrdoc->parse_error = octstr_format("XML-RPC compiler: Unknown XML node in the XML-RPC source.");            return -1;            break;    }    if (node->next != NULL)        if (parse_value(doc, node->next, xrdoc, value) == -1)            return -1;    return status;}static int parse_value_element(xmlDocPtr doc, xmlNodePtr node,                                XMLRPCDocument *xrdoc, XMLRPCValue *xrvalue){    Octstr *name;    Octstr *value = NULL;    xmlChar *content_buff;    long lval = 0;    double dval = 0.0;    size_t i;    /*     * check if the element is allowed at this level      */    if (node->name == NULL) {        error(0, "XMLRPC: XML value element nodes without name!");        xrdoc->parse_status = XMLRPC_XMLPARSE_FAILED;        xrdoc->parse_error = octstr_format("XML-RPC compiler: bad XML");        return -1;    }    name = octstr_create(node->name);    if (octstr_len(name) == 0) {        octstr_destroy(name);        return -1;    }    i = 0;    while (i < NUMBER_OF_VALUE_ELEMENTS) {        if (octstr_case_compare(name, octstr_imm(value_elements[i].name)) == 0)            break;        ++i;    }    if (i == NUMBER_OF_VALUE_ELEMENTS) {        xrdoc->parse_status = XMLRPC_PARSING_FAILED;        xrdoc->parse_error = octstr_format("XML-RPC compiler: unknown tag '%s' "                                           "in XML source at level <value>",                                            octstr_get_cstr(name));        octstr_destroy(name);        return -1;    }     octstr_destroy(name);    content_buff = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);    if (content_buff != NULL) {        value = octstr_create(content_buff);        xmlFree(content_buff);    }    /*      * now check which type it is and process      *     * valid tags at this level are:     *   i4, int     *   boolean     *   string     *   double     *   dateTime.iso8601     *   base64     *   struct     *   array     */    switch (value_elements[i].s_type) {        /*         * scalar types         */        case xr_int:   case xr_bool:        case xr_double:        case xr_date:  case xr_base64:#ifndef XR_ENABLE_EMPTY_STRING_VALUES        case xr_string:#endif            if (value == NULL) {                xrdoc->parse_status = XMLRPC_PARSING_FAILED;                xrdoc->parse_error = octstr_format("XML-RPC compiler: no value for '%s'",                                            node->name);                return -1;            }            break;    }    switch (value_elements[i].s_type) {                /*         * scalar types         */        case xr_int:            if (value != NULL && octstr_parse_long(&lval, value, 0, 10) < 0) {                xrdoc->parse_status = XMLRPC_PARSING_FAILED;                xrdoc->parse_error = octstr_format("XML-RPC compiler: could not parse int value '%s'",                                                    octstr_get_cstr(value));                octstr_destroy(value);                return -1;            }            xrvalue->v_type = xr_scalar;            xrvalue->v_scalar = xmlrpc_scalar_create(xr_int, (void *) &lval);            break;                case xr_bool:            if (value != NULL && octstr_parse_long(&lval, value, 0, 10) < 0) {                xrdoc->parse_status = XMLRPC_PARSING_FAILED;                xrdoc->parse_error = octstr_format("XML-RPC compiler: could not parse boolean value '%s'",                                                    octstr_get_cstr(value));                octstr_destroy(value);                return -1;            }            xrvalue->v_type = xr_scalar;            xrvalue->v_scalar = xmlrpc_scalar_create(xr_bool, (void *) &lval);            break;        case xr_double:            if (value != NULL && octstr_parse_double(&dval, value, 0) < 0) {                xrdoc->parse_status = XMLRPC_PARSING_FAILED;                xrdoc->parse_error = octstr_format("XML-RPC compiler: could not parse double value '%s'",                                                    octstr_get_cstr(value));                octstr_destroy(value);                return -1;            }            xrvalue->v_type = xr_scalar;            xrvalue->v_scalar = xmlrpc_scalar_create(xr_double, (void *) &dval);            break;        case xr_string:            xrvalue->v_type = xr_scalar;            xrvalue->v_scalar = xmlrpc_scalar_create(xr_string, (void *) value);            break;        case xr_date:            xrvalue->v_type = xr_scalar;            xrvalue->v_scalar = xmlrpc_scalar_create(xr_date, (void *) value);            break;        case xr_base64:            xrvalue->v_type = xr_scalar;            xrvalue->v_scalar = xmlrpc_scalar_create(xr_base64, (void *) value);            break;        case xr_struct:            xrvalue->v_type = xr_struct;            xrvalue->v_struct = dict_create(OPTIMAL_STRUCT_SIZE, xmlrpc_value_destroy_item);            if (parse_struct(doc, node->xmlChildrenNode, xrdoc, xrvalue->v_struct) == -1) {                octstr_destroy(value);                return -1;            }            break;        case xr_array:            xrvalue->v_type = xr_array;            xrvalue->v_array = list_create();            if (parse_array(doc, node->xmlChildrenNode, xrdoc, xrvalue->v_array) == -1) {                xrdoc->parse_status = XMLRPC_PARSING_FAILED;                 xrdoc->parse_error = octstr_format("XML-RPC compiler: could not parse array");                 octstr_destroy(value);                return -1;            }            break;        default:            xrdoc->parse_status = XMLRPC_PARSING_FAILED;            xrdoc->parse_error = octstr_format("XML-RPC compiler: bogus parsing exception in parse_value!");            return -1;    }    octstr_destroy(value);    return 0;}static int parse_struct(xmlDocPtr doc, xmlNodePtr node,                         XMLRPCDocument *xrdoc, Dict *members){    int status = 0;      /* call for the parser function of the node type. */    switch (node->type) {        case XML_ELEMENT_NODE:            status = parse_struct_element(doc, node, xrdoc, members);            break;        case XML_TEXT_NODE:        case XML_COMMENT_NODE:        case XML_PI_NODE:            /* Text nodes, comments and PIs are ignored. */            break;           /*            * XML has also many other node types, these are not needed with             * XML-RPC. Therefore they are assumed to be an error.            */        default:            xrdoc->parse_status = XMLRPC_PARSING_FAILED;            xrdoc->parse_error = octstr_format("XML-RPC compiler: Unknown XML node in the XML-RPC source.");            return -1;            break;    }    if (node->next != NULL)           if (parse_struct(doc, node->next, xrdoc, members) == -1)            return -1;    return status;}static int parse_struct_element(xmlDocPtr doc, xmlNodePtr node,                                 XMLRPCDocument *xrdoc, Dict *members){    Octstr *name;    size_t i;    XMLRPCMember *member;    /*     * check if the element is allowed at this level      */    if (node->name == NULL) {        error(0, "XMLRPC: XML struct element nodes without name!");        xrdoc->parse_status = XMLRPC_XMLPARSE_FAILED;        xrdoc->parse_error = octstr_format("XML-RPC compiler: bad XML");        return -1;    }        name = octstr_create(node->name);    if (octstr_len(name) == 0) {        octstr_destroy(name);        return -1;    }    i = 0;    while (i < NUMBER_OF_STRUCT_ELEMENTS) {        if (octstr_case_compare(name, octstr_imm(struct_elements[i].name)) == 0)            break;        ++i;    }    if (i == NUMBER_OF_STRUCT_ELEMENTS) {        xrdoc->parse_status = XMLRPC_PARSING_FAILED;        xrdoc->parse_error = octstr_format("XML-RPC compiler: unknown tag '%s' "                                           "in XML source at level <struct>",                                            octstr_get_cstr(name));        octstr_destroy(name);        return -1;    }     octstr_destroy(name);    /*      * now check which type it is and process      *     * valid tags at this level are:     *   member [0]     */    if (i == 0) {        /* this has been a <member> tag */        member = xmlrpc_member_create();        if (parse_member(doc, node->xmlChildrenNode, xrdoc, member) == -1) {            xmlrpc_member_destroy(member, 1);            return -1;        }        if (! dict_put_once(members, member->name, member->value)) {            xrdoc->parse_status = XMLRPC_PARSING_FAILED;            xrdoc->parse_error = octstr_format("XML-RPC compiler: at least two members have same name.");            xmlrpc_member_destroy(member, 1);            return -1;        }        xmlrpc_member_destroy(member, 0);    } else {        /* we should never be here */        xrdoc->parse_status = XMLRPC_PARSING_FAILED;        xrdoc->parse_error = octstr_format("XML-RPC compiler: bogus parsing exception in parse_struct!");        return -1;    }    return 0;}static int parse_member(xmlDocPtr doc, xmlNodePtr node,                         XMLRPCDocument *xrdoc, XMLRPCMember *member){    int status = 0;      /* call for the parser function of the node type. */    switch (node->type) {        case XML_ELEMENT_NODE:            status = parse_member_element(doc, node, xrdoc, member);            break;        case XML_TEXT_NODE:        case XML_COMMENT_NODE:        case XML_PI_NODE:            /* Text nodes, comments and PIs are ignored. */            break;           /*            * XML has also many other node types, these are not needed with             * XML-RPC. Therefore they are assumed to be an error.            */        default:            xrdoc->parse_status = XMLRPC_PARSING_FAILED;            xrdoc->parse_error = octstr_format("XML-RPC compiler: Unknown XML node in the XML-RPC source.");            return -1;            break;    }    if (node->next != NULL)           if (parse_member(d

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -