aboutsummaryrefslogtreecommitdiff
path: root/test/FileClient.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/FileClient.cpp')
-rw-r--r--test/FileClient.cpp108
1 files changed, 108 insertions, 0 deletions
diff --git a/test/FileClient.cpp b/test/FileClient.cpp
new file mode 100644
index 0000000..81d9f3e
--- /dev/null
+++ b/test/FileClient.cpp
@@ -0,0 +1,108 @@
+// 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;
+}