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

📄 xmlrpc.c

📁 The Kannel Open Source WAP and SMS gateway works as both an SMS gateway, for implementing keyword b
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -