00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
#ifndef _PSOAP_H
00043
#define _PSOAP_H
00044
00045
#ifdef P_USE_PRAGMA
00046
#pragma interface
00047
#endif
00048
00049
00050
#if P_EXPAT
00051
00052
#include <ptclib/pxml.h>
00053
#include <ptclib/http.h>
00054
00055
00056
#define DEFAULT_SOAP_URL "/soap"
00057
00058
00064
00065
class PSOAPMessage :
public PXML
00066 {
00067
PCLASSINFO(PSOAPMessage,
PXML);
00068
public:
00069
00071 PSOAPMessage(
int options = PXMLParser::Indent + PXMLParser::NewLineAfterElement );
00072
00074 PSOAPMessage(
const PString & method,
const PString & nameSpace );
00075
00077
void SetMethod(
const PString & name,
const PString & nameSpace );
00078
00080
void GetMethod(
PString & name,
PString & nameSpace );
00081
00083
void AddParameter(
PString name,
PString type,
PString value );
00084
00086
void AddParameter(
PXMLElement* parameter, BOOL dirty = TRUE );
00087
00089 BOOL GetParameter(
const PString & name,
PString & value );
00090
00092 BOOL GetParameter(
const PString & name,
int & value );
00093
00095
PXMLElement* GetParameter(
const PString & name );
00096
00098
void PrintOn(ostream & strm)
const;
00099
00101
PString AsString(
void );
00102
00104 BOOL Load(
const PString & str);
00105
00107
enum
00108 {
00110 NoFault,
00112 VersionMismatch,
00114 MustUnderstand,
00116 Client,
00118 Server
00119 };
00120
00121 PINDEX GetFaultCode()
const {
return faultCode; }
00122
PString GetFaultText()
const {
return faultText; }
00123
void SetFault( PINDEX code,
const PString & text );
00124
00125
private:
00126
PXMLElement* pSOAPBody;
00127
PXMLElement* pSOAPMethod;
00128
PString faultText;
00129 PINDEX faultCode;
00130 };
00131
00132
00138
class PSOAPServerRequestResponse :
public PObject
00139 {
00140
PCLASSINFO( PSOAPServerRequestResponse,
PObject );
00141
public:
00142 PSOAPServerRequestResponse( PSOAPMessage & _request )
00143 : request( _request ) { }
00144
00145 PSOAPMessage & request;
00146 PSOAPMessage response;
00147 };
00148
00149
00151
class PSOAPServerMethod :
public PString
00152 {
00153
PCLASSINFO( PSOAPServerMethod,
PString );
00154
public:
00155 PSOAPServerMethod(
const PString & name )
00156 :
PString( name ) { }
00157
00158
PNotifier methodFunc;
00159 };
00160
00161
PSORTED_LIST(PSOAPServerMethodList, PSOAPServerMethod);
00162
00163
00165
class PSOAPServerResource :
public PHTTPResource
00166 {
00167
PCLASSINFO( PSOAPServerResource,
PHTTPResource );
00168
public:
00169 PSOAPServerResource();
00170 PSOAPServerResource(
00171
const PHTTPAuthority & auth
00172 );
00173 PSOAPServerResource(
00174
const PURL & url
00175 );
00176 PSOAPServerResource(
00177
const PURL & url,
00178
const PHTTPAuthority & auth
00179 );
00180
00181
00182 BOOL LoadHeaders(
PHTTPRequest & request );
00183 BOOL OnPOSTData(
PHTTPRequest & request,
const PStringToString & data );
00184
00185
00186
virtual BOOL OnSOAPRequest(
const PString & body,
PString & reply );
00187
virtual BOOL SetMethod(
const PString & methodName,
const PNotifier & func );
00188 BOOL OnSOAPRequest(
const PString & methodName, PSOAPMessage & request,
PString & reply );
00189
00190
virtual PSOAPMessage FormatFault( PINDEX code,
const PString & str );
00191
00193
00196
void SetSOAPAction(
PString saction ) { soapAction = saction; }
00197
00198
protected:
00199
PMutex methodMutex;
00200 PSOAPServerMethodList methodList;
00201
private:
00202
PString soapAction;
00203 };
00204
00205
00211
class PSOAPClient :
public PObject
00212 {
00213
PCLASSINFO( PSOAPClient,
PObject );
00214
public:
00215
00216 PSOAPClient(
const PURL & url );
00217
00218
void SetTimeout(
const PTimeInterval & _timeout ) { timeout = _timeout; }
00219
00220 BOOL MakeRequest(
const PString & method,
const PString & nameSpace );
00221 BOOL MakeRequest(
const PString & method,
const PString & nameSpace, PSOAPMessage & response );
00222 BOOL MakeRequest( PSOAPMessage & request, PSOAPMessage & response );
00223
00224
PString GetFaultText()
const {
return faultText; }
00225 PINDEX GetFaultCode()
const {
return faultCode; }
00226
00228
void setSOAPAction(
PString saction ) { soapAction = saction; }
00229
protected:
00230 BOOL PerformRequest( PSOAPMessage & request, PSOAPMessage & response );
00231
00232
PURL url;
00233 PINDEX faultCode;
00234
PString faultText;
00235
PTimeInterval timeout;
00236
private:
00237
PString soapAction;
00238 };
00239
00240
00241
#endif // P_EXPAT
00242
00243
00244
#endif // _PSOAP_H
00245
00246
00247