|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <stdlib.h> |
|
|
#include <stdio.h> |
|
|
|
|
|
#include <xmlrpc-c/base.h> |
|
|
#include <xmlrpc-c/client.h> |
|
|
|
|
|
#include "config.h" |
|
|
|
|
|
#define NAME "Xmlrpc-c Test Client" |
|
|
#define VERSION "1.0" |
|
|
|
|
|
static void |
|
|
dieIfFaultOccurred (xmlrpc_env * const envP) { |
|
|
if (envP->fault_occurred) { |
|
|
fprintf(stderr, "ERROR: %s (%d)\n", |
|
|
envP->fault_string, envP->fault_code); |
|
|
exit(1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
struct ratio { |
|
|
double dividend; |
|
|
double divisor; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
main(int const argc, |
|
|
const char ** const argv) { |
|
|
|
|
|
const char * const serverUrl = "http://localhost:8080/RPC2"; |
|
|
const char * const methodName = "example.divide"; |
|
|
unsigned int const argVersion = 1; |
|
|
struct ratio const data[] = {{1,2},{12,3},{10,3},{89,3000}}; |
|
|
xmlrpc_env env; |
|
|
xmlrpc_value * resultP; |
|
|
unsigned int i; |
|
|
xmlrpc_value * ratioArrayP; |
|
|
unsigned int quotientCt; |
|
|
|
|
|
if (argc-1 > 0) { |
|
|
fprintf(stderr, "This program has no arguments\n"); |
|
|
exit(1); |
|
|
} |
|
|
|
|
|
xmlrpc_env_init(&env); |
|
|
|
|
|
xmlrpc_client_init2(&env, XMLRPC_CLIENT_NO_FLAGS, NAME, VERSION, NULL, 0); |
|
|
dieIfFaultOccurred(&env); |
|
|
|
|
|
|
|
|
|
|
|
ratioArrayP = xmlrpc_array_new(&env); |
|
|
dieIfFaultOccurred(&env); |
|
|
|
|
|
for (i = 0; i < 4; ++i) { |
|
|
xmlrpc_value * dividendP; |
|
|
xmlrpc_value * divisorP; |
|
|
xmlrpc_value * ratioP; |
|
|
|
|
|
dividendP = xmlrpc_double_new(&env, data[i].dividend); |
|
|
dieIfFaultOccurred(&env); |
|
|
divisorP = xmlrpc_double_new(&env, data[i].divisor); |
|
|
dieIfFaultOccurred(&env); |
|
|
|
|
|
ratioP = xmlrpc_struct_new(&env); |
|
|
dieIfFaultOccurred(&env); |
|
|
|
|
|
xmlrpc_struct_set_value(&env, ratioP, "DIVIDEND", dividendP); |
|
|
dieIfFaultOccurred(&env); |
|
|
xmlrpc_struct_set_value(&env, ratioP, "DIVISOR", divisorP); |
|
|
dieIfFaultOccurred(&env); |
|
|
|
|
|
xmlrpc_array_append_item(&env, ratioArrayP, ratioP); |
|
|
dieIfFaultOccurred(&env); |
|
|
|
|
|
xmlrpc_DECREF(ratioP); |
|
|
xmlrpc_DECREF(divisorP); |
|
|
xmlrpc_DECREF(dividendP); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
resultP = xmlrpc_client_call(&env, serverUrl, methodName, "(iA)", |
|
|
(xmlrpc_int32) argVersion, ratioArrayP); |
|
|
dieIfFaultOccurred(&env); |
|
|
|
|
|
|
|
|
|
|
|
quotientCt = xmlrpc_array_size(&env, resultP); |
|
|
dieIfFaultOccurred(&env); |
|
|
|
|
|
for (i = 0; i < quotientCt; ++i) { |
|
|
xmlrpc_value * quotientP; |
|
|
xmlrpc_double quotient; |
|
|
|
|
|
xmlrpc_array_read_item(&env, resultP, i, "ientP); |
|
|
dieIfFaultOccurred(&env); |
|
|
|
|
|
xmlrpc_read_double(&env, quotientP, "ient); |
|
|
dieIfFaultOccurred(&env); |
|
|
|
|
|
printf("Server says quotient %u is %f\n", i, quotient); |
|
|
|
|
|
xmlrpc_DECREF(quotientP); |
|
|
} |
|
|
|
|
|
xmlrpc_DECREF(resultP); |
|
|
|
|
|
xmlrpc_env_clean(&env); |
|
|
|
|
|
xmlrpc_client_cleanup(); |
|
|
|
|
|
return 0; |
|
|
} |
|
|
|
|
|
|