14e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius// HelloClient.cpp : A simple xmlrpc client. Usage: HelloClient serverHost serverPort 24e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius// Link against xmlrpc lib and whatever socket libs your system needs (ws2_32.lib 34e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius// on windows) 44e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius#include "XmlRpc.h" 54e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius#include <iostream> 64e2ea8184cc1f9609f1f1251394316629a108a78Roshan Piususing namespace XmlRpc; 74e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius 84e2ea8184cc1f9609f1f1251394316629a108a78Roshan Piusint main(int argc, char* argv[]) 94e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius{ 104e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius if (argc != 3) { 114e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cerr << "Usage: HelloClient serverHost serverPort\n"; 124e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius return -1; 134e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius } 144e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius int port = atoi(argv[2]); 154e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius //XmlRpc::setVerbosity(5); 164e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius 174e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius // Use introspection API to look up the supported methods 184e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius XmlRpcClient c(argv[1], port); 194e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius XmlRpcValue noArgs, result; 204e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius if (c.execute("system.listMethods", noArgs, result)) 214e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << "\nMethods:\n " << result << "\n\n"; 224e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius else 234e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << "Error calling 'listMethods'\n\n"; 244e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius 254e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius // Use introspection API to get the help string for the Hello method 264e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius XmlRpcValue oneArg; 274e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius oneArg[0] = "Hello"; 284e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius if (c.execute("system.methodHelp", oneArg, result)) 294e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << "Help for 'Hello' method: " << result << "\n\n"; 304e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius else 314e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << "Error calling 'methodHelp'\n\n"; 324e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius 334e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius // Call the Hello method 344e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius if (c.execute("Hello", noArgs, result)) 354e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << result << "\n\n"; 364e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius else 374e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << "Error calling 'Hello'\n\n"; 384e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius 394e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius // Call the HelloName method 404e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius oneArg[0] = "Chris"; 414e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius if (c.execute("HelloName", oneArg, result)) 424e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << result << "\n\n"; 434e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius else 444e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << "Error calling 'HelloName'\n\n"; 454e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius 464e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius // Add up an array of numbers 474e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius XmlRpcValue numbers; 484e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius numbers[0] = 33.33; 494e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius numbers[1] = 112.57; 504e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius numbers[2] = 76.1; 514e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << "numbers.size() is " << numbers.size() << std::endl; 524e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius if (c.execute("Sum", numbers, result)) 534e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << "Sum = " << double(result) << "\n\n"; 544e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius else 554e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << "Error calling 'Sum'\n\n"; 564e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius 574e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius // Test the "no such method" fault 584e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius if (c.execute("NoSuchMethod", numbers, result)) 594e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << "NoSuchMethod call: fault: " << c.isFault() << ", result = " << result << std::endl; 604e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius else 614e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << "Error calling 'Sum'\n"; 624e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius 634e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius // Test the multicall method. It accepts one arg, an array of structs 644e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius XmlRpcValue multicall; 654e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius multicall[0][0]["methodName"] = "Sum"; 664e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius multicall[0][0]["params"][0] = 5.0; 674e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius multicall[0][0]["params"][1] = 9.0; 684e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius 694e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius multicall[0][1]["methodName"] = "NoSuchMethod"; 704e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius multicall[0][1]["params"][0] = ""; 714e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius 724e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius multicall[0][2]["methodName"] = "Sum"; 734e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius // Missing params 744e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius 754e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius multicall[0][3]["methodName"] = "Sum"; 764e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius multicall[0][3]["params"][0] = 10.5; 774e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius multicall[0][3]["params"][1] = 12.5; 784e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius 794e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius if (c.execute("system.multicall", multicall, result)) 804e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << "\nmulticall result = " << result << std::endl; 814e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius else 824e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius std::cout << "\nError calling 'system.multicall'\n"; 834e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius 844e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius return 0; 854e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius} 86