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