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 #ifndef __OPAL_HANDLERS_H
00032 #define __OPAL_HANDLERS_H
00033
00034 #ifdef P_USE_PRAGMA
00035 #pragma interface
00036 #endif
00037
00038 #ifndef _PTLIB_H
00039 #include <ptlib.h>
00040 #endif
00041
00042 #include <opal/buildopts.h>
00043
00044 #include <ptlib/safecoll.h>
00045
00046 #include <opal/connection.h>
00047 #include <sip/sippdu.h>
00048
00049
00050
00051
00052
00053 class SIPHandler : public PSafeObject
00054 {
00055 PCLASSINFO(SIPHandler, PSafeObject);
00056
00057 protected:
00058 SIPHandler(
00059 SIPEndPoint & ep,
00060 const PString & to,
00061 int expireTime,
00062 int offlineExpire = 30,
00063 const PTimeInterval & retryMin = PMaxTimeInterval,
00064 const PTimeInterval & retryMax = PMaxTimeInterval
00065 );
00066
00067 public:
00068 ~SIPHandler();
00069
00070 virtual bool ShutDown();
00071
00072 enum State {
00073
00074 Subscribed,
00075 Subscribing,
00076 Unavailable,
00077 Refreshing,
00078 Restoring,
00079 Unsubscribing,
00080 Unsubscribed
00081 };
00082
00083 void SetState (SIPHandler::State s);
00084
00085 inline SIPHandler::State GetState ()
00086 { return state; }
00087
00088 virtual OpalTransport * GetTransport();
00089
00090 virtual SIPAuthentication * GetAuthentication()
00091 { return authentication; }
00092
00093 virtual const SIPURL & GetTargetAddress()
00094 { return targetAddress; }
00095
00096 virtual const PString GetRemotePartyAddress();
00097
00098 virtual PBoolean OnReceivedNOTIFY(SIP_PDU & response);
00099
00100 virtual void SetExpire(int e);
00101
00102 virtual int GetExpire()
00103 { return expire; }
00104
00105 virtual PString GetCallID()
00106 { return callID; }
00107
00108 virtual void SetBody(const PString & b)
00109 { body = b;}
00110
00111 virtual SIPTransaction * CreateTransaction(OpalTransport & t) = 0;
00112
00113 virtual SIP_PDU::Methods GetMethod() = 0;
00114 virtual PCaselessString GetEventPackage() const
00115 { return PString::Empty(); }
00116
00117 virtual void OnReceivedAuthenticationRequired(SIPTransaction & transaction, SIP_PDU & response);
00118 virtual void OnReceivedOK(SIPTransaction & transaction, SIP_PDU & response);
00119 virtual void OnTransactionFailed(SIPTransaction & transaction);
00120 virtual void OnFailed(SIP_PDU::StatusCodes);
00121
00122 virtual PBoolean SendRequest(SIPHandler::State state);
00123
00124 const PStringList & GetRouteSet() const { return routeSet; }
00125
00126 const OpalProductInfo & GetProductInfo() const { return m_productInfo; }
00127
00128 PString authenticationUsername;
00129 PString authenticationPassword;
00130 PString authenticationAuthRealm;
00131
00132 protected:
00133 void CollapseFork(SIPTransaction & transaction);
00134 PDECLARE_NOTIFIER(PTimer, SIPHandler, OnExpireTimeout);
00135 static PBoolean WriteSIPHandler(OpalTransport & transport, void * info);
00136 bool WriteSIPHandler(OpalTransport & transport);
00137
00138 SIPEndPoint & endpoint;
00139
00140 SIPAuthentication * authentication;
00141
00142 PSafeList<SIPTransaction> transactions;
00143 OpalTransport * transport;
00144 SIPURL targetAddress;
00145 PString callID;
00146 int expire;
00147 int originalExpire;
00148 int offlineExpire;
00149 PStringList routeSet;
00150 PString body;
00151 unsigned authenticationAttempts;
00152 State state;
00153 PTimer expireTimer;
00154 PTimeInterval retryTimeoutMin;
00155 PTimeInterval retryTimeoutMax;
00156 PString remotePartyAddress;
00157 SIPURL proxy;
00158 OpalProductInfo m_productInfo;
00159 };
00160
00161 #if PTRACING
00162 ostream & operator<<(ostream & strm, SIPHandler::State state);
00163 #endif
00164
00165
00166 class SIPRegisterHandler : public SIPHandler
00167 {
00168 PCLASSINFO(SIPRegisterHandler, SIPHandler);
00169
00170 public:
00171 SIPRegisterHandler(
00172 SIPEndPoint & ep,
00173 const SIPRegister::Params & params
00174 );
00175
00176 ~SIPRegisterHandler();
00177
00178 virtual SIPTransaction * CreateTransaction(OpalTransport &);
00179 virtual void OnReceivedOK(SIPTransaction & transaction, SIP_PDU & response);
00180 virtual SIP_PDU::Methods GetMethod()
00181 { return SIP_PDU::Method_REGISTER; }
00182
00183 virtual void OnFailed(SIP_PDU::StatusCodes r);
00184 virtual PBoolean SendRequest(SIPHandler::State state);
00185
00186 void UpdateParameters(const SIPRegister::Params & params);
00187
00188 private:
00189 void SendStatus(SIP_PDU::StatusCodes code);
00190
00191 SIPRegister::Params m_parameters;
00192 };
00193
00194
00195 class SIPSubscribeHandler : public SIPHandler
00196 {
00197 PCLASSINFO(SIPSubscribeHandler, SIPHandler);
00198 public:
00199 SIPSubscribeHandler(SIPEndPoint & ep, const SIPSubscribe::Params & params);
00200 ~SIPSubscribeHandler();
00201
00202 virtual SIPTransaction * CreateTransaction (OpalTransport &);
00203 virtual void OnReceivedOK(SIPTransaction & transaction, SIP_PDU & response);
00204 virtual PBoolean OnReceivedNOTIFY(SIP_PDU & response);
00205 virtual void OnFailed(SIP_PDU::StatusCodes r);
00206 virtual PBoolean SendRequest(SIPHandler::State state);
00207 virtual SIP_PDU::Methods GetMethod ()
00208 { return SIP_PDU::Method_SUBSCRIBE; }
00209 virtual PCaselessString GetEventPackage() const
00210 { return m_parameters.m_eventPackage; }
00211
00212 void UpdateParameters(const SIPSubscribe::Params & params);
00213
00214 private:
00215 void SendStatus(SIP_PDU::StatusCodes code);
00216 PBoolean OnReceivedMWINOTIFY(SIP_PDU & response);
00217 PBoolean OnReceivedPresenceNOTIFY(SIP_PDU & response);
00218
00219 SIPSubscribe::Params m_parameters;
00220
00221 PString localPartyAddress;
00222 PBoolean dialogCreated;
00223 unsigned lastSentCSeq;
00224 unsigned lastReceivedCSeq;
00225 };
00226
00227
00228 class SIPPublishHandler : public SIPHandler
00229 {
00230 PCLASSINFO(SIPPublishHandler, SIPHandler);
00231
00232 public:
00233 SIPPublishHandler(SIPEndPoint & ep,
00234 const PString & to,
00235 const PString & body,
00236 int expire);
00237 ~SIPPublishHandler();
00238
00239 virtual SIPTransaction * CreateTransaction(OpalTransport &);
00240 virtual void OnReceivedOK(SIPTransaction & transaction, SIP_PDU & response);
00241 virtual SIP_PDU::Methods GetMethod()
00242 { return SIP_PDU::Method_PUBLISH; }
00243 virtual void SetBody(const PString & body);
00244 static PString BuildBody(const PString & to,
00245 const PString & basic,
00246 const PString & note);
00247
00248 private:
00249 PDECLARE_NOTIFIER(PTimer, SIPPublishHandler, OnPublishTimeout);
00250 PTimer publishTimer;
00251 PString sipETag;
00252 PBoolean stateChanged;
00253 };
00254
00255
00256 class SIPMessageHandler : public SIPHandler
00257 {
00258 PCLASSINFO(SIPMessageHandler, SIPHandler);
00259 public:
00260 SIPMessageHandler(SIPEndPoint & ep,
00261 const PString & to,
00262 const PString & body);
00263 ~SIPMessageHandler();
00264
00265 virtual SIPTransaction * CreateTransaction (OpalTransport &);
00266 virtual SIP_PDU::Methods GetMethod ()
00267 { return SIP_PDU::Method_MESSAGE; }
00268 virtual void OnFailed (SIP_PDU::StatusCodes);
00269 virtual void SetBody(const PString & b);
00270
00271 private:
00272 virtual void OnExpireTimeout(PTimer &, INT);
00273 };
00274
00275
00276 class SIPPingHandler : public SIPHandler
00277 {
00278 PCLASSINFO(SIPPingHandler, SIPHandler);
00279 public:
00280 SIPPingHandler(SIPEndPoint & ep,
00281 const PString & to);
00282 virtual SIPTransaction * CreateTransaction (OpalTransport &);
00283 virtual SIP_PDU::Methods GetMethod ()
00284 { return SIP_PDU::Method_MESSAGE; }
00285 };
00286
00287
00292 class SIPHandlersList : public PSafeList<SIPHandler>
00293 {
00294 public:
00298 unsigned GetCount(SIP_PDU::Methods meth, const PString & eventPackage = PString::Empty()) const;
00299
00303 PSafePtr<SIPHandler> FindSIPHandlerByCallID(const PString & callID, PSafetyMode m);
00304
00308 PSafePtr<SIPHandler> FindSIPHandlerByAuthRealm(const PString & authRealm, const PString & userName, PSafetyMode m);
00309
00317 PSafePtr<SIPHandler> FindSIPHandlerByUrl(const PString & url, SIP_PDU::Methods meth, PSafetyMode m);
00318 PSafePtr<SIPHandler> FindSIPHandlerByUrl(const PString & url, SIP_PDU::Methods meth, const PString & eventPackage, PSafetyMode m);
00319
00325 PSafePtr <SIPHandler> FindSIPHandlerByDomain(const PString & name, SIP_PDU::Methods meth, PSafetyMode m);
00326 };
00327
00328
00329 #endif