OPAL  Version 3.10.4
rtpconn.h
Go to the documentation of this file.
00001 /*
00002  * rtpconn.h
00003  *
00004  * Connection abstraction
00005  *
00006  * Open Phone Abstraction Library (OPAL)
00007  *
00008  * Copyright (C) 2007 Post Increment
00009  *
00010  * The contents of this file are subject to the Mozilla Public License
00011  * Version 1.0 (the "License"); you may not use this file except in
00012  * compliance with the License. You may obtain a copy of the License at
00013  * http://www.mozilla.org/MPL/
00014  *
00015  * Software distributed under the License is distributed on an "AS IS"
00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00017  * the License for the specific language governing rights and limitations
00018  * under the License.
00019  *
00020  * The Original Code is Open Phone Abstraction Library.
00021  *
00022  * The Initial Developer of the Original Code is Post Increment
00023  *
00024  * Contributor(s): ______________________________________.
00025  *
00026  * $Revision: 26728 $
00027  * $Author: rjongbloed $
00028  * $Date: 2011-12-01 22:59:14 -0600 (Thu, 01 Dec 2011) $
00029  */
00030 
00031 #ifndef OPAL_OPAL_RTPCONN_H
00032 #define OPAL_OPAL_RTPCONN_H
00033 
00034 #ifdef P_USE_PRAGMA
00035 #pragma interface
00036 #endif
00037 
00038 #include <opal/buildopts.h>
00039 
00040 #include <opal/connection.h>
00041 #include <opal/mediatype.h>
00042 
00043 #ifdef OPAL_ZRTP
00044 
00045 class OpalZRTPStreamInfo {
00046   public:
00047     virtual bool Open() = 0;
00048     virtual RTP_UDP * CreateRTPSession(OpalConnection & conn, unsigned sessionId, bool remoteIsNat) = 0;
00049 };
00050 
00051 class OpalZRTPConnectionInfo {
00052   public:
00053     virtual bool Open() = 0;
00054     virtual RTP_UDP * CreateRTPSession(OpalConnection & conn, unsigned sessionId, bool remoteIsNat) = 0;
00055 
00056     PMutex mutex;
00057 };
00058 
00059 #endif // OPAL_ZRTP
00060 
00061 
00062 class OpalRTPEndPoint;
00063 
00064 //#ifdef HAS_LIBZRTP
00065 //#ifndef __ZRTP_TYPES_H__
00066 //struct zrtp_conn_ctx_t;
00067 //#endif
00068 //#endif
00069 
00072 class OpalMediaSession : public PObject
00073 {
00074     PCLASSINFO(OpalMediaSession, PObject);
00075   public:
00076     OpalMediaSession(OpalConnection & conn, const OpalMediaType & _mediaType, unsigned sessionId);
00077     OpalMediaSession(const OpalMediaSession & _obj);
00078 
00079     virtual void Close() = 0;
00080 
00081     virtual PObject * Clone() const = 0;
00082 
00083     virtual bool IsActive() const = 0;
00084 
00085     virtual bool IsRTP() const = 0;
00086 
00087     virtual bool HasFailed() const = 0;
00088 
00089     virtual OpalTransportAddress GetLocalMediaAddress() const = 0;
00090 
00091     virtual void SetRemoteMediaAddress(const OpalTransportAddress &, const OpalMediaFormatList & ) { }
00092 
00093 #if OPAL_SIP
00094     virtual SDPMediaDescription * CreateSDPMediaDescription(
00095       const OpalTransportAddress & localAddress
00096     ) = 0;
00097 #endif
00098 
00099     virtual OpalMediaStream * CreateMediaStream(
00100       const OpalMediaFormat & mediaFormat, 
00101       unsigned sessionID, 
00102       PBoolean isSource
00103     ) = 0;
00104 
00105     OpalConnection & connection;
00106     OpalMediaType mediaType;     // media type for session
00107     unsigned sessionId;          // unique session ID
00108 };
00109 
00110 
00113 class OpalRTPMediaSession : public OpalMediaSession
00114 {
00115   PCLASSINFO(OpalRTPMediaSession, OpalMediaSession);
00116   public:
00117     OpalRTPMediaSession(
00118       OpalConnection & conn,
00119       const OpalMediaType & mediaType,
00120       unsigned sessionId
00121     );
00122     OpalRTPMediaSession(const OpalRTPMediaSession & obj);
00123     ~OpalRTPMediaSession();
00124 
00125     PObject * Clone() const { return new OpalRTPMediaSession(*this); }
00126 
00127     void Attach(RTP_Session * rtpSession);
00128 
00129     virtual void Close();
00130 
00131     virtual bool IsActive() const { return rtpSession != NULL; }
00132 
00133     virtual bool IsRTP() const { return true; }
00134 
00135     virtual bool HasFailed() const { return (rtpSession != NULL) && (rtpSession->HasFailed() || (rtpSession->GetPacketsReceived() == 0)); }
00136 
00137     virtual OpalTransportAddress GetLocalMediaAddress() const;
00138 
00139 #if OPAL_SIP
00140     virtual SDPMediaDescription * CreateSDPMediaDescription(
00141       const OpalTransportAddress & localAddress
00142     );
00143 #endif
00144 
00145     virtual OpalMediaStream * CreateMediaStream(
00146       const OpalMediaFormat & mediaFormat, 
00147       unsigned sessionID, 
00148       PBoolean isSource
00149     );
00150 
00151     RTP_Session * GetSession() const { return rtpSession; }
00152 
00153   protected:
00154     RTP_Session * rtpSession;    // RTP session
00155 };
00156 
00159 class OpalRTPSessionManager : public PObject
00160 {
00161     PCLASSINFO(OpalRTPSessionManager , PObject);
00162   public:
00167     OpalRTPSessionManager(
00168       OpalRTPConnection & connection 
00169     );
00170 
00172     ~OpalRTPSessionManager();
00173 
00175     OpalRTPSessionManager(const OpalRTPSessionManager & other);
00176 
00178     void operator=(const OpalRTPSessionManager & other) { sessions = other.sessions; }
00180 
00185     unsigned GetNextSessionID();
00186 
00193     void AddSession(
00194       RTP_Session * session,          
00195       const OpalMediaType & mediaType 
00196     );
00197     void AddMediaSession(
00198       OpalMediaSession * session,          
00199       const OpalMediaType & mediaType 
00200     );
00201 
00204     virtual void CloseSession(
00205       unsigned sessionID     
00206     );
00207 
00210     RTP_Session * GetSession(
00211       unsigned sessionID    
00212     ) const;
00213     OpalMediaSession * GetMediaSession(
00214       unsigned sessionID
00215     ) const;
00216 
00222     bool ChangeSessionID(
00223       unsigned fromSessionID,   
00224       unsigned toSessionID      
00225     );
00227 
00228     PMutex & GetMutex() { return m_mutex; }
00229 
00230     virtual bool AllSessionsFailing();
00231 
00232   protected:
00233     OpalRTPConnection & m_connection;
00234     PMutex m_mutex;
00235 
00236     PDICTIONARY(SessionDict, POrdinalKey, OpalMediaSession);
00237     SessionDict sessions;
00238 };
00239 
00240 
00241 typedef OpalRTPSessionManager RTP_SessionManager;
00242 
00243 
00247 class OpalRTPConnection : public OpalConnection
00248 {
00249     PCLASSINFO(OpalRTPConnection, OpalConnection);
00250   public:
00255     OpalRTPConnection(
00256       OpalCall & call,                         
00257       OpalRTPEndPoint & endpoint,              
00258       const PString & token,                   
00259       unsigned options = 0,                    
00260       OpalConnection::StringOptions * stringOptions = NULL     
00261     );  
00262 
00265     ~OpalRTPConnection();
00266 
00284     virtual void OnReleased();
00286 
00287 
00292     virtual unsigned GetNextSessionID(
00293       const OpalMediaType & mediaType,   
00294       bool isSource                      
00295     );
00296 
00300     virtual RTP_Session * GetSession(
00301       unsigned sessionID    
00302     ) const;
00303     virtual OpalMediaSession * GetMediaSession(
00304       unsigned sessionID    
00305     ) const;
00306 
00315     virtual RTP_Session * UseSession(
00316       const OpalTransport & transport,  
00317       unsigned sessionID,               
00318       const OpalMediaType & mediatype,  
00319       RTP_QOS * rtpqos = NULL           
00320     );
00321 
00324     virtual void CloseSession(
00325       unsigned sessionID     
00326     );
00327 
00332     virtual RTP_Session * CreateSession(
00333       const OpalTransport & transport,
00334       unsigned sessionID,
00335       const OpalMediaType & mediaType,
00336       RTP_QOS * rtpqos
00337     );
00338 
00341     virtual RTP_UDP * CreateRTPSession(
00342       unsigned sessionId,
00343       const OpalMediaType & mediaType,
00344       bool remoteIsNat
00345     );
00346 
00352     virtual bool ChangeSessionID(
00353       unsigned fromSessionID,   
00354       unsigned toSessionID      
00355     );
00357 
00362     virtual PBoolean RemoteIsNAT() const
00363     { return remoteIsNAT; }
00364 
00382     virtual PBoolean IsRTPNATEnabled(
00383       const PIPSocket::Address & localAddr,   
00384       const PIPSocket::Address & peerAddr,    
00385       const PIPSocket::Address & signalAddr,  
00386       PBoolean incoming                       
00387     );
00389 
00394     virtual void AttachRFC2833HandlerToPatch(PBoolean isSource, OpalMediaPatch & patch);
00395 
00396     virtual PBoolean SendUserInputTone(
00397       char tone,        
00398       unsigned duration = 0  
00399     );
00400 
00403     struct MediaInformation {
00404       MediaInformation() { 
00405         rfc2833  = RTP_DataFrame::IllegalPayloadType; 
00406         ciscoNSE = RTP_DataFrame::IllegalPayloadType; 
00407       }
00408 
00409       OpalTransportAddress data;           
00410       OpalTransportAddress control;        
00411       RTP_DataFrame::PayloadTypes rfc2833; 
00412       RTP_DataFrame::PayloadTypes ciscoNSE; 
00413     };
00415 
00426     virtual PBoolean GetMediaInformation(
00427       unsigned sessionID,     
00428       MediaInformation & info 
00429     ) const;
00430 
00435     virtual PBoolean IsMediaBypassPossible(
00436       unsigned sessionID                  
00437     ) const;
00438 
00451     virtual OpalMediaStream * CreateMediaStream(
00452       const OpalMediaFormat & mediaFormat, 
00453       unsigned sessionID,                  
00454       PBoolean isSource                        
00455     );
00456 
00470     virtual void AdjustMediaFormats(
00471       bool local,                             
00472       const OpalConnection * otherConnection, 
00473       OpalMediaFormatList & mediaFormats      
00474     ) const;
00475 
00484     virtual void OnPatchMediaStream(
00485       PBoolean isSource,        
00486       OpalMediaPatch & patch    
00487     );
00488 
00494     virtual bool OnMediaCommand(
00495       OpalMediaStream & stream,         
00496       const OpalMediaCommand & command  
00497     );
00499 
00500     virtual void SessionFailing(RTP_Session & session);
00501 
00502   protected:
00503     PDECLARE_NOTIFIER(OpalRFC2833Info, OpalRTPConnection, OnUserInputInlineRFC2833);
00504     PDECLARE_NOTIFIER(OpalRFC2833Info, OpalRTPConnection, OnUserInputInlineCiscoNSE);
00505 
00506     OpalRTPSessionManager m_rtpSessions;
00507     OpalRFC2833Proto * rfc2833Handler;
00508 #if OPAL_T38_CAPABILITY
00509     OpalRFC2833Proto * ciscoNSEHandler;
00510 #endif
00511 
00512     PBoolean remoteIsNAT;
00513     PBoolean useRTPAggregation;
00514 
00515 #ifdef OPAL_ZRTP
00516     bool zrtpEnabled;
00517     PMutex zrtpConnInfoMutex;
00518     OpalZRTPConnectionInfo * zrtpConnInfo;
00519 #endif
00520 };
00521 
00522 
00523 class RTP_UDP;
00524 
00525 class OpalSecurityMode : public PObject
00526 {
00527   PCLASSINFO(OpalSecurityMode, PObject);
00528   public:
00529     virtual RTP_UDP * CreateRTPSession(
00530       OpalRTPConnection & connection,     
00531       const RTP_Session::Params & options 
00532     ) = 0;
00533     virtual PBoolean Open() = 0;
00534 };
00535 
00536 #endif // OPAL_OPAL_RTPCONN_H