1 2 #ifndef _XMLRPCCLIENT_H_ 3 #define _XMLRPCCLIENT_H_ 4 // 5 // XmlRpc++ Copyright (c) 2002-2003 by Chris Morley 6 // 7 #if defined(_MSC_VER) 8 # pragma warning(disable:4786) // identifier was truncated in debug info 9 #endif 10 11 12 #ifndef MAKEDEPEND 13 # include <string> 14 #endif 15 16 #include "XmlRpcDispatch.h" 17 #include "XmlRpcSource.h" 18 19 namespace XmlRpc { 20 21 // Arguments and results are represented by XmlRpcValues 22 class XmlRpcValue; 23 24 //! A class to send XML RPC requests to a server and return the results. 25 class XmlRpcClient : public XmlRpcSource { 26 public: 27 // Static data 28 static const char REQUEST_BEGIN[]; 29 static const char REQUEST_END_METHODNAME[]; 30 static const char PARAMS_TAG[]; 31 static const char PARAMS_ETAG[]; 32 static const char PARAM_TAG[]; 33 static const char PARAM_ETAG[]; 34 static const char REQUEST_END[]; 35 // Result tags 36 static const char METHODRESPONSE_TAG[]; 37 static const char FAULT_TAG[]; 38 39 //! Construct a client to connect to the server at the specified host:port address 40 //! @param host The name of the remote machine hosting the server 41 //! @param port The port on the remote machine where the server is listening 42 //! @param uri An optional string to be sent as the URI in the HTTP GET header 43 XmlRpcClient(const char* host, int port, const char* uri=0); 44 45 //! Destructor 46 virtual ~XmlRpcClient(); 47 48 //! Execute the named procedure on the remote server. 49 //! @param method The name of the remote procedure to execute 50 //! @param params An array of the arguments for the method 51 //! @param result The result value to be returned to the client 52 //! @return true if the request was sent and a result received 53 //! (although the result might be a fault). 54 //! 55 //! Currently this is a synchronous (blocking) implementation (execute 56 //! does not return until it receives a response or an error). Use isFault() 57 //! to determine whether the result is a fault response. 58 bool execute(const char* method, XmlRpcValue const& params, XmlRpcValue& result); 59 60 //! Returns true if the result of the last execute() was a fault response. isFault()61 bool isFault() const { return _isFault; } 62 63 64 // XmlRpcSource interface implementation 65 //! Close the connection 66 virtual void close(); 67 68 //! Handle server responses. Called by the event dispatcher during execute. 69 //! @param eventType The type of event that occurred. 70 //! @see XmlRpcDispatch::EventType 71 virtual unsigned handleEvent(unsigned eventType); 72 73 protected: 74 // Execution processing helpers 75 virtual bool doConnect(); 76 virtual bool setupConnection(); 77 78 virtual bool generateRequest(const char* method, XmlRpcValue const& params); 79 virtual std::string generateHeader(std::string const& body); 80 virtual bool writeRequest(); 81 virtual bool readHeader(); 82 virtual bool readResponse(); 83 virtual bool parseResponse(XmlRpcValue& result); 84 85 // Possible IO states for the connection 86 enum ClientConnectionState { NO_CONNECTION, CONNECTING, WRITE_REQUEST, READ_HEADER, READ_RESPONSE, IDLE }; 87 ClientConnectionState _connectionState; 88 89 // Server location 90 std::string _host; 91 std::string _uri; 92 int _port; 93 94 // The xml-encoded request, http header of response, and response xml 95 std::string _request; 96 std::string _header; 97 std::string _response; 98 99 // Number of times the client has attempted to send the request 100 int _sendAttempts; 101 102 // Number of bytes of the request that have been written to the socket so far 103 int _bytesWritten; 104 105 // True if we are currently executing a request. If you want to multithread, 106 // each thread should have its own client. 107 bool _executing; 108 109 // True if the server closed the connection 110 bool _eof; 111 112 // True if a fault response was returned by the server 113 bool _isFault; 114 115 // Number of bytes expected in the response body (parsed from response header) 116 int _contentLength; 117 118 // Event dispatcher 119 XmlRpcDispatch _disp; 120 121 }; // class XmlRpcClient 122 123 } // namespace XmlRpc 124 125 #endif // _XMLRPCCLIENT_H_ 126