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: 22531 $
00027  * $Author: csoutheren $
00028  * $Date: 2009-05-06 13:12:26 +0000 (Wed, 06 May 2009) $
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 
00112 class OpalRTPMediaSession : public OpalMediaSession
00113 {
00114   PCLASSINFO(OpalRTPMediaSession, OpalMediaSession);
00115   public:
00116     OpalRTPMediaSession(OpalConnection & conn, const OpalMediaType & mediaType, unsigned sessionId);
00117     OpalRTPMediaSession(const OpalRTPMediaSession & obj);
00118 
00119     PObject * Clone() const { return new OpalRTPMediaSession(*this); }
00120 
00121     virtual void Close();
00122 
00123     virtual bool IsActive() const { return rtpSession != NULL; }
00124 
00125     virtual bool IsRTP() const { return true; }
00126 
00127     virtual bool HasFailed() const { return (rtpSession != NULL) && (rtpSession->HasFailed() || (rtpSession->GetPacketsReceived() == 0)); }
00128 
00129     virtual OpalTransportAddress GetLocalMediaAddress() const;
00130 
00131 #if OPAL_SIP
00132     virtual SDPMediaDescription * CreateSDPMediaDescription(
00133       const OpalTransportAddress & localAddress
00134     );
00135 #endif
00136 
00137     virtual OpalMediaStream * CreateMediaStream(
00138       const OpalMediaFormat & mediaFormat, 
00139       unsigned sessionID, 
00140       PBoolean isSource
00141     );
00142 
00143     RTP_Session * rtpSession;    // RTP session
00144 };
00145 
00148 class OpalRTPSessionManager : public PObject
00149 {
00150   PCLASSINFO(OpalRTPSessionManager , PObject);
00151 
00152   public:
00157     OpalRTPSessionManager(OpalConnection & conn);
00158     ~OpalRTPSessionManager();
00159     void operator=(const OpalRTPSessionManager & other) { sessions = other.sessions; }
00161 
00170     void AddSession(
00171       RTP_Session * session,          
00172       const OpalMediaType & mediaType 
00173     );
00174     void AddMediaSession(
00175       OpalMediaSession * session,          
00176       const OpalMediaType & mediaType 
00177     );
00178 
00181     void ReleaseSession(
00182       unsigned sessionID,    
00183       PBoolean clearAll = PFalse  
00184     );
00185 
00188     RTP_Session * GetSession(
00189       unsigned sessionID    
00190     ) const;
00191     OpalMediaSession * GetMediaSession(
00192       unsigned sessionID
00193     ) const;
00195 
00196     PMutex & GetMutex() { return m_mutex; }
00197 
00198     virtual bool AllSessionsFailing();
00199 
00200   protected:
00201     OpalConnection & connection;
00202     PMutex m_mutex;
00203 
00204     PDICTIONARY(SessionDict, POrdinalKey, OpalMediaSession);
00205     SessionDict sessions;
00206 };
00207 
00208 typedef OpalRTPSessionManager RTP_SessionManager;
00209 
00213 class OpalRTPConnection : public OpalConnection
00214 {
00215   PCLASSINFO(OpalRTPConnection, OpalConnection);
00216   public:
00221     OpalRTPConnection(
00222       OpalCall & call,                         
00223       OpalRTPEndPoint & endpoint,              
00224       const PString & token,                   
00225       unsigned options = 0,                    
00226       OpalConnection::StringOptions * stringOptions = NULL     
00227     );  
00228 
00231     ~OpalRTPConnection();
00232 
00233 
00239     virtual RTP_Session * GetSession(
00240       unsigned sessionID    
00241     ) const;
00242     virtual OpalMediaSession * GetMediaSession(
00243       unsigned sessionID    
00244     ) const;
00245 
00254     virtual RTP_Session * UseSession(
00255       const OpalTransport & transport,  
00256       unsigned sessionID,               
00257       const OpalMediaType & mediatype,  
00258       RTP_QOS * rtpqos = NULL           
00259     );
00260 
00263     virtual void ReleaseSession(
00264       unsigned sessionID,    
00265       PBoolean clearAll = PFalse  
00266     );
00267 
00272     virtual RTP_Session * CreateSession(
00273       const OpalTransport & transport,
00274       unsigned sessionID,
00275       RTP_QOS * rtpqos
00276     );
00277 
00280     virtual RTP_UDP * CreateRTPSession(
00281       unsigned sessionId,
00282       bool remoteIsNat
00283     );
00285 
00287 
00289     virtual PBoolean RemoteIsNAT() const
00290     { return remoteIsNAT; }
00291 
00309     virtual PBoolean IsRTPNATEnabled(
00310       const PIPSocket::Address & localAddr,   
00311       const PIPSocket::Address & peerAddr,    
00312       const PIPSocket::Address & signalAddr,  
00313       PBoolean incoming                       
00314     );
00316 
00321     virtual void AttachRFC2833HandlerToPatch(PBoolean isSource, OpalMediaPatch & patch);
00322 
00323     virtual PBoolean SendUserInputTone(
00324       char tone,        
00325       unsigned duration = 0  
00326     );
00327 
00330     struct MediaInformation {
00331       MediaInformation() { 
00332         rfc2833  = RTP_DataFrame::IllegalPayloadType; 
00333         ciscoNSE = RTP_DataFrame::IllegalPayloadType; 
00334       }
00335 
00336       OpalTransportAddress data;           
00337       OpalTransportAddress control;        
00338       RTP_DataFrame::PayloadTypes rfc2833; 
00339       RTP_DataFrame::PayloadTypes ciscoNSE; 
00340     };
00341 
00350     virtual PBoolean GetMediaInformation(
00351       unsigned sessionID,     
00352       MediaInformation & info 
00353     ) const;
00354 
00359     virtual PBoolean IsMediaBypassPossible(
00360       unsigned sessionID                  
00361     ) const;
00362 
00375     virtual OpalMediaStream * CreateMediaStream(
00376       const OpalMediaFormat & mediaFormat, 
00377       unsigned sessionID,                  
00378       PBoolean isSource                        
00379     );
00380 
00383     virtual void OnPatchMediaStream(PBoolean isSource, OpalMediaPatch & patch);
00384 
00385     void OnMediaCommand(OpalMediaCommand & command, INT extra);
00386 
00387     PDECLARE_NOTIFIER(OpalRFC2833Info, OpalRTPConnection, OnUserInputInlineRFC2833);
00388     PDECLARE_NOTIFIER(OpalRFC2833Info, OpalRTPConnection, OnUserInputInlineCiscoNSE);
00389 
00390     virtual void SessionFailing(RTP_Session & session);
00391 
00392   protected:
00393     OpalRTPSessionManager m_rtpSessions;
00394     OpalRFC2833Proto * rfc2833Handler;
00395 #if OPAL_T38_CAPABILITY
00396     OpalRFC2833Proto * ciscoNSEHandler;
00397 #endif
00398 
00399     PBoolean remoteIsNAT;
00400     PBoolean useRTPAggregation;
00401 
00402 #ifdef OPAL_ZRTP
00403     bool zrtpEnabled;
00404     PMutex zrtpConnInfoMutex;
00405     OpalZRTPConnectionInfo * zrtpConnInfo;
00406 #endif
00407 };
00408 
00409 
00410 class RTP_UDP;
00411 
00412 class OpalSecurityMode : public PObject
00413 {
00414   PCLASSINFO(OpalSecurityMode, PObject);
00415   public:
00416     virtual RTP_UDP * CreateRTPSession(
00417       OpalRTPConnection & connection,     
00418       const RTP_Session::Params & options 
00419     ) = 0;
00420     virtual PBoolean Open() = 0;
00421 };
00422 
00423 #endif // OPAL_OPAL_RTPCONN_H

Generated on Mon Feb 1 00:25:54 2010 for OPAL by  doxygen 1.5.1