static void
getMethListFromMulticallPlist(xmlrpc_env *    const envP,
                              xmlrpc_value *  const paramArrayP,
                              xmlrpc_value ** const methlistPP) {

    if (xmlrpc_array_size(envP, paramArrayP) != 1)
        xmlrpc_env_set_fault_formatted(
            envP, XMLRPC_PARSE_ERROR,
            "system.multicall takes one parameter, which is an "
            "array, each element describing one RPC.  You "
            "supplied %u arguments", 
            xmlrpc_array_size(envP, paramArrayP));
    else {
        xmlrpc_value * methlistP;

        xmlrpc_array_read_item(envP, paramArrayP, 0, &methlistP);

        XMLRPC_ASSERT_ENV_OK(envP);

        if (xmlrpc_value_type(methlistP) != XMLRPC_TYPE_ARRAY)
            xmlrpc_env_set_fault_formatted(
                envP, XMLRPC_TYPE_ERROR,
                "system.multicall's parameter should be an array, "
                "each element describing one RPC.  But it is type "
                "%u instead.", xmlrpc_value_type(methlistP));
        else
            *methlistPP = methlistP;

        if (envP->fault_occurred)
            xmlrpc_DECREF(methlistP);
    }
}
static void
test_value_array(void) {

    xmlrpc_value *v;
    xmlrpc_env env;
    size_t len;

    /* Basic array-building test. */

    xmlrpc_env_init(&env);

    v = xmlrpc_array_new(&env);
    TEST_NO_FAULT(&env);
    TEST(XMLRPC_TYPE_ARRAY == xmlrpc_value_type(v));
    len = xmlrpc_array_size(&env, v);
    TEST_NO_FAULT(&env);
    TEST(len == 0);
    xmlrpc_DECREF(v);

    v = xmlrpc_build_value(&env, "()");
    TEST_NO_FAULT(&env);
    TEST(XMLRPC_TYPE_ARRAY == xmlrpc_value_type(v));
    len = xmlrpc_array_size(&env, v);
    TEST_NO_FAULT(&env);
    TEST(len == 0);
    xmlrpc_DECREF(v);

    xmlrpc_env_clean(&env);
}
bool ArchiveDataClient::getArchives(stdVector<ArchiveInfo> &archives)
{
    xmlrpc_value *result, *element;
    xmlrpc_int32 key;
    const char   *name, *path;
    size_t       count, i, n_len, p_len;
    ArchiveInfo  info;
    result = xmlrpc_client_call(&env, (char *)URL, "archiver.archives", "()");
    if (log_fault())
        return false;
    count = xmlrpc_array_size(&env, result);
    archives.reserve(count);
    for (i=0; i<count; ++i)
    {
        element = xmlrpc_array_get_item(&env, result, i);
        if (log_fault())
            return false;
        xmlrpc_parse_value(&env, element, "{s:i,s:s#,s:s#,*}",
                           "key",  &key,
                           "name", &name, &n_len,
                           "path", &path, &p_len);
        if (log_fault())
            return false;
        info.key = key;
        info.name.assign(name, n_len);
        info.path.assign(path, p_len);
        archives.push_back(info);
    }
    xmlrpc_DECREF(result);
    return true;
}
Exemple #4
0
void cmd_list(xmlrpc_env *env, int argc, char **argv)
{
	xmlrpc_value *response, *result;
	char *username;
	int len, i;

	if (argc > 0)
		username = argv[0];
	else
		username = "";

	response = client_call("vxdb.list",
		"{s:s}",
		"username", username);
	return_if_fault(env);

	len = xmlrpc_array_size(env, response);
	return_if_fault(env);

	for (i = 0; i < len; i++) {
		xmlrpc_array_read_item(env, response, i, &result);
		return_if_fault(env);

		xmlrpc_decompose_value(env, result, "s", &username);
		return_if_fault(env);

		xmlrpc_DECREF(result);

		printf("%s\n", username);
	}

	xmlrpc_DECREF(response);
}
Exemple #5
0
static void
test_value_AS(void) {

    xmlrpc_value *v;
    xmlrpc_value *v2;
    xmlrpc_value *v3;
    xmlrpc_env env;
    size_t len;

    /* Test parsing of 'A' and 'S'. */

    xmlrpc_env_init(&env);

    v = xmlrpc_build_value(&env, "((){})");
    TEST_NO_FAULT(&env);
    xmlrpc_decompose_value(&env, v, "(AS)", &v2, &v3);
    xmlrpc_DECREF(v);
    TEST_NO_FAULT(&env);
    TEST(XMLRPC_TYPE_ARRAY == xmlrpc_value_type(v2));
    TEST(XMLRPC_TYPE_STRUCT == xmlrpc_value_type(v3));
    len = xmlrpc_array_size(&env, v2);
    TEST_NO_FAULT(&env);
    TEST(len == 0);
    len = xmlrpc_struct_size(&env, v3);
    TEST_NO_FAULT(&env);
    TEST(len == 0);
    xmlrpc_DECREF(v2);
    xmlrpc_DECREF(v3);

    xmlrpc_env_clean(&env);
}
Exemple #6
0
void cmd_vx_bcaps_get(xmlrpc_env *env, int argc, char **argv)
{
	xmlrpc_value *response, *result;
	char *name, *bcap;
	int len, i;

	if (argc < 1)
		usage(EXIT_FAILURE);

	name = argv[0];

	response = client_call("vxdb.vx.bcaps.get",
		"{s:s}",
		"name", name);
	return_if_fault(env);

	len = xmlrpc_array_size(env, response);
	return_if_fault(env);

	for (i = 0; i < len; i++) {
		xmlrpc_array_read_item(env, response, i, &result);
		return_if_fault(env);

		xmlrpc_decompose_value(env, result, "s", &bcap);
		return_if_fault(env);

		xmlrpc_DECREF(result);

		printf("%s\n", bcap);
	}

	xmlrpc_DECREF(response);
}
bool ArchiveDataClient::getNames(int key, const stdString &pattern,
                                 stdVector<NameInfo> &names)
{
    xmlrpc_value *result, *element;
    const char   *name;
    xmlrpc_int32 start_sec, start_nano, end_sec, end_nano;
    size_t       count, i, len;
    NameInfo     info;
    result = xmlrpc_client_call(&env, (char *)URL, "archiver.names", "(is)",
                                (xmlrpc_int32) key, pattern.c_str());
    if (log_fault())
        return false;
    count = xmlrpc_array_size(&env, result);
    names.reserve(count);
    for (i=0; i<count; ++i)
    {
        element = xmlrpc_array_get_item(&env, result, i);
        if (log_fault())
            return false;
        xmlrpc_parse_value(&env, element, "{s:s#,s:i,s:i,s:i,s:i,*}",
                           "name",       &name, &len,
                           "start_sec",  &start_sec,
                           "start_nano", &start_nano,
                           "end_sec",    &end_sec,
                           "end_nano",   &end_nano);
        if (log_fault())
            return false;
        info.name.assign(name, len);
        pieces2epicsTime(start_sec, start_nano, info.start);
        pieces2epicsTime(end_sec, end_nano, info.end);
        names.push_back(info);
    }
    xmlrpc_DECREF(result);
    return true;
}
Exemple #8
0
static void getRecentPosts( const char *host, const char *username, const char *password )
{
    xmlrpc_env env;
    xmlrpc_value * resultP = NULL; // array item 
    xmlrpc_value * firstElementP = NULL;  // first element in array
    xmlrpc_value * varP = NULL;
    const char * postResult = NULL;
    int arrsize;
    
    xmlrpc_client_init( XMLRPC_CLIENT_NO_FLAGS, NAME, VERSION );
    xmlrpc_env_init( &env );

    resultP = xmlrpc_client_call( &env, host,
                                "blogger.getRecentPosts",
                                "(ssssi)", 
                                "", /* key, not used */
                                username, /* journal unique name */
                                username, /* journal username */
                                password, /* journal password */
                                RECENT_POST_COUNT ); /* post count */
    die_if_fault_occurred( &env );
 
    arrsize = xmlrpc_array_size( &env, resultP ); 
    die_if_fault_occurred( &env );
    //fprintf( stderr, "Array size %d\n", arrsize );
    
    for (int i = 0; i < arrsize; i++ )
    {
        xmlrpc_array_read_item( &env, resultP, i, &firstElementP);
        xmlrpc_struct_find_value( &env, firstElementP, "title", &varP);
        if (varP)
        {
            xmlrpc_read_string( &env, varP, &postResult);
            printf( "%d %s\n\n", i, postResult );
            free((char *)postResult);
            xmlrpc_DECREF( varP );
        }
        die_if_fault_occurred( &env );
        
        xmlrpc_struct_find_value( &env, firstElementP, "content", &varP);
        if (varP)
        {
            xmlrpc_read_string( &env, varP, &postResult);
            printf( "%s\n\n", postResult );
            free((char *)postResult);
            xmlrpc_DECREF( varP );
        }
        die_if_fault_occurred( &env );

        xmlrpc_DECREF( firstElementP );
    }
    xmlrpc_DECREF( resultP );
    xmlrpc_env_clean( &env );
    xmlrpc_client_cleanup();
}
Exemple #9
0
static void
test_value_array(void) {

    xmlrpc_value *v;
    xmlrpc_env env;
    size_t len;
    xmlrpc_value * itemP;

    /* Basic array-building test. */

    xmlrpc_env_init(&env);

    TEST(streq(xmlrpc_type_name(XMLRPC_TYPE_ARRAY), "ARRAY"));

    v = xmlrpc_array_new(&env);
    TEST_NO_FAULT(&env);
    TEST(XMLRPC_TYPE_ARRAY == xmlrpc_value_type(v));
    len = xmlrpc_array_size(&env, v);
    TEST_NO_FAULT(&env);
    TEST(len == 0);

    itemP = xmlrpc_int_new(&env, 7);
    TEST_NO_FAULT(&env);
    xmlrpc_array_append_item(&env, v, itemP);
    TEST_NO_FAULT(&env);
    len = xmlrpc_array_size(&env, v);
    TEST_NO_FAULT(&env);
    TEST(len == 1);
    xmlrpc_DECREF(itemP);

    xmlrpc_DECREF(v);

    v = xmlrpc_build_value(&env, "()");
    TEST_NO_FAULT(&env);
    TEST(XMLRPC_TYPE_ARRAY == xmlrpc_value_type(v));
    len = xmlrpc_array_size(&env, v);
    TEST_NO_FAULT(&env);
    TEST(len == 0);
    xmlrpc_DECREF(v);

    xmlrpc_env_clean(&env);
}
size_t
value_array::size() const {

    env_wrap env;
    unsigned int arraySize;

    arraySize = xmlrpc_array_size(&env.env_c, this->cValueP);
    throwIfError(env);
    
    return arraySize;
}
static void
test_value_array_nil(void) {

    xmlrpc_value * arrayP;
    xmlrpc_env env;
    xmlrpc_int32 i1, i2;
    xmlrpc_value * itemP;
    size_t len;

    xmlrpc_env_init(&env);

    arrayP = xmlrpc_build_value(&env, "(nini)",
                                (xmlrpc_int32) 10, (xmlrpc_int32) 20);
    TEST_NO_FAULT(&env);
    TEST(XMLRPC_TYPE_ARRAY == xmlrpc_value_type(arrayP));

    len = xmlrpc_array_size(&env, arrayP);
    TEST_NO_FAULT(&env);
    TEST(len == 4);

    itemP = xmlrpc_array_get_item(&env, arrayP, 0);
    TEST_NO_FAULT(&env);
    xmlrpc_decompose_value(&env, itemP, "n");
    TEST_NO_FAULT(&env);

    itemP = xmlrpc_array_get_item(&env, arrayP, 1);
    TEST_NO_FAULT(&env);
    {
        int i;
        xmlrpc_decompose_value(&env, itemP, "i", &i);
        TEST_NO_FAULT(&env);
        TEST(i == 10);
    }
    xmlrpc_decompose_value(&env, arrayP, "(nini)", &i1, &i2);
    TEST_NO_FAULT(&env);
    TEST(i1 == 10 && i2 == 20);

    /* Test bounds check on xmlrpc_array_get_item. */
    xmlrpc_array_read_item(&env, arrayP, 4, &itemP);
    TEST_FAULT(&env, XMLRPC_INDEX_ERROR);
    xmlrpc_env_clean(&env);
    xmlrpc_env_init(&env);

    xmlrpc_array_get_item(&env, arrayP, 4);
    TEST_FAULT(&env, XMLRPC_INDEX_ERROR);
    xmlrpc_env_clean(&env);
    xmlrpc_env_init(&env);

    xmlrpc_DECREF(arrayP);

    xmlrpc_env_clean(&env);
}
Exemple #12
0
const char* extract_result (xmlrpc_env *env , xmlrpc_value *temp)
{
   xmlrpc_value * arrayP;	
   xmlrpc_decompose_value(env, temp, "(A)", &arrayP);
   size_t size = xmlrpc_array_size(env, arrayP);
   xmlrpc_value * strctP;
   strctP = xmlrpc_array_get_item(env, arrayP, 0);
   const char *primeResult = (const char *)malloc (256);
   size_t str1_len;
   xmlrpc_read_string_lp(env, strctP, &str1_len, &primeResult);			
   
   return primeResult;
}
Exemple #13
0
/* The only way this can fail is if arrayP is not actually an array XML-RPC
 * value. So it is usually not worth checking *envP.
 * die or return size of array
 */
