📄 xmlrpc.c
字号:
/* 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 + -