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  * $Log: channels.h,v $
00030  * Revision 2.16  2007/03/29 05:15:48  csoutheren
00031  * Pass OpalConnection to OpalMediaSream constructor
00032  * Add ID to OpalMediaStreams so that transcoders can match incoming and outgoing codecs
00033  *
00034  * Revision 2.15  2006/08/10 05:10:30  csoutheren
00035  * Various H.323 stability patches merged in from DeimosPrePLuginBranch
00036  *
00037  * Revision 2.14.6.1  2006/08/09 12:49:21  csoutheren
00038  * Improve stablity under heavy H.323 load
00039  *
00040  * Revision 2.14  2005/11/30 13:35:26  csoutheren
00041  * Changed tags for Doxygen
00042  *
00043  * Revision 2.13  2005/09/04 06:23:38  rjongbloed
00044  * Added OpalMediaCommand mechanism (via PNotifier) for media streams
00045  *   and media transcoders to send commands back to remote.
00046  *
00047  * Revision 2.12  2005/08/31 13:19:25  rjongbloed
00048  * Added mechanism for controlling media (especially codecs) including
00049  *   changing the OpalMediaFormat option list (eg bit rate) and a completely
00050  *   new OpalMediaCommand abstraction for things like video fast update.
00051  *
00052  * Revision 2.11  2002/11/10 11:33:16  robertj
00053  * Updated to OpenH323 v1.10.3
00054  *
00055  * Revision 2.10  2002/09/16 02:52:33  robertj
00056  * Added #define so can select if #pragma interface/implementation is used on
00057  *   platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan.
00058  *
00059  * Revision 2.9  2002/09/04 06:01:46  robertj
00060  * Updated to OpenH323 v1.9.6
00061  *
00062  * Revision 2.8  2002/07/01 04:56:29  robertj
00063  * Updated to OpenH323 v1.9.1
00064  *
00065  * Revision 2.7  2002/04/18 03:41:28  robertj
00066  * Fixed logical channel so does not delete media stream too early.
00067  *
00068  * Revision 2.6  2002/02/11 09:32:11  robertj
00069  * Updated to openH323 v1.8.0
00070  *
00071  * Revision 2.5  2002/02/11 07:37:21  robertj
00072  * Added media bypass for streams between compatible protocols.
00073  *
00074  * Revision 2.4  2002/01/22 04:56:55  robertj
00075  * Update from OpenH323, rev 1.26 to 1.28
00076  *
00077  * Revision 2.3  2002/01/14 06:35:56  robertj
00078  * Updated to OpenH323 v1.7.9
00079  *
00080  * Revision 2.2  2001/11/02 10:45:19  robertj
00081  * Updated to OpenH323 v1.7.3
00082  *
00083  * Revision 2.1  2001/10/15 04:30:09  robertj
00084  * Added delayed start of media patch threads.
00085  *
00086  * Revision 2.0  2001/07/27 15:48:24  robertj
00087  * Conversion of OpenH323 to Open Phone Abstraction Library (OPAL)
00088  *
00089  * Revision 1.40  2002/09/16 01:14:15  robertj
00090  * Added #define so can select if #pragma interface/implementation is used on
00091  *   platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan.
00092  *
00093  * Revision 1.39  2002/09/03 06:19:36  robertj
00094  * Normalised the multi-include header prevention ifdef/define symbol.
00095  *
00096  * Revision 1.38  2002/08/05 10:03:47  robertj
00097  * Cosmetic changes to normalise the usage of pragma interface/implementation.
00098  *
00099  * Revision 1.37  2002/06/25 08:30:08  robertj
00100  * Changes to differentiate between stright G.723.1 and G.723.1 Annex A using
00101  *   the OLC dataType silenceSuppression field so does not send SID frames
00102  *   to receiver codecs that do not understand them.
00103  *
00104  * Revision 1.36  2002/05/23 04:53:54  robertj
00105  * Added function to remove a filter from logical channel.
00106  *
00107  * Revision 1.35  2002/05/10 05:46:46  robertj
00108  * Added session ID to the data logical channel class.
00109  *
00110  * Revision 1.34  2002/05/02 07:56:24  robertj
00111  * Added automatic clearing of call if no media (RTP data) is transferred in a
00112  *   configurable (default 5 minutes) amount of time.
00113  *
00114  * Revision 1.33  2002/05/02 06:28:50  robertj
00115  * Fixed problem with external RTP channels not fast starting.
00116  *
00117  * Revision 1.32  2002/04/17 05:56:28  robertj
00118  * Added trace output of H323Channel::Direction enum.
00119  *
00120  * Revision 1.31  2002/02/09 04:39:01  robertj
00121  * Changes to allow T.38 logical channels to use single transport which is
00122  *   now owned by the OpalT38Protocol object instead of H323Channel.
00123  *
00124  * Revision 1.30  2002/02/05 08:13:20  robertj
00125  * Added ability to not have addresses when external RTP channel created.
00126  *
00127  * Revision 1.29  2002/01/22 22:48:21  robertj
00128  * Fixed RFC2833 support (transmitter) requiring large rewrite
00129  *
00130  * Revision 1.28  2002/01/17 07:04:57  robertj
00131  * Added support for RFC2833 embedded DTMF in the RTP stream.
00132  *
00133  * Revision 1.27  2002/01/17 00:10:37  robertj
00134  * Fixed double copy of rtpPayloadType in RTP channel, caused much confusion.
00135  *
00136  * Revision 1.26  2002/01/14 05:18:16  robertj
00137  * Fixed typo on external RTP channel constructor.
00138  *
00139  * Revision 1.25  2002/01/10 05:13:50  robertj
00140  * Added support for external RTP stacks, thanks NuMind Software Systems.
00141  *
00142  * Revision 1.24  2001/10/23 02:18:06  dereks
00143  * Initial release of CU30 video codec.
00144  *
00145  * Revision 1.23  2001/07/24 02:26:53  robertj
00146  * Added start for handling reverse channels.
00147  *
00148  * Revision 1.22  2001/07/17 04:44:29  robertj
00149  * Partial implementation of T.120 and T.38 logical channels.
00150  *
00151  * Revision 1.21  2001/02/09 05:16:24  robertj
00152  * Added #pragma interface for GNU C++.
00153  *
00154  * Revision 1.20  2001/01/25 07:27:14  robertj
00155  * Major changes to add more flexible OpalMediaFormat class to normalise
00156  *   all information about media types, especially codecs.
00157  *
00158  * Revision 1.19  2000/10/19 04:05:20  robertj
00159  * Added compare function for logical channel numbers, thanks Yuriy Ershov.
00160  *
00161  * Revision 1.18  2000/09/22 01:35:02  robertj
00162  * Added support for handling LID's that only do symmetric codecs.
00163  *
00164  * Revision 1.17  2000/08/31 08:15:32  robertj
00165  * Added support for dynamic RTP payload types in H.245 OpenLogicalChannel negotiations.
00166  *
00167  * Revision 1.16  2000/08/21 02:50:19  robertj
00168  * Fixed race condition if close call just as slow start media channels are opening.
00169  *
00170  * Revision 1.15  2000/06/15 01:46:13  robertj
00171  * Added channel pause (aka mute) functions.
00172  *
00173  * Revision 1.14  2000/05/18 11:53:33  robertj
00174  * Changes to support doc++ documentation generation.
00175  *
00176  * Revision 1.13  2000/05/02 04:32:23  robertj
00177  * Fixed copyright notice comment.
00178  *
00179  * Revision 1.12  1999/12/23 23:02:34  robertj
00180  * File reorganision for separating RTP from H.323 and creation of LID for VPB support.
00181  *
00182  * Revision 1.11  1999/11/19 09:06:30  robertj
00183  * Changed to close down logical channel if get a transmit codec error.
00184  *
00185  * Revision 1.10  1999/11/06 05:37:44  robertj
00186  * Complete rewrite of termination of connection to avoid numerous race conditions.
00187  *
00188  * Revision 1.9  1999/09/08 04:05:48  robertj
00189  * Added support for video capabilities & codec, still needs the actual codec itself!
00190  *
00191  * Revision 1.8  1999/08/31 12:34:18  robertj
00192  * Added gatekeeper support.
00193  *
00194  * Revision 1.7  1999/07/09 06:09:49  robertj
00195  * Major implementation. An ENORMOUS amount of stuff added everywhere.
00196  *
00197  * Revision 1.6  1999/06/14 05:15:55  robertj
00198  * Changes for using RTP sessions correctly in H323 Logical Channel context
00199  *
00200  * Revision 1.5  1999/06/13 12:41:14  robertj
00201  * Implement logical channel transmitter.
00202  * Fixed H245 connect on receiving call.
00203  *
00204  * Revision 1.4  1999/06/09 05:26:19  robertj
00205  * Major restructuring of classes.
00206  *
00207  * Revision 1.3  1999/06/06 06:06:36  robertj
00208  * Changes for new ASN compiler and v2 protocol ASN files.
00209  *
00210  * Revision 1.2  1999/04/26 06:14:46  craigs
00211  * Initial implementation for RTP decoding and lots of stuff
00212  * As a whole, these changes are called "First Noise"
00213  *
00214  * Revision 1.1  1999/01/16 01:31:07  robertj
00215  * Initial revision
00216  *
00217  */
00218 
00219 #ifndef __OPAL_CHANNELS_H
00220 #define __OPAL_CHANNELS_H
00221 
00222 #ifdef P_USE_PRAGMA
00223 #pragma interface
00224 #endif
00225 
00226 
00227 #include <rtp/rtp.h>
00228 #include <h323/transaddr.h>
00229 
00230 
00231 class OpalMediaStream;
00232 class OpalMediaCommand;
00233 
00234 class H245_OpenLogicalChannel;
00235 class H245_OpenLogicalChannelAck;
00236 class H245_OpenLogicalChannel_forwardLogicalChannelParameters;
00237 class H245_OpenLogicalChannel_reverseLogicalChannelParameters;
00238 class H245_H2250LogicalChannelParameters;
00239 class H245_H2250LogicalChannelAckParameters;
00240 class H245_MiscellaneousCommand_type;
00241 class H245_MiscellaneousIndication_type;
00242 
00243 class H323EndPoint;
00244 class H323Connection;
00245 class H323Capability;
00246 class H323_RTP_Session;
00247 
00248 
00250 
00254 class H323ChannelNumber : public PObject
00255 {
00256   PCLASSINFO(H323ChannelNumber, PObject);
00257 
00258   public:
00259     H323ChannelNumber() { number = 0; fromRemote = FALSE; }
00260     H323ChannelNumber(unsigned number, BOOL fromRemote);
00261 
00262     virtual PObject * Clone() const;
00263     virtual PINDEX HashFunction() const;
00264     virtual void PrintOn(ostream & strm) const;
00265     virtual Comparison Compare(const PObject & obj) const;
00266 
00267     H323ChannelNumber & operator++(int);
00268     operator unsigned() const { return number; }
00269     BOOL IsFromRemote() const { return fromRemote; }
00270     
00271   protected:
00272     unsigned number;
00273     BOOL     fromRemote;
00274 };
00275 
00276 
00283 class H323Channel : public PObject
00284 {
00285   PCLASSINFO(H323Channel, PObject);
00286 
00287   public:
00292     H323Channel(
00293       H323Connection & connection,        
00294       const H323Capability & capability   
00295     );
00296 
00301     ~H323Channel();
00303 
00306     virtual void PrintOn(
00307       ostream & strm
00308     ) const;
00310 
00313     enum Directions {
00314       IsBidirectional,
00315       IsTransmitter,
00316       IsReceiver,
00317       NumDirections
00318     };
00319 #if PTRACING
00320     friend ostream & operator<<(ostream & out, Directions dir);
00321 #endif
00322 
00327     virtual Directions GetDirection() const = 0;
00328 
00334     virtual unsigned GetSessionID() const;
00335 
00342     virtual BOOL GetMediaTransportAddress(
00343       OpalTransportAddress & data,        
00344       OpalTransportAddress & control      
00345     ) const;
00346 
00354     virtual BOOL SetInitialBandwidth() = 0;
00355 
00360     virtual BOOL Open();
00361 
00364     virtual BOOL Start() = 0;
00365 
00368     virtual void Close();
00369 
00372     BOOL IsOpen() const { return opened && !terminating; }
00373 
00381     virtual OpalMediaStream * GetMediaStream(
00382       BOOL deleted = FALSE
00383     ) const = 0;
00384 
00385 
00388     virtual BOOL OnSendingPDU(
00389       H245_OpenLogicalChannel & openPDU  
00390     ) const = 0;
00391 
00397     virtual void OnSendOpenAck(
00398       const H245_OpenLogicalChannel & open,   
00399       H245_OpenLogicalChannelAck & ack        
00400     ) const;
00401 
00408     virtual BOOL OnReceivedPDU(
00409       const H245_OpenLogicalChannel & pdu,    
00410       unsigned & errorCode                    
00411     );
00412 
00419     virtual BOOL OnReceivedAckPDU(
00420       const H245_OpenLogicalChannelAck & pdu  
00421     );
00422 
00426     virtual void OnFlowControl(
00427       long bitRateRestriction   
00428     );
00429 
00433     virtual void OnMiscellaneousCommand(
00434       const H245_MiscellaneousCommand_type & type  
00435     );
00436 
00440     virtual void OnMiscellaneousIndication(
00441       const H245_MiscellaneousIndication_type & type  
00442     );
00443 
00447     virtual void OnJitterIndication(
00448       DWORD jitter,           
00449       int skippedFrameCount,  
00450       int additionalBuffer    
00451     );
00453 
00458     const H323ChannelNumber & GetNumber() const { return number; }
00459 
00462     void SetNumber(const H323ChannelNumber & num) { number = num; }
00463 
00466     const H323ChannelNumber & GetReverseChannel() const { return reverseChannel; }
00467 
00470     void SetReverseChannel(const H323ChannelNumber & num) { reverseChannel = num; }
00471 
00474     unsigned GetBandwidthUsed() const { return bandwidthUsed; }
00475 
00478     BOOL SetBandwidthUsed(
00479       unsigned bandwidth  
00480     );
00481 
00484     const H323Capability & GetCapability() const { return *capability; }
00485 
00494     BOOL IsPaused() const { return paused; }
00495 
00504     void SetPause(
00505       BOOL pause   
00506     ) { paused = pause; }
00508 
00509   protected:
00510     H323EndPoint         & endpoint;
00511     H323Connection       & connection;
00512     H323Capability       * capability;
00513     H323ChannelNumber      number;
00514     H323ChannelNumber      reverseChannel;
00515     BOOL                   opened;
00516     BOOL                   paused;
00517     BOOL                   terminating;
00518 
00519   private:
00520     unsigned bandwidthUsed;
00521 };
00522 
00523 
00524 PLIST(H323LogicalChannelList, H323Channel);
00525 
00526 
00527 
00534 class H323UnidirectionalChannel : public H323Channel
00535 {
00536   PCLASSINFO(H323UnidirectionalChannel, H323Channel);
00537 
00538   public:
00543     H323UnidirectionalChannel(
00544       H323Connection & connection,        
00545       const H323Capability & capability,  
00546       Directions direction                
00547     );
00548 
00551     ~H323UnidirectionalChannel();
00553 
00560     virtual Directions GetDirection() const;
00561 
00569     virtual BOOL SetInitialBandwidth();
00570 
00573     virtual BOOL Open();
00574 
00579     virtual BOOL Start();
00580 
00583     virtual void Close();
00584 
00588     virtual void OnMiscellaneousCommand(
00589       const H245_MiscellaneousCommand_type & type  
00590     );
00592 
00598     virtual OpalMediaStream * GetMediaStream(BOOL deleted = FALSE) const;
00600 
00601   protected:
00602     PDECLARE_NOTIFIER(OpalMediaCommand, H323UnidirectionalChannel, OnMediaCommand);
00603 
00604     BOOL              receiver;
00605     mutable OpalMediaStream * mediaStream;
00606 };
00607 
00608 
00615 class H323BidirectionalChannel : public H323Channel
00616 {
00617   PCLASSINFO(H323BidirectionalChannel, H323Channel);
00618 
00619   public:
00624     H323BidirectionalChannel(
00625       H323Connection & connection,        
00626       const H323Capability & capability   
00627     );
00629 
00636     virtual Directions GetDirection() const;
00637 
00642     virtual BOOL Start();
00644 };
00645 
00646 
00648 
00651 class H323_RealTimeChannel : public H323UnidirectionalChannel
00652 {
00653   PCLASSINFO(H323_RealTimeChannel, H323UnidirectionalChannel);
00654 
00655   public:
00660     H323_RealTimeChannel(
00661       H323Connection & connection,        
00662       const H323Capability & capability,  
00663       Directions direction                
00664     );
00666 
00671     virtual BOOL OnSendingPDU(
00672       H245_OpenLogicalChannel & openPDU  
00673     ) const;
00674 
00678     virtual void OnSendOpenAck(
00679       const H245_OpenLogicalChannel & open,   
00680       H245_OpenLogicalChannelAck & ack        
00681     ) const;
00682 
00690     virtual BOOL OnReceivedPDU(
00691       const H245_OpenLogicalChannel & pdu,    
00692       unsigned & errorCode                    
00693     );
00694 
00702     virtual BOOL OnReceivedAckPDU(
00703       const H245_OpenLogicalChannelAck & pdu 
00704     );
00706 
00711     virtual BOOL OnSendingPDU(
00712       H245_H2250LogicalChannelParameters & param  
00713     ) const = 0;
00714 
00718     virtual void OnSendOpenAck(
00719       H245_H2250LogicalChannelAckParameters & param 
00720     ) const = 0;
00721 
00728     virtual BOOL OnReceivedPDU(
00729       const H245_H2250LogicalChannelParameters & param, 
00730       unsigned & errorCode                              
00731     ) = 0;
00732 
00739     virtual BOOL OnReceivedAckPDU(
00740       const H245_H2250LogicalChannelAckParameters & param 
00741     ) = 0;
00742 
00745     virtual BOOL SetDynamicRTPPayloadType(
00746       int newType  
00747     );
00748 
00749     RTP_DataFrame::PayloadTypes GetDynamicRTPPayloadType() const { return rtpPayloadType; }
00751 
00752   protected:
00753     RTP_DataFrame::PayloadTypes rtpPayloadType;
00754 };
00755 
00756 
00758 
00761 class H323_RTPChannel : public H323_RealTimeChannel
00762 {
00763   PCLASSINFO(H323_RTPChannel, H323_RealTimeChannel);
00764 
00765   public:
00770     H323_RTPChannel(
00771       H323Connection & connection,        
00772       const H323Capability & capability,  
00773       Directions direction,               
00774       RTP_Session & rtp                   
00775     );
00776 
00778     ~H323_RTPChannel();
00780 
00787     virtual unsigned GetSessionID() const;
00789 
00794     virtual BOOL OnSendingPDU(
00795       H245_H2250LogicalChannelParameters & param  
00796     ) const;
00797 
00801     virtual void OnSendOpenAck(
00802       H245_H2250LogicalChannelAckParameters & param 
00803     ) const;
00804 
00811     virtual BOOL OnReceivedPDU(
00812       const H245_H2250LogicalChannelParameters & param, 
00813       unsigned & errorCode                              
00814     );
00815 
00822     virtual BOOL OnReceivedAckPDU(
00823       const H245_H2250LogicalChannelAckParameters & param 
00824     );
00826 
00827   protected:
00828     RTP_Session      & rtpSession;
00829     H323_RTP_Session & rtpCallbacks;
00830 };
00831 
00832 
00834 
00838 class H323_ExternalRTPChannel : public H323_RealTimeChannel
00839 {
00840   PCLASSINFO(H323_ExternalRTPChannel, H323_RealTimeChannel);
00841 
00842   public:
00847     H323_ExternalRTPChannel(
00848       H323Connection & connection,        
00849       const H323Capability & capability,  
00850       Directions direction,               
00851       unsigned sessionID                  
00852     );
00855     H323_ExternalRTPChannel(
00856       H323Connection & connection,        
00857       const H323Capability & capability,  
00858       Directions direction,               
00859       unsigned sessionID,                 
00860       const H323TransportAddress & data,  
00861       const H323TransportAddress & control
00862     );
00865     H323_ExternalRTPChannel(
00866       H323Connection & connection,        
00867       const H323Capability & capability,  
00868       Directions direction,               
00869       unsigned sessionID,                 
00870       const PIPSocket::Address & ip,      
00871       WORD dataPort                       
00872     );
00874 
00881     virtual unsigned GetSessionID() const;
00882 
00889     virtual BOOL GetMediaTransportAddress(
00890       OpalTransportAddress & data,        
00891       OpalTransportAddress & control      
00892     ) const;
00893 
00896     virtual BOOL Start();
00897 
00904     virtual void Receive();
00905 
00912     virtual void Transmit();
00914 
00919     virtual BOOL OnSendingPDU(
00920       H245_H2250LogicalChannelParameters & param  
00921     ) const;
00922 
00926     virtual void OnSendOpenAck(
00927       H245_H2250LogicalChannelAckParameters & param 
00928     ) const;
00929 
00936     virtual BOOL OnReceivedPDU(
00937       const H245_H2250LogicalChannelParameters & param, 
00938       unsigned & errorCode                              
00939     );
00940 
00947     virtual BOOL OnReceivedAckPDU(
00948       const H245_H2250LogicalChannelAckParameters & param 
00949     );
00951 
00952     void SetExternalAddress(
00953       const H323TransportAddress & data,  
00954       const H323TransportAddress & control
00955     );
00956 
00957     const H323TransportAddress & GetRemoteMediaAddress()        const { return remoteMediaAddress; }
00958     const H323TransportAddress & GetRemoteMediaControlAddress() const { return remoteMediaControlAddress; }
00959 
00960     BOOL GetRemoteAddress(
00961       PIPSocket::Address & ip,
00962       WORD & dataPort
00963     ) const;
00964 
00965   protected:
00966     void Construct(H323Connection & conn, unsigned id);
00967 
00968     unsigned             sessionID;
00969     H323TransportAddress externalMediaAddress;
00970     H323TransportAddress externalMediaControlAddress;
00971     H323TransportAddress remoteMediaAddress;
00972     H323TransportAddress remoteMediaControlAddress;
00973 };
00974 
00975 
00977 
00984 class H323DataChannel : public H323UnidirectionalChannel
00985 {
00986   PCLASSINFO(H323DataChannel, H323UnidirectionalChannel);
00987 
00988   public:
00993     H323DataChannel(
00994       H323Connection & connection,        
00995       const H323Capability & capability,  
00996       Directions direction,               
00997       unsigned sessionID                  
00998     );
00999 
01002     ~H323DataChannel();
01004 
01009     virtual void Close();
01010 
01015     virtual unsigned GetSessionID() const;
01016 
01019     virtual BOOL OnSendingPDU(
01020       H245_OpenLogicalChannel & openPDU  
01021     ) const;
01022 
01026     virtual void OnSendOpenAck(
01027       const H245_OpenLogicalChannel & open,   
01028       H245_OpenLogicalChannelAck & ack        
01029     ) const;
01030 
01038     virtual BOOL OnReceivedPDU(
01039       const H245_OpenLogicalChannel & pdu,    
01040       unsigned & errorCode                    
01041     );
01042 
01050     virtual BOOL OnReceivedAckPDU(
01051       const H245_OpenLogicalChannelAck & pdu 
01052     );
01054 
01063     virtual BOOL CreateListener();
01064 
01072     virtual BOOL CreateTransport();
01074 
01075   protected:
01076     unsigned        sessionID;
01077     H323Listener  * listener;
01078     BOOL            autoDeleteListener;
01079     H323Transport * transport;
01080     BOOL            autoDeleteTransport;
01081     BOOL            separateReverseChannel;
01082 };
01083 
01084 
01085 #endif // __OPAL_CHANNELS_H
01086 
01087 

Generated on Fri Mar 7 06:33:08 2008 for OPAL by  doxygen 1.5.1