1 /*=============================================================================
2                         asynch_client.cpp
3 ===============================================================================
4   This is an example of an XML-RPC client that uses XML-RPC for C/C++
5   (Xmlrpc-c).
6 
7   In particular, it does multiple RPCs asynchronously, running
8   simultaneously.
9 =============================================================================*/
10 
11 #include <cassert>
12 #include <cstdlib>
13 #include <string>
14 #include <iostream>
15 
16 using namespace std;
17 
18 #include <xmlrpc-c/girerr.hpp>
19 #include <xmlrpc-c/base.hpp>
20 #include <xmlrpc-c/client.hpp>
21 
22 int
main(int argc,char **)23 main(int argc, char **) {
24 
25     if (argc-1 > 0) {
26         cerr << "This program has no arguments" << endl;
27         exit(1);
28     }
29 
30     try {
31         xmlrpc_c::clientXmlTransport_curl myTransport;
32 
33         xmlrpc_c::client_xml myClient(&myTransport);
34 
35         string const methodName("sample.add");
36 
37         xmlrpc_c::paramList sampleAddParms1;
38         sampleAddParms1.add(xmlrpc_c::value_int(3));
39         sampleAddParms1.add(xmlrpc_c::value_int(1));
40 
41         xmlrpc_c::rpcPtr rpc1P(methodName, sampleAddParms1);
42 
43         xmlrpc_c::paramList sampleAddParms2;
44         sampleAddParms2.add(xmlrpc_c::value_int(5));
45         sampleAddParms2.add(xmlrpc_c::value_int(7));
46 
47         xmlrpc_c::rpcPtr rpc2P(methodName, sampleAddParms2);
48 
49         string const serverUrl("http://localhost:8080/RPC2");
50 
51         xmlrpc_c::carriageParm_curl0 myCarriageParm(serverUrl);
52 
53         rpc1P->start(&myClient, &myCarriageParm);
54         rpc2P->start(&myClient, &myCarriageParm);
55 
56         cout << "Two RPCs started.  Waiting for them to finish." << endl;
57 
58         myClient.finishAsync(xmlrpc_c::timeout());  // infinite timeout
59 
60         assert(rpc1P->isFinished());
61         assert(rpc2P->isFinished());
62 
63         int const sum1(xmlrpc_c::value_int(rpc1P->getResult()));
64         int const sum2(xmlrpc_c::value_int(rpc2P->getResult()));
65 
66         cout << "Result of RPC 1 (sum of 3 and 1): " << sum1 << endl;
67         cout << "Result of RPC 2 (sum of 5 and 7): " << sum2 << endl;
68 
69     } catch (exception const& e) {
70         cerr << "Client threw error: " << e.what() << endl;
71     } catch (...) {
72         cerr << "Client threw unexpected error." << endl;
73     }
74 
75     return 0;
76 }
77