00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef INC_MI32_SOAPSERVER_H
00023 #define INC_MI32_SOAPSERVER_H
00024
00025
00026 #ifndef INC_MI32_SOAP_H
00027 #include <mi32/soap.h>
00028 #endif
00029
00030 #ifndef INC_MI32_HTTPSERVER_H
00031 #include <mi32/httpserver.h>
00032 #endif
00033
00034 namespace SOAP {
00035
00036 class OBJECT_DEFINITION;
00037 class SERVER;
00038 class METHOD;
00039
00040
00044 class OBJECT_DEFINITION {
00045 public:
00046
00047 OBJECT_DEFINITION (
00048 const char* name
00049 );
00050
00051 virtual ~OBJECT_DEFINITION (
00052 );
00053
00059 HTTPCLIENT::INSTANCEDATA* AllocateInstance (
00060 HTTPSERVER::CLIENT* client
00061 );
00062
00065 METHOD* FindMethod (
00066 const char* name
00067 ) const;
00068
00070 const char* GetName (
00071 ) const;
00072
00073 const XMLDOC& GetWSDL (
00074 ) const;
00075
00076 private:
00077
00078
00079
00080 virtual HTTPCLIENT::INSTANCEDATA* v_AllocateInstance (
00081 HTTPSERVER::CLIENT* client
00082 );
00083
00084 friend class METHOD;
00085
00086 void AddMethod (
00087 METHOD* method
00088 );
00089
00090 const char* m_name;
00091 SIMPLE_ARRAY<SOAP::METHOD*> m_Methods;
00092 mutable XMLDOC* m_wsdl;
00093
00094 };
00095
00099 class METHOD {
00100 public:
00101
00102
00103 enum TYPE {
00104 TYPE_String,
00105 TYPE_Double,
00106 TYPE_Integer,
00107 TYPE_XML
00108 };
00109
00110 virtual ~METHOD (
00111 );
00112
00113 const char* GetName (
00114 ) const;
00115
00116 ERRVALUE ProcessRequest (
00117 HTTPCLIENT::INSTANCEDATA* This,
00118 const VALUES& parms,
00119 VALUES& retval
00120 );
00121
00122 protected:
00123
00129 METHOD (
00130 OBJECT_DEFINITION* obj,
00131 const char* name
00132 );
00133
00136 ERRVALUE AddParameter (
00137 const char* name,
00138 VALUES::TYPE type,
00139 bool bIsOptional
00140 );
00141
00144 ERRVALUE AddRetVal (
00145 const char* name,
00146 VALUES::TYPE type,
00147 bool bIsOptional
00148 );
00149
00150 private:
00151 struct PARM {
00152 const char* m_name;
00153 VALUES::TYPE m_type;
00154 bool m_bIsOptional;
00155
00156 void AddWSDLNode(XMLNODE* parent) const;
00157 };
00158
00159 const char* m_name;
00160 SIMPLE_ARRAY<PARM> m_Parms;
00161 SIMPLE_ARRAY<PARM> m_OutReply;
00162
00167 virtual ERRVALUE v_ProcessRequest (
00168 HTTPCLIENT::INSTANCEDATA* This,
00169 const VALUES& parms,
00170 VALUES& retval
00171 ) = 0;
00172
00173 void CreateWSDLMessageNodes (
00174 XMLNODE* definitionsNode
00175 ) const;
00176
00177 void CreateWSDLPortTypeOperationNode (
00178 XMLNODE* portTypeNode
00179 ) const;
00180
00181 void CreateWSDLBindingOperationNode (
00182 const char* ObjectName,
00183 XMLNODE* bindingNode
00184 ) const;
00185
00186 friend class OBJECT_DEFINITION;
00187 };
00188
00189
00190 template <class _CT> class METHOD_T : public METHOD {
00191 public:
00192 METHOD_T (
00193 OBJECT_DEFINITION* obj,
00194 const char* name
00195 ) :
00196 METHOD(obj, name)
00197 {
00198 }
00199
00200 private:
00205 virtual ERRVALUE v_ProcessRequest (
00206 _CT* This,
00207 const VALUES& parms,
00208 VALUES& retval
00209 ) = 0;
00210
00211 #ifndef GENERATING_DOXYGEN_OUTPUT
00212 ERRVALUE v_ProcessRequest (
00213 HTTPCLIENT::INSTANCEDATA* This,
00214 const VALUES& parms,
00215 VALUES& retval
00216 ) {
00217 return (v_ProcessRequest(static_cast<_CT*>(This), parms, retval));
00218 }
00219 #endif
00220 };
00221
00222
00223
00224 class HANDLER : public HTTPSERVER::HANDLER {
00225 public:
00226 HANDLER (
00227 HTTPSERVER& server
00228 );
00229
00230 virtual ~HANDLER (
00231 );
00232
00233 ERRVALUE AddObjectDefinition (
00234 OBJECT_DEFINITION* obj
00235 );
00236
00237 private:
00238 virtual bool v_CanHandleMethod (
00239 HTTPMESSAGE::METHOD method
00240 ) const;
00241
00242 virtual int v_Matches (
00243 const HTTPMESSAGE& message
00244 ) const;
00245
00246 virtual bool v_ProcessRequest (
00247 HTTPSERVER::CLIENT* client,
00248 const HTTPMESSAGE& message
00249 );
00250
00251 OBJECT_DEFINITION* FindObjectDef (
00252 const HTTPMESSAGE& message
00253 ) const;
00254
00255 private:
00256 SIMPLE_ARRAY<OBJECT_DEFINITION*> m_ObjectTypes;
00257 };
00258
00259 }
00260
00261 #endif // INC_MI32_SOAPSERVER_H
00262