h323caps.h

Go to the documentation of this file.
00001 /*
00002  * h323caps.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: 21956 $
00030  * $Author: rjongbloed $
00031  * $Date: 2009-01-28 03:09:29 +0000 (Wed, 28 Jan 2009) $
00032  */
00033 
00034 #ifndef OPAL_H323_H323CAPS_H
00035 #define OPAL_H323_H323CAPS_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 <opal/mediafmt.h>
00046 #include <h323/channels.h>
00047 
00048 
00049 /* The following classes have forward references to avoid including the VERY
00050    large header files for H225 and H245. If an application requires access
00051    to the protocol classes they can include them, but for simple usage their
00052    inclusion can be avoided.
00053  */
00054 class PASN_Choice;
00055 class H245_Capability;
00056 class H245_DataType;
00057 class H245_ModeElement;
00058 class H245_AudioCapability;
00059 class H245_AudioMode;
00060 class H245_VideoCapability;
00061 class H245_VideoMode;
00062 class H245_DataApplicationCapability;
00063 class H245_DataMode;
00064 class H245_DataProtocolCapability;
00065 class H245_H2250LogicalChannelParameters;
00066 class H245_TerminalCapabilitySet;
00067 class H245_NonStandardParameter;
00068 class H323Connection;
00069 class H323Capabilities;
00070 class H245_CapabilityIdentifier;
00071 class H245_GenericCapability;
00072 class H245_GenericParameter;
00073 
00075 
00089 class H323Capability : public PObject
00090 {
00091   PCLASSINFO(H323Capability, PObject);
00092 
00093   public:
00098     H323Capability();
00100 
00106     Comparison Compare(const PObject & obj) const;
00107 
00110     void PrintOn(ostream & strm) const;
00112 
00115     enum MainTypes {
00117       e_Audio,
00119       e_Video,
00121       e_Data,
00123       e_UserInput,
00125       e_NumMainTypes
00126     };
00127 
00133     virtual MainTypes GetMainType() const = 0;
00134 
00138     virtual unsigned  GetSubType()  const = 0;
00139 
00142     virtual PString GetFormatName() const = 0;
00144 
00150     static H323Capability * Create(
00151       const PString & name     
00152     );
00153 
00154     enum {
00155       DefaultAudioSessionID = 1,
00156       DefaultVideoSessionID = 2,
00157       DefaultDataSessionID  = 3,
00158       DefaultH224SessionID  = 4
00159     };
00160 
00169     virtual unsigned GetDefaultSessionID() const;
00170 
00179     virtual void SetTxFramesInPacket(
00180       unsigned frames   
00181     );
00182 
00187     virtual unsigned GetTxFramesInPacket() const;
00188 
00193     virtual unsigned GetRxFramesInPacket() const;
00194 
00200     virtual H323Channel * CreateChannel(
00201       H323Connection & connection,    
00202       H323Channel::Directions dir,    
00203       unsigned sessionID,             
00204       const H245_H2250LogicalChannelParameters * param
00206     ) const = 0;
00208 
00211     enum CommandType {
00212       e_TCS,
00213       e_OLC,
00214       e_ReqMode
00215     };
00216 
00224     virtual PBoolean OnSendingPDU(
00225       H245_Capability & pdu  
00226     ) const = 0;
00227 
00235     virtual PBoolean OnSendingPDU(
00236       H245_DataType & pdu  
00237     ) const;
00238 
00246     virtual PBoolean OnSendingPDU(
00247       H245_ModeElement & pdu  
00248     ) const = 0;
00249 
00262     virtual PBoolean OnReceivedPDU(
00263       const H245_Capability & pdu 
00264     );
00265 
00273     virtual PBoolean OnReceivedPDU(
00274       const H245_DataType & pdu,  
00275       PBoolean receiver               
00276     );
00277 
00280     virtual PBoolean IsMatch(
00281       const PASN_Choice & subTypePDU  
00282     ) const;
00283 
00291     virtual PBoolean IsUsable(
00292       const H323Connection & connection
00293     ) const;
00295 
00298     enum CapabilityDirection {
00299       e_Unknown,
00300       e_Receive,
00301       e_Transmit,
00302       e_ReceiveAndTransmit,
00303       e_NoDirection,
00304       NumCapabilityDirections
00305     };
00306 
00309     CapabilityDirection GetCapabilityDirection() const { return capabilityDirection; }
00310 
00313     void SetCapabilityDirection(
00314       CapabilityDirection dir   
00315     ) { capabilityDirection = dir; }
00316 
00318     unsigned GetCapabilityNumber() const { return assignedCapabilityNumber; }
00319 
00321     void SetCapabilityNumber(unsigned num) { assignedCapabilityNumber = num; }
00322 
00325     OpalMediaFormat GetMediaFormat() const;
00326 
00329     bool SetMediaFormatOptions(
00330       const OpalMediaFormat & format
00331     );
00332 
00334     RTP_DataFrame::PayloadTypes GetPayloadType() const { return rtpPayloadType; }
00335 
00337     void SetPayloadType(RTP_DataFrame::PayloadTypes pt) { rtpPayloadType = pt; }
00338 
00340     virtual void AttachQoS(RTP_QOS *) { }
00342 
00343 #if PTRACING
00344     friend ostream & operator<<(ostream & o , MainTypes t);
00345     friend ostream & operator<<(ostream & o , CapabilityDirection d);
00346 #endif
00347 
00348   protected:
00349     OpalMediaFormat & GetWritableMediaFormat();
00350 
00351     unsigned            assignedCapabilityNumber;  
00352     CapabilityDirection capabilityDirection;
00353     RTP_DataFrame::PayloadTypes rtpPayloadType;
00354 
00355   private:
00356     mutable OpalMediaFormat mediaFormat;
00357 
00358   friend class H323Capabilities;
00359 };
00360 
00361 
00362 
00371 class H323NonStandardCapabilityInfo
00372 {
00373   public:
00374     typedef PObject::Comparison (*CompareFuncType)(struct PluginCodec_H323NonStandardCodecData *);
00375 
00378     H323NonStandardCapabilityInfo(
00379       CompareFuncType compareFunc,
00380       const BYTE * dataBlock,         
00381       PINDEX dataSize                 
00382     );
00383 
00386     H323NonStandardCapabilityInfo(
00387       const BYTE * dataBlock,         
00388       PINDEX dataSize,                
00389       PINDEX comparisonOffset = 0,    
00390       PINDEX comparisonLength = P_MAX_INDEX  
00391     );
00392 
00395     H323NonStandardCapabilityInfo(
00396       const PString & oid,
00397       const BYTE * dataBlock,         
00398       PINDEX dataSize,                
00399       PINDEX comparisonOffset = 0,
00400       PINDEX comparisonLength = P_MAX_INDEX
00401     );
00402 
00405     H323NonStandardCapabilityInfo(
00406       BYTE country,                  
00407       BYTE extension,                
00408       WORD maufacturer,              
00409       const BYTE * dataBlock,         
00410       PINDEX dataSize,                
00411       PINDEX comparisonOffset = 0,    
00412       PINDEX comparisonLength = P_MAX_INDEX  
00413     );
00414 
00417     virtual ~H323NonStandardCapabilityInfo();
00418 
00423     virtual PBoolean OnSendingPDU(
00424       PBYTEArray & data  
00425     ) const;
00426 
00431     virtual PBoolean OnReceivedPDU(
00432       const PBYTEArray & data  
00433     );
00434 
00435     PBoolean IsMatch(const H245_NonStandardParameter & param) const;
00436 
00437     PObject::Comparison CompareParam(
00438       const H245_NonStandardParameter & param
00439     ) const;
00440 
00441   protected:
00442     PBoolean OnSendingNonStandardPDU(
00443       PASN_Choice & pdu,
00444       unsigned nonStandardTag
00445     ) const;
00446     PBoolean OnReceivedNonStandardPDU(
00447       const PASN_Choice & pdu,
00448       unsigned nonStandardTag
00449     );
00450 
00451     PObject::Comparison CompareInfo(
00452       const H323NonStandardCapabilityInfo & obj
00453     ) const;
00454     PObject::Comparison CompareData(
00455       const PBYTEArray & data  
00456     ) const;
00457 
00458     PString    oid;
00459     BYTE       t35CountryCode;
00460     BYTE       t35Extension;
00461     WORD       manufacturerCode;
00462     PBYTEArray nonStandardData;
00463     PINDEX     comparisonOffset;
00464     PINDEX     comparisonLength;
00465     CompareFuncType compareFunc;
00466 };
00467 
00477 class H323GenericCapabilityInfo
00478 {
00479   public:
00480     H323GenericCapabilityInfo(
00481       const PString & id,     
00482       PINDEX maxBitRate = 0   
00483     );
00484     H323GenericCapabilityInfo(const H323GenericCapabilityInfo & obj);
00485     virtual ~H323GenericCapabilityInfo();
00486 
00487   protected:
00488     virtual PBoolean OnSendingGenericPDU(
00489       H245_GenericCapability & pdu,
00490       const OpalMediaFormat & mediaFormat,
00491       H323Capability::CommandType type
00492     ) const;
00493     virtual PBoolean OnReceivedGenericPDU(
00494       OpalMediaFormat & mediaFormat,
00495       const H245_GenericCapability & pdu,
00496       H323Capability::CommandType type
00497     );
00498 
00499     PBoolean IsMatch(
00500       const H245_GenericCapability & param  
00501     ) const;
00502     PObject::Comparison CompareInfo(
00503       const H323GenericCapabilityInfo & obj
00504     ) const;
00505 
00506 
00507     H245_CapabilityIdentifier * identifier;
00508     unsigned                    maxBitRate;
00509 };
00510 
00517 class H323RealTimeCapability : public H323Capability
00518 {
00519   PCLASSINFO(H323RealTimeCapability, H323Capability);
00520 
00521   public:
00526     virtual H323Channel * CreateChannel(
00527       H323Connection & connection,    
00528       H323Channel::Directions dir,    
00529       unsigned sessionID,             
00530       const H245_H2250LogicalChannelParameters * param
00532     ) const;
00533 
00534     H323RealTimeCapability();
00535     H323RealTimeCapability(const H323RealTimeCapability &rtc);
00536     virtual ~H323RealTimeCapability();
00537     void AttachQoS(RTP_QOS * _rtpqos);
00538 
00539   protected:
00540     RTP_QOS * rtpqos;
00542 };
00543 
00544 
00551 class H323AudioCapability : public H323RealTimeCapability
00552 {
00553   PCLASSINFO(H323AudioCapability, H323RealTimeCapability);
00554 
00555   public:
00560     H323AudioCapability();
00562 
00568     virtual MainTypes GetMainType() const;
00570 
00581     virtual unsigned GetDefaultSessionID() const;
00582 
00591     virtual void SetTxFramesInPacket(
00592       unsigned frames   
00593     );
00594 
00600     virtual unsigned GetTxFramesInPacket() const;
00601 
00607     virtual unsigned GetRxFramesInPacket() const;
00609 
00620     virtual PBoolean OnSendingPDU(
00621       H245_Capability & pdu  
00622     ) const;
00623 
00632     virtual PBoolean OnSendingPDU(
00633       H245_DataType & pdu  
00634     ) const;
00635 
00644     virtual PBoolean OnSendingPDU(
00645       H245_ModeElement & pdu  
00646     ) const;
00647 
00656     virtual PBoolean OnSendingPDU(
00657       H245_AudioCapability & pdu,  
00658       unsigned packetSize          
00659     ) const;
00660     virtual PBoolean OnSendingPDU(
00661       H245_AudioCapability & pdu,  
00662       unsigned packetSize,         
00663       CommandType type             
00664     ) const;
00665 
00674     virtual PBoolean OnSendingPDU(
00675       H245_AudioMode & pdu  
00676     ) const;
00677 
00689     virtual PBoolean OnReceivedPDU(
00690       const H245_Capability & pdu  
00691     );
00692 
00702     virtual PBoolean OnReceivedPDU(
00703       const H245_DataType & pdu,  
00704       PBoolean receiver               
00705     );
00706 
00715     virtual PBoolean OnReceivedPDU(
00716       const H245_AudioCapability & pdu,  
00717       unsigned & packetSize              
00718     );
00719     virtual PBoolean OnReceivedPDU(
00720       const H245_AudioCapability & pdu,  
00721       unsigned & packetSize,             
00722       CommandType type                   
00723     );
00725 };
00726 
00727 
00735 class H323NonStandardAudioCapability : public H323AudioCapability,
00736                                        public H323NonStandardCapabilityInfo
00737 {
00738   PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00739 
00740   public:
00743     H323NonStandardAudioCapability(
00744       H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00745       const BYTE * dataBlock,         
00746       PINDEX dataSize                 
00747     );
00750     H323NonStandardAudioCapability(
00751       const BYTE * dataBlock = NULL,  
00752       PINDEX dataSize = 0,            
00753       PINDEX comparisonOffset = 0,    
00754       PINDEX comparisonLength = P_MAX_INDEX  
00755      );
00756 
00759     H323NonStandardAudioCapability(
00760       const PString & oid,            
00761       const BYTE * dataBlock = NULL,  
00762       PINDEX dataSize = 0,            
00763       PINDEX comparisonOffset = 0,    
00764       PINDEX comparisonLength = P_MAX_INDEX  
00765     );
00766 
00769     H323NonStandardAudioCapability(
00770       BYTE country,                   
00771       BYTE extension,                 
00772       WORD maufacturer,               
00773       const BYTE * dataBlock = NULL,  
00774       PINDEX dataSize = 0,            
00775       PINDEX comparisonOffset = 0,    
00776       PINDEX comparisonLength = P_MAX_INDEX  
00777     );
00779 
00785     Comparison Compare(const PObject & obj) const;
00787 
00795     virtual unsigned GetSubType() const;
00797 
00808     virtual PBoolean OnSendingPDU(
00809       H245_AudioCapability & pdu,  
00810       unsigned packetSize          
00811     ) const;
00812 
00821     virtual PBoolean OnSendingPDU(
00822       H245_AudioMode & pdu  
00823     ) const;
00824 
00833     virtual PBoolean OnReceivedPDU(
00834       const H245_AudioCapability & pdu,  
00835       unsigned & packetSize              
00836     );
00837 
00840     virtual PBoolean IsMatch(
00841       const PASN_Choice & subTypePDU  
00842     ) const;
00844 };
00845 
00853 class H323GenericAudioCapability : public H323AudioCapability,
00854                                    public H323GenericCapabilityInfo
00855 {
00856   PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00857 
00858   public:
00863     H323GenericAudioCapability(
00864       const PString & capabilityId,    
00865       PINDEX maxBitRate = 0                
00866     );
00868 
00874     Comparison Compare(const PObject & obj) const;
00876 
00884     virtual unsigned GetSubType() const;
00886 
00897     virtual PBoolean OnSendingPDU(
00898       H245_AudioCapability & pdu,  
00899       unsigned packetSize,         
00900       CommandType type             
00901     ) const;
00902 
00911     virtual PBoolean OnSendingPDU(
00912       H245_AudioMode & pdu  
00913     ) const;
00914 
00923     virtual PBoolean OnReceivedPDU(
00924       const H245_AudioCapability & pdu,  
00925       unsigned & packetSize,             
00926       CommandType type                   
00927     );
00928 
00931     virtual PBoolean IsMatch(
00932       const PASN_Choice & subTypePDU  
00933     ) const;
00935 };
00936 
00937 
00938 #if OPAL_VIDEO
00939 
00946 class H323VideoCapability : public H323RealTimeCapability
00947 {
00948   PCLASSINFO(H323VideoCapability, H323RealTimeCapability);
00949 
00950   public:
00956     virtual MainTypes GetMainType() const;
00958 
00969     virtual unsigned GetDefaultSessionID() const;
00971 
00982     virtual PBoolean OnSendingPDU(
00983       H245_Capability & pdu  
00984     ) const;
00985 
00994     virtual PBoolean OnSendingPDU(
00995       H245_DataType & pdu  
00996     ) const;
00997 
01006     virtual PBoolean OnSendingPDU(
01007       H245_ModeElement & pdu  
01008     ) const;
01009 
01017     virtual PBoolean OnSendingPDU(
01018       H245_VideoCapability & pdu  
01019     ) const;
01020     virtual PBoolean OnSendingPDU(
01021       H245_VideoCapability & pdu,  
01022       CommandType type             
01023     ) const;
01024 
01033     virtual PBoolean OnSendingPDU(
01034       H245_VideoMode & pdu  
01035     ) const = 0;
01036 
01046     virtual PBoolean OnReceivedPDU(
01047       const H245_Capability & pdu  
01048     );
01049 
01057     virtual PBoolean OnReceivedPDU(
01058       const H245_DataType & pdu,  
01059       PBoolean receiver               
01060     );
01061 
01069     virtual PBoolean OnReceivedPDU(
01070       const H245_VideoCapability & pdu  
01071     );
01072     virtual PBoolean OnReceivedPDU(
01073       const H245_VideoCapability & pdu,  
01074       CommandType type                   
01075     );
01077 };
01078 
01079 
01087 class H323NonStandardVideoCapability : public H323VideoCapability,
01088                                        public H323NonStandardCapabilityInfo
01089 {
01090   PCLASSINFO(H323NonStandardVideoCapability, H323VideoCapability);
01091 
01092   public:
01095     H323NonStandardVideoCapability(
01096       H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
01097       const BYTE * dataBlock,         
01098       PINDEX dataSize                 
01099     );
01102     H323NonStandardVideoCapability(
01103       const BYTE * dataBlock = NULL,  
01104       PINDEX dataSize = 0,            
01105       PINDEX comparisonOffset = 0,    
01106       PINDEX comparisonLength = P_MAX_INDEX  
01107     );
01108 
01111     H323NonStandardVideoCapability(
01112       const PString & oid,            
01113       const BYTE * dataBlock = NULL,  
01114       PINDEX dataSize = 0,            
01115       PINDEX comparisonOffset = 0,    
01116       PINDEX comparisonLength = P_MAX_INDEX  
01117     );
01118 
01121     H323NonStandardVideoCapability(
01122       BYTE country,                   
01123       BYTE extension,                 
01124       WORD maufacturer,               
01125       const BYTE * dataBlock = NULL,  
01126       PINDEX dataSize = 0,            
01127       PINDEX comparisonOffset = 0,    
01128       PINDEX comparisonLength = P_MAX_INDEX  
01129     );
01131 
01137     Comparison Compare(const PObject & obj) const;
01139 
01148     virtual unsigned GetSubType() const;
01150 
01161     virtual PBoolean OnSendingPDU(
01162       H245_VideoCapability & pdu  
01163     ) const;
01164 
01173     virtual PBoolean OnSendingPDU(
01174       H245_VideoMode & pdu  
01175     ) const;
01176 
01185     virtual PBoolean OnReceivedPDU(
01186       const H245_VideoCapability & pdu  
01187     );
01188 
01191     virtual PBoolean IsMatch(
01192       const PASN_Choice & subTypePDU  
01193     ) const;
01195 };
01196 
01204 class H323GenericVideoCapability : public H323VideoCapability,
01205                                    public H323GenericCapabilityInfo
01206 {
01207   PCLASSINFO(H323GenericVideoCapability, H323VideoCapability);
01208 
01209   public:
01214     H323GenericVideoCapability(
01215       const PString & capabilityId,    
01216       PINDEX maxBitRate = 0            
01217     );
01219 
01225     Comparison Compare(const PObject & obj) const;
01227 
01235     virtual unsigned GetSubType() const;
01237 
01248     virtual PBoolean OnSendingPDU(
01249       H245_VideoCapability & pdu,  
01250       CommandType type             
01251     ) const;
01252 
01261     virtual PBoolean OnSendingPDU(
01262       H245_VideoMode & pdu  
01263     ) const;
01264 
01273     virtual PBoolean OnReceivedPDU(
01274       const H245_VideoCapability & pdu,  
01275       CommandType type                   
01276     );
01278 
01281     virtual PBoolean IsMatch(
01282       const PASN_Choice & subTypePDU  
01283     ) const;
01284 };
01285 
01286 #endif  // OPAL_VIDEO
01287 
01294 class H323DataCapability : public H323Capability
01295 {
01296   PCLASSINFO(H323DataCapability, H323Capability);
01297 
01298   public:
01303     H323DataCapability(
01304       unsigned maxBitRate = 0  
01305     );
01307 
01313     virtual MainTypes GetMainType() const;
01315 
01325     virtual unsigned GetDefaultSessionID() const;
01327 
01338     virtual PBoolean OnSendingPDU(
01339       H245_Capability & pdu  
01340     ) const;
01341 
01350     virtual PBoolean OnSendingPDU(
01351       H245_DataType & pdu  
01352     ) const;
01353 
01362     virtual PBoolean OnSendingPDU(
01363       H245_ModeElement & pdu  
01364     ) const;
01365 
01373     virtual PBoolean OnSendingPDU(
01374       H245_DataApplicationCapability & pdu  
01375     ) const;
01376     virtual PBoolean OnSendingPDU(
01377       H245_DataApplicationCapability & pdu, 
01378       CommandType type                      
01379     ) const;
01380 
01389     virtual PBoolean OnSendingPDU(
01390       H245_DataMode & pdu  
01391     ) const = 0;
01392 
01402     virtual PBoolean OnReceivedPDU(
01403       const H245_Capability & pdu  
01404     );
01405 
01413     virtual PBoolean OnReceivedPDU(
01414       const H245_DataType & pdu,  
01415       PBoolean receiver               
01416     );
01417 
01425     virtual PBoolean OnReceivedPDU(
01426       const H245_DataApplicationCapability & pdu  
01427     );
01428     virtual PBoolean OnReceivedPDU(
01429       const H245_DataApplicationCapability & pdu, 
01430       CommandType type                            
01431     );
01433 
01434   protected:
01435     unsigned maxBitRate;
01436 };
01437 
01438 
01446 class H323NonStandardDataCapability : public H323DataCapability,
01447                                       public H323NonStandardCapabilityInfo
01448 {
01449   PCLASSINFO(H323NonStandardDataCapability, H323DataCapability);
01450 
01451   public:
01456     H323NonStandardDataCapability(
01457       unsigned maxBitRate,            
01458       const BYTE * dataBlock = NULL,  
01459       PINDEX dataSize = 0,            
01460       PINDEX comparisonOffset = 0,    
01461       PINDEX comparisonLength = P_MAX_INDEX  
01462     );
01463 
01466     H323NonStandardDataCapability(
01467       unsigned maxBitRate,            
01468       const PString & oid,            
01469       const BYTE * dataBlock = NULL,  
01470       PINDEX dataSize = 0,            
01471       PINDEX comparisonOffset = 0,    
01472       PINDEX comparisonLength = P_MAX_INDEX  
01473     );
01474 
01477     H323NonStandardDataCapability(
01478       unsigned maxBitRate,            
01479       BYTE country,                   
01480       BYTE extension,                 
01481       WORD maufacturer,               
01482       const BYTE * dataBlock = NULL,  
01483       PINDEX dataSize = 0,            
01484       PINDEX comparisonOffset = 0,    
01485       PINDEX comparisonLength = P_MAX_INDEX  
01486     );
01488 
01494     Comparison Compare(const PObject & obj) const;
01496 
01505     virtual unsigned GetSubType() const;
01507 
01518     virtual PBoolean OnSendingPDU(
01519       H245_DataApplicationCapability & pdu  
01520     ) const;
01521 
01530     virtual PBoolean OnSendingPDU(
01531       H245_DataMode & pdu  
01532     ) const;
01533 
01542     virtual PBoolean OnReceivedPDU(
01543       const H245_DataApplicationCapability & pdu  
01544     );
01545 
01548     virtual PBoolean IsMatch(
01549       const PASN_Choice & subTypePDU  
01550     ) const;
01552 };
01553 
01554 
01556 // Known audio codecs
01557 
01560 class H323_G711Capability : public H323AudioCapability
01561 {
01562   PCLASSINFO(H323_G711Capability, H323AudioCapability)
01563 
01564   public:
01566     enum Mode {
01568       ALaw,
01570       muLaw
01571     };
01573     enum Speed {
01575       At64k,
01577       At56k
01578     };
01579 
01584     H323_G711Capability(
01585       Mode mode = muLaw,    
01586       Speed speed = At64k   
01587     );
01589 
01594     virtual PObject * Clone() const;
01596 
01605     virtual unsigned GetSubType() const;
01606 
01609     virtual PString GetFormatName() const;
01611 
01612   protected:
01613     Mode     mode;
01614     Speed    speed;
01615 };
01616 
01618 
01621 class H323_UserInputCapability : public H323Capability
01622 {
01623   PCLASSINFO(H323_UserInputCapability, H323Capability);
01624 
01625   public:
01628     enum SubTypes {
01629       BasicString,
01630       IA5String,
01631       GeneralString,
01632       SignalToneH245,
01633       HookFlashH245,
01634       SignalToneRFC2833,
01635       NumSubTypes
01636     };
01637     static const char * GetSubTypeName(SubTypes subType);
01638     friend ostream & operator<<(ostream & strm, SubTypes subType) { return strm << GetSubTypeName(subType); }
01639 
01644     H323_UserInputCapability(
01645       SubTypes subType
01646     );
01648 
01653     virtual PObject * Clone() const;
01655 
01663     virtual MainTypes GetMainType() const;
01664 
01668     virtual unsigned  GetSubType()  const;
01669 
01672     virtual PString GetFormatName() const;
01674 
01682     virtual H323Channel * CreateChannel(
01683       H323Connection & connection,    
01684       H323Channel::Directions dir,    
01685       unsigned sessionID,             
01686       const H245_H2250LogicalChannelParameters * param
01688     ) const;
01690 
01700     virtual PBoolean OnSendingPDU(
01701       H245_Capability & pdu  
01702     ) const;
01703 
01711     virtual PBoolean OnSendingPDU(
01712       H245_DataType & pdu  
01713     ) const;
01714 
01723     virtual PBoolean OnSendingPDU(
01724       H245_ModeElement & pdu  
01725     ) const;
01726 
01736     virtual PBoolean OnReceivedPDU(
01737       const H245_Capability & pdu  
01738     );
01739 
01747     virtual PBoolean OnReceivedPDU(
01748       const H245_DataType & pdu,  
01749       PBoolean receiver               
01750     );
01751 
01760     virtual PBoolean IsUsable(
01761       const H323Connection & connection
01762     ) const;
01764 
01765     static void AddAllCapabilities(
01766       H323Capabilities & capabilities,        
01767       PINDEX descriptorNum,   
01768       PINDEX simultaneous     
01769     );
01770 
01771   protected:
01772     SubTypes subType;
01773 };
01774 
01775 
01776 
01778 
01779 PARRAY(H323CapabilitiesList, H323Capability);
01780 
01781 PARRAY(H323CapabilitiesListArray, H323CapabilitiesList);
01782 
01783 class H323SimultaneousCapabilities : public H323CapabilitiesListArray
01784 {
01785   PCLASSINFO(H323SimultaneousCapabilities, H323CapabilitiesListArray);
01786   public:
01787     PBoolean SetSize(PINDEX newSize);
01788 };
01789 
01790 
01791 PARRAY(H323CapabilitiesSetArray, H323SimultaneousCapabilities);
01792 
01793 
01794 class H323CapabilitiesSet : public H323CapabilitiesSetArray
01795 {
01796   PCLASSINFO(H323CapabilitiesSet, H323CapabilitiesSetArray);
01797   public:
01799     PBoolean SetSize(PINDEX newSize);
01800 };
01801 
01802 
01805 class H323Capabilities : public PObject
01806 {
01807     PCLASSINFO(H323Capabilities, PObject);
01808   public:
01813     H323Capabilities();
01814 
01817     H323Capabilities(
01818       const H323Connection & connection,      
01819       const H245_TerminalCapabilitySet & pdu  
01820     );
01821 
01826     H323Capabilities(
01827       const H323Capabilities & original 
01828     );
01829 
01834     H323Capabilities & operator=(
01835       const H323Capabilities & original 
01836     );
01838 
01843     void PrintOn(
01844       ostream & strm    
01845     ) const;
01847 
01852     PINDEX GetSize() const { return table.GetSize(); }
01853 
01856     H323Capability & operator[](PINDEX i) const { return table[i]; }
01857 
01878     PINDEX SetCapability(
01879       PINDEX descriptorNum, 
01880       PINDEX simultaneous,  
01881       H323Capability * cap  
01882     );
01883 
01886     PINDEX AddMediaFormat(
01887       PINDEX descriptorNum,    
01888       PINDEX simultaneous,     
01889       const OpalMediaFormat & mediaFormat 
01890     );
01891 
01896     PINDEX AddAllCapabilities(
01897       PINDEX descriptorNum,    
01898       PINDEX simultaneous,     
01899       const PString & name,    
01900       PBoolean exact = PFalse       
01901     );
01902 
01903     // this function is retained for backwards compatibility
01904     PINDEX AddAllCapabilities(
01905       const H323EndPoint &,    
01906       PINDEX descriptorNum,    
01907       PINDEX simultaneous,     
01908       const PString & name,    
01909       PBoolean exact = PFalse       
01910     )
01911     { return AddAllCapabilities(descriptorNum, simultaneous, name, exact); }
01912 
01921     void Add(
01922       H323Capability * capability   
01923     );
01924 
01931     H323Capability * Copy(
01932       const H323Capability & capability   
01933     );
01934 
01939     void Remove(
01940       H323Capability * capability   
01941     );
01942 
01947     void Remove(
01948       const PString & formatName   
01949     );
01950 
01954     void Remove(
01955       const PStringArray & formatNames  
01956     );
01957 
01960     void RemoveAll();
01961 
01969     H323Capability * FindCapability(
01970       unsigned capabilityNumber
01971     ) const;
01972 
01988     H323Capability * FindCapability(
01989       const PString & formatName, 
01990       H323Capability::CapabilityDirection direction = H323Capability::e_Unknown,
01992       PBoolean exact = PFalse       
01993     ) const;
01994 
02000     H323Capability * FindCapability(
02001       H323Capability::CapabilityDirection direction 
02002     ) const;
02003 
02011     H323Capability * FindCapability(
02012       const H323Capability & capability 
02013     ) const;
02014 
02020     H323Capability * FindCapability(
02021       const H245_Capability & cap  
02022     ) const;
02023 
02029     H323Capability * FindCapability(
02030       const H245_DataType & dataType  
02031     ) const;
02032 
02038     H323Capability * FindCapability(
02039       const H245_ModeElement & modeElement  
02040     ) const;
02041 
02047     H323Capability * FindCapability(
02048       H323Capability::MainTypes mainType, 
02049       unsigned subType = UINT_MAX         
02050     ) const;
02051 
02054     void BuildPDU(
02055       const H323Connection & connection,  
02056       H245_TerminalCapabilitySet & pdu    
02057     ) const;
02058 
02061     PBoolean Merge(
02062       const H323Capabilities & newCaps
02063     );
02064 
02071     void Reorder(
02072       const PStringArray & preferenceOrder  
02073     );
02074 
02077     PBoolean IsAllowed(
02078       const H323Capability & capability
02079     );
02080 
02083     PBoolean IsAllowed(
02084       unsigned capabilityNumber
02085     );
02086 
02089     PBoolean IsAllowed(
02090       const H323Capability & capability1,
02091       const H323Capability & capability2
02092     );
02093 
02096     PBoolean IsAllowed(
02097       unsigned capabilityNumber1,
02098       unsigned capabilityNumber2
02099     );
02100 
02103     OpalMediaFormatList GetMediaFormats() const;
02104 
02105     const PStringSet & GetMediaPacketizations() const { return mediaPacketizations; }
02107 
02108   protected:
02109     void SetMediaPacketizations(const PStringSet & packetizations) { mediaPacketizations = packetizations; }
02110     
02111     H323CapabilitiesList table;
02112     H323CapabilitiesSet  set;
02113     PStringSet           mediaPacketizations;
02114 };
02115 
02116 
02118 
02119 /* New capability registration macros based on abstract factories
02120  */
02121 typedef PFactory<H323Capability, std::string> H323CapabilityFactory;
02122 
02123 #define H323_REGISTER_CAPABILITY(cls, capName)   static H323CapabilityFactory::Worker<cls> cls##Factory(capName, true); \
02124 
02125 
02126 #endif // OPAL_H323
02127 
02128 #endif // OPAL_H323_H323CAPS_H
02129 
02130 

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