unsigned rhbz_array_size(xmlrpc_value *xml)
{
    func_entry();

    xmlrpc_env env;
    xmlrpc_env_init(&env);

    unsigned size = xmlrpc_array_size(&env, xml);
    if (env.fault_occurred)
        abrt_xmlrpc_die(&env);

    return size;
}
static xmlrpc_value *
system_multicall(xmlrpc_env *   const envP,
                 xmlrpc_value * const paramArrayP,
                 void *         const serverInfo,
                 void *         const callInfo) {

    xmlrpc_registry * registryP;
    xmlrpc_value * resultsP;
    xmlrpc_value * methlistP;

    XMLRPC_ASSERT_ENV_OK(envP);
    XMLRPC_ASSERT_ARRAY_OK(paramArrayP);
    XMLRPC_ASSERT_PTR_OK(serverInfo);

    resultsP = NULL;  /* defeat compiler warning */

    /* Turn our arguments into something more useful. */
    registryP = (xmlrpc_registry*) serverInfo;

    getMethListFromMulticallPlist(envP, paramArrayP, &methlistP);
    if (!envP->fault_occurred) {
        /* Create an initially empty result list. */
        resultsP = xmlrpc_array_new(envP);
        if (!envP->fault_occurred) {
            /* Loop over our input list, calling each method in turn. */
            unsigned int const methodCount =
                xmlrpc_array_size(envP, methlistP);
            unsigned int i;
            for (i = 0; i < methodCount && !envP->fault_occurred; ++i) {
                xmlrpc_value * const methinfoP = 
                    xmlrpc_array_get_item(envP, methlistP, i);
            
                xmlrpc_value * resultP;
            
                XMLRPC_ASSERT_ENV_OK(envP);
            
                callOneMethod(envP, registryP, methinfoP, callInfo, &resultP);
            
                if (!envP->fault_occurred) {
                    /* Append this method result to our master array. */
                    xmlrpc_array_append_item(envP, resultsP, resultP);
                    xmlrpc_DECREF(resultP);
                }
            }
            if (envP->fault_occurred)
                xmlrpc_DECREF(resultsP);
            xmlrpc_DECREF(methlistP);
        }
    }
    return resultsP;
}
bool ArchiveDataClient::getValues(int key, stdVector<stdString> &names,
                                  const epicsTime &start, const epicsTime &end,
                                  int count, int how,
                                  value_callback callback, void *callback_arg)
{
    xmlrpc_value *name_array, *result, *element;
    size_t n;
    name_array = xmlrpc_build_value(&env, "()");
    if (log_fault())
        return false;
     for (n=0; n<names.size(); ++n)
    {
        element = xmlrpc_build_value(&env, "s", names[n].c_str());
        if (log_fault())
            return false;
        xmlrpc_array_append_item(&env, name_array, element);
        if (log_fault())
            return false;
        xmlrpc_DECREF(element);
    }
    xmlrpc_int32 start_sec, start_nano, end_sec, end_nano;
    epicsTime2pieces(start, start_sec, start_nano);
    epicsTime2pieces(end, end_sec, end_nano);
    result = xmlrpc_client_call(&env, (char *)URL,
                                "archiver.values", "(iViiiiii)",
                                (xmlrpc_int32)key, name_array,
                                start_sec, start_nano, end_sec, end_nano,
                                (xmlrpc_int32)count, (xmlrpc_int32)how);
    if (log_fault())
        return false;
    xmlrpc_DECREF(name_array);
    size_t channel_count = xmlrpc_array_size(&env, result);
    xmlrpc_value *channel_result;
    for (n=0; n<channel_count; ++n)
    {
        channel_result = xmlrpc_array_get_item(&env, result, n);
        if (log_fault())
            return false;
        if (!decode_channel(channel_result, n, callback, callback_arg))
            return false;
    }
    xmlrpc_DECREF(result);
    return true;
}
void
clientSimple::call(string  const serverUrl,
                   string  const methodName,
                   string  const format,
                   value * const resultP,
                   ...) {

    carriageParm_http0 carriageParm(serverUrl);

    env_wrap env;
    xmlrpc_value * paramArrayP;

    va_list args;
    va_start(args, resultP);
    makeParamArray(format, &paramArrayP, args);
    va_end(args);

    if (env.env_c.fault_occurred)
        throw(error(env.env_c.fault_string));
    else {
        cValueWrapper paramArrayWrapper(paramArrayP); // ensure destruction
        unsigned int const paramCount(
            xmlrpc_array_size(&env.env_c, paramArrayP));
        
        if (env.env_c.fault_occurred)
            throw(error(env.env_c.fault_string));
        
        paramList paramList;
        for (unsigned int i = 0; i < paramCount; ++i) {
            xmlrpc_value * paramP;
            xmlrpc_array_read_item(&env.env_c, paramArrayP, i, &paramP);
            if (env.env_c.fault_occurred)
                throw(error(env.env_c.fault_string));
            else {
                cValueWrapper paramWrapper(paramP); // ensure destruction
                paramList.add(value(paramP));
            }
        }
        rpcPtr rpcPtr(methodName, paramList);
        rpcPtr->call(this->clientP.get(), &carriageParm);
        *resultP = rpcPtr->getResult();
    }
}
Exemple #17
0
static void
parseParamsElement(xmlrpc_env *        const envP,
                   const xml_element * const paramsElementP,
                   xmlrpc_value **     const resultPP) {

    xmlrpc_value * paramsVP;
    xmlrpc_env env;

    xmlrpc_env_init(&env);

    XMLRPC_ASSERT(xmlrpc_streq(xml_element_name(paramsElementP), "params"));

    paramsVP = convertParams(envP, paramsElementP);

    if (!envP->fault_occurred) {
        int arraySize;
        xmlrpc_env sizeEnv;

        XMLRPC_ASSERT_ARRAY_OK(paramsVP);
        
        xmlrpc_env_init(&sizeEnv);

        arraySize = xmlrpc_array_size(&sizeEnv, paramsVP);
        /* Since it's a valid array, as asserted above, can't fail */
        XMLRPC_ASSERT(!sizeEnv.fault_occurred);

        if (arraySize != 1)
            setParseFault(envP, "Contains %d items.  It should have 1.",
                          arraySize);
        else {
            xmlrpc_array_read_item(envP, paramsVP, 0, resultPP);
        }
        xmlrpc_DECREF(paramsVP);
        xmlrpc_env_clean(&sizeEnv);
    }
    if (env.fault_occurred)
        xmlrpc_env_set_fault_formatted(
            envP, env.fault_code,
            "Invalid <params> element.  %s", env.fault_string);

    xmlrpc_env_clean(&env);
}
char *
wpGetBlogId(char *username, char *password, char *url) {
	char *blogid;
	int i;
	int noOfBlogs;
	xmlrpc_env env;
	xmlrpc_client *clientP;
	char *methodName = "wp.getUsersBlogs";
	xmlrpc_value *result, *result2;

	wp_env_init(&env, &clientP);

	/* Make the remote procedure call */
	xmlrpc_client_call2f(&env, clientP, url, methodName, &result,
							"(ss)", username, password);
	die_if_fault_occurred(&env);
	noOfBlogs = xmlrpc_array_size(&env, result);
	if ( noOfBlogs > 1 ) {
		fprintf(stderr, "Currently only single blog wp accounts are supported\n");
		blogid = NULL;
		goto out;
	}
	for(i = 0; i < noOfBlogs; i++) {
		xmlrpc_value *blog_id_xml;
		xmlrpc_array_read_item(&env, result, i, &result2);
		xmlrpc_struct_read_value(&env, result2, "blogid", &blog_id_xml);
		xmlrpc_read_string(&env, blog_id_xml,(const char **) &blogid);
		xmlrpc_DECREF(blog_id_xml);
	}

	/* Dispose of our result value. */
	xmlrpc_DECREF(result2);

out:
	xmlrpc_DECREF(result);

	/* Clean up our error-handling environment. */
	wp_env_clean(&env, &clientP);
	
	return blogid;
}
Exemple #19
0
vector<xmlrpc_c::value>
value_array::vectorValueValue() const {

    this->validateInstantiated();

    env_wrap env;

    unsigned int arraySize;

    arraySize = xmlrpc_array_size(&env.env_c, this->cValueP);
    throwIfError(env);

    vector<xmlrpc_c::value> retval(arraySize);

    for (unsigned int i = 0; i < arraySize; ++i) {

        class cWrapper {
        public:
            xmlrpc_value *valueP;

            cWrapper(xmlrpc_value *const arrayP,
                     unsigned int const index) {
                env_wrap env;

                xmlrpc_array_read_item(&env.env_c, arrayP, index, &valueP);

                throwIfError(env);
            }

            ~cWrapper() {
                xmlrpc_DECREF(valueP);
            }
        };

        cWrapper wrapper(this->cValueP, i);

        retval[i].instantiate(wrapper.valueP);
    }

    return retval;
}
static void
validateArraySize(xmlrpc_env *         const envP,
                  const xmlrpc_value * const arrayP,
                  struct arrayDecomp   const arrayDecomp) {
    
    unsigned int size;
              
    size = xmlrpc_array_size(envP, arrayP);
    if (!envP->fault_occurred) {
        if (arrayDecomp.itemCnt > size)
            xmlrpc_env_set_fault_formatted(
                envP, XMLRPC_INDEX_ERROR,
                "Format string requests %u items from array, but array "
                "has only %u items.", arrayDecomp.itemCnt, size);
        else if (arrayDecomp.itemCnt < size && !arrayDecomp.ignoreExcess)
            xmlrpc_env_set_fault_formatted(
                envP, XMLRPC_INDEX_ERROR,
                "Format string requests exactly %u items from array, "
                "but array has %u items.  (A '*' at the end would avoid "
                "this failure)", arrayDecomp.itemCnt, size);
    }
}
Exemple #21
0
static xmlrpc_value * add_flow_destination(xmlrpc_env * const env,
		   xmlrpc_value * const param_array,
		   void * const user_data)
{
	UNUSED_ARGUMENT(user_data);

	int rc, i;
	xmlrpc_value *ret = 0;
	char* cc_alg = 0;
	char* bind_address = 0;
	xmlrpc_value* extra_options = 0;

	struct _flow_settings settings;

	struct _request_add_flow_destination* request = 0;

	DEBUG_MSG(LOG_WARNING, "Method add_flow_destination called");

	/* Parse our argument array. */
	xmlrpc_decompose_value(env, param_array,
		"("
		"{s:s,*}"
		"{s:d,s:d,s:d,s:d,s:d,*}"
		"{s:i,s:i,*}"
		"{s:i,*}"
		"{s:b,s:b,s:b,s:b,s:b,*}"
		"{s:i,s:i,*}"
		"{s:i,s:d,s:d,*}" /* request */
		"{s:i,s:d,s:d,*}" /* response */
		"{s:i,s:d,s:d,*}" /* interpacket_gap */
		"{s:b,s:b,s:i,s:i,*}"
		"{s:s,*}"
		"{s:i,s:i,s:i,s:i,s:i,*}"
#ifdef HAVE_LIBPCAP
		"{s:s,*}"
#endif /* HAVE_LIBPCAP */
		"{s:i,s:A,*}"
		")",

		/* general settings */
		"bind_address", &bind_address,

		"write_delay", &settings.delay[WRITE],
		"write_duration", &settings.duration[WRITE],
		"read_delay", &settings.delay[READ],
		"read_duration", &settings.duration[READ],
		"reporting_interval", &settings.reporting_interval,

		"requested_send_buffer_size", &settings.requested_send_buffer_size,
		"requested_read_buffer_size", &settings.requested_read_buffer_size,

		"maximum_block_size", &settings.maximum_block_size,

		"traffic_dump", &settings.traffic_dump,
		"so_debug", &settings.so_debug,
		"route_record", &settings.route_record,
		"pushy", &settings.pushy,
		"shutdown", &settings.shutdown,

		"write_rate", &settings.write_rate,
		"random_seed",&settings.random_seed,

		"traffic_generation_request_distribution", &settings.request_trafgen_options.distribution,
		"traffic_generation_request_param_one", &settings.request_trafgen_options.param_one,
		"traffic_generation_request_param_two", &settings.request_trafgen_options.param_two,

		"traffic_generation_response_distribution", &settings.response_trafgen_options.distribution,
		"traffic_generation_response_param_one", &settings.response_trafgen_options.param_one,
		"traffic_generation_response_param_two", &settings.response_trafgen_options.param_two,

		"traffic_generation_gap_distribution", &settings.interpacket_gap_trafgen_options.distribution,
		"traffic_generation_gap_param_one", &settings.interpacket_gap_trafgen_options.param_one,
		"traffic_generation_gap_param_two", &settings.interpacket_gap_trafgen_options.param_two,

		"flow_control", &settings.flow_control,
		"byte_counting", &settings.byte_counting,
		"cork", &settings.cork,
		"nonagle", &settings.nonagle,

		"cc_alg", &cc_alg,

		"elcn", &settings.elcn,
		"lcd", &settings.lcd,
		"mtcp", &settings.mtcp,
		"dscp", &settings.dscp,
		"ipmtudiscover", &settings.ipmtudiscover,
#ifdef HAVE_LIBPCAP
		"dump_prefix", &dump_prefix,
#endif /* HAVE_LIBPCAP */
		"num_extra_socket_options", &settings.num_extra_socket_options,
		"extra_socket_options", &extra_options);

	if (env->fault_occurred)
		goto cleanup;

	/* Check for sanity */
	if (strlen(bind_address) >= sizeof(settings.bind_address) - 1 ||
		settings.delay[WRITE] < 0 || settings.duration[WRITE] < 0 ||
		settings.delay[READ] < 0 || settings.duration[READ] < 0 ||
		settings.requested_send_buffer_size < 0 || settings.requested_read_buffer_size < 0 ||
		settings.maximum_block_size < MIN_BLOCK_SIZE ||
		settings.write_rate < 0 ||
		strlen(cc_alg) > TCP_CA_NAME_MAX ||
		settings.num_extra_socket_options < 0 || settings.num_extra_socket_options > MAX_EXTRA_SOCKET_OPTIONS ||
		xmlrpc_array_size(env, extra_options) != settings.num_extra_socket_options) {
		XMLRPC_FAIL(env, XMLRPC_TYPE_ERROR, "Flow settings incorrect");
	}

	/* Parse extra socket options */
	for (i = 0; i < settings.num_extra_socket_options; i++) {

		const unsigned char* buffer = 0;
		size_t len;
		xmlrpc_value *option, *level = 0, *optname = 0, *value = 0;
		xmlrpc_array_read_item(env, extra_options, i, &option);

		if (!env->fault_occurred)
			xmlrpc_struct_read_value(env, option, "level", &level);
		if (!env->fault_occurred)
			xmlrpc_struct_read_value(env, option, "optname", &optname);
		if (!env->fault_occurred)
			xmlrpc_struct_read_value(env, option, "value", &value);
		if (!env->fault_occurred)
			xmlrpc_read_int(env, level, &settings.extra_socket_options[i].level);
		if (!env->fault_occurred)
			xmlrpc_read_int(env, optname, &settings.extra_socket_options[i].optname);
		if (!env->fault_occurred)
			xmlrpc_read_base64(env, value, &len, &buffer);
		if (level)
			xmlrpc_DECREF(level);
		if (optname)
			xmlrpc_DECREF(optname);
		if (value)
			xmlrpc_DECREF(value);
		if (!env->fault_occurred) {
			if (len > MAX_EXTRA_SOCKET_OPTION_VALUE_LENGTH) {
				free((void *)buffer);
				XMLRPC_FAIL(env, XMLRPC_TYPE_ERROR, "Too long extra socket option length");
			}
			settings.extra_socket_options[i].optlen = len;
			memcpy(settings.extra_socket_options[i].optval, buffer, len);
			free((void *)buffer);
		}
		if (env->fault_occurred)
			goto cleanup;
	}

	strcpy(settings.cc_alg, cc_alg);
	strcpy(settings.bind_address, bind_address);
	DEBUG_MSG(LOG_WARNING, "bind_address=%s", bind_address);
	request = malloc(sizeof(struct _request_add_flow_destination));
	request->settings = settings;
	rc = dispatch_request((struct _request*)request, REQUEST_ADD_DESTINATION);

	if (rc == -1) {
		XMLRPC_FAIL(env, XMLRPC_INTERNAL_ERROR, request->r.error); /* goto cleanup on failure */
	}

	/* Return our result. */
	ret = xmlrpc_build_value(env, "{s:i,s:i,s:i,s:i}",
		"flow_id", request->flow_id,
		"listen_data_port", request->listen_data_port,
		"real_listen_send_buffer_size", request->real_listen_send_buffer_size,
		"real_listen_read_buffer_size", request->real_listen_read_buffer_size);

cleanup:
	if (request)
		free_all(request->r.error, request);
	free_all(cc_alg, bind_address);

	if (extra_options)
		xmlrpc_DECREF(extra_options);

	if (env->fault_occurred)
		logging_log(LOG_WARNING, "Method add_flow_destination failed: %s", env->fault_string);
	else {
		DEBUG_MSG(LOG_WARNING, "Method add_flow_destination successful");
	}

	return ret;
}
Exemple #22
0
// very_complex_array = archiver.values(key, names[], start, end, ...)
xmlrpc_value *get_values(xmlrpc_env *env, xmlrpc_value *args, void *user)
{
#ifdef LOGFILE
    LOG_MSG("archiver.get_values\n");
#endif
    xmlrpc_value *names;
    xmlrpc_int32 key, start_sec, start_nano, end_sec, end_nano, count, how;
    xmlrpc_int32 actual_count;
    // Extract arguments
    xmlrpc_parse_value(env, args, "(iAiiiiii)",
                       &key, &names,
                       &start_sec, &start_nano, &end_sec, &end_nano,
                       &count, &how);    
    if (env->fault_occurred)
        return 0;
#ifdef LOGFILE
    LOG_MSG("how=%d, count=%d\n", (int) how, (int) count);
#endif
    if (count <= 1)
        count = 1;
    actual_count = count;
    if (count > 10000) // Upper limit to avoid outrageous requests.
        actual_count = 10000;
    // Build start/end
    epicsTime start, end;
    pieces2epicsTime(start_sec, start_nano, start);
    pieces2epicsTime(end_sec, end_nano, end);    
    // Pull names into vector for SpreadsheetReader and just because.
    xmlrpc_value *name_val;
    char *name;
    int i;
    xmlrpc_int32 name_count = xmlrpc_array_size(env, names);
    stdVector<stdString> name_vector;
    name_vector.reserve(name_count);
    for (i=0; i<name_count; ++i)
    {   // no new ref!
        name_val = xmlrpc_array_get_item(env, names, i);
        if (env->fault_occurred)
            return 0;
        xmlrpc_parse_value(env, name_val, "s", &name);
        if (env->fault_occurred)
            return 0;
        name_vector.push_back(stdString(name));
    }
    // Build results
    switch (how)
    {
        case HOW_RAW:
            return get_channel_data(env, key, name_vector, start, end,
                                    actual_count, ReaderFactory::Raw, 0.0);
        case HOW_SHEET:
            return get_sheet_data(env, key, name_vector, start, end,
                                  actual_count, ReaderFactory::Raw, 0.0);
        case HOW_AVERAGE:
            return get_sheet_data(env, key, name_vector, start, end,
                                  actual_count,
                                  ReaderFactory::Average, (end-start)/count);
        case HOW_PLOTBIN:
            // 'count' = # of bins, resulting in up to 4*count samples
            return get_channel_data(env, key, name_vector, start, end,
                                    actual_count*4,
                                    ReaderFactory::Plotbin, (end-start)/count);
        case HOW_LINEAR:
            return get_sheet_data(env, key, name_vector, start, end,
                                  actual_count,
                                  ReaderFactory::Linear, (end-start)/count);
    }
    xmlrpc_env_set_fault_formatted(env, ARCH_DAT_ARG_ERROR,
                                   "Invalid how=%d", how);
    return 0;
}
Exemple #23
0
// {string name, int32 start_sec, int32 start_nano,
//               int32 end_sec,   int32 end_nano}[]
// = archiver.names(int32 key, string pattern)
xmlrpc_value *get_names(xmlrpc_env *env, xmlrpc_value *args, void *user)
{
#ifdef LOGFILE
    LOG_MSG("archiver.names\n");
#endif
    // Get args, maybe setup pattern
    AutoPtr<RegularExpression> regex;
    xmlrpc_int32 key;
    char *pattern = 0;
    size_t pattern_len = 0; 
    xmlrpc_parse_value(env, args, "(is#)", &key, &pattern, &pattern_len);
    if (env->fault_occurred)
        return 0;
    // Create result
    AutoXmlRpcValue result(xmlrpc_build_value(env, "()"));
    if (env->fault_occurred)
        return 0;
    try
    {
        if (pattern_len > 0)
            regex.assign(new RegularExpression(pattern));
        // Open Index
        stdString directory;
        AutoPtr<Index> index(open_index(env, key));
        if (env->fault_occurred)
            return 0;
        // Put all names in binary tree
        Index::NameIterator ni;
        BinaryTree<ChannelInfo> channels;
        ChannelInfo info;
        bool ok;
        for (ok = index->getFirstChannel(ni);
             ok; ok = index->getNextChannel(ni))
        {
            if (regex && !regex->doesMatch(ni.getName()))
                continue; // skip what doesn't match regex
            info.name = ni.getName();
            AutoPtr<RTree> tree(index->getTree(info.name, directory));
            if (tree)
                tree->getInterval(info.start, info.end);
            else // Is this an error?
                info.start = info.end = nullTime;
            channels.add(info);
        }
        index->close();
        // Sorted dump of names
        ChannelInfo::UserArg user_arg;
        user_arg.env = env;
        user_arg.result = result;
        channels.traverse(ChannelInfo::add_name_to_result, (void *)&user_arg);
#ifdef LOGFILE
        LOG_MSG("get_names(%d, '%s') -> %d names\n",
                key,
                (pattern ? pattern : "<no pattern>"),
                xmlrpc_array_size(env, result));
#endif
    }
    catch (GenericException &e)
    {
        xmlrpc_env_set_fault_formatted(env, ARCH_DAT_SERV_FAULT,
                                       (char *) e.what());
        return 0;
    }
    return result.release();
}
Exemple #24
0
static xmlrpc_value *
service_refresh_blocking (xmlrpc_env   *env,
                          xmlrpc_value *param_array,
                          void         *user_data)
{
    int size;
    RCWorld *world;
    RCPending *pending = NULL;
    GSList *pending_list;
    char *err_msg = NULL;

    if (rcd_transaction_is_locked ()) {
        xmlrpc_env_set_fault (env, RCD_RPC_FAULT_LOCKED,
                              "Transaction lock in place");
        return NULL;
    }

    size = xmlrpc_array_size (env, param_array);
    XMLRPC_FAIL_IF_FAULT (env);

    if (size > 0) {
        char *service_identifier;

        xmlrpc_parse_value (env, param_array, "(s)", &service_identifier);
        XMLRPC_FAIL_IF_FAULT (env);

        world = RC_WORLD (service_lookup (service_identifier));

        if (!world) {
            xmlrpc_env_set_fault_formatted (env, RCD_RPC_FAULT_INVALID_SERVICE,
                                            "Unable to find service '%s'",
                                            service_identifier);
            goto cleanup;
        }
    } else {
        world = rc_get_world ();
    }

    /* FIXME: err_msg ? */
    pending = rc_world_refresh (world);

    if (err_msg) {
        xmlrpc_env_set_fault_formatted (
            env, RCD_RPC_FAULT_CANT_REFRESH,
            "Unable to download channel data: %s", err_msg);
        goto cleanup;
    }

    pending_list = g_slist_prepend (NULL, pending);
    rcd_rpc_block_on_pending_list (env, pending_list, FALSE,
                                   RCD_RPC_FAULT_CANT_REFRESH);
    g_slist_free (pending_list);

cleanup:
    if (pending)
        g_object_unref (pending);

    if (err_msg)
        g_free (err_msg);

    if (env->fault_occurred)
        return NULL;

    return xmlrpc_build_value (env, "i", 0);
}
static void
testParseNumberValue(void) {

char const xmldata[] =
    XML_PROLOGUE
    "<methodCall>\r\n"
    "<methodName>test</methodName>\r\n"
    "<params>\r\n"
    "<param><value><int>2147483647</int></value></param>\r\n" \
    "<param><value><int>-2147483648</int></value></param>\r\n" \
    "<param><value><i1>10</i1></value></param>\r\n"
    "<param><value><i2>10</i2></value></param>\r\n"
    "<param><value><i4>10</i4></value></param>\r\n"
    "<param><value><i8>10</i8></value></param>\r\n"
    "<param><value><ex:i8>10</ex:i8></value></param>\r\n"
    "<param><value><double>10</double></value></param>\r\n"
    "<param><value><double>10.1</double></value></param>\r\n"
    "<param><value><double>-10.1</double></value></param>\r\n"
    "<param><value><double>+10.1</double></value></param>\r\n"
    "<param><value><double>0</double></value></param>\r\n"
    "<param><value><double>.01</double></value></param>\r\n"
    "<param><value><double>5.</double></value></param>\r\n"
    "<param><value><double>5.3E6</double></value></param>\r\n"
    "<param><value><double> 1</double></value></param>\r\n"
    "</params>\r\n"
    "</methodCall>\r\n";
    
    xmlrpc_env env;
    xmlrpc_value * paramArrayP;
    const char * methodName;
    int arraySize;
    xmlrpc_int int_max, int_min;
    xmlrpc_int32 i_i1, i_i2, i_i4;
    xmlrpc_int64 i_i8, i_ex_i8;
    double d1, d2, d3, d4, d5, d6, d7, d8, d9;

    xmlrpc_env_init(&env);

    xmlrpc_parse_call(&env, xmldata, strlen(xmldata),
                      &methodName, &paramArrayP);
    TEST_NO_FAULT(&env);

    arraySize = xmlrpc_array_size(&env, paramArrayP);
    TEST_NO_FAULT(&env);

    TEST(arraySize == 16);

    xmlrpc_decompose_value(
        &env, paramArrayP, "(iiiiiIIddddddddd)", 
        &int_max, &int_min, &i_i1, &i_i2, &i_i4, &i_i8, &i_ex_i8,
        &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9);

    TEST_NO_FAULT(&env);

    TEST(int_max == INT_MAX);
    TEST(int_min == INT_MIN);
    TEST(i_i1 == 10);
    TEST(i_i2 == 10);
    TEST(i_i4 == 10);
    TEST(i_i8 == 10);
    TEST(i_ex_i8 == 10);
    TESTFLOATEQUAL(d1, 10.0);
    TESTFLOATEQUAL(d2, 10.1);
    TESTFLOATEQUAL(d3, -10.1);
    TESTFLOATEQUAL(d4, +10.1);
    TESTFLOATEQUAL(d5, 0.0);
    TESTFLOATEQUAL(d6, 0.01);
    TESTFLOATEQUAL(d7, 5.0);
    TESTFLOATEQUAL(d8, 5.3E6);
    TESTFLOATEQUAL(d9, 1.0);

    xmlrpc_DECREF(paramArrayP);
    strfree(methodName);

    xmlrpc_env_clean(&env);
}
static void
testParseMiscSimpleValue(void) {

char const xmldata[] =
    XML_PROLOGUE
    "<methodCall>\r\n"
    "<methodName>test</methodName>\r\n"
    "<params>\r\n"
    "<param><value><string>hello</string></value></param>\r\n"
    "<param><value><boolean>0</boolean></value></param>\r\n"
    "<param><value><boolean>1</boolean></value></param>\r\n"
    "<param><value><dateTime.iso8601>19980717T14:08:55</dateTime.iso8601>"
       "</value></param>\r\n"
    "<param><value>"
       "<dateTime.iso8601>19980717T14:08:55.123456</dateTime.iso8601>"
       "</value></param>\r\n"
    "<param><value><base64>YmFzZTY0IGRhdGE=</base64></value></param>\r\n"
    "<param><value><nil/></value></param>\r\n"
    "<param><value><ex:nil/></value></param>\r\n"
    "</params>\r\n"
    "</methodCall>\r\n";
    
    xmlrpc_env env;
    xmlrpc_value * paramArrayP;
    const char * methodName;
    int arraySize;
    const char * str_hello;
    xmlrpc_bool b_false, b_true;
    const char * datetime_sec;
    const char * datetime_usec;
    unsigned char * b64_data;
    size_t b64_len;

    xmlrpc_env_init(&env);

    xmlrpc_parse_call(&env, xmldata, strlen(xmldata),
                      &methodName, &paramArrayP);
    TEST_NO_FAULT(&env);

    arraySize = xmlrpc_array_size(&env, paramArrayP);
    TEST_NO_FAULT(&env);

    TEST(arraySize == 8);

    xmlrpc_decompose_value(
        &env, paramArrayP, "(sbb886nn)", 
        &str_hello, &b_false, &b_true, &datetime_sec, &datetime_usec,
        &b64_data, &b64_len);

    TEST_NO_FAULT(&env);

    TEST(streq(str_hello, "hello"));
    TEST(!b_false);
    TEST(b_true);
    TEST(streq(datetime_sec, "19980717T14:08:55")); 
    TEST(streq(datetime_usec, "19980717T14:08:55.123456")); 
    TEST(b64_len == 11);
    TEST(memcmp(b64_data, "base64 data", b64_len) == 0);

    free(b64_data);
    strfree(str_hello);
    strfree(datetime_sec);
    strfree(datetime_usec);
    xmlrpc_DECREF(paramArrayP);
    strfree(methodName);

    xmlrpc_env_clean(&env);
}
bool ArchiveDataClient::decode_data(const char *name,
                                    xmlrpc_int32 type, xmlrpc_int32 count,
                                    xmlrpc_value *data_array,
                                    CtrlInfo &ctrlinfo,
                                    size_t n,
                                    value_callback callback,
                                    void *callback_arg)
{
    size_t       i, num, v, v_num;
    xmlrpc_int32 stat, sevr, secs, nano;
    xmlrpc_value *data, *value_array, *value;
    epicsTime    stamp;
    DbrType      dbr_type;
    RawValue::Data *raw_value;    
    switch (type)
    {
        case XML_STRING: dbr_type = DBR_TIME_STRING;  break;
        case XML_ENUM:   dbr_type = DBR_TIME_ENUM;    break;
        case XML_INT:    dbr_type = DBR_TIME_LONG;    break;
        case XML_DOUBLE: dbr_type = DBR_TIME_DOUBLE;  break;
        default:
            LOG_MSG("Cannot decode data type %d\n", type);
            return false;
    }
    raw_value = RawValue::allocate(dbr_type, count, 1);
    num = xmlrpc_array_size(&env, data_array);
    if (log_fault())
        return false;
    for (i=0; i<num; ++i)
    {
        data = xmlrpc_array_get_item(&env, data_array, i);
        xmlrpc_parse_value(&env, data, "{s:i,s:i,s:i,s:i,s:A,*}",
                           "stat", &stat, "sevr", &sevr,
                           "secs", &secs, "nano", &nano,
                           "value", &value_array);
        if (log_fault())
            return false;
        pieces2epicsTime(secs, nano, stamp);
        RawValue::setStatus(raw_value, stat, sevr);
        RawValue::setTime(raw_value, stamp);
        v_num = xmlrpc_array_size(&env, value_array);
        if (log_fault())
            return false;
        if (v_num != (size_t)count)
        {
            LOG_MSG("value size discrepancy, %zu != %zu\n", v_num, (size_t)count);
            return false;
        }
        for (v=0; v<v_num; ++v)
        {
            value = xmlrpc_array_get_item(&env, value_array, v);
            if (log_fault())
                return false;
            switch (dbr_type)
            {
                case DBR_TIME_STRING:
                {
                    if (v > 0)
                        break;
                    const char *txt;
                    size_t len;
                    xmlrpc_parse_value(&env, value, "s#", &txt, &len);
                    if (len >= MAX_STRING_SIZE)
                        len = MAX_STRING_SIZE-1;
                    memcpy(((dbr_time_string *)raw_value)->value, txt, len);
                    ((dbr_time_string *)raw_value)->value[len] = '\0';
                }
                break;
                case DBR_TIME_ENUM:
                {
                    dbr_enum_t *val = &((dbr_time_enum *)raw_value)->value;
                    xmlrpc_int32 ival;
                    xmlrpc_parse_value(&env, value, "i", &ival);
                    val[v] = ival;
                    if (log_fault())
                        return false;
                }
                break;
                case DBR_TIME_LONG:
                {
                    dbr_long_t *val = &((dbr_time_long *)raw_value)->value;
                    xmlrpc_int32 ival;
                    xmlrpc_parse_value(&env, value, "i", &ival);
                    val[v] = ival;
                    if (log_fault())
                        return false;
                }
                break;
                case DBR_TIME_DOUBLE:
                {
                    double *val = &((dbr_time_double *)raw_value)->value;
                    xmlrpc_parse_value(&env, value, "d", &val[v]);
                    if (log_fault())
                        return false;
                }
                break;
            }
        }
        if (!callback(callback_arg, name, n, i,
                      ctrlinfo, dbr_type, count, raw_value))
            break;
    }
    RawValue::free(raw_value);
    return true;
}
bool ArchiveDataClient::getInfo(int &version,
                                stdString &description,
                                stdVector<stdString> &how_strings,
                                stdVector<stdString> &stat_strings,
                                stdVector<SeverityInfo> &sevr_infos)
{
    xmlrpc_value *result, *hows, *stats, *sevrs, *element;
    xmlrpc_int32 num;
    xmlrpc_bool has_value, txt_stat;
    const char   *str;
    size_t       count, len, i;
    result = xmlrpc_client_call(&env, (char *)URL, "archiver.info", "()");
    if (log_fault())
        return false;
    xmlrpc_parse_value(&env, result, "{s:i,s:s#,s:A,s:A,s:A,*}",
                       "ver",  &num,
                       "desc", &str, &len,
                       "how",  &hows,
                       "stat", &stats,
                       "sevr", &sevrs);
    if (log_fault())
        return false;
    version = num;
    description.assign(str, len);
    // 'how' array
    count = xmlrpc_array_size(&env, hows);
    how_strings.reserve(count);
    for (i=0; i<count; ++i)
    {
        element = xmlrpc_array_get_item(&env, hows, i);
        if (log_fault())
            return false;
        xmlrpc_parse_value(&env, element, "s", &str);
        if (log_fault())
            return false;
        how_strings.push_back(stdString(str));
    }
    // 'stat' array
    count = xmlrpc_array_size(&env, stats);
    stat_strings.reserve(count);
    for (i=0; i<count; ++i)
    {
        element = xmlrpc_array_get_item(&env, stats, i);
        if (log_fault())
            return false;
        xmlrpc_parse_value(&env, element, "s", &str);
        if (log_fault())
            return false;
        stat_strings.push_back(stdString(str));
    }
    // 'sevr' array
    count = xmlrpc_array_size(&env, sevrs);
    stat_strings.reserve(count);
    SeverityInfo info;
    for (i=0; i<count; ++i)
    {
        element = xmlrpc_array_get_item(&env, sevrs, i);
        if (log_fault())
            return false;
        xmlrpc_parse_value(&env, element, "{s:i,s:s#,s:b,s:b,*}",
                           "num",  &num,
                           "sevr", &str, &len,
                           "has_value",  &has_value,
                           "txt_stat", &txt_stat);
        if (log_fault())
            return false;
        info.num = num;
        info.text.assign(str, len);
        info.has_value = has_value;
        info.txt_stat = txt_stat;
        sevr_infos.push_back(info);
    }
    xmlrpc_DECREF(result);
    return true;
}
// Dump 'meta' part of returned value
bool ArchiveDataClient::decode_meta(xmlrpc_value *meta, CtrlInfo &ctrlinfo)
{
    xmlrpc_int32 type;
    xmlrpc_parse_value(&env, meta, "{s:i,*}", "type", &type);
    if (log_fault())
        return false;
    if (type == 0)
    {
        xmlrpc_value *element, *states;
        xmlrpc_parse_value(&env, meta, "{s:A,*}", "states", &states);
        if (log_fault())
            return false;
        size_t i, total, len, count = xmlrpc_array_size(&env, states);
        const char *str;
        total = 0;
        for (i=0; i<count; ++i)
        {
            element = xmlrpc_array_get_item(&env, states, i);
            if (log_fault())
                return false;
            xmlrpc_parse_value(&env, element, "s#", &str, &len);
            if (log_fault())
                return false;
            total += len+1;
        }
        ctrlinfo.allocEnumerated(count, total);
        for (i=0; i<count; ++i)
        {
            element = xmlrpc_array_get_item(&env, states, i);
            if (log_fault())
                return false;
            xmlrpc_parse_value(&env, element, "s", &str);
            if (log_fault())
                return false;
            ctrlinfo.setEnumeratedString(i, str);
        }
    }
    else if (type == 1)
    {
        double disp_high, disp_low, alarm_high, alarm_low, warn_high, warn_low;
        xmlrpc_int32 prec;
        char *units;   
        xmlrpc_parse_value(&env, meta, "{s:d,s:d,s:d,s:d,s:d,s:d,s:i,s:s,*}",
                           "disp_high", &disp_high,
                           "disp_low", &disp_low,
                           "alarm_high", &alarm_high,
                           "alarm_low", &alarm_low,
                           "warn_high", &warn_high,
                           "warn_low", &warn_low,
                           "prec", &prec,
                           "units", &units);
        if (log_fault())
            return false;
        ctrlinfo.setNumeric(prec, units, disp_low, disp_high,
                            alarm_low, warn_low, warn_high, alarm_high);
    }
    else
    {
        LOG_MSG("unknown meta type %d\n", type);
        return false;
    }
    return true;
}
Exemple #30
0
static void
test_value_array2(void) {

    xmlrpc_value * arrayP;
    xmlrpc_env env;
    xmlrpc_int32 i, i1, i2, i3, i4, i5;
    xmlrpc_value * itemP;
    xmlrpc_value * subarrayP;
    size_t len;

    /* A more complex array. */

    xmlrpc_env_init(&env);

    arrayP = xmlrpc_build_value(&env, "(i(ii)i)",
                                (xmlrpc_int32) 10, (xmlrpc_int32) 20,
                                (xmlrpc_int32) 30, (xmlrpc_int32) 40);
    TEST_NO_FAULT(&env);
    TEST(XMLRPC_TYPE_ARRAY == xmlrpc_value_type(arrayP));

    len = xmlrpc_array_size(&env, arrayP);
    TEST_NO_FAULT(&env);
    TEST(len == 3);

    xmlrpc_array_read_item(&env, arrayP, 1, &subarrayP);
    TEST_NO_FAULT(&env);

    len = xmlrpc_array_size(&env, subarrayP);
    TEST_NO_FAULT(&env);
    TEST(len == 2);

    xmlrpc_array_read_item(&env, subarrayP, 0, &itemP);
    TEST_NO_FAULT(&env);
    xmlrpc_decompose_value(&env, itemP, "i", &i);
    xmlrpc_DECREF(itemP);
    TEST_NO_FAULT(&env);
    TEST(i == 20);

    xmlrpc_DECREF(subarrayP);

    itemP = xmlrpc_array_get_item(&env, arrayP, 0);
    TEST_NO_FAULT(&env);
    xmlrpc_decompose_value(&env, itemP, "i", &i);
    TEST_NO_FAULT(&env);
    TEST(i == 10);

    xmlrpc_decompose_value(&env, arrayP, "(i(ii)i)", &i1, &i2, &i3, &i4);
    TEST_NO_FAULT(&env);
    TEST(i1 == 10 && i2 == 20 && i3 == 30 && i4 == 40);

    xmlrpc_decompose_value(&env, arrayP, "(i(i*)i)", &i1, &i2, &i3);
    TEST_NO_FAULT(&env);
    TEST(i1 == 10 && i2 == 20 && i3 == 40);

    xmlrpc_decompose_value(&env, arrayP, "(i(ii*)i)", &i1, &i2, &i3, &i4);
    TEST_NO_FAULT(&env);

    xmlrpc_decompose_value(&env, arrayP, "(i(iii)i)", &i1, &i2, &i3, &i4, &i5);
    TEST_FAULT(&env, XMLRPC_INDEX_ERROR);

    xmlrpc_decompose_value(&env, arrayP, "(i(i)i)", &i1, &i2, &i3, &i4, &i5);
    TEST_FAULT(&env, XMLRPC_INDEX_ERROR);

    xmlrpc_decompose_value(&env, arrayP, "(i(ii)i*i)",
                           &i1, &i2, &i3, &i4, &i5);
    TEST_FAULT(&env, XMLRPC_INTERNAL_ERROR);

    xmlrpc_decompose_value(&env, arrayP, "(i(iiQ)i*i)",
                           &i1, &i2, &i3, &i4, &i5);
    TEST_FAULT(&env, XMLRPC_INTERNAL_ERROR);

    xmlrpc_decompose_value(&env, arrayP, "(",
                           &i1, &i2, &i3, &i4, &i5);
    TEST_FAULT(&env, XMLRPC_INTERNAL_ERROR);

    xmlrpc_decompose_value(&env, arrayP, "(i",
                           &i1, &i2, &i3, &i4, &i5);
    TEST_FAULT(&env, XMLRPC_INTERNAL_ERROR);

    xmlrpc_decompose_value(&env, arrayP, "(i*",
                           &i1, &i2, &i3, &i4, &i5);
    TEST_FAULT(&env, XMLRPC_INTERNAL_ERROR);


    /* Test bounds check on xmlrpc_array_get_item. */
    xmlrpc_array_read_item(&env, arrayP, 3, &itemP);
    TEST_FAULT(&env, XMLRPC_INDEX_ERROR);

    xmlrpc_array_get_item(&env, arrayP, 3);
    TEST_FAULT(&env, XMLRPC_INDEX_ERROR);

    xmlrpc_array_get_item(&env, arrayP, -1);
    TEST_FAULT(&env, XMLRPC_INDEX_ERROR);

    xmlrpc_DECREF(arrayP);

    xmlrpc_env_clean(&env);
}