// FileClient.cpp : A simple xmlrpc client. Usage: FileClient serverHost serverPort xmlfile // Reads an xmlrpc request from the specified xmlfile and calls the method on the server. // // Link against xmlrpc lib and whatever socket libs your system needs (ws2_32.lib on windows) #include "XmlRpc.h" #include <iostream> #include <fstream> #include <stdlib.h> using namespace XmlRpc; std::string parseRequest(std::string const& xml, XmlRpcValue& params); int main(int argc, char* argv[]) { if (argc != 4) { std::cerr << "Usage: FileClient serverHost serverPort requestXmlFile\n"; return -1; } int port = atoi(argv[2]); XmlRpc::setVerbosity(5); XmlRpcClient c(argv[1], port); // std::ifstream infile(argv[3]); if (infile.fail()) { std::cerr << "Could not open file '" << argv[3] << "'.\n"; return -1; } // Suck in the file. This is a one-liner in good compilers (which vc++ 6 is not)... infile.seekg(0L, std::ios::end); long nb = infile.tellg(); infile.clear(); infile.seekg(0L); char* b = new char[nb+1]; infile.read(b, nb); b[nb] = 0; std::cout << "Read file.\n"; // Find the methodName and parse the params std::string s(b); XmlRpcValue params; std::string name = parseRequest(s, params); if (name.empty()) { std::cerr << "Could not parse file\n"; return -1; } for (;;) { XmlRpcValue result; std::cout << "Calling " << name << std::endl; if (c.execute(name.c_str(), params, result)) std::cout << result << "\n\n"; else std::cout << "Error calling '" << name << "'\n\n"; std::cout << "Again? [y]: "; std::string ans; std::cin >> ans; if (ans != "" && ans != "y") break; } return 0; } // std::string parseRequest(std::string const& xml, XmlRpcValue& params) { const char METHODNAME_TAG[] = "<methodName>"; const char PARAMS_TAG[] = "<params>"; const char PARAMS_ETAG[] = "</params>"; const char PARAM_TAG[] = "<param>"; const char PARAM_ETAG[] = "</param>"; int offset = 0; // Number of chars parsed from the request std::string methodName = XmlRpcUtil::parseTag(METHODNAME_TAG, xml, &offset); XmlRpcUtil::log(3, "XmlRpcServerConnection::parseRequest: parsed methodName %s.", methodName.c_str()); if (! methodName.empty() && XmlRpcUtil::findTag(PARAMS_TAG, xml, &offset)) { int nArgs = 0; while (XmlRpcUtil::nextTagIs(PARAM_TAG, xml, &offset)) { std::cout << "Parsing arg " << nArgs+1 << std::endl; XmlRpcValue arg(xml, &offset); if ( ! arg.valid()) { std::cerr << "Invalid argument\n"; return std::string(); } std::cout << "Adding arg " << nArgs+1 << " to params array." << std::endl; params[nArgs++] = arg; (void) XmlRpcUtil::nextTagIs(PARAM_ETAG, xml, &offset); } XmlRpcUtil::log(3, "XmlRpcServerConnection::parseRequest: parsed %d params.", nArgs); (void) XmlRpcUtil::nextTagIs(PARAMS_ETAG, xml, &offset); } return methodName; }