[Brillo] Add XmlRpc++ library

Adding a third-party native XML RPC library for Shill testing on Brillo.

Bug: 24335496
TEST: source build/envsetup.sh && lunch aosp_shamu-userdebug && 
make -j 64

Change-Id: I7a4d86fc3ab3b85f981e1814c1ef44eab85471b5
diff --git a/test/HelloClient.cpp b/test/HelloClient.cpp
new file mode 100644
index 0000000..f11c094
--- /dev/null
+++ b/test/HelloClient.cpp
@@ -0,0 +1,85 @@
+// HelloClient.cpp : A simple xmlrpc client. Usage: HelloClient serverHost serverPort
+// Link against xmlrpc lib and whatever socket libs your system needs (ws2_32.lib 
+// on windows)
+#include "XmlRpc.h"
+#include <iostream>
+using namespace XmlRpc;
+
+int main(int argc, char* argv[])
+{
+  if (argc != 3) {
+    std::cerr << "Usage: HelloClient serverHost serverPort\n";
+    return -1;
+  }
+  int port = atoi(argv[2]);
+  //XmlRpc::setVerbosity(5);
+
+  // Use introspection API to look up the supported methods
+  XmlRpcClient c(argv[1], port);
+  XmlRpcValue noArgs, result;
+  if (c.execute("system.listMethods", noArgs, result))
+    std::cout << "\nMethods:\n " << result << "\n\n";
+  else
+    std::cout << "Error calling 'listMethods'\n\n";
+
+  // Use introspection API to get the help string for the Hello method
+  XmlRpcValue oneArg;
+  oneArg[0] = "Hello";
+  if (c.execute("system.methodHelp", oneArg, result))
+    std::cout << "Help for 'Hello' method: " << result << "\n\n";
+  else
+    std::cout << "Error calling 'methodHelp'\n\n";
+
+  // Call the Hello method
+  if (c.execute("Hello", noArgs, result))
+    std::cout << result << "\n\n";
+  else
+    std::cout << "Error calling 'Hello'\n\n";
+
+  // Call the HelloName method
+  oneArg[0] = "Chris";
+  if (c.execute("HelloName", oneArg, result))
+    std::cout << result << "\n\n";
+  else
+    std::cout << "Error calling 'HelloName'\n\n";
+
+  // Add up an array of numbers
+  XmlRpcValue numbers;
+  numbers[0] = 33.33;
+  numbers[1] = 112.57;
+  numbers[2] = 76.1;
+  std::cout << "numbers.size() is " << numbers.size() << std::endl;
+  if (c.execute("Sum", numbers, result))
+    std::cout << "Sum = " << double(result) << "\n\n";
+  else
+    std::cout << "Error calling 'Sum'\n\n";
+
+  // Test the "no such method" fault
+  if (c.execute("NoSuchMethod", numbers, result))
+    std::cout << "NoSuchMethod call: fault: " << c.isFault() << ", result = " << result << std::endl;
+  else
+    std::cout << "Error calling 'Sum'\n";
+
+  // Test the multicall method. It accepts one arg, an array of structs
+  XmlRpcValue multicall;
+  multicall[0][0]["methodName"] = "Sum";
+  multicall[0][0]["params"][0] = 5.0;
+  multicall[0][0]["params"][1] = 9.0;
+
+  multicall[0][1]["methodName"] = "NoSuchMethod";
+  multicall[0][1]["params"][0] = "";
+
+  multicall[0][2]["methodName"] = "Sum";
+  // Missing params
+
+  multicall[0][3]["methodName"] = "Sum";
+  multicall[0][3]["params"][0] = 10.5;
+  multicall[0][3]["params"][1] = 12.5;
+
+  if (c.execute("system.multicall", multicall, result))
+    std::cout << "\nmulticall  result = " << result << std::endl;
+  else
+    std::cout << "\nError calling 'system.multicall'\n";
+
+  return 0;
+}