diff options
Diffstat (limited to 'vendor/voclient/libsamp/libxrpc/xrValues.c')
-rw-r--r-- | vendor/voclient/libsamp/libxrpc/xrValues.c | 295 |
1 files changed, 295 insertions, 0 deletions
diff --git a/vendor/voclient/libsamp/libxrpc/xrValues.c b/vendor/voclient/libsamp/libxrpc/xrValues.c new file mode 100644 index 00000000..72c4935f --- /dev/null +++ b/vendor/voclient/libsamp/libxrpc/xrValues.c @@ -0,0 +1,295 @@ +/** + * XRVALUES.C + * + * Methods to handle XML-RPC values. + * + * xr_initValues () + * v = xr_newValue (int type, void *v) + * v = xr_tmpValue (int type, void *v) + * xr_freeValue (int index) + * + * snum = xr_appendStruct (int snum, char *key, int value) + * anum = xr_appendArray (int anum, char *key, int value) + * + * xr_getStructValue (int snum, char *key, void *value) + * xr_getArrayValue (int anum, int index, void *value) + * + * + * @brief Methods to handle XML-RPC values. + * + * @file xrValues.c + * @author Mike Fitzpatrick + * @date 6/10/09 + */ + + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <string.h> + +#include <xmlrpc-c/base.h> +#include <xmlrpc-c/client.h> +#include <xmlrpc-c/server.h> +#include <xmlrpc-c/server_abyss.h> + +#include "xrpcP.h" + + + +#define MAX_XVALUES 128 + +#define V_FIRST 5 +#define V_LAST MAX_XVALUES + +#define V_TMPVAL 0 /* temp value */ +#define V_CPARAM 1 /* client-side params */ +#define V_CRESULT 2 /* client-side results */ +#define V_MPARAM 3 /* method-side params */ +#define V_MRESULT 4 /* method-side results */ + + +typedef struct { + xmlrpc_value *val; /* xmlrpc value */ + int in_use; + +} XValue, *XValueP; + + +int nx_values = -1; +XValue xValues[MAX_XVALUES]; + +xmlrpc_env env; /* local env */ + + +static xmlrpc_value *xr_gval (int type, void *value); +static int xr_sval (int type, xmlrpc_value *v, void *uval); + + + + + +/* XR_INTIVALUES -- Globally initialize the XValues array. +*/ +void +xr_initValues () +{ + memset (&xValues[0], 0, MAX_XVALUES * sizeof(XValue) ); + nx_values = -1; +} + + +/* XR_NEWVALUE -- 'Allocate' a new dynamic value to be used. +*/ +int +xr_newValue (int type, void *v) +{ + int i; + int *iv = (int *) v; + double *dv = (double *) v; + const char *str = (const char *) v; + XValue *xv; + + + if (nx_values < 0) /* initialize the value array */ + memset (&xValues[0], 0, MAX_XVALUES * sizeof(XValue) ); + + nx_values++; + for (i=V_FIRST; i < V_LAST; i++) { + xv = &xValues[i]; + if (! xv->in_use) { + + if ( (xv->val = xr_gval (type, v)) ) { + xv->in_use = TRUE; + return (i); + } else + break; + } + } + + return (-1); + +} + + +/* XR_TMPVAL -- Return a temp xmlrc_value. This is distinguished from other +** XValues by the fact that this is a static value that might be overwritten +** by some later call. This will always be the xmlrpc_value in the zero +** position of the XValues array, any procedure that requests a new value +** on this XValue position will destroy the value before a new one is +** allocated. +*/ +int +xr_tmpValue (int type, void *v) +{ + int i; + int *iv = (int *) v; + double *dv = (double *) v; + const char *str = (const char *) v; + XValue *xv; + + xv = &xValues[V_TMPVAL]; + + if (! xv->in_use) + xmlrpc_DECREF(xv->val); + + if ( (xv->val = xr_gval (type, v)) ) { + xv->in_use = TRUE; + return (V_TMPVAL); + } else + return (-1); + +} + + + +/* XR_FREEVALUE -- 'Deallocate' a new value in use. +*/ +void +xr_freeValue (int index) +{ + XValue *xv = &xValues[index]; + + if (xv->in_use) { + xmlrpc_DECREF (xv->val); + memset (&xValues[index], 0, sizeof(XValue) ); + nx_values--; + } +} + + +/* Compound objects. +** +*/ +int +xr_appendStruct (int snum, char *key, int value) +{ + XValue *x1 = &xValues[snum]; /* struct to be appended */ + XValue *x2 = &xValues[value]; /* value to be appended */ + + xmlrpc_struct_set_value (&env, x1->val, key, x2->val); +} + + +int +xr_appendArray (int anum, char *key, int value) +{ + XValue *x1 = &xValues[anum]; /* array to be appended */ + XValue *x2 = &xValues[value]; /* value to be appended */ + + xmlrpc_array_append_item (&env, x1->val, x2->val); +} + + + + +/* Get methods. +*/ + +void +xr_getStructValue (int snum, char *key, void *value) +{ + XValue *xv = &xValues[snum]; /* struct object */ + xmlrpc_value *s = xv->val; + xmlrpc_value *v = (xmlrpc_value *) NULL; + + if (xmlrpc_struct_has_key (&env, s, (const char *) key)) { + xmlrpc_struct_find_value (&env, s, (const char *)key, &v); + + value = (void *)v; + } +} + + +void +xr_getArrayValue (int anum, int index, void *value) +{ + + XValue *xv = &xValues[anum]; /* array object */ + xmlrpc_value *tmp; + + xmlrpc_array_read_item (&env, xv->val, index, &tmp); + + /* FIXME */ + +/* + switch (type) { + case TY_INT: + + xmlrpc_read_int (&env, tmp, &ival); + break; + } +*/ +} + + + +/************************************************************************ +** PRIVATE PROCEDURES +** +*/ + + +/* GVAL -- Given a user-defined value, convert it to an xmlrpc_value. +*/ +static xmlrpc_value * +xr_gval (int type, void *v) +{ + int *iv = (int *) v; + double *dv = (double *) v; + const char *str = (const char *) v; + + switch (type) { + case TY_INT: return ( xmlrpc_int_new (&env, *iv) ); + case TY_DOUBLE: return ( xmlrpc_double_new (&env, *dv) ); + case TY_BOOL: return ( xmlrpc_bool_new (&env, (xmlrpc_bool)*iv) ); + case TY_STRING: return ( xmlrpc_string_new (&env, str) ); + case TY_DATETIME: return ( xmlrpc_datetime_new_str (&env, str) ); + case TY_ARRAY: return ( xmlrpc_array_new (&env) ); + case TY_STRUCT: return ( xmlrpc_struct_new (&env) ); + } + return (xmlrpc_value *) NULL; +} + + +/* SVAL -- Scan a user-type value from an xmlrpc_value. Note we cannot +** use this for compound objects such as arrays and structs, we assume +** the caller has already allocated the uval pointer. +*/ +static int +xr_sval (int type, xmlrpc_value *v, void *uval) +{ + size_t len; + int *iv = (int *) uval; + double *dv = (double *) uval; + const char *str = (const char *) uval; + xmlrpc_bool bv; + + + switch (type) { + case TY_INT: + xmlrpc_read_int (&env, v, iv); + uval = (void *)&iv; + break; + case TY_DOUBLE: + xmlrpc_read_double (&env, v, dv); + uval = (void *)&dv; + break; + case TY_BOOL: + xmlrpc_read_bool (&env, v, &bv); + uval = (void *)&bv; + break; + case TY_STRING: + xmlrpc_read_string_lp (&env, v, &len, &str); + uval = (void *)&str; + break; + case TY_DATETIME: + xmlrpc_read_datetime_str (&env, v, &str); + uval = (void *)&str; + break; + } + + return ( ((env.fault_occurred) ? ERR : OK) ); +} + + |