📄 xmlrpc.c
字号:
XMLRPCScalar *scalar = gw_malloc(sizeof(XMLRPCScalar)); scalar->s_type = type; scalar->s_int = 0; scalar->s_bool = 0; scalar->s_double = 0.0; scalar->s_str = NULL; scalar->s_date = NULL; scalar->s_base64 = NULL; if (arg == NULL) {#ifdef XR_ENABLE_EMPTY_STRING_VALUES if (scalar->s_type != xr_string) {#endif error(0,"XML-RPC: scalar value may not be null!"); xmlrpc_scalar_destroy(scalar); return NULL;#ifdef XR_ENABLE_EMPTY_STRING_VALUES }#endif } switch (type) { case xr_int: if (arg != NULL) scalar->s_int = *(long*)arg; break; case xr_bool: if (arg != NULL) scalar->s_bool = *(int*)arg; break; case xr_double: if (arg != NULL) scalar->s_double = *(double*)arg; break; case xr_string: scalar->s_str = octstr_duplicate((Octstr *)arg); break; case xr_date: scalar->s_date = octstr_duplicate((Octstr *)arg); break; case xr_base64: scalar->s_base64 = octstr_duplicate((Octstr *)arg); break; default: error(0,"XML-RPC: scalar type not supported!"); xmlrpc_scalar_destroy(scalar); return NULL; } return scalar;}/* Destroy scalar */void xmlrpc_scalar_destroy(XMLRPCScalar *scalar){ if (scalar == NULL) return; octstr_destroy(scalar->s_str); octstr_destroy(scalar->s_date); octstr_destroy(scalar->s_base64); gw_free(scalar);}int xmlrpc_scalar_get_type(XMLRPCScalar *scalar){ if (scalar == NULL) return -1; return scalar->s_type;}void *xmlrpc_scalar_get_content(XMLRPCScalar *scalar, int s_type){ if (scalar == NULL) return NULL; if (scalar->s_type != s_type) { error(0, "XMLRPC: Scalar content request with bogus type"); return NULL; } switch (scalar->s_type) { case xr_int: return &(scalar->s_int); case xr_bool: return &(scalar->s_bool); case xr_double: return &(scalar->s_double); case xr_string: return scalar->s_str; case xr_date: return scalar->s_date; case xr_base64: return scalar->s_base64; default: error(0,"XML-RPC: scalar type not supported!"); return NULL; }}Octstr *xmlrpc_scalar_print(XMLRPCScalar *scalar, int level){ Octstr *os = NULL; if (scalar == NULL) return NULL; switch (scalar->s_type) { case xr_int: os = octstr_format("%*s<int>%ld</int>\n", level, "", scalar->s_int); break; case xr_bool: os = octstr_format("%*s<bool>%d</bool>\n", level, "", scalar->s_bool); break; case xr_double: os = octstr_format("%*s<double>%d</double>\n", level, "", scalar->s_double); break; case xr_string: if (scalar->s_str == NULL) {#ifdef XR_ENABLE_EMPTY_STRING_VALUES os = octstr_create("");#endif } else { os = octstr_format("%*s<string>%S</string>\n", level, "", scalar->s_str); } break; case xr_date: os = octstr_format("%*s<datetime.iso8601>%S</datetime.iso8601>\n", level, "", scalar->s_date); break; case xr_base64: os = octstr_format("%*s<base64>%S</base64>\n", level, "", scalar->s_base64); break; } return os; }/*------------------------------------- * XMLRPCMember - internal functions *//* Create new member with undefined name and value */static XMLRPCMember *xmlrpc_member_create(void){ XMLRPCMember *member = gw_malloc(sizeof(XMLRPCMember)); member->name = NULL; member->value = NULL; return member;}/* Destroy member and if destroy_value != 0 destroy its content */static void xmlrpc_member_destroy(XMLRPCMember *member, int destroy_value){ if (member == NULL) return; octstr_destroy(member->name); if (destroy_value == 1) xmlrpc_value_destroy(member->value); gw_free(member);}/*------------------------------------------------- * Utilities to make things easier */Octstr *xmlrpc_get_call_name(XMLRPCDocument *call){ if (call == NULL || call->methodcall == NULL) return NULL; return xmlrpc_call_get_name(call->methodcall);}/*** PARAMS HANDLING ***/int xmlrpc_count_params(XMLRPCDocument *xrdoc){ if (xrdoc == NULL) return -1; if (xrdoc->d_type == xr_methodcall && xrdoc->methodcall != NULL) return list_len(xrdoc->methodcall->params); else if (xrdoc->d_type == xr_methodresponse && xrdoc->methodresponse != NULL) return (xrdoc->methodresponse->param != NULL ? 1 : 0); return -1;}XMLRPCValue *xmlrpc_get_param(XMLRPCDocument *xrdoc, int i){ if (xrdoc == NULL) return NULL; if (xrdoc->d_type == xr_methodcall && xrdoc->methodcall != NULL) return list_get(xrdoc->methodcall->params, i); else if (xrdoc->d_type == xr_methodresponse && xrdoc->methodresponse != NULL && i == 0) return xrdoc->methodresponse->param; return NULL;}int xmlrpc_get_type_param(XMLRPCDocument *xrdoc, int i){ XMLRPCValue *param = xmlrpc_get_param(xrdoc, i); return xmlrpc_value_get_type(param);}void *xmlrpc_get_content_param(XMLRPCDocument *xrdoc, int i){ XMLRPCValue *param = xmlrpc_get_param(xrdoc, i); return xmlrpc_value_get_content(param);}/*** STRUCT VALUE HANDLING ***/XMLRPCValue *xmlrpc_create_struct_value(int count_members){ XMLRPCValue *value = xmlrpc_value_create(); int len = (count_members > 0 ? count_members : OPTIMAL_STRUCT_SIZE); value->v_type = xr_struct; value->v_struct = dict_create(len, xmlrpc_value_destroy_item); return value;}long xmlrpc_count_members(XMLRPCValue *xrstruct){ if (xrstruct == NULL || xrstruct->v_type != xr_struct) return -1; return dict_key_count(xrstruct->v_struct);}int xmlrpc_add_member(XMLRPCValue *xrstruct, Octstr *name, XMLRPCValue *value){ if (xrstruct == NULL || xrstruct->v_type != xr_struct || name == NULL || value == NULL) return -1; return dict_put_once(xrstruct->v_struct, name, value);}int xmlrpc_add_member_scalar(XMLRPCValue *xrstruct, Octstr *name, int type, void *arg){ XMLRPCValue *value = xmlrpc_create_scalar_value(type, arg); int status; status = xmlrpc_add_member(xrstruct, name, value); if (status < 0) xmlrpc_value_destroy(value); return status;}XMLRPCValue *xmlrpc_get_member(XMLRPCValue *xrstruct, Octstr *name){ if (xrstruct == NULL || xrstruct->v_type != xr_struct || name == NULL) return NULL; return dict_get(xrstruct->v_struct, name);}int xmlrpc_get_member_type(XMLRPCValue *xrstruct, Octstr *name){ XMLRPCValue *value = xmlrpc_get_member(xrstruct, name); return xmlrpc_value_get_type(value);}void *xmlrpc_get_member_content(XMLRPCValue *xrstruct, Octstr *name){ XMLRPCValue *value = xmlrpc_get_member(xrstruct, name); return xmlrpc_value_get_content(value);}Octstr *xmlrpc_print_struct(Dict *v_struct, int level){ Octstr *body, *os_val, *key; List *keys; XMLRPCValue *member_val; if (v_struct == NULL || dict_key_count(v_struct) == 0) return NULL; keys = dict_keys(v_struct); body = octstr_format("%*s<struct>\n", level, ""); while ((key = list_consume(keys)) != NULL) { member_val = dict_get(v_struct, key); os_val = xmlrpc_value_print(member_val, level+4); if (os_val == NULL) { list_destroy(keys, octstr_destroy_item); octstr_destroy(key); octstr_destroy(body); return NULL; } octstr_format_append(body, "%*s<member>\n" "%*s<name>%S</name>\n%S" "%*s</member>\n", level+2, "", level+4, "", key, os_val, level+2, ""); octstr_destroy(key); octstr_destroy(os_val); } list_destroy(keys, octstr_destroy_item); octstr_format_append(body, "%*s</struct>\n", level, ""); return body;}/*** ARRAY VALUE HANDLING ***/XMLRPCValue *xmlrpc_create_array_value(void){ XMLRPCValue *value = xmlrpc_value_create(); value->v_type = xr_array; value->v_array = list_create(); return value;}int xmlrpc_count_elements(XMLRPCValue *xrarray){ if (xrarray == NULL || xrarray->v_type != xr_array) return -1; return list_len(xrarray->v_array);}int xmlrpc_add_element(XMLRPCValue *xrarray, XMLRPCValue *value){ if (xrarray == NULL || xrarray->v_type != xr_array || value == NULL) return -1; list_produce(xrarray->v_array, value); return 1;}int xmlrpc_add_element_scalar(XMLRPCValue *xrarray, int type, void *arg){ XMLRPCValue *value = xmlrpc_create_scalar_value(type, arg); int status; status = xmlrpc_add_element(xrarray, value); if (status < 0) xmlrpc_value_destroy(value); return status;}XMLRPCValue *xmlrpc_get_element(XMLRPCValue *xrarray, int i){ if (xrarray == NULL || xrarray->v_type != xr_array || i < 0) return NULL; return list_get(xrarray->v_array, i);}int xmlrpc_get_element_type(XMLRPCValue *xrarray, int i){ XMLRPCValue *value = xmlrpc_get_element(xrarray, i); return xmlrpc_value_get_type(value);}void *xmlrpc_get_element_content(XMLRPCValue *xrarray, int i){ XMLRPCValue *value = xmlrpc_get_element(xrarray, i); return xmlrpc_value_get_content(value);}Octstr *xmlrpc_print_array(List *v_array, int level){ Octstr *body, *os_element; XMLRPCValue *element = NULL; int i; if (v_array == NULL) return NULL; body = octstr_format("%*s<array>\n%*s<data>", level, "", level+2, ""); for(i = 0; i < list_len(v_array); i++) { element = list_get(v_array, i); os_element = xmlrpc_value_print(element, level+4); if (os_element == NULL) { octstr_destroy(body); return NULL; } octstr_append(body, os_element); octstr_destroy(os_element); } octstr_format_append(body, "%*s</data>\n%*s</array>\n", level+2, "", level, ""); return body;}/*** SCALAR VALUE HANDLING ***/XMLRPCValue *xmlrpc_create_scalar_value(int type, void *arg){ XMLRPCValue *value = xmlrpc_value_create(); value->v_type = xr_scalar; value->v_scalar = xmlrpc_scalar_create(type, arg); return value;}XMLRPCValue *xmlrpc_create_double_value(double val){ return xmlrpc_create_scalar_value(xr_double, &val);}XMLRPCValue *xmlrpc_create_int_value(long val){ return xmlrpc_create_scalar_value(xr_int, &val);}XMLRPCValue *xmlrpc_create_string_value(Octstr *val){ return xmlrpc_create_scalar_value(xr_string, val);}/*** FAULT HANDLING ***/int xmlrpc_is_fault(XMLRPCDocument *response){ if (response == NULL || response->d_type != xr_methodresponse) return 0; return xmlrpc_response_is_fault(response->methodresponse);}long xmlrpc_get_faultcode(XMLRPCDocument *faultresponse)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -