sipcon.h

Go to the documentation of this file.
00001 /*
00002  * sipcon.h
00003  *
00004  * Session Initiation Protocol connection.
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: 21004 $
00028  * $Author: rjongbloed $
00029  * $Date: 2008-09-16 07:08:56 +0000 (Tue, 16 Sep 2008) $
00030  */
00031 
00032 #ifndef __OPAL_SIPCON_H
00033 #define __OPAL_SIPCON_H
00034 
00035 #ifdef P_USE_PRAGMA
00036 #pragma interface
00037 #endif
00038 
00039 #include <opal/buildopts.h>
00040 
00041 #include <opal/buildopts.h>
00042 #include <opal/rtpconn.h>
00043 #include <sip/sippdu.h>
00044 #if OPAL_VIDEO
00045 #include <opal/pcss.h>                  // for OpalPCSSConnection
00046 #include <codec/vidcodec.h>             // for OpalVideoUpdatePicture command
00047 #endif
00048 
00049 class OpalCall;
00050 class SIPEndPoint;
00051 
00052 
00054 
00057 //class SIPConnection : public OpalConnection
00058 class SIPConnection : public OpalRTPConnection
00059 {
00060   PCLASSINFO(SIPConnection, OpalRTPConnection);
00061   public:
00062 
00067     SIPConnection(
00068       OpalCall & call,                          
00069       SIPEndPoint & endpoint,                   
00070       const PString & token,                    
00071       const SIPURL & address,                   
00072       OpalTransport * transport,                
00073       unsigned int options = 0,                 
00074       OpalConnection::StringOptions * stringOptions = NULL  
00075     );
00076 
00079     ~SIPConnection();
00081 
00092     virtual bool IsNetworkConnection() const { return true; }
00093 
00096     virtual PString GetPrefixName() const;
00097 
00104     virtual PString GetRemotePartyURL() const;
00105 
00112     virtual PBoolean SetUpConnection();
00113 
00120     virtual PString GetDestinationAddress();
00121 
00129     virtual PString GetCalledPartyURL();
00130 
00137     virtual bool TransferConnection(
00138       const PString & remoteParty   
00139     );
00140 
00143     virtual bool HoldConnection();
00144 
00148     virtual bool RetrieveConnection();
00149 
00152     virtual PBoolean IsConnectionOnHold();
00153 
00164     virtual PBoolean SetAlerting(
00165       const PString & calleeName,   
00166       PBoolean withMedia
00167     );
00168 
00173     virtual PBoolean SetConnected();
00174 
00177     virtual OpalMediaFormatList GetMediaFormats() const;
00178     
00181     virtual OpalMediaStreamPtr OpenMediaStream(
00182       const OpalMediaFormat & mediaFormat, 
00183       unsigned sessionID,                  
00184       bool isSource                        
00185     );
00186 
00191     virtual bool CloseMediaStream(
00192       OpalMediaStream & stream  
00193     );
00194 
00212     virtual void OnReleased();
00213 
00223     virtual PBoolean ForwardCall(
00224       const PString & forwardParty   
00225     );
00226 
00232     virtual SendUserInputModes GetRealSendUserInputMode() const;
00233 
00250     PBoolean SendUserInputTone(char tone, unsigned duration);
00251 
00259     virtual void OnRTPStatistics(
00260       const RTP_Session & session         
00261     ) const;
00263 
00268     virtual void OnTransactionFailed(
00269       SIPTransaction & transaction
00270     );
00271 
00274     virtual void OnReceivedPDU(SIP_PDU & pdu);
00275 
00278     virtual void OnReceivedINVITE(SIP_PDU & pdu);
00279 
00282     virtual void OnReceivedReINVITE(SIP_PDU & pdu);
00283 
00286     virtual void OnReceivedACK(SIP_PDU & pdu);
00287   
00290     virtual void OnReceivedOPTIONS(SIP_PDU & pdu);
00291 
00294     virtual void OnReceivedNOTIFY(SIP_PDU & pdu);
00295 
00298     virtual void OnReceivedREFER(SIP_PDU & pdu);
00299   
00302     virtual void OnReceivedINFO(SIP_PDU & pdu);
00303 
00306     virtual void OnReceivedPING(SIP_PDU & pdu);
00307 
00310     virtual void OnReceivedBYE(SIP_PDU & pdu);
00311   
00314     virtual void OnReceivedCANCEL(SIP_PDU & pdu);
00315   
00320     virtual void OnReceivedResponseToINVITE(
00321       SIPTransaction & transaction,
00322       SIP_PDU & response
00323     );
00324 
00327     virtual void OnReceivedResponse(
00328       SIPTransaction & transaction,
00329       SIP_PDU & response
00330     );
00331 
00334     virtual void OnReceivedTrying(SIP_PDU & pdu);
00335   
00338     virtual void OnReceivedRinging(SIP_PDU & pdu);
00339   
00342     virtual void OnReceivedSessionProgress(SIP_PDU & pdu);
00343   
00347     virtual PBoolean OnReceivedAuthenticationRequired(
00348       SIPTransaction & transaction,
00349       SIP_PDU & response
00350     );
00351   
00354     virtual void OnReceivedRedirection(SIP_PDU & pdu);
00355 
00359     virtual void OnReceivedOK(
00360       SIPTransaction & transaction,
00361       SIP_PDU & response
00362     );
00363   
00366     virtual void OnCreatingINVITE(SIP_PDU & pdu);
00367 
00370     virtual PBoolean SendInviteOK(const SDPSessionDescription & sdp);
00371         
00374     virtual PBoolean SendInviteResponse(
00375       SIP_PDU::StatusCodes code,
00376       const char * contact = NULL,
00377       const char * extra = NULL,
00378       const SDPSessionDescription * sdp = NULL
00379     );
00381 
00382     unsigned GetNextCSeq() { return ++lastSentCSeq; }
00383 
00384     OpalTransportAddress GetLocalAddress(WORD port = 0) const;
00385 
00386     OpalTransport & GetTransport() const { return *transport; }
00387 
00388     SIPEndPoint & GetEndPoint() const { return endpoint; }
00389     const SIPURL & GetRequestURI() const { return m_requestURI; }
00390     const PString & GetDialogFrom() const { return m_dialogFrom; }
00391     const PString & GetDialogTo() const { return m_dialogTo; }
00392     const PStringList & GetRouteSet() const { return routeSet; }
00393     SIPAuthentication * GetAuthenticator() const { return authentication; }
00394 
00395 #if OPAL_VIDEO
00396 
00401     virtual PBoolean OnMediaControlXML(SIP_PDU & pdu);
00402 #endif
00403 
00404     virtual void OnMediaCommand(OpalMediaCommand & note, INT extra);
00405 
00406   protected:
00407     PDECLARE_NOTIFIER(PTimer, SIPConnection, OnInviteResponseRetry);
00408     PDECLARE_NOTIFIER(PTimer, SIPConnection, OnAckTimeout);
00409 
00410     void AdjustOutgoingINVITE();
00411     virtual RTP_UDP *OnUseRTPSession(
00412       const unsigned rtpSessionId,
00413       const OpalMediaType & mediaType,
00414       const OpalTransportAddress & mediaAddress,
00415       OpalTransportAddress & localAddress
00416     );
00417 
00418     virtual bool OnSendSDP(
00419       bool isAnswerSDP,
00420       OpalRTPSessionManager & rtpSessions,
00421       SDPSessionDescription & sdpOut
00422     );
00423     virtual bool OfferSDPMediaDescription(
00424       const OpalMediaType & mediaType,
00425       unsigned sessionID,
00426       OpalRTPSessionManager & rtpSessions,
00427       SDPSessionDescription & sdpOut
00428     );
00429     virtual bool AnswerSDPMediaDescription(
00430       const SDPSessionDescription & sdpIn,
00431       unsigned sessionIndex,
00432       SDPSessionDescription & sdpOut
00433     );
00434 
00435     virtual void OnReceivedSDP(
00436       SIP_PDU & pdu
00437     );
00438     virtual bool OnReceivedSDPMediaDescription(
00439       SDPSessionDescription & sdp,
00440       unsigned sessionId
00441     );
00442     friend class SIPInvite;
00443     static PBoolean WriteINVITE(OpalTransport & transport, void * param);
00444 
00445     OpalTransport * CreateTransport(const OpalTransportAddress & address, PBoolean isLocalAddress = PFalse);
00446 
00447     void UpdateRemoteAddresses(const PString & addr);
00448 
00449     SIPEndPoint         & endpoint;
00450     OpalTransport       * transport;
00451     bool                  deleteTransport;
00452 
00453     enum HoldState {
00454       eHoldOff,
00455       eRetrieveInProgress,
00456 
00457       // Order is important!
00458       eHoldOn,
00459       eHoldInProgress
00460     };
00461     HoldState             m_holdToRemote;
00462     bool                  m_holdFromRemote;
00463     PString               forwardParty;
00464 
00465     SIP_PDU             * originalInvite;
00466     PTime                 originalInviteTime;
00467 
00468     bool                  needReINVITE;
00469     PStringList           routeSet;
00470     SIPURL                m_requestURI;
00471     PString               m_dialogFrom;
00472     PString               m_dialogTo;
00473     SIPAuthentication   * authentication;
00474 
00475     std::map<SIP_PDU::Methods, unsigned> m_lastRxCSeq;
00476 
00477     PTimer                    ackTimer;
00478     PTimer                    ackRetry;
00479     SIP_PDU                   ackPacket;
00480     bool                      ackReceived;
00481     PSafePtr<SIPTransaction>  referTransaction;
00482     PSafeList<SIPTransaction> forkedInvitations; // Not for re-INVITE
00483     PAtomicInteger            lastSentCSeq;
00484 
00485     enum {
00486       ReleaseWithBYE,
00487       ReleaseWithCANCEL,
00488       ReleaseWithResponse,
00489       ReleaseWithNothing,
00490     } releaseMethod;
00491 
00492     OpalMediaFormatList remoteFormatList;
00493 
00494   protected:
00495     PTimer sessionTimer;
00496   public:
00497     PDECLARE_NOTIFIER(PTimer, SIPConnection, OnSessionTimeout);
00498 };
00499 
00500 
00503 class SIP_RTP_Session : public RTP_UserData
00504 {
00505   PCLASSINFO(SIP_RTP_Session, RTP_UserData);
00506 
00511     SIP_RTP_Session(
00512       const SIPConnection & connection  
00513     );
00515 
00524     virtual void OnTxStatistics(
00525       const RTP_Session & session   
00526     ) const;
00527 
00534     virtual void OnRxStatistics(
00535       const RTP_Session & session   
00536     ) const;
00537 
00538 #if OPAL_VIDEO
00539 
00543     virtual void OnRxIntraFrameRequest(
00544       const RTP_Session & session   
00545     ) const;
00546 
00550     virtual void OnTxIntraFrameRequest(
00551       const RTP_Session & session   
00552     ) const;
00553 #endif
00554 
00555 
00556     void OnClearCall(const RTP_Session & /*session*/);
00557 
00558   protected:
00559     const SIPConnection & connection; 
00560 };
00561 
00562 
00563 #endif // __OPAL_SIPCON_H
00564 
00565 
00566 // End of File ///////////////////////////////////////////////////////////////

Generated on Mon Sep 22 12:24:54 2008 for OPAL by  doxygen 1.5.1