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: 24807 $
00030  * $Author: rjongbloed $
00031  * $Date: 2010-10-19 23:33:34 -0500 (Tue, 19 Oct 2010) $
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 void OnMediaCommand(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 
00563     virtual PBoolean SetDynamicRTPPayloadType(
00564       int newType  
00565     );
00566 
00567     RTP_DataFrame::PayloadTypes GetDynamicRTPPayloadType() const { return rtpPayloadType; }
00569 
00570   protected:
00571     RTP_DataFrame::PayloadTypes rtpPayloadType;
00572 };
00573 
00574 
00576 
00579 class H323_RTPChannel : public H323_RealTimeChannel
00580 {
00581   PCLASSINFO(H323_RTPChannel, H323_RealTimeChannel);
00582 
00583   public:
00588     H323_RTPChannel(
00589       H323Connection & connection,        
00590       const H323Capability & capability,  
00591       Directions direction,               
00592       RTP_Session & rtp                   
00593     );
00594 
00596     ~H323_RTPChannel();
00598 
00605     virtual unsigned GetSessionID() const;
00606 
00613     virtual bool SetSessionID(
00614       unsigned sessionID   
00615     );
00617 
00622     virtual PBoolean OnSendingPDU(
00623       H245_H2250LogicalChannelParameters & param  
00624     ) const;
00625 
00629     virtual void OnSendOpenAck(
00630       H245_H2250LogicalChannelAckParameters & param 
00631     ) const;
00632 
00639     virtual PBoolean OnReceivedPDU(
00640       const H245_H2250LogicalChannelParameters & param, 
00641       unsigned & errorCode                              
00642     );
00643 
00650     virtual PBoolean OnReceivedAckPDU(
00651       const H245_H2250LogicalChannelAckParameters & param 
00652     );
00654 
00655   protected:
00656     RTP_Session      & rtpSession;
00657     H323_RTP_Session & rtpCallbacks;
00658 };
00659 
00660 
00662 
00666 class H323_ExternalRTPChannel : public H323_RealTimeChannel
00667 {
00668   PCLASSINFO(H323_ExternalRTPChannel, H323_RealTimeChannel);
00669 
00670   public:
00675     H323_ExternalRTPChannel(
00676       H323Connection & connection,        
00677       const H323Capability & capability,  
00678       Directions direction,               
00679       unsigned sessionID                  
00680     );
00683     H323_ExternalRTPChannel(
00684       H323Connection & connection,        
00685       const H323Capability & capability,  
00686       Directions direction,               
00687       unsigned sessionID,                 
00688       const H323TransportAddress & data,  
00689       const H323TransportAddress & control
00690     );
00693     H323_ExternalRTPChannel(
00694       H323Connection & connection,        
00695       const H323Capability & capability,  
00696       Directions direction,               
00697       unsigned sessionID,                 
00698       const PIPSocket::Address & ip,      
00699       WORD dataPort                       
00700     );
00702 
00709     virtual unsigned GetSessionID() const;
00710 
00717     virtual PBoolean GetMediaTransportAddress(
00718       OpalTransportAddress & data,        
00719       OpalTransportAddress & control      
00720     ) const;
00721 
00724     virtual PBoolean Start();
00725 
00732     virtual void Receive();
00733 
00740     virtual void Transmit();
00742 
00747     virtual PBoolean OnSendingPDU(
00748       H245_H2250LogicalChannelParameters & param  
00749     ) const;
00750 
00754     virtual void OnSendOpenAck(
00755       H245_H2250LogicalChannelAckParameters & param 
00756     ) const;
00757 
00764     virtual PBoolean OnReceivedPDU(
00765       const H245_H2250LogicalChannelParameters & param, 
00766       unsigned & errorCode                              
00767     );
00768 
00775     virtual PBoolean OnReceivedAckPDU(
00776       const H245_H2250LogicalChannelAckParameters & param 
00777     );
00779 
00780     void SetExternalAddress(
00781       const H323TransportAddress & data,  
00782       const H323TransportAddress & control
00783     );
00784 
00785     const H323TransportAddress & GetRemoteMediaAddress()        const { return remoteMediaAddress; }
00786     const H323TransportAddress & GetRemoteMediaControlAddress() const { return remoteMediaControlAddress; }
00787 
00788     PBoolean GetRemoteAddress(
00789       PIPSocket::Address & ip,
00790       WORD & dataPort
00791     ) const;
00792 
00793   protected:
00794     void Construct(H323Connection & conn, unsigned id);
00795 
00796     unsigned             sessionID;
00797     H323TransportAddress externalMediaAddress;
00798     H323TransportAddress externalMediaControlAddress;
00799     H323TransportAddress remoteMediaAddress;
00800     H323TransportAddress remoteMediaControlAddress;
00801 };
00802 
00803 
00805 
00812 class H323DataChannel : public H323UnidirectionalChannel
00813 {
00814   PCLASSINFO(H323DataChannel, H323UnidirectionalChannel);
00815 
00816   public:
00821     H323DataChannel(
00822       H323Connection & connection,        
00823       const H323Capability & capability,  
00824       Directions direction,               
00825       unsigned sessionID                  
00826     );
00827 
00830     ~H323DataChannel();
00832 
00839     virtual unsigned GetSessionID() const;
00840 
00843     virtual PBoolean OnSendingPDU(
00844       H245_OpenLogicalChannel & openPDU  
00845     ) const;
00846 
00850     virtual void OnSendOpenAck(
00851       const H245_OpenLogicalChannel & open,   
00852       H245_OpenLogicalChannelAck & ack        
00853     ) const;
00854 
00862     virtual PBoolean OnReceivedPDU(
00863       const H245_OpenLogicalChannel & pdu,    
00864       unsigned & errorCode                    
00865     );
00866 
00874     virtual PBoolean OnReceivedAckPDU(
00875       const H245_OpenLogicalChannelAck & pdu 
00876     );
00878 
00887     virtual PBoolean CreateListener();
00888 
00896     virtual PBoolean CreateTransport();
00898 
00899   protected:
00900     virtual void InternalClose();
00901 
00902     unsigned        sessionID;
00903     H323Listener  * listener;
00904     PBoolean            autoDeleteListener;
00905     H323Transport * transport;
00906     PBoolean            autoDeleteTransport;
00907     PBoolean            separateReverseChannel;
00908 };
00909 
00910 
00911 #endif // OPAL_H323
00912 
00913 #endif // OPAL_H323_CHANNELS_H
00914 
00915 

Generated on Sun Nov 21 20:20:50 2010 for OPAL by  doxygen 1.4.7