1 #ifndef _XMLRPCSERVERCONNECTION_H_
2 #define _XMLRPCSERVERCONNECTION_H_
3 //
4 // XmlRpc++ Copyright (c) 2002-2003 by Chris Morley
5 //
6 #if defined(_MSC_VER)
7 # pragma warning(disable:4786)    // identifier was truncated in debug info
8 #endif
9 
10 #ifndef MAKEDEPEND
11 # include <string>
12 #endif
13 
14 #include "XmlRpcValue.h"
15 #include "XmlRpcSource.h"
16 
17 namespace XmlRpc {
18 
19 
20   // The server waits for client connections and provides methods
21   class XmlRpcServer;
22   class XmlRpcServerMethod;
23 
24   //! A class to handle XML RPC requests from a particular client
25   class XmlRpcServerConnection : public XmlRpcSource {
26   public:
27     // Static data
28     static const char METHODNAME_TAG[];
29     static const char PARAMS_TAG[];
30     static const char PARAMS_ETAG[];
31     static const char PARAM_TAG[];
32     static const char PARAM_ETAG[];
33 
34     static const std::string SYSTEM_MULTICALL;
35     static const std::string METHODNAME;
36     static const std::string PARAMS;
37 
38     static const std::string FAULTCODE;
39     static const std::string FAULTSTRING;
40 
41     //! Constructor
42     XmlRpcServerConnection(int fd, XmlRpcServer* server, bool deleteOnClose = false);
43     //! Destructor
44     virtual ~XmlRpcServerConnection();
45 
46     // XmlRpcSource interface implementation
47     //! Handle IO on the client connection socket.
48     //!   @param eventType Type of IO event that occurred. @see XmlRpcDispatch::EventType.
49     virtual unsigned handleEvent(unsigned eventType);
50 
51   protected:
52 
53     bool readHeader();
54     bool readRequest();
55     bool writeResponse();
56 
57     // Parses the request, runs the method, generates the response xml.
58     virtual void executeRequest();
59 
60     // Parse the methodName and parameters from the request.
61     std::string parseRequest(XmlRpcValue& params);
62 
63     // Execute a named method with the specified params.
64     bool executeMethod(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result);
65 
66     // Execute multiple calls and return the results in an array.
67     bool executeMulticall(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result);
68 
69     // Construct a response from the result XML.
70     void generateResponse(std::string const& resultXml);
71     void generateFaultResponse(std::string const& msg, int errorCode = -1);
72     std::string generateHeader(std::string const& body);
73 
74 
75     // The XmlRpc server that accepted this connection
76     XmlRpcServer* _server;
77 
78     // Possible IO states for the connection
79     enum ServerConnectionState { READ_HEADER, READ_REQUEST, WRITE_RESPONSE };
80     ServerConnectionState _connectionState;
81 
82     // Request headers
83     std::string _header;
84 
85     // Number of bytes expected in the request body (parsed from header)
86     int _contentLength;
87 
88     // Request body
89     std::string _request;
90 
91     // Response
92     std::string _response;
93 
94     // Number of bytes of the response written so far
95     int _bytesWritten;
96 
97     // Whether to keep the current client connection open for further requests
98     bool _keepAlive;
99   };
100 } // namespace XmlRpc
101 
102 #endif // _XMLRPCSERVERCONNECTION_H_
103