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

📄 xmlrpc.c

📁 PHP v6.0 For Linux 运行环境:Win9X/ WinME/ WinNT/ Win2K/ WinXP
💻 C
📖 第 1 页 / 共 5 页
字号:
			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 + -