Home | History | Annotate | Download | only in test
      1 // FileClient.cpp : A simple xmlrpc client. Usage: FileClient serverHost serverPort xmlfile
      2 // Reads an xmlrpc request from the specified xmlfile and calls the method on the server.
      3 //
      4 // Link against xmlrpc lib and whatever socket libs your system needs (ws2_32.lib on windows)
      5 
      6 #include "XmlRpc.h"
      7 #include <iostream>
      8 #include <fstream>
      9 #include <stdlib.h>
     10 
     11 using namespace XmlRpc;
     12 
     13 std::string parseRequest(std::string const& xml, XmlRpcValue& params);
     14 
     15 
     16 int main(int argc, char* argv[])
     17 {
     18   if (argc != 4) {
     19     std::cerr << "Usage: FileClient serverHost serverPort requestXmlFile\n";
     20     return -1;
     21   }
     22   int port = atoi(argv[2]);
     23 
     24   XmlRpc::setVerbosity(5);
     25   XmlRpcClient c(argv[1], port);
     26 
     27   //
     28   std::ifstream infile(argv[3]);
     29   if (infile.fail()) {
     30     std::cerr << "Could not open file '" << argv[3] << "'.\n";
     31     return -1;
     32   }
     33 
     34   // Suck in the file. This is a one-liner in good compilers (which vc++ 6 is not)...
     35   infile.seekg(0L, std::ios::end);
     36   long nb = infile.tellg();
     37   infile.clear();
     38   infile.seekg(0L);
     39   char* b = new char[nb+1];
     40   infile.read(b, nb);
     41   b[nb] = 0;
     42 
     43   std::cout << "Read file.\n";
     44 
     45   // Find the methodName and parse the params
     46   std::string s(b);
     47   XmlRpcValue params;
     48   std::string name = parseRequest(s, params);
     49 
     50   if (name.empty()) {
     51     std::cerr << "Could not parse file\n";
     52     return -1;
     53   }
     54 
     55   for (;;) {
     56     XmlRpcValue result;
     57     std::cout << "Calling " << name << std::endl;
     58     if (c.execute(name.c_str(), params, result))
     59       std::cout << result << "\n\n";
     60     else
     61       std::cout << "Error calling '" << name << "'\n\n";
     62     std::cout << "Again? [y]: ";
     63     std::string ans;
     64     std::cin >> ans;
     65     if (ans != "" && ans != "y") break;
     66   }
     67 
     68   return 0;
     69 }
     70 
     71 
     72 //
     73 std::string
     74 parseRequest(std::string const& xml, XmlRpcValue& params)
     75 {
     76   const char METHODNAME_TAG[] = "<methodName>";
     77   const char PARAMS_TAG[] = "<params>";
     78   const char PARAMS_ETAG[] = "</params>";
     79   const char PARAM_TAG[] = "<param>";
     80   const char PARAM_ETAG[] = "</param>";
     81 
     82   int offset = 0;   // Number of chars parsed from the request
     83 
     84   std::string methodName = XmlRpcUtil::parseTag(METHODNAME_TAG, xml, &offset);
     85   XmlRpcUtil::log(3, "XmlRpcServerConnection::parseRequest: parsed methodName %s.", methodName.c_str());
     86 
     87   if (! methodName.empty() && XmlRpcUtil::findTag(PARAMS_TAG, xml, &offset))
     88   {
     89     int nArgs = 0;
     90     while (XmlRpcUtil::nextTagIs(PARAM_TAG, xml, &offset)) {
     91       std::cout << "Parsing arg " << nArgs+1 << std::endl;
     92       XmlRpcValue arg(xml, &offset);
     93       if ( ! arg.valid()) {
     94         std::cerr << "Invalid argument\n";
     95         return std::string();
     96       }
     97       std::cout << "Adding arg " << nArgs+1 << " to params array." << std::endl;
     98       params[nArgs++] = arg;
     99       (void) XmlRpcUtil::nextTagIs(PARAM_ETAG, xml, &offset);
    100     }
    101 
    102     XmlRpcUtil::log(3, "XmlRpcServerConnection::parseRequest: parsed %d params.", nArgs);
    103 
    104     (void) XmlRpcUtil::nextTagIs(PARAMS_ETAG, xml, &offset);
    105   }
    106 
    107   return methodName;
    108 }
    109