14e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius#ifndef _XMLRPCSERVERCONNECTION_H_
24e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius#define _XMLRPCSERVERCONNECTION_H_
34e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius//
44e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius// XmlRpc++ Copyright (c) 2002-2003 by Chris Morley
54e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius//
64e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius#if defined(_MSC_VER)
74e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius# pragma warning(disable:4786)    // identifier was truncated in debug info
84e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius#endif
94e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
104e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius#ifndef MAKEDEPEND
114e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius# include <string>
124e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius#endif
134e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
144e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius#include "XmlRpcValue.h"
154e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius#include "XmlRpcSource.h"
164e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
174e2ea8184cc1f9609f1f1251394316629a108a78Roshan Piusnamespace XmlRpc {
184e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
194e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
204e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius  // The server waits for client connections and provides methods
214e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius  class XmlRpcServer;
224e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius  class XmlRpcServerMethod;
234e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
244e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius  //! A class to handle XML RPC requests from a particular client
254e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius  class XmlRpcServerConnection : public XmlRpcSource {
264e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius  public:
274e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // Static data
284e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    static const char METHODNAME_TAG[];
294e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    static const char PARAMS_TAG[];
304e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    static const char PARAMS_ETAG[];
314e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    static const char PARAM_TAG[];
324e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    static const char PARAM_ETAG[];
334e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
344e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    static const std::string SYSTEM_MULTICALL;
354e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    static const std::string METHODNAME;
364e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    static const std::string PARAMS;
374e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
384e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    static const std::string FAULTCODE;
394e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    static const std::string FAULTSTRING;
404e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
414e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    //! Constructor
424e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    XmlRpcServerConnection(int fd, XmlRpcServer* server, bool deleteOnClose = false);
434e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    //! Destructor
444e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    virtual ~XmlRpcServerConnection();
454e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
464e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // XmlRpcSource interface implementation
474e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    //! Handle IO on the client connection socket.
484e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    //!   @param eventType Type of IO event that occurred. @see XmlRpcDispatch::EventType.
494e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    virtual unsigned handleEvent(unsigned eventType);
504e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
514e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius  protected:
524e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
534e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    bool readHeader();
544e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    bool readRequest();
554e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    bool writeResponse();
564e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
574e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // Parses the request, runs the method, generates the response xml.
584e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    virtual void executeRequest();
594e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
604e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // Parse the methodName and parameters from the request.
614e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    std::string parseRequest(XmlRpcValue& params);
624e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
634e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // Execute a named method with the specified params.
644e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    bool executeMethod(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result);
654e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
664e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // Execute multiple calls and return the results in an array.
674e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    bool executeMulticall(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result);
684e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
694e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // Construct a response from the result XML.
704e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    void generateResponse(std::string const& resultXml);
714e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    void generateFaultResponse(std::string const& msg, int errorCode = -1);
724e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    std::string generateHeader(std::string const& body);
734e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
744e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
754e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // The XmlRpc server that accepted this connection
764e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    XmlRpcServer* _server;
774e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
784e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // Possible IO states for the connection
794e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    enum ServerConnectionState { READ_HEADER, READ_REQUEST, WRITE_RESPONSE };
804e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    ServerConnectionState _connectionState;
814e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
824e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // Request headers
834e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    std::string _header;
844e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
854e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // Number of bytes expected in the request body (parsed from header)
864e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    int _contentLength;
874e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
884e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // Request body
894e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    std::string _request;
904e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
914e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // Response
924e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    std::string _response;
934e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
944e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // Number of bytes of the response written so far
954e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    int _bytesWritten;
964e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
974e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    // Whether to keep the current client connection open for further requests
984e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius    bool _keepAlive;
994e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius  };
1004e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius} // namespace XmlRpc
1014e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius
1024e2ea8184cc1f9609f1f1251394316629a108a78Roshan Pius#endif // _XMLRPCSERVERCONNECTION_H_
103