channels.h

Go to the documentation of this file.
00001 /*
00002  * channels.h
00003  *
00004  * H.323 protocol handler
00005  *
00006  * Open H323 Library
00007  *
00008  * Copyright (c) 1998-2001 Equivalence Pty. Ltd.
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 H323 Library.
00021  *
00022  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
00023  *
00024  * Portions of this code were written with the assisance of funding from
00025  * Vovida Networks, Inc. http://www.vovida.com.
00026  *
00027  * Contributor(s): ______________________________________.
00028  *
00029  * $Revision: 27619 $
00030  * $Author: rjongbloed $
00031  * $Date: 2012-05-13 20:16:44 -0500 (Sun, 13 May 2012) $
00032  */
00033 
00034 #ifndef OPAL_H323_CHANNELS_H
00035 #define OPAL_H323_CHANNELS_H
00036 
00037 #ifdef P_USE_PRAGMA
00038 #pragma interface
00039 #endif
00040 
00041 #include <opal/buildopts.h>
00042 
00043 #if OPAL_H323
00044 
00045 #include <rtp/rtp.h>
00046 #include <h323/transaddr.h>
00047 #include <opal/mediastrm.h>
00048 
00049 
00050 class H245_OpenLogicalChannel;
00051 class H245_OpenLogicalChannelAck;
00052 class H245_OpenLogicalChannel_forwardLogicalChannelParameters;
00053 class H245_OpenLogicalChannel_reverseLogicalChannelParameters;
00054 class H245_H2250LogicalChannelParameters;
00055 class H245_H2250LogicalChannelAckParameters;
00056 class H245_MiscellaneousCommand_type;
00057 class H245_MiscellaneousIndication_type;
00058 
00059 class H323EndPoint;
00060 class H323Connection;
00061 class H323Capability;
00062 class H323_RTP_Session;
00063 
00064 
00066 
00070 class H323ChannelNumber : public PObject
00071 {
00072   PCLASSINFO(H323ChannelNumber, PObject);
00073 
00074   public:
00075     H323ChannelNumber() { number = 0; fromRemote = false; }
00076     H323ChannelNumber(unsigned number, PBoolean fromRemote);
00077 
00078     virtual PObject * Clone() const;
00079     virtual PINDEX HashFunction() const;
00080     virtual void PrintOn(ostream & strm) const;
00081     virtual Comparison Compare(const PObject & obj) const;
00082 
00083     H323ChannelNumber & operator++(int);
00084     operator unsigned() const { return number; }
00085     PBoolean IsFromRemote() const { return fromRemote; }
00086     
00087   protected:
00088     unsigned number;
00089     PBoolean     fromRemote;
00090 };
00091 
00092 
00099 class H323Channel : public PObject
00100 {
00101   PCLASSINFO(H323Channel, PObject);
00102 
00103   public:
00108     H323Channel(
00109       H323Connection & connection,        
00110       const H323Capability & capability   
00111     );
00112 
00117     ~H323Channel();
00119 
00122     virtual void PrintOn(
00123       ostream & strm
00124     ) const;
00126 
00129     enum Directions {
00130       IsBidirectional,
00131       IsTransmitter,
00132       IsReceiver,
00133       NumDirections
00134     };
00135 #if PTRACING
00136     friend ostream & operator<<(ostream & out, Directions dir);
00137 #endif
00138 
00143     virtual Directions GetDirection() const = 0;
00144 
00150     virtual unsigned GetSessionID() const;
00151 
00158     virtual bool SetSessionID(
00159       unsigned sessionID   
00160     );
00161 
00168     virtual PBoolean GetMediaTransportAddress(
00169       OpalTransportAddress & data,        
00170       OpalTransportAddress & control      
00171     ) const;
00172 
00180     virtual PBoolean SetInitialBandwidth() = 0;
00181 
00186     virtual PBoolean Open();
00187 
00190     virtual PBoolean Start() = 0;
00191 
00194     virtual void Close();
00195 
00198     PBoolean IsOpen() const { return opened && m_terminating == 0; }
00199 
00207     virtual OpalMediaStreamPtr GetMediaStream() const;
00208 
00209 
00212     virtual PBoolean OnSendingPDU(
00213       H245_OpenLogicalChannel & openPDU  
00214     ) const = 0;
00215 
00221     virtual void OnSendOpenAck(
00222       const H245_OpenLogicalChannel & open,   
00223       H245_OpenLogicalChannelAck & ack        
00224     ) const;
00225 
00232     virtual PBoolean OnReceivedPDU(
00233       const H245_OpenLogicalChannel & pdu,    
00234       unsigned & errorCode                    
00235     );
00236 
00243     virtual PBoolean OnReceivedAckPDU(
00244       const H245_OpenLogicalChannelAck & pdu  
00245     );
00246 
00250     virtual void OnFlowControl(
00251       long bitRateRestriction   
00252     );
00253 
00257     virtual void OnMiscellaneousCommand(
00258       const H245_MiscellaneousCommand_type & type  
00259     );
00260 
00264     virtual void OnMiscellaneousIndication(
00265       const H245_MiscellaneousIndication_type & type  
00266     );
00267 
00271     virtual void OnJitterIndication(
00272       DWORD jitter,           
00273       int skippedFrameCount,  
00274       int additionalBuffer    
00275     );
00277 
00282     const H323ChannelNumber & GetNumber() const { return number; }
00283 
00286     void SetNumber(const H323ChannelNumber & num) { number = num; }
00287 
00290     const H323ChannelNumber & GetReverseChannel() const { return reverseChannel; }
00291 
00294     void SetReverseChannel(const H323ChannelNumber & num) { reverseChannel = num; }
00295 
00298     unsigned GetBandwidthUsed() const { return bandwidthUsed; }
00299 
00302     PBoolean SetBandwidthUsed(
00303       unsigned bandwidth  
00304     );
00305 
00308     const H323Capability & GetCapability() const { return *capability; }
00309 
00318     PBoolean IsPaused() const { return paused; }
00319 
00328     void SetPause(
00329       PBoolean pause   
00330     ) { paused = pause; }
00332 
00333     virtual bool OnMediaCommand(const OpalMediaCommand &);
00334 
00335   protected:
00336     virtual void InternalClose();
00337 
00338     H323EndPoint         & endpoint;
00339     H323Connection       & connection;
00340     H323Capability       * capability;
00341     H323ChannelNumber      number;
00342     H323ChannelNumber      reverseChannel;
00343     bool                   opened;
00344     bool                   paused;
00345     PAtomicInteger         m_terminating;
00346 
00347   private:
00348     unsigned bandwidthUsed;
00349 };
00350 
00351 
00352 PLIST(H323LogicalChannelList, H323Channel);
00353 
00354 
00355 
00362 class H323UnidirectionalChannel : public H323Channel
00363 {
00364   PCLASSINFO(H323UnidirectionalChannel, H323Channel);
00365 
00366   public:
00371     H323UnidirectionalChannel(
00372       H323Connection & connection,        
00373       const H323Capability & capability,  
00374       Directions direction                
00375     );
00376 
00379     ~H323UnidirectionalChannel();
00381 
00388     virtual Directions GetDirection() const;
00389 
00397     virtual PBoolean SetInitialBandwidth();
00398 
00401     virtual PBoolean Open();
00402 
00407     virtual PBoolean Start();
00409 
00415     virtual OpalMediaStreamPtr GetMediaStream() const;
00417 
00418 
00419   protected:
00420     virtual void InternalClose();
00421 
00422     bool               receiver;
00423     OpalMediaStreamPtr mediaStream;
00424 };
00425 
00426 
00433 class H323BidirectionalChannel : public H323Channel
00434 {
00435   PCLASSINFO(H323BidirectionalChannel, H323Channel);
00436 
00437   public:
00442     H323BidirectionalChannel(
00443       H323Connection & connection,        
00444       const H323Capability & capability   
00445     );
00447 
00454     virtual Directions GetDirection() const;
00455 
00460     virtual PBoolean Start();
00462 };
00463 
00464 
00466 
00469 class H323_RealTimeChannel : public H323UnidirectionalChannel
00470 {
00471   PCLASSINFO(H323_RealTimeChannel, H323UnidirectionalChannel);
00472 
00473   public:
00478     H323_RealTimeChannel(
00479       H323Connection & connection,        
00480       const H323Capability & capability,  
00481       Directions direction                
00482     );
00484 
00489     virtual PBoolean OnSendingPDU(
00490       H245_OpenLogicalChannel & openPDU  
00491     ) const;
00492 
00496     virtual void OnSendOpenAck(
00497       const H245_OpenLogicalChannel & open,   
00498       H245_OpenLogicalChannelAck & ack        
00499     ) const;
00500 
00508     virtual PBoolean OnReceivedPDU(
00509       const H245_OpenLogicalChannel & pdu,    
00510       unsigned & errorCode                    
00511     );
00512 
00520     virtual PBoolean OnReceivedAckPDU(
00521       const H245_OpenLogicalChannelAck & pdu 
00522     );
00524 
00529     virtual PBoolean OnSendingPDU(
00530       H245_H2250LogicalChannelParameters & param  
00531     ) const;
00532 
00536     virtual void OnSendOpenAck(
00537       H245_H2250LogicalChannelAckParameters & param 
00538     ) const;
00539 
00546     virtual PBoolean OnReceivedPDU(
00547       const H245_H2250LogicalChannelParameters & param, 
00548       unsigned & errorCode                              
00549     );
00550 
00557     virtual PBoolean OnReceivedAckPDU(
00558       const H245_H2250LogicalChannelAckParameters & param 
00559     );
00560 
00561     RTP_DataFrame::PayloadTypes GetDynamicRTPPayloadType() const;
00563 };
00564 
00565 
00567 
00570 class H323_RTPChannel : public H323_RealTimeChannel
00571 {
00572   PCLASSINFO(H323_RTPChannel, H323_RealTimeChannel);
00573 
00574   public:
00579     H323_RTPChannel(
00580       H323Connection & connection,        
00581       const H323Capability & capability,  
00582       Directions direction,               
00583       RTP_Session & rtp                   
00584     );
00585 
00587     ~H323_RTPChannel();
00589 
00596     virtual unsigned GetSessionID() const;
00597 
00604     virtual bool SetSessionID(
00605       unsigned sessionID   
00606     );
00608 
00613     virtual PBoolean OnSendingPDU(
00614       H245_H2250LogicalChannelParameters & param  
00615     ) const;
00616 
00620     virtual void OnSendOpenAck(
00621       H245_H2250LogicalChannelAckParameters & param 
00622     ) const;
00623 
00630     virtual PBoolean OnReceivedPDU(
00631       const H245_H2250LogicalChannelParameters & param, 
00632       unsigned & errorCode                              
00633     );
00634 
00641     virtual PBoolean OnReceivedAckPDU(
00642       const H245_H2250LogicalChannelAckParameters & param 
00643     );
00645 
00646   protected:
00647     RTP_Session      & rtpSession;
00648     H323_RTP_Session & rtpCallbacks;
00649 };
00650 
00651 
00653 
00657 class H323_ExternalRTPChannel : public H323_RealTimeChannel
00658 {
00659   PCLASSINFO(H323_ExternalRTPChannel, H323_RealTimeChannel);
00660 
00661   public:
00666     H323_ExternalRTPChannel(
00667       H323Connection & connection,        
00668       const H323Capability & capability,  
00669       Directions direction,               
00670       unsigned sessionID                  
00671     );
00674     H323_ExternalRTPChannel(
00675       H323Connection & connection,        
00676       const H323Capability & capability,  
00677       Directions direction,               
00678       unsigned sessionID,                 
00679       const H323TransportAddress & data,  
00680       const H323TransportAddress & control
00681     );
00684     H323_ExternalRTPChannel(
00685       H323Connection & connection,        
00686       const H323Capability & capability,  
00687       Directions direction,               
00688       unsigned sessionID,                 
00689       const PIPSocket::Address & ip,      
00690       WORD dataPort                       
00691     );
00693 
00700     virtual unsigned GetSessionID() const;
00701 
00708     virtual PBoolean GetMediaTransportAddress(
00709       OpalTransportAddress & data,        
00710       OpalTransportAddress & control      
00711     ) const;
00712 
00715     virtual PBoolean Start();
00716 
00723     virtual void Receive();
00724 
00731     virtual void Transmit();
00733 
00738     virtual PBoolean OnSendingPDU(
00739       H245_H2250LogicalChannelParameters & param  
00740     ) const;
00741 
00745     virtual void OnSendOpenAck(
00746       H245_H2250LogicalChannelAckParameters & param 
00747     ) const;
00748 
00755     virtual PBoolean OnReceivedPDU(
00756       const H245_H2250LogicalChannelParameters & param, 
00757       unsigned & errorCode                              
00758     );
00759 
00766     virtual PBoolean OnReceivedAckPDU(
00767       const H245_H2250LogicalChannelAckParameters & param 
00768     );
00770 
00771     void SetExternalAddress(
00772       const H323TransportAddress & data,  
00773       const H323TransportAddress & control
00774     );
00775 
00776     const H323TransportAddress & GetRemoteMediaAddress()        const { return remoteMediaAddress; }
00777     const H323TransportAddress & GetRemoteMediaControlAddress() const { return remoteMediaControlAddress; }
00778 
00779     PBoolean GetRemoteAddress(
00780       PIPSocket::Address & ip,
00781       WORD & dataPort
00782     ) const;
00783 
00784   protected:
00785     void Construct(H323Connection & conn, unsigned id);
00786 
00787     unsigned             sessionID;
00788     H323TransportAddress externalMediaAddress;
00789     H323TransportAddress externalMediaControlAddress;
00790     H323TransportAddress remoteMediaAddress;
00791     H323TransportAddress remoteMediaControlAddress;
00792 };
00793 
00794 
00796 
00803 class H323DataChannel : public H323UnidirectionalChannel
00804 {
00805   PCLASSINFO(H323DataChannel, H323UnidirectionalChannel);
00806 
00807   public:
00812     H323DataChannel(
00813       H323Connection & connection,        
00814       const H323Capability & capability,  
00815       Directions direction,               
00816       unsigned sessionID                  
00817     );
00818 
00821     ~H323DataChannel();
00823 
00830     virtual unsigned GetSessionID() const;
00831 
00834     virtual PBoolean OnSendingPDU(
00835       H245_OpenLogicalChannel & openPDU  
00836     ) const;
00837 
00841     virtual void OnSendOpenAck(
00842       const H245_OpenLogicalChannel & open,   
00843       H245_OpenLogicalChannelAck & ack        
00844     ) const;
00845 
00853     virtual PBoolean OnReceivedPDU(
00854       const H245_OpenLogicalChannel & pdu,    
00855       unsigned & errorCode                    
00856     );
00857 
00865     virtual PBoolean OnReceivedAckPDU(
00866       const H245_OpenLogicalChannelAck & pdu 
00867     );
00869 
00878     virtual PBoolean CreateListener();
00879 
00887     virtual PBoolean CreateTransport();
00889 
00890   protected:
00891     virtual void InternalClose();
00892 
00893     unsigned        sessionID;
00894     H323Listener  * listener;
00895     PBoolean            autoDeleteListener;
00896     H323Transport * transport;
00897     PBoolean            autoDeleteTransport;
00898     PBoolean            separateReverseChannel;
00899 };
00900 
00901 
00902 #endif // OPAL_H323
00903 
00904 #endif // OPAL_H323_CHANNELS_H
00905 
00906 

Generated on 14 Aug 2013 for OPAL by  doxygen 1.4.7