📄 xmlrpc.c
字号:
XMLRPC_CleanupValue (request->error); } request->error = XMLRPC_CopyValue (error); return request->error; } return NULL;}/*******//****f* REQUEST/XMLRPC_RequestGetError * NAME * XMLRPC_RequestGetError * SYNOPSIS * XMLRPC_VALUE XMLRPC_RequestGetError(XMLRPC_REQUEST request) * FUNCTION * Returns error data associated with request, if any. * INPUTS * request -- previously allocated request struct * RESULT * XMLRPC_VALUE -- pointer to error value stored, or NULL * NOTES * This is a private function for usage by internals only. * SEE ALSO * XMLRPC_RequestSetError () * XMLRPC_RequestFree () * SOURCE */XMLRPC_VALUE XMLRPC_RequestGetError (XMLRPC_REQUEST request) { return request ? request->error : NULL;}/*******//****f* REQUEST/XMLRPC_RequestSetOutputOptions * NAME * XMLRPC_RequestSetOutputOptions * SYNOPSIS * XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestSetOutputOptions(XMLRPC_REQUEST request, XMLRPC_REQUEST_OUTPUT_OPTIONS output) * FUNCTION * Sets output options used for generating XML. The output struct * is copied, and may be freed by the caller. * INPUTS * request -- previously allocated request struct * output -- output options struct initialized by caller * RESULT * XMLRPC_REQUEST_OUTPUT_OPTIONS -- pointer to value stored, or NULL * SEE ALSO * XMLRPC_RequestNew () * XMLRPC_RequestGetOutputOptions () * XMLRPC_RequestFree () * XMLRPC_REQUEST * XMLRPC_REQUEST_OUTPUT_OPTIONS * SOURCE */XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestSetOutputOptions(XMLRPC_REQUEST request, XMLRPC_REQUEST_OUTPUT_OPTIONS output) { if(request && output) { memcpy (&request->output, output, sizeof (STRUCT_XMLRPC_REQUEST_OUTPUT_OPTIONS)); return &request->output; } return NULL;}/*******//****f* REQUEST/XMLRPC_RequestGetOutputOptions * NAME * XMLRPC_RequestGetOutputOptions * SYNOPSIS * XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestGetOutputOptions(XMLRPC_REQUEST request) * FUNCTION * Gets a pointer to output options used for generating XML. * INPUTS * request -- previously allocated request struct * RESULT * XMLRPC_REQUEST_OUTPUT_OPTIONS -- pointer to options stored, or NULL * SEE ALSO * XMLRPC_RequestNew () * XMLRPC_RequestSetOutputOptions () * XMLRPC_RequestFree () * XMLRPC_REQUEST * XMLRPC_REQUEST_OUTPUT_OPTIONS * SOURCE */XMLRPC_REQUEST_OUTPUT_OPTIONS XMLRPC_RequestGetOutputOptions(XMLRPC_REQUEST request) { return request ? &request->output : NULL;}/*******//*-************************** End XMLRPC_REQUEST funcs ****************************//*-**************************** Begin Serializiation funcs ******************************//****f* SERIALIZE/XMLRPC_VALUE_ToXML * NAME * XMLRPC_VALUE_ToXML * SYNOPSIS * char* XMLRPC_VALUE_ToXML(XMLRPC_VALUE val) * FUNCTION * encode XMLRPC_VALUE into XML buffer. Note that the generated * buffer will not contain a methodCall. * INPUTS * val -- previously allocated XMLRPC_VALUE * buf_len -- length of returned buffer, if not null * RESULT * char* -- newly allocated buffer containing XML. * It is the caller's responsibility to free it. * SEE ALSO * XMLRPC_REQUEST_ToXML () * XMLRPC_VALUE_FromXML () * XMLRPC_Free () * XMLRPC_VALUE * SOURCE */char* XMLRPC_VALUE_ToXML(XMLRPC_VALUE val, int* buf_len) { xml_element *root_elem = XMLRPC_VALUE_to_xml_element(val); char* pRet = NULL; if(root_elem) { pRet = xml_elem_serialize_to_string(root_elem, NULL, buf_len); xml_elem_free(root_elem); } return pRet;}/*******//****f* SERIALIZE/XMLRPC_REQUEST_ToXML * NAME * XMLRPC_REQUEST_ToXML * SYNOPSIS * char* XMLRPC_REQUEST_ToXML(XMLRPC_REQUEST request) * FUNCTION * encode XMLRPC_REQUEST into XML buffer * INPUTS * request -- previously allocated XMLRPC_REQUEST * buf_len -- size of returned buf, if not null * RESULT * char* -- newly allocated buffer containing XML. * It is the caller's responsibility to free it. * SEE ALSO * XMLRPC_REQUEST_ToXML () * XMLRPC_REQUEST_FromXML () * XMLRPC_Free () * XMLRPC_VALUE_ToXML () * XMLRPC_REQUEST * SOURCE */char* XMLRPC_REQUEST_ToXML(XMLRPC_REQUEST request, int* buf_len) { char* pRet = NULL; if (request) { xml_element *root_elem = NULL; if (request->output.version == xmlrpc_version_simple) { root_elem = DANDARPC_REQUEST_to_xml_element (request); } else if (request->output.version == xmlrpc_version_1_0 || request->output.version == xmlrpc_version_none) { root_elem = XMLRPC_REQUEST_to_xml_element (request); } else if (request->output.version == xmlrpc_version_soap_1_1) { root_elem = SOAP_REQUEST_to_xml_element (request); } if(root_elem) { pRet = xml_elem_serialize_to_string (root_elem, &request->output.xml_elem_opts, buf_len); xml_elem_free(root_elem); } } return pRet;}/*******//****f* SERIALIZE/XMLRPC_VALUE_FromXML * NAME * XMLRPC_VALUE_FromXML * SYNOPSIS * XMLRPC_VALUE XMLRPC_VALUE_FromXML(const char* in_buf, int le * FUNCTION * Retrieve XMLRPC_VALUE from XML buffer. Note that this will * ignore any methodCall. See XMLRPC_REQUEST_FromXML * INPUTS * in_buf -- character buffer containing XML * len -- length of buffer * RESULT * XMLRPC_VALUE -- newly allocated data, or NULL if error. Should * be free'd by caller. * SEE ALSO * XMLRPC_VALUE_ToXML () * XMLRPC_REQUEST_FromXML () * XMLRPC_VALUE * SOURCE */XMLRPC_VALUE XMLRPC_VALUE_FromXML (const char *in_buf, int len, XMLRPC_REQUEST_INPUT_OPTIONS in_options) { XMLRPC_VALUE xResponse = NULL; XMLRPC_REQUEST req = XMLRPC_REQUEST_FromXML(in_buf, len, in_options); if(req) { xResponse = req->io; XMLRPC_RequestFree(req, 0); } return xResponse;}/*******//* map parser errors to standard xml-rpc errors */static XMLRPC_VALUE map_expat_errors(XML_ELEM_ERROR error) { XMLRPC_VALUE xReturn = NULL; if(error) { XMLRPC_ERROR_CODE code; char buf[1024]; snprintf(buf, sizeof(buf), "error occurred at line %ld, column %ld, byte index %ld", error->line, error->column, error->byte_index); /* expat specific errors */ switch(error->parser_code) { case XML_ERROR_UNKNOWN_ENCODING: code = xmlrpc_error_parse_unknown_encoding; break; case XML_ERROR_INCORRECT_ENCODING: code = xmlrpc_error_parse_bad_encoding; break; default: code = xmlrpc_error_parse_xml_syntax; break; } xReturn = XMLRPC_UtilityCreateFault(code, buf); } return xReturn;}/****f* SERIALIZE/XMLRPC_REQUEST_FromXML * NAME * XMLRPC_REQUEST_FromXML * SYNOPSIS * XMLRPC_REQUEST XMLRPC_REQUEST_FromXML(const char* in_buf, int le * FUNCTION * Retrieve XMLRPC_REQUEST from XML buffer * INPUTS * in_buf -- character buffer containing XML * len -- length of buffer * RESULT * XMLRPC_REQUEST -- newly allocated data, or NULL if error. Should * be free'd by caller. * SEE ALSO * XMLRPC_REQUEST_ToXML () * XMLRPC_VALUE_FromXML () * XMLRPC_REQUEST * SOURCE */XMLRPC_REQUEST XMLRPC_REQUEST_FromXML (const char *in_buf, int len, XMLRPC_REQUEST_INPUT_OPTIONS in_options) { XMLRPC_REQUEST request = XMLRPC_RequestNew(); STRUCT_XML_ELEM_ERROR error = {0}; if(request) { xml_element *root_elem = xml_elem_parse_buf (in_buf, len, (in_options ? &in_options->xml_elem_opts : NULL), &error); if(root_elem) { if(!strcmp(root_elem->name, "simpleRPC")) { request->output.version = xmlrpc_version_simple; xml_element_to_DANDARPC_REQUEST(request, root_elem); } else if (!strcmp (root_elem->name, "SOAP-ENV:Envelope")) { request->output.version = xmlrpc_version_soap_1_1; xml_element_to_SOAP_REQUEST (request, root_elem); } else { request->output.version = xmlrpc_version_1_0; xml_element_to_XMLRPC_REQUEST(request, root_elem); } xml_elem_free(root_elem); } else { if(error.parser_error) { XMLRPC_RequestSetError (request, map_expat_errors (&error)); } } } return request;}/*******//*-************************* End Serialization Funcs ***************************//****f* VALUE/XMLRPC_CreateValueEmpty * NAME * XMLRPC_CreateValueEmpty * SYNOPSIS * XMLRPC_VALUE XMLRPC_CreateValueEmpty () * FUNCTION * Create an XML value to be used/modified elsewhere. * INPUTS * RESULT * XMLRPC_VALUE. The new value, or NULL on failure. * SEE ALSO * XMLRPC_CleanupValue () * XMLRPC_VALUE * SOURCE */XMLRPC_VALUE XMLRPC_CreateValueEmpty() { XMLRPC_VALUE v = calloc(1, sizeof(STRUCT_XMLRPC_VALUE)); if(v) {#ifdef XMLRPC_DEBUG_REFCOUNT printf ("calloc'd 0x%x\n", v);#endif v->type = xmlrpc_empty; simplestring_init(&v->id); simplestring_init(&v->str); } return v;}/*******//****f* VALUE/XMLRPC_SetValueID_Case * NAME * XMLRPC_SetValueID_Case * SYNOPSIS * const char *XMLRPC_SetValueID_Case(XMLRPC_VALUE value, const char* id, int len, XMLRPC_CASE id_case) * FUNCTION * Assign an ID (key) to an XMLRPC value. * INPUTS * value The xml value who's ID we will set. * id The desired new id. * len length of id string if known, or 0 if unknown. * id_case one of XMLRPC_CASE * RESULT * const char* pointer to the newly allocated id string, or NULL * SEE ALSO * XMLRPC_SetValueID () * XMLRPC_GetValueID () * XMLRPC_VALUE * XMLRPC_CASE * SOURCE */const char *XMLRPC_SetValueID_Case(XMLRPC_VALUE value, const char* id, int len, XMLRPC_CASE id_case) { const char* pRetval = NULL; if(value) { if(id) { simplestring_clear(&value->id); (len > 0) ? simplestring_addn(&value->id, id, len) : simplestring_add(&value->id, id); /* upper or lower case string in place if required. could be a seperate func. */ if(id_case == xmlrpc_case_lower || id_case == xmlrpc_case_upper) { int i; for(i = 0; i < value->id.len; i++) { value->id.str[i] = (id_case == xmlrpc_case_lower) ? tolower (value->id. str[i]) : toupper (value-> id. str[i]); } } pRetval = value->id.str;#ifdef XMLRPC_DEBUG_REFCOUNT printf("set value id: %s\n", pRetval);#endif } } return pRetval;}/*******//****f* VALUE/XMLRPC_SetValueString * NAME * XMLRPC_SetValueString * SYNOPSIS * const char *XMLRPC_SetValueString(XMLRPC_VALUE value, const char* val, int len) * FUNCTION * Assign a string value to an XMLRPC_VALUE, and set it to type xmlrpc_string * INPUTS * value The xml value who's ID we will set. * val The desired new string val. * len length of val string if known, or 0 if unknown. * RESULT * const char* pointer to the newly allocated value string, or NULL * SEE ALSO * XMLRPC_GetValueString () * XMLRPC_VALUE * XMLRPC_VALUE_TYPE * SOURCE */const char *XMLRPC_SetValueString(XMLRPC_VALUE value, const char* val, int len) { char *pRetval = NULL; if(value && val) { simplestring_clear(&value->str); (len > 0) ? simplestring_addn(&value->str, val, len) : simplestring_add(&value->str, val); value->type = xmlrpc_string; pRetval = (char *)value->str.str; } return pRetval;}/*******//****f* VALUE/XMLRPC_SetValueInt * NAME * XMLRPC_SetValueInt * SYNOPSIS * void XMLRPC_SetValueInt(XMLRPC_VALUE value, int val) * FUNCTION * Assign an int value to an XMLRPC_VALUE, and set it to type xmlrpc_int * INPUTS * value The xml value who's ID we will set. * val The desired new integer value * RESULT * SEE ALSO * XMLRPC_GetValueInt () * XMLRPC_VALUE * XMLRPC_VALUE_TYPE * SOURCE */void XMLRPC_SetValueInt(XMLRPC_VALUE value, int val) { if(value) { value->type = xmlrpc_int; value->i = val; }}/*******//****f* VALUE/XMLRPC_SetValueBoolean * NAME * XMLRPC_SetValueBoolean * SYNOPSIS * void XMLRPC_SetValueBoolean(XMLRPC_VALUE value, int val) * FUNCTION * Assign a boolean value to an XMLRPC_VALUE, and set it to type xmlrpc_boolean * INPUTS * value The xml value who's value we will set. * val The desired new boolean value. [0 | 1] * RESULT * SEE ALSO * XMLRPC_GetValueBoolean () * XMLRPC_VALUE * XMLRPC_VALUE_TYPE * SOURCE */void XMLRPC_SetValueBoolean(XMLRPC_VALUE value, int val) { if(value) { value->type = xmlrpc_boolean; value->i = val ? 1 : 0; }}/*******//****f* VECTOR/XMLRPC_SetIsVector * NAME * XMLRPC_SetIsVector * SYNOPSIS * int XMLRPC_SetIsVector(XMLRPC_VALUE value, XMLRPC_VECTOR_TYPE type) * FUNCTION * Set the XMLRPC_VALUE to be a vector (list) type. The vector may be one of * [xmlrpc_array | xmlrpc_struct | xmlrpc_mixed]. An array has only index values. * A struct has key/val pairs. Mixed allows both index and key/val combinations. * INPUTS * value The xml value who's vector type we will set * type New type of vector as enumerated by XMLRPC_VECTOR_TYPE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -