sipep.h

Go to the documentation of this file.
00001 /*
00002  * sipep.h
00003  *
00004  * Session Initiation Protocol endpoint.
00005  *
00006  * Open Phone Abstraction Library (OPAL)
00007  * Formally known as the Open H323 project.
00008  *
00009  * Copyright (c) 2001 Equivalence Pty. Ltd.
00010  *
00011  * The contents of this file are subject to the Mozilla Public License
00012  * Version 1.0 (the "License"); you may not use this file except in
00013  * compliance with the License. You may obtain a copy of the License at
00014  * http://www.mozilla.org/MPL/
00015  *
00016  * Software distributed under the License is distributed on an "AS IS"
00017  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00018  * the License for the specific language governing rights and limitations
00019  * under the License.
00020  *
00021  * The Original Code is Open Phone Abstraction Library.
00022  *
00023  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
00024  *
00025  * Contributor(s): ______________________________________.
00026  *
00027  * $Revision: 28428 $
00028  * $Author: rjongbloed $
00029  * $Date: 2012-10-01 03:38:50 -0500 (Mon, 01 Oct 2012) $
00030  */
00031 
00032 #ifndef OPAL_SIP_SIPEP_H
00033 #define OPAL_SIP_SIPEP_H
00034 
00035 #ifdef P_USE_PRAGMA
00036 #pragma interface
00037 #endif
00038 
00039 #ifndef _PTLIB_H
00040 #include <ptlib.h>
00041 #endif
00042 
00043 #include <opal/buildopts.h>
00044 
00045 #if OPAL_SIP
00046 
00047 #include <ptclib/threadpool.h>
00048 #include <opal/rtpep.h>
00049 #include <sip/sipcon.h>
00050 #include <sip/sippdu.h>
00051 #include <sip/handlers.h> 
00052 
00053 #if OPAL_HAS_SIPIM
00054 #include <im/sipim.h>
00055 #endif
00056 
00057 class SIPRegisterHandler;
00058 
00059 
00060 //
00061 //  provide flag so applications know if presence is available
00062 //
00063 #define OPAL_HAS_SIP_PRESENCE   1
00064 
00066 
00070 class SIPAuthInfo : public PObject
00071 {
00072   public:
00073     SIPAuthInfo()
00074     { }
00075 
00076     SIPAuthInfo(const PString & u, const PString & p)
00077     { username = u; password = p; }
00078     PString username;
00079     PString password;
00080 };
00081 
00083 
00086 class SIPEndPoint : public OpalRTPEndPoint
00087 {
00088   PCLASSINFO(SIPEndPoint, OpalRTPEndPoint);
00089 
00090   public:
00095     SIPEndPoint(
00096       OpalManager & manager,
00097       unsigned maxConnectionThreads = 10,
00098       unsigned maxHandlerThreads = 5
00099     );
00100 
00103     ~SIPEndPoint();
00105 
00112     virtual void ShutDown();
00113 
00117     virtual PString GetDefaultTransport() const;
00118 
00123     virtual PBoolean NewIncomingConnection(
00124       OpalTransport * transport  
00125     );
00126 
00156     virtual PSafePtr<OpalConnection> MakeConnection(
00157       OpalCall & call,                         
00158       const PString & party,                   
00159       void * userData,                         
00160       unsigned int options,                    
00161       OpalConnection::StringOptions * stringOptions  
00162     );
00163 
00182     virtual void OnReleased(
00183       OpalConnection & connection   
00184     );
00185 
00190     virtual PBoolean GarbageCollection();
00192 
00198     virtual SIPConnection * CreateConnection(
00199       OpalCall & call,                         
00200       const PString & token,                   
00201       void * userData,                         
00202       const SIPURL & destination,              
00203       OpalTransport * transport,               
00204       SIP_PDU * invite,                        
00205       unsigned int options = 0,                
00206       OpalConnection::StringOptions * stringOptions = NULL 
00207 
00208     );
00209     
00212     virtual PBoolean SetupTransfer(
00213       const PString & token,        
00214       const PString & callIdentity, 
00215       const PString & remoteParty,  
00216       void * userData = NULL        
00217     );
00218     
00222     virtual PBoolean ForwardConnection(
00223       SIPConnection & connection,     
00224       const PString & forwardParty    
00225     );
00226 
00237     bool ClearDialogContext(
00238       const PString & descriptor  
00239     );
00240     bool ClearDialogContext(
00241       SIPDialogContext & context  
00242     );
00244   
00247 
00251     OpalTransport * CreateTransport(
00252       const SIPURL & remoteURL,
00253       const PString & localInterface = PString::Empty()
00254     );
00255 
00256     virtual void HandlePDU(
00257       OpalTransport & transport
00258     );
00259 
00262     virtual PBoolean OnReceivedPDU(
00263       OpalTransport & transport,
00264       SIP_PDU * pdu
00265     );
00266 
00269     virtual bool OnReceivedConnectionlessPDU(
00270       OpalTransport & transport, 
00271       SIP_PDU * pdu
00272     );
00273 
00276     virtual void OnReceivedResponse(
00277       SIPTransaction & transaction,
00278       SIP_PDU & response
00279     );
00280 
00283     virtual PBoolean OnReceivedINVITE(
00284       OpalTransport & transport,
00285       SIP_PDU * pdu
00286     );
00287 
00290     virtual PBoolean OnReceivedNOTIFY(
00291       OpalTransport & transport,
00292       SIP_PDU & response
00293     );
00294 
00297     virtual PBoolean OnReceivedREGISTER(
00298       OpalTransport & transport, 
00299       SIP_PDU & pdu
00300     );
00301 
00304     virtual PBoolean OnReceivedSUBSCRIBE(
00305       OpalTransport & transport, 
00306       SIP_PDU & pdu
00307     );
00308 
00311     virtual bool OnReceivedMESSAGE(
00312       OpalTransport & transport,
00313       SIP_PDU & response
00314     );
00315 
00318     virtual bool OnReceivedOPTIONS(
00319       OpalTransport & transport,
00320       SIP_PDU & response
00321     );
00322     
00325     virtual void OnTransactionFailed(
00326       SIPTransaction & transaction
00327     );
00328     
00336     virtual void OnRTPStatistics(
00337       const SIPConnection & connection,  
00338       const RTP_Session & session         
00339     ) const;
00341  
00342 
00350     PSafePtr<SIPConnection> GetSIPConnectionWithLock(
00351       const PString & token,     
00352       PSafetyMode mode = PSafeReadWrite,  
00353       SIP_PDU::StatusCodes * errorCode = NULL 
00354     );
00355 
00356     virtual PBoolean IsAcceptedAddress(const SIPURL & toAddr);
00357 
00358 
00393     bool Register(
00394       const SIPRegister::Params & params, 
00395       PString & aor,                      
00396       SIP_PDU::StatusCodes * reason = NULL 
00397     );
00398 
00399     // For backward compatibility
00400     bool Register(
00401       const SIPRegister::Params & params, 
00402       PString & aor,                      
00403       bool asynchronous                   
00404     );
00405 
00407     bool P_DEPRECATED Register(
00408       const PString & host,
00409       const PString & user = PString::Empty(),
00410       const PString & autName = PString::Empty(),
00411       const PString & password = PString::Empty(),
00412       const PString & authRealm = PString::Empty(),
00413       unsigned expire = 0,
00414       const PTimeInterval & minRetryTime = PMaxTimeInterval, 
00415       const PTimeInterval & maxRetryTime = PMaxTimeInterval
00416     );
00417 
00432     PBoolean IsRegistered(
00433       const PString & aor,          
00434       bool includeOffline = false   
00435     );
00436 
00446     bool Unregister(
00447       const PString & aor    
00448     );
00449 
00453     bool UnregisterAll();
00454 
00457     unsigned GetRegistrationsCount() const { return activeSIPHandlers.GetCount(SIP_PDU::Method_REGISTER); }
00458 
00461     PStringList GetRegistrations(
00462       bool includeOffline = false   
00463     ) const { return activeSIPHandlers.GetAddresses(includeOffline, SIP_PDU::Method_REGISTER); }
00464 
00466     struct RegistrationStatus {
00467       SIPRegisterHandler * m_handler;           
00468       PString              m_addressofRecord;   
00469       bool                 m_wasRegistering;    
00470       bool                 m_reRegistering;     
00471       SIP_PDU::StatusCodes m_reason;            
00472       OpalProductInfo      m_productInfo;       
00473       void               * m_userData;          
00474     };
00475 
00478     virtual void OnRegistrationStatus(
00479       const RegistrationStatus & status   
00480     );
00481 
00482     // For backward compatibility
00483     virtual void OnRegistrationStatus(
00484       const PString & aor,
00485       PBoolean wasRegistering,
00486       PBoolean reRegistering,
00487       SIP_PDU::StatusCodes reason
00488     );
00489 
00493     virtual void OnRegistrationFailed(
00494       const PString & aor,
00495       SIP_PDU::StatusCodes reason,
00496       PBoolean wasRegistering
00497     );
00498 
00502     virtual void OnRegistered(
00503       const PString & aor,
00504       PBoolean wasRegistering
00505     );
00506 
00507 
00547     bool Subscribe(
00548       const SIPSubscribe::Params & params, 
00549       PString & token,                     
00550       bool tokenIsAOR = true               
00551     );
00552 
00553     // For backward compatibility
00554     bool Subscribe(
00555       SIPSubscribe::PredefinedPackages eventPackage, 
00556       unsigned expire,                               
00557       const PString & aor                            
00558     );
00559 
00566     bool IsSubscribed(
00567       const PString & aor,           
00568       bool includeOffline = false    
00569     );
00570     bool IsSubscribed(
00571       const PString & eventPackage,  
00572       const PString & aor,           
00573       bool includeOffline = false    
00574     );
00575 
00585     bool Unsubscribe(
00586       const PString & aor,             
00587       bool invalidateNotifiers = false 
00588     );
00589     bool Unsubscribe(
00590       SIPSubscribe::PredefinedPackages eventPackage,  
00591       const PString & aor,                            
00592       bool invalidateNotifiers = false                
00593     );
00594     bool Unsubscribe(
00595       const PString & eventPackage,  
00596       const PString & aor,             
00597       bool invalidateNotifiers = false 
00598     );
00599 
00603     bool UnsubcribeAll(
00604       SIPSubscribe::PredefinedPackages eventPackage  
00605     );
00606     bool UnsubcribeAll(
00607       const PString & eventPackage  
00608     );
00609 
00612     unsigned GetSubscriptionCount(
00613       const SIPSubscribe::EventPackage & eventPackage  
00614     ) { return activeSIPHandlers.GetCount(SIP_PDU::Method_SUBSCRIBE, eventPackage); }
00615 
00618     PStringList GetSubscriptions(
00619       const SIPSubscribe::EventPackage & eventPackage, 
00620       bool includeOffline = false   
00621     ) const { return activeSIPHandlers.GetAddresses(includeOffline, SIP_PDU::Method_REGISTER, eventPackage); }
00622 
00624     typedef SIPSubscribe::SubscriptionStatus SubscriptionStatus;
00625 
00628     virtual void OnSubscriptionStatus(
00629       const SubscriptionStatus & status   
00630     );
00631 
00635     virtual void OnSubscriptionStatus(
00636       const PString & eventPackage, 
00637       const SIPURL & uri,           
00638       bool wasSubscribing,          
00639       bool reSubscribing,           
00640       SIP_PDU::StatusCodes reason   
00641     );
00642 
00643     virtual void OnSubscriptionStatus(
00644       SIPSubscribeHandler & handler, 
00645       const SIPURL & uri,            
00646       bool wasSubscribing,           
00647       bool reSubscribing,            
00648       SIP_PDU::StatusCodes reason    
00649     );
00650 
00653     virtual bool CanNotify(
00654       const PString & eventPackage 
00655     );
00656 
00659     bool Notify(
00660       const SIPURL & targetAddress, 
00661       const PString & eventPackage, 
00662       const PObject & body          
00663     );
00664 
00665 
00668     virtual void OnDialogInfoReceived(
00669       const SIPDialogNotification & info  
00670     );
00671 
00672     void SendNotifyDialogInfo(
00673       const SIPDialogNotification & info  
00674     );
00675 
00676 
00679     virtual PBoolean Message(
00680       OpalIM & message
00681     );
00682 
00685     bool SendMESSAGE(
00686       SIPMessage::Params & params
00687     );
00688 
00691     virtual void OnMESSAGECompleted(
00692       const SIPMessage::Params & params,
00693       SIP_PDU::StatusCodes reason
00694     );
00695 
00696     struct ConnectionlessMessageInfo {
00697       ConnectionlessMessageInfo(OpalTransport & transport, SIP_PDU & pdu)
00698         : m_pdu(pdu), m_transport(transport), m_status(ResponseSent)
00699       { }
00700 
00701       SIP_PDU & m_pdu;
00702       OpalTransport & m_transport;
00703       enum {
00704         NotHandled,
00705         SendOK,
00706         MethodNotAllowed,
00707         ResponseSent
00708       } m_status;
00709     };
00710 
00711     typedef PNotifierTemplate<ConnectionlessMessageInfo &> ConnectionlessMessageNotifier;
00712     #define PDECLARE_ConnectionlessMessageNotifier(cls, fn) PDECLARE_NOTIFIER2(SIPEndPoint, cls, fn, SIPEndPoint::ConnectionlessMessageInfo &)
00713     #define PCREATE_ConnectionlessMessageNotifier(fn) PCREATE_NOTIFIER2(fn, SIPEndPoint::ConnectionlessMessageInfo &)
00714 
00715     void SetConnectionlessMessageNotifier(
00716       const ConnectionlessMessageNotifier & notifier
00717     )
00718     { m_onConnectionlessMessage = notifier; }
00719 
00720 
00723     virtual bool SendOPTIONS(
00724       const SIPOptions::Params & params
00725     );
00726 
00730     virtual void OnOptionsCompleted(
00731       const SIPOptions::Params & params,    
00732       const SIP_PDU & response              
00733     );
00734 
00735 
00739     bool Publish(
00740       const SIPSubscribe::Params & params,
00741       const PString & body,
00742       PString & aor
00743     );
00744     bool Publish(
00745       const PString & to,   
00746       const PString & body, 
00747       unsigned expire = 300 
00748     );
00749 
00752     PStringList GetPublications(
00753       const SIPSubscribe::EventPackage & eventPackage, 
00754       bool includeOffline = false   
00755     ) const { return activeSIPHandlers.GetAddresses(includeOffline, SIP_PDU::Method_PUBLISH, eventPackage); }
00756 
00757 
00761     bool PublishPresence(
00762       const SIPPresenceInfo & info,  
00763       unsigned expire = 300          
00764     );
00765     
00768     virtual void OnPresenceInfoReceived (
00769       const SIPPresenceInfo & info  
00770     );
00771     virtual void OnPresenceInfoReceived (
00772       const PString & identity,
00773       const PString & basic,
00774       const PString & note
00775     );
00776 
00777 
00780     PBoolean Ping(
00781       const PURL & to
00782     );
00783 
00786     SIPConnection::PRACKMode GetDefaultPRACKMode() const { return m_defaultPrackMode; }
00787 
00790     void SetDefaultPRACKMode(SIPConnection::PRACKMode mode) { m_defaultPrackMode = mode; }
00791 
00792     void SetMIMEForm(PBoolean v) { mimeForm = v; }
00793     PBoolean GetMIMEForm() const { return mimeForm; }
00794 
00795     void SetMaxRetries(unsigned r) { maxRetries = r; }
00796     unsigned GetMaxRetries() const { return maxRetries; }
00797 
00798     void SetRetryTimeouts(
00799       const PTimeInterval & t1,
00800       const PTimeInterval & t2
00801     ) { retryTimeoutMin = t1; retryTimeoutMax = t2; }
00802     const PTimeInterval & GetRetryTimeoutMin() const { return retryTimeoutMin; }
00803     const PTimeInterval & GetRetryTimeoutMax() const { return retryTimeoutMax; }
00804 
00805     void SetNonInviteTimeout(
00806       const PTimeInterval & t
00807     ) { nonInviteTimeout = t; }
00808     const PTimeInterval & GetNonInviteTimeout() const { return nonInviteTimeout; }
00809 
00810     void SetPduCleanUpTimeout(
00811       const PTimeInterval & t
00812     ) { pduCleanUpTimeout = t; }
00813     const PTimeInterval & GetPduCleanUpTimeout() const { return pduCleanUpTimeout; }
00814 
00815     void SetInviteTimeout(
00816       const PTimeInterval & t
00817     ) { inviteTimeout = t; }
00818     const PTimeInterval & GetInviteTimeout() const { return inviteTimeout; }
00819 
00820     void SetProgressTimeout(
00821       const PTimeInterval & t
00822     ) { m_progressTimeout = t; }
00823     const PTimeInterval & GetProgressTimeout() const { return m_progressTimeout; }
00824 
00825     void SetAckTimeout(
00826       const PTimeInterval & t
00827     ) { ackTimeout = t; }
00828     const PTimeInterval & GetAckTimeout() const { return ackTimeout; }
00829 
00830     void SetRegistrarTimeToLive(
00831       const PTimeInterval & t
00832     ) { registrarTimeToLive = t; }
00833     const PTimeInterval & GetRegistrarTimeToLive() const { return registrarTimeToLive; }
00834     
00835     void SetNotifierTimeToLive(
00836       const PTimeInterval & t
00837     ) { notifierTimeToLive = t; }
00838     const PTimeInterval & GetNotifierTimeToLive() const { return notifierTimeToLive; }
00839     
00840     void SetNATBindingTimeout(
00841       const PTimeInterval & t
00842     ) { natBindingTimeout = t; natBindingTimer.RunContinuous (natBindingTimeout); }
00843     const PTimeInterval & GetNATBindingTimeout() const { return natBindingTimeout; }
00844 
00845     void AddTransaction(
00846       SIPTransaction * transaction
00847     ) { transactions.SetAt(transaction->GetTransactionID(), transaction); }
00848 
00849     PSafePtr<SIPTransaction> GetTransaction(const PString & transactionID, PSafetyMode mode = PSafeReadWrite)
00850     { return transactions.FindWithLock(transactionID, mode); }
00851     
00854     unsigned GetNextCSeq() { return ++lastSentCSeq; }
00855 
00861     void SetRegisteredUserMode(bool v) { m_registeredUserMode = v; }
00862     bool GetRegisteredYserMode() const { return m_registeredUserMode; }
00863 
00866     SIP_PDU::StatusCodes HandleAuthentication(
00867       SIPAuthentication * & authentication,
00868       unsigned & authenticateErrors,
00869       const SIP_PDU & response,
00870       const SIPURL & proxyOverride,
00871       const PString & username,
00872       const PString & password
00873     );
00874     
00877     virtual SIPURL GetRegisteredProxy(const SIPURL & remoteURL);
00878 
00884     virtual SIPURL GetRegisteredPartyName(const SIPURL & remoteURL, const OpalTransport & transport);
00885 
00886 
00889     virtual SIPURL GetDefaultRegisteredPartyName(const OpalTransport & transport);
00890     
00891 
00900     void AdjustToRegistration(
00901       SIP_PDU & pdu,
00902       const OpalTransport & transport,
00903       const SIPConnection * connection
00904     );
00905 
00915     virtual SIPURL GetLocalURL(
00916        const OpalTransport & transport,             
00917        const PString & userName = PString::Empty()  
00918     );
00919     
00920     
00923     const SIPURL & GetProxy() const { return proxy; }
00924 
00925     
00928     void SetProxy(const SIPURL & url);
00929     
00930     
00933     void SetProxy(
00934       const PString & hostname,
00935       const PString & username,
00936       const PString & password
00937     );
00938 
00939     
00942     int GetDefaultAppearanceCode() const { return m_defaultAppearanceCode; }
00943 
00946     void SetDefaultAppearanceCode(int code) { m_defaultAppearanceCode = code; }
00947 
00954     virtual PString GetUserAgent() const;
00955         
00958     void SetUserAgent(const PString & str) { userAgentString = str; }
00959 
00960 
00963     virtual unsigned GetAllowedMethods() const;
00964 
00965 
00968     enum NATBindingRefreshMethod{
00969       None,
00970       Options,
00971       EmptyRequest,
00972       NumMethods
00973     };
00974 
00975 
00978     void SetNATBindingRefreshMethod(const NATBindingRefreshMethod m) { natMethod = m; }
00979 
00980     virtual SIPRegisterHandler * CreateRegisterHandler(const SIPRegister::Params & params);
00981 
00982     virtual void OnStartTransaction(SIPConnection & conn, SIPTransaction & transaction);
00983 
00984     void UpdateHandlerIndexes(SIPHandler * handler) { activeSIPHandlers.Update(handler); }
00985 
00986   protected:
00987     PDECLARE_NOTIFIER(PThread, SIPEndPoint, TransportThreadMain);
00988     PDECLARE_NOTIFIER(PTimer, SIPEndPoint, NATBindingRefresh);
00989 
00990     SIPURL        proxy;
00991     PString       userAgentString;
00992 
00993     SIPConnection::PRACKMode m_defaultPrackMode;
00994 
00995     bool          mimeForm;
00996     unsigned      maxRetries;
00997     PTimeInterval retryTimeoutMin;   // T1
00998     PTimeInterval retryTimeoutMax;   // T2
00999     PTimeInterval nonInviteTimeout;  // T3
01000     PTimeInterval pduCleanUpTimeout; // T4
01001     PTimeInterval inviteTimeout;
01002     PTimeInterval m_progressTimeout;
01003     PTimeInterval ackTimeout;
01004     PTimeInterval registrarTimeToLive;
01005     PTimeInterval notifierTimeToLive;
01006     PTimeInterval natBindingTimeout;
01007     bool          m_registeredUserMode;
01008 
01009     bool              m_shuttingDown;
01010     SIPHandlersList   activeSIPHandlers;
01011     PStringToString   m_receivedConnectionTokens;
01012 
01013     PSafeDictionary<PString, SIPTransaction> transactions;
01014 
01015     PTimer                  natBindingTimer;
01016     NATBindingRefreshMethod natMethod;
01017     PAtomicInteger          lastSentCSeq;
01018     int                     m_defaultAppearanceCode;
01019 
01020     struct RegistrationCompletion {
01021       PSyncPoint           m_sync;
01022       SIP_PDU::StatusCodes m_reason;
01023       RegistrationCompletion() : m_reason(SIP_PDU::Information_Trying) { }
01024     };
01025     std::map<PString, RegistrationCompletion> m_registrationComplete;
01026 
01027     ConnectionlessMessageNotifier m_onConnectionlessMessage;
01028 
01029     // Thread pooling
01030     class SIP_Work
01031     {
01032       public:
01033         SIP_Work(SIPEndPoint & ep, SIP_PDU * pdu, const PString & token);
01034         virtual ~SIP_Work();
01035 
01036         virtual void Work();
01037 
01038         SIPEndPoint & m_endpoint;
01039         SIP_PDU     * m_pdu;
01040         PString       m_token;
01041     };
01042 
01043     class WorkThreadPool : public PQueuedThreadPool<SIP_Work>
01044     {
01045       public:
01046         WorkThreadPool(unsigned maxWorkers)
01047           : PQueuedThreadPool<SIP_Work>(maxWorkers)
01048         { }
01049         virtual WorkerThreadBase * CreateWorkerThread();
01050     } m_connectionThreadPool, m_handlerThreadPool;
01051 
01052 
01053     // Network interface checking
01054     enum {
01055       HighPriority = 80,
01056       LowPriority  = 30,
01057     };
01058     class InterfaceMonitor : public PInterfaceMonitorClient
01059     {
01060         PCLASSINFO(InterfaceMonitor, PInterfaceMonitorClient);
01061       public:
01062         InterfaceMonitor(SIPEndPoint & manager, PINDEX priority);
01063         
01064         virtual void OnAddInterface(const PIPSocket::InterfaceEntry & entry);
01065         virtual void OnRemoveInterface(const PIPSocket::InterfaceEntry & entry);
01066 
01067       protected:
01068         SIPEndPoint & m_endpoint;
01069     };
01070     InterfaceMonitor m_highPriorityMonitor;
01071     InterfaceMonitor m_lowPriorityMonitor;
01072 
01073     friend void InterfaceMonitor::OnAddInterface(const PIPSocket::InterfaceEntry & entry);
01074     friend void InterfaceMonitor::OnRemoveInterface(const PIPSocket::InterfaceEntry & entry);
01075 
01076     bool m_disableTrying;
01077 
01078     P_REMOVE_VIRTUAL_VOID(OnReceivedIntervalTooBrief(SIPTransaction &, SIP_PDU &));
01079     P_REMOVE_VIRTUAL_VOID(OnReceivedAuthenticationRequired(SIPTransaction &, SIP_PDU &));
01080     P_REMOVE_VIRTUAL_VOID(OnReceivedOK(SIPTransaction &, SIP_PDU &));
01081     P_REMOVE_VIRTUAL_VOID(OnMessageFailed(const SIPURL &, SIP_PDU::StatusCodes));
01082 };
01083 
01084 
01085 #endif // OPAL_SIP
01086 
01087 #endif // OPAL_SIP_SIPEP_H
01088 
01089 
01090 // End of File ///////////////////////////////////////////////////////////////

Generated on 14 Aug 2013 for OPAL by  doxygen 1.4.7