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_SIP_HANDLERS_H
00032 #define OPAL_SIP_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 #if OPAL_SIP
00045
00046 #include <ptlib/safecoll.h>
00047
00048 #include <opal/connection.h>
00049 #include <sip/sippdu.h>
00050
00051
00052
00053
00054
00055 class SIPHandler : public PSafeObject
00056 {
00057 PCLASSINFO(SIPHandler, PSafeObject);
00058
00059 protected:
00060 SIPHandler(
00061 SIPEndPoint & ep,
00062 const PString & target,
00063 const PString & remote,
00064 int expireTime = 0,
00065 int offlineExpire = 30,
00066 const PTimeInterval & retryMin = PMaxTimeInterval,
00067 const PTimeInterval & retryMax = PMaxTimeInterval
00068 );
00069
00070 public:
00071 ~SIPHandler();
00072
00073 virtual bool ShutDown();
00074
00075 enum State {
00076 Subscribed,
00077 Subscribing,
00078 Unavailable,
00079 Refreshing,
00080 Restoring,
00081 Unsubscribing,
00082 Unsubscribed
00083 };
00084
00085 void SetState (SIPHandler::State s);
00086
00087 inline SIPHandler::State GetState ()
00088 { return state; }
00089
00090 virtual OpalTransport * GetTransport();
00091
00092 virtual SIPAuthentication * GetAuthentication()
00093 { return authentication; }
00094
00095 virtual const SIPURL & GetAddressOfRecord()
00096 { return m_addressOfRecord; }
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 bool IsDuplicateCSeq(unsigned ) { return false; }
00112
00113 virtual SIPTransaction * CreateTransaction(OpalTransport & t) = 0;
00114
00115 virtual SIP_PDU::Methods GetMethod() = 0;
00116 virtual SIPSubscribe::EventPackage GetEventPackage() const
00117 { return PString::Empty(); }
00118
00119 virtual void OnReceivedAuthenticationRequired(SIPTransaction & transaction, SIP_PDU & response);
00120 virtual void OnReceivedOK(SIPTransaction & transaction, SIP_PDU & response);
00121 virtual void OnTransactionFailed(SIPTransaction & transaction);
00122 virtual void OnFailed(SIP_PDU::StatusCodes);
00123
00124 bool ActivateState(SIPHandler::State state, unsigned msecs = 1000);
00125 virtual bool SendNotify(const PObject * ) { return false; }
00126
00127 SIPEndPoint & GetEndPoint() const { return endpoint; }
00128
00129 const OpalProductInfo & GetProductInfo() const { return m_productInfo; }
00130
00131 const PString & GetUsername() const { return m_username; }
00132 const PString & GetPassword() const { return m_password; }
00133 const PString & GetRealm() const { return m_realm; }
00134 const SIPURL & GetRemoteAddress() const { return m_remoteAddress; }
00135
00136 protected:
00137 virtual PBoolean SendRequest(SIPHandler::State state);
00138 void CollapseFork(SIPTransaction & transaction);
00139 PDECLARE_NOTIFIER(PTimer, SIPHandler, OnExpireTimeout);
00140 static PBoolean WriteSIPHandler(OpalTransport & transport, void * info);
00141 bool WriteSIPHandler(OpalTransport & transport);
00142
00143 SIPEndPoint & endpoint;
00144
00145 SIPAuthentication * authentication;
00146 PString m_username;
00147 PString m_password;
00148 PString m_realm;
00149
00150 PSafeList<SIPTransaction> transactions;
00151 OpalTransport * m_transport;
00152 SIPURL m_addressOfRecord;
00153 SIPURL m_remoteAddress;
00154 PString callID;
00155 int expire;
00156 int originalExpire;
00157 int offlineExpire;
00158 PString body;
00159 unsigned authenticationAttempts;
00160 State state;
00161 PTimer expireTimer;
00162 PTimeInterval retryTimeoutMin;
00163 PTimeInterval retryTimeoutMax;
00164 SIPURL m_proxy;
00165 OpalProductInfo m_productInfo;
00166 };
00167
00168 #if PTRACING
00169 ostream & operator<<(ostream & strm, SIPHandler::State state);
00170 #endif
00171
00172
00173 class SIPRegisterHandler : public SIPHandler
00174 {
00175 PCLASSINFO(SIPRegisterHandler, SIPHandler);
00176
00177 public:
00178 SIPRegisterHandler(
00179 SIPEndPoint & ep,
00180 const SIPRegister::Params & params
00181 );
00182
00183 ~SIPRegisterHandler();
00184
00185 virtual SIPTransaction * CreateTransaction(OpalTransport &);
00186 virtual void OnReceivedOK(SIPTransaction & transaction, SIP_PDU & response);
00187 virtual SIP_PDU::Methods GetMethod()
00188 { return SIP_PDU::Method_REGISTER; }
00189
00190 virtual void OnFailed(SIP_PDU::StatusCodes r);
00191
00192 void UpdateParameters(const SIPRegister::Params & params);
00193
00194 protected:
00195 virtual PBoolean SendRequest(SIPHandler::State state);
00196 void SendStatus(SIP_PDU::StatusCodes code, State state);
00197
00198 SIPRegister::Params m_parameters;
00199 unsigned m_sequenceNumber;
00200 };
00201
00202
00203 class SIPSubscribeHandler : public SIPHandler
00204 {
00205 PCLASSINFO(SIPSubscribeHandler, SIPHandler);
00206 public:
00207 SIPSubscribeHandler(SIPEndPoint & ep, const SIPSubscribe::Params & params);
00208 ~SIPSubscribeHandler();
00209
00210 virtual SIPTransaction * CreateTransaction (OpalTransport &);
00211 virtual void OnReceivedOK(SIPTransaction & transaction, SIP_PDU & response);
00212 virtual PBoolean OnReceivedNOTIFY(SIP_PDU & response);
00213 virtual void OnFailed(SIP_PDU::StatusCodes r);
00214 virtual SIP_PDU::Methods GetMethod ()
00215 { return SIP_PDU::Method_SUBSCRIBE; }
00216 virtual SIPEventPackage GetEventPackage() const
00217 { return m_parameters.m_eventPackage; }
00218
00219 void UpdateParameters(const SIPSubscribe::Params & params);
00220
00221 virtual bool IsDuplicateCSeq(unsigned sequenceNumber) { return m_dialog.IsDuplicateCSeq(sequenceNumber); }
00222
00223 protected:
00224 virtual PBoolean SendRequest(SIPHandler::State state);
00225 void SendStatus(SIP_PDU::StatusCodes code, State state);
00226
00227 SIPSubscribe::Params m_parameters;
00228 SIPDialogContext m_dialog;
00229 bool m_unconfirmed;
00230 SIPEventPackageHandler * m_packageHandler;
00231 };
00232
00233
00234 class SIPNotifyHandler : public SIPHandler
00235 {
00236 PCLASSINFO(SIPNotifyHandler, SIPHandler);
00237 public:
00238 SIPNotifyHandler(
00239 SIPEndPoint & ep,
00240 const PString & targetAddress,
00241 const SIPEventPackage & eventPackage,
00242 const SIPDialogContext & dialog
00243 );
00244 ~SIPNotifyHandler();
00245
00246 virtual SIPTransaction * CreateTransaction(OpalTransport &);
00247 virtual SIP_PDU::Methods GetMethod ()
00248 { return SIP_PDU::Method_NOTIFY; }
00249 virtual SIPEventPackage GetEventPackage() const
00250 { return m_eventPackage; }
00251
00252 virtual bool IsDuplicateCSeq(unsigned sequenceNumber) { return m_dialog.IsDuplicateCSeq(sequenceNumber); }
00253 virtual bool SendNotify(const PObject * body);
00254
00255 enum Reasons {
00256 Deactivated,
00257 Probation,
00258 Rejected,
00259 Timeout,
00260 GiveUp,
00261 NoResource
00262 };
00263
00264 protected:
00265 virtual PBoolean SendRequest(SIPHandler::State state);
00266
00267 SIPEventPackage m_eventPackage;
00268 SIPDialogContext m_dialog;
00269 Reasons m_reason;
00270 SIPEventPackageHandler * m_packageHandler;
00271 };
00272
00273
00274 class SIPPublishHandler : public SIPHandler
00275 {
00276 PCLASSINFO(SIPPublishHandler, SIPHandler);
00277
00278 public:
00279 SIPPublishHandler(SIPEndPoint & ep,
00280 const SIPSubscribe::Params & params,
00281 const PString & body);
00282 ~SIPPublishHandler();
00283
00284 virtual SIPTransaction * CreateTransaction(OpalTransport &);
00285 virtual void OnReceivedOK(SIPTransaction & transaction, SIP_PDU & response);
00286 virtual SIP_PDU::Methods GetMethod()
00287 { return SIP_PDU::Method_PUBLISH; }
00288 virtual SIPEventPackage GetEventPackage() const
00289 { return m_parameters.m_eventPackage; }
00290 virtual void SetBody(const PString & body);
00291
00292 private:
00293 SIPSubscribe::Params m_parameters;
00294 PString m_sipETag;
00295 bool m_stateChanged;
00296 };
00297
00298
00299 class SIPMessageHandler : public SIPHandler
00300 {
00301 PCLASSINFO(SIPMessageHandler, SIPHandler);
00302 public:
00303 SIPMessageHandler(SIPEndPoint & ep,
00304 const PString & to,
00305 const PString & body,
00306 const PString & remoteContact,
00307 const PString & callId);
00308 ~SIPMessageHandler();
00309
00310 virtual SIPTransaction * CreateTransaction (OpalTransport &);
00311 virtual SIP_PDU::Methods GetMethod ()
00312 { return SIP_PDU::Method_MESSAGE; }
00313 virtual void OnFailed (SIP_PDU::StatusCodes);
00314 virtual void SetBody(const PString & b);
00315
00316 private:
00317 virtual void OnExpireTimeout(PTimer &, INT);
00318 };
00319
00320
00321 class SIPPingHandler : public SIPHandler
00322 {
00323 PCLASSINFO(SIPPingHandler, SIPHandler);
00324 public:
00325 SIPPingHandler(SIPEndPoint & ep,
00326 const PString & to);
00327 virtual SIPTransaction * CreateTransaction (OpalTransport &);
00328 virtual SIP_PDU::Methods GetMethod ()
00329 { return SIP_PDU::Method_MESSAGE; }
00330 };
00331
00332
00336 class SIPHandlersList
00337 {
00338 public:
00341 void Append(SIPHandler * handler)
00342 { m_handlersList.Append(handler); }
00343
00348 void Remove(SIPHandler * handler)
00349 { m_handlersList.Remove(handler); }
00350
00353 bool DeleteObjectsToBeRemoved()
00354 { return m_handlersList.DeleteObjectsToBeRemoved(); }
00355
00359 PSafePtr<SIPHandler> GetFirstHandler(PSafetyMode mode = PSafeReference) const
00360 { return PSafePtr<SIPHandler>(m_handlersList, mode); }
00361
00365 unsigned GetCount(SIP_PDU::Methods meth, const PString & eventPackage = PString::Empty()) const;
00366
00370 PStringList GetAddresses(bool includeOffline, SIP_PDU::Methods meth, const PString & eventPackage = PString::Empty()) const;
00371
00375 PSafePtr<SIPHandler> FindSIPHandlerByCallID(const PString & callID, PSafetyMode m);
00376
00380 PSafePtr<SIPHandler> FindSIPHandlerByAuthRealm(const PString & authRealm, const PString & userName, PSafetyMode m);
00381
00389 PSafePtr<SIPHandler> FindSIPHandlerByUrl(const PString & url, SIP_PDU::Methods meth, PSafetyMode m);
00390 PSafePtr<SIPHandler> FindSIPHandlerByUrl(const PString & url, SIP_PDU::Methods meth, const PString & eventPackage, PSafetyMode m);
00391
00397 PSafePtr <SIPHandler> FindSIPHandlerByDomain(const PString & name, SIP_PDU::Methods meth, PSafetyMode m);
00398
00399 protected:
00400 PSafeList<SIPHandler> m_handlersList;
00401 };
00402
00403
00406 struct SIPPresenceInfo
00407 {
00408 enum BasicStates {
00409 Unknown,
00410 Open,
00411 Closed
00412 };
00413
00414 SIPPresenceInfo() : m_basic(Unknown) { }
00415
00416 PString m_address;
00417 PString m_entity;
00418 BasicStates m_basic;
00419 PString m_note;
00420 PString m_contact;
00421 PString m_to;
00422
00423 PString AsString() const;
00424 };
00425
00426
00429 struct SIPDialogNotification : public PObject
00430 {
00431 PCLASSINFO(SIPDialogNotification, PObject);
00432
00433 enum States {
00434 Terminated,
00435 Trying,
00436 Proceeding,
00437 Early,
00438 Confirmed,
00439
00440 FirstState = Terminated,
00441 LastState = Confirmed
00442 };
00443 friend States operator++(States & state) { return (state = (States)(state+1)); }
00444 friend States operator--(States & state) { return (state = (States)(state-1)); }
00445 static PString GetStateName(States state);
00446 PString GetStateName() const { return GetStateName(m_state); }
00447
00448 enum Events {
00449 NoEvent = -1,
00450 Cancelled,
00451 Rejected,
00452 Replaced,
00453 LocalBye,
00454 RemoteBye,
00455 Error,
00456 Timeout,
00457
00458 FirstEvent = Cancelled,
00459 LastEvent = Timeout
00460 };
00461 friend Events operator++(Events & evt) { return (evt = (Events)(evt+1)); }
00462 friend Events operator--(Events & evt) { return (evt = (Events)(evt-1)); }
00463 static PString GetEventName(Events state);
00464 PString GetEventName() const { return GetEventName(m_eventType); }
00465
00466 enum Rendering {
00467 RenderingUnknown = -1,
00468 NotRenderingMedia,
00469 RenderingMedia
00470 };
00471
00472 PString m_entity;
00473 PString m_dialogId;
00474 PString m_callId;
00475 bool m_initiator;
00476 States m_state;
00477 Events m_eventType;
00478 unsigned m_eventCode;
00479 struct Participant {
00480 Participant() : m_appearance(-1), m_byeless(false), m_rendering(RenderingUnknown) { }
00481 PString m_URI;
00482 PString m_dialogTag;
00483 PString m_identity;
00484 PString m_display;
00485 int m_appearance;
00486 bool m_byeless;
00487 Rendering m_rendering;
00488 } m_local, m_remote;
00489
00490 SIPDialogNotification(const PString & entity = PString::Empty());
00491
00492 void PrintOn(ostream & strm) const;
00493 };
00494
00495
00496 #endif // OPAL_SIP
00497
00498 #endif // OPAL_SIP_HANDLERS_H