OPAL  Version 3.10.4
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: 26128 $
00030  * $Author: rjongbloed $
00031  * $Date: 2011-07-07 21:36:57 -0500 (Thu, 07 Jul 2011) $
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_GenericControl,
00127       e_NumMainTypes
00128     };
00129 
00135     virtual MainTypes GetMainType() const = 0;
00136 
00140     virtual unsigned  GetSubType()  const = 0;
00141 
00144     virtual PString GetFormatName() const = 0;
00146 
00152     static H323Capability * Create(
00153       const PString & name     
00154     );
00155 
00156     enum {
00157       DefaultAudioSessionID = 1,
00158       DefaultVideoSessionID = 2,
00159       DefaultDataSessionID  = 3,
00160       DefaultH224SessionID  = 4
00161     };
00162 
00171     virtual unsigned GetDefaultSessionID() const;
00172 
00181     virtual void SetTxFramesInPacket(
00182       unsigned frames   
00183     );
00184 
00189     virtual unsigned GetTxFramesInPacket() const;
00190 
00195     virtual unsigned GetRxFramesInPacket() const;
00196 
00202     virtual H323Channel * CreateChannel(
00203       H323Connection & connection,    
00204       H323Channel::Directions dir,    
00205       unsigned sessionID,             
00206       const H245_H2250LogicalChannelParameters * param
00208     ) const = 0;
00210 
00213     enum CommandType {
00214       e_TCS,
00215       e_OLC,
00216       e_ReqMode
00217     };
00218 
00226     virtual PBoolean OnSendingPDU(
00227       H245_Capability & pdu  
00228     ) const = 0;
00229 
00237     virtual PBoolean OnSendingPDU(
00238       H245_DataType & pdu  
00239     ) const;
00240 
00248     virtual PBoolean OnSendingPDU(
00249       H245_ModeElement & pdu  
00250     ) const = 0;
00251 
00264     virtual PBoolean OnReceivedPDU(
00265       const H245_Capability & pdu 
00266     );
00267 
00275     virtual PBoolean OnReceivedPDU(
00276       const H245_DataType & pdu,  
00277       PBoolean receiver               
00278     );
00279 
00282     virtual PBoolean IsMatch(
00283       const PASN_Choice & subTypePDU  
00284     ) const;
00285 
00293     virtual PBoolean IsUsable(
00294       const H323Connection & connection
00295     ) const;
00297 
00300     enum CapabilityDirection {
00301       e_Unknown,
00302       e_Receive,
00303       e_Transmit,
00304       e_ReceiveAndTransmit,
00305       e_NoDirection,
00306       NumCapabilityDirections
00307     };
00308 
00311     CapabilityDirection GetCapabilityDirection() const { return capabilityDirection; }
00312 
00315     void SetCapabilityDirection(
00316       CapabilityDirection dir   
00317     ) { capabilityDirection = dir; }
00318 
00320     unsigned GetCapabilityNumber() const { return assignedCapabilityNumber; }
00321 
00323     void SetCapabilityNumber(unsigned num) { assignedCapabilityNumber = num; }
00324 
00327     OpalMediaFormat GetMediaFormat() const;
00328 
00331     bool UpdateMediaFormat(
00332       const OpalMediaFormat & format
00333     );
00334 
00336     RTP_DataFrame::PayloadTypes GetPayloadType() const { return GetMediaFormat().GetPayloadType(); }
00337 
00339     void SetPayloadType(RTP_DataFrame::PayloadTypes pt) { GetWritableMediaFormat().SetPayloadType(pt); }
00340 
00342     virtual void AttachQoS(RTP_QOS *) { }
00344 
00345 #if PTRACING
00346     friend ostream & operator<<(ostream & o , MainTypes t);
00347     friend ostream & operator<<(ostream & o , CapabilityDirection d);
00348 #endif
00349 
00350   protected:
00351     OpalMediaFormat & GetWritableMediaFormat() const;
00352 
00353     unsigned            assignedCapabilityNumber;  
00354     CapabilityDirection capabilityDirection;
00355 
00356   private:
00357     mutable OpalMediaFormat m_mediaFormat;
00358 
00359   friend class H323Capabilities;
00360 };
00361 
00362 
00363 
00372 class H323NonStandardCapabilityInfo
00373 {
00374   public:
00375     typedef PObject::Comparison (*CompareFuncType)(struct PluginCodec_H323NonStandardCodecData *);
00376 
00379     H323NonStandardCapabilityInfo(
00380       CompareFuncType compareFunc,
00381       const BYTE * dataBlock,         
00382       PINDEX dataSize                 
00383     );
00384 
00387     H323NonStandardCapabilityInfo(
00388       const BYTE * dataBlock,         
00389       PINDEX dataSize,                
00390       PINDEX comparisonOffset = 0,    
00391       PINDEX comparisonLength = P_MAX_INDEX  
00392     );
00393 
00396     H323NonStandardCapabilityInfo(
00397       const PString & oid,
00398       const BYTE * dataBlock,         
00399       PINDEX dataSize,                
00400       PINDEX comparisonOffset = 0,
00401       PINDEX comparisonLength = P_MAX_INDEX
00402     );
00403 
00406     H323NonStandardCapabilityInfo(
00407       BYTE country,                  
00408       BYTE extension,                
00409       WORD maufacturer,              
00410       const BYTE * dataBlock,         
00411       PINDEX dataSize,                
00412       PINDEX comparisonOffset = 0,    
00413       PINDEX comparisonLength = P_MAX_INDEX  
00414     );
00415 
00418     virtual ~H323NonStandardCapabilityInfo();
00419 
00424     virtual PBoolean OnSendingPDU(
00425       PBYTEArray & data  
00426     ) const;
00427 
00432     virtual PBoolean OnReceivedPDU(
00433       const PBYTEArray & data  
00434     );
00435 
00436     PBoolean IsMatch(const H245_NonStandardParameter & param) const;
00437 
00438     PObject::Comparison CompareParam(
00439       const H245_NonStandardParameter & param
00440     ) const;
00441 
00442   protected:
00443     PBoolean OnSendingNonStandardPDU(
00444       PASN_Choice & pdu,
00445       unsigned nonStandardTag
00446     ) const;
00447     PBoolean OnReceivedNonStandardPDU(
00448       const PASN_Choice & pdu,
00449       unsigned nonStandardTag
00450     );
00451 
00452     PObject::Comparison CompareInfo(
00453       const H323NonStandardCapabilityInfo & obj
00454     ) const;
00455     PObject::Comparison CompareData(
00456       const PBYTEArray & data  
00457     ) const;
00458 
00459     PString    oid;
00460     BYTE       t35CountryCode;
00461     BYTE       t35Extension;
00462     WORD       manufacturerCode;
00463     PBYTEArray nonStandardData;
00464     PINDEX     comparisonOffset;
00465     PINDEX     comparisonLength;
00466     CompareFuncType compareFunc;
00467 };
00468 
00478 class H323GenericCapabilityInfo
00479 {
00480   public:
00481     H323GenericCapabilityInfo(
00482       const PString & id,     
00483       unsigned maxBitRate = 0   
00484     );
00485 
00486     virtual ~H323GenericCapabilityInfo() { }
00487 
00488   protected:
00489     virtual PBoolean OnSendingGenericPDU(
00490       H245_GenericCapability & pdu,
00491       const OpalMediaFormat & mediaFormat,
00492       H323Capability::CommandType type
00493     ) const;
00494     virtual PBoolean OnReceivedGenericPDU(
00495       OpalMediaFormat & mediaFormat,
00496       const H245_GenericCapability & pdu,
00497       H323Capability::CommandType type
00498     );
00499 
00500     PBoolean IsMatch(
00501       const H245_GenericCapability & param  
00502     ) const;
00503     PObject::Comparison CompareInfo(
00504       const H323GenericCapabilityInfo & obj
00505     ) const;
00506 
00507 
00508     PString  m_identifier;
00509     unsigned maxBitRate;
00510 };
00511 
00518 class H323RealTimeCapability : public H323Capability
00519 {
00520   PCLASSINFO(H323RealTimeCapability, H323Capability);
00521 
00522   public:
00527     virtual H323Channel * CreateChannel(
00528       H323Connection & connection,    
00529       H323Channel::Directions dir,    
00530       unsigned sessionID,             
00531       const H245_H2250LogicalChannelParameters * param
00533     ) const;
00534 
00535     H323RealTimeCapability();
00536     H323RealTimeCapability(const H323RealTimeCapability &rtc);
00537     virtual ~H323RealTimeCapability();
00538     void AttachQoS(RTP_QOS * _rtpqos);
00539 
00540   protected:
00541     RTP_QOS * rtpqos;
00543 };
00544 
00545 
00552 class H323AudioCapability : public H323RealTimeCapability
00553 {
00554   PCLASSINFO(H323AudioCapability, H323RealTimeCapability);
00555 
00556   public:
00561     H323AudioCapability();
00563 
00569     virtual MainTypes GetMainType() const;
00571 
00582     virtual unsigned GetDefaultSessionID() const;
00583 
00592     virtual void SetTxFramesInPacket(
00593       unsigned frames   
00594     );
00595 
00601     virtual unsigned GetTxFramesInPacket() const;
00602 
00608     virtual unsigned GetRxFramesInPacket() const;
00610 
00621     virtual PBoolean OnSendingPDU(
00622       H245_Capability & pdu  
00623     ) const;
00624 
00633     virtual PBoolean OnSendingPDU(
00634       H245_DataType & pdu  
00635     ) const;
00636 
00645     virtual PBoolean OnSendingPDU(
00646       H245_ModeElement & pdu  
00647     ) const;
00648 
00657     virtual PBoolean OnSendingPDU(
00658       H245_AudioCapability & pdu,  
00659       unsigned packetSize          
00660     ) const;
00661     virtual PBoolean OnSendingPDU(
00662       H245_AudioCapability & pdu,  
00663       unsigned packetSize,         
00664       CommandType type             
00665     ) const;
00666 
00675     virtual PBoolean OnSendingPDU(
00676       H245_AudioMode & pdu  
00677     ) const;
00678 
00690     virtual PBoolean OnReceivedPDU(
00691       const H245_Capability & pdu  
00692     );
00693 
00703     virtual PBoolean OnReceivedPDU(
00704       const H245_DataType & pdu,  
00705       PBoolean receiver               
00706     );
00707 
00716     virtual PBoolean OnReceivedPDU(
00717       const H245_AudioCapability & pdu,  
00718       unsigned & packetSize              
00719     );
00720     virtual PBoolean OnReceivedPDU(
00721       const H245_AudioCapability & pdu,  
00722       unsigned & packetSize,             
00723       CommandType type                   
00724     );
00726 };
00727 
00728 
00736 class H323NonStandardAudioCapability : public H323AudioCapability,
00737                                        public H323NonStandardCapabilityInfo
00738 {
00739   PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00740 
00741   public:
00744     H323NonStandardAudioCapability(
00745       H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00746       const BYTE * dataBlock,         
00747       PINDEX dataSize                 
00748     );
00751     H323NonStandardAudioCapability(
00752       const BYTE * dataBlock = NULL,  
00753       PINDEX dataSize = 0,            
00754       PINDEX comparisonOffset = 0,    
00755       PINDEX comparisonLength = P_MAX_INDEX  
00756      );
00757 
00760     H323NonStandardAudioCapability(
00761       const PString & oid,            
00762       const BYTE * dataBlock = NULL,  
00763       PINDEX dataSize = 0,            
00764       PINDEX comparisonOffset = 0,    
00765       PINDEX comparisonLength = P_MAX_INDEX  
00766     );
00767 
00770     H323NonStandardAudioCapability(
00771       BYTE country,                   
00772       BYTE extension,                 
00773       WORD maufacturer,               
00774       const BYTE * dataBlock = NULL,  
00775       PINDEX dataSize = 0,            
00776       PINDEX comparisonOffset = 0,    
00777       PINDEX comparisonLength = P_MAX_INDEX  
00778     );
00780 
00786     Comparison Compare(const PObject & obj) const;
00788 
00796     virtual unsigned GetSubType() const;
00798 
00809     virtual PBoolean OnSendingPDU(
00810       H245_AudioCapability & pdu,  
00811       unsigned packetSize          
00812     ) const;
00813 
00822     virtual PBoolean OnSendingPDU(
00823       H245_AudioMode & pdu  
00824     ) const;
00825 
00834     virtual PBoolean OnReceivedPDU(
00835       const H245_AudioCapability & pdu,  
00836       unsigned & packetSize              
00837     );
00838 
00841     virtual PBoolean IsMatch(
00842       const PASN_Choice & subTypePDU  
00843     ) const;
00845 };
00846 
00854 class H323GenericAudioCapability : public H323AudioCapability,
00855                                    public H323GenericCapabilityInfo
00856 {
00857   PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00858 
00859   public:
00864     H323GenericAudioCapability(
00865       const PString & capabilityId,    
00866       PINDEX maxBitRate = 0               
00867     );
00869 
00875     Comparison Compare(const PObject & obj) const;
00877 
00885     virtual unsigned GetSubType() const;
00887 
00898     virtual PBoolean OnSendingPDU(
00899       H245_AudioCapability & pdu,  
00900       unsigned packetSize,         
00901       CommandType type             
00902     ) const;
00903 
00912     virtual PBoolean OnSendingPDU(
00913       H245_AudioMode & pdu  
00914     ) const;
00915 
00924     virtual PBoolean OnReceivedPDU(
00925       const H245_AudioCapability & pdu,  
00926       unsigned & packetSize,             
00927       CommandType type                   
00928     );
00929 
00932     virtual PBoolean IsMatch(
00933       const PASN_Choice & subTypePDU  
00934     ) const;
00936 };
00937 
00938 
00939 #if OPAL_VIDEO
00940 
00947 class H323VideoCapability : public H323RealTimeCapability
00948 {
00949   PCLASSINFO(H323VideoCapability, H323RealTimeCapability);
00950 
00951   public:
00957     virtual MainTypes GetMainType() const;
00959 
00970     virtual unsigned GetDefaultSessionID() const;
00972 
00983     virtual PBoolean OnSendingPDU(
00984       H245_Capability & pdu  
00985     ) const;
00986 
00995     virtual PBoolean OnSendingPDU(
00996       H245_DataType & pdu  
00997     ) const;
00998 
01007     virtual PBoolean OnSendingPDU(
01008       H245_ModeElement & pdu  
01009     ) const;
01010 
01018     virtual PBoolean OnSendingPDU(
01019       H245_VideoCapability & pdu  
01020     ) const;
01021     virtual PBoolean OnSendingPDU(
01022       H245_VideoCapability & pdu,  
01023       CommandType type             
01024     ) const;
01025 
01034     virtual PBoolean OnSendingPDU(
01035       H245_VideoMode & pdu  
01036     ) const = 0;
01037 
01047     virtual PBoolean OnReceivedPDU(
01048       const H245_Capability & pdu  
01049     );
01050 
01058     virtual PBoolean OnReceivedPDU(
01059       const H245_DataType & pdu,  
01060       PBoolean receiver               
01061     );
01062 
01070     virtual PBoolean OnReceivedPDU(
01071       const H245_VideoCapability & pdu  
01072     );
01073     virtual PBoolean OnReceivedPDU(
01074       const H245_VideoCapability & pdu,  
01075       CommandType type                   
01076     );
01078 };
01079 
01080 
01088 class H323NonStandardVideoCapability : public H323VideoCapability,
01089                                        public H323NonStandardCapabilityInfo
01090 {
01091   PCLASSINFO(H323NonStandardVideoCapability, H323VideoCapability);
01092 
01093   public:
01096     H323NonStandardVideoCapability(
01097       H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
01098       const BYTE * dataBlock,         
01099       PINDEX dataSize                 
01100     );
01103     H323NonStandardVideoCapability(
01104       const BYTE * dataBlock = NULL,  
01105       PINDEX dataSize = 0,            
01106       PINDEX comparisonOffset = 0,    
01107       PINDEX comparisonLength = P_MAX_INDEX  
01108     );
01109 
01112     H323NonStandardVideoCapability(
01113       const PString & oid,            
01114       const BYTE * dataBlock = NULL,  
01115       PINDEX dataSize = 0,            
01116       PINDEX comparisonOffset = 0,    
01117       PINDEX comparisonLength = P_MAX_INDEX  
01118     );
01119 
01122     H323NonStandardVideoCapability(
01123       BYTE country,                   
01124       BYTE extension,                 
01125       WORD maufacturer,               
01126       const BYTE * dataBlock = NULL,  
01127       PINDEX dataSize = 0,            
01128       PINDEX comparisonOffset = 0,    
01129       PINDEX comparisonLength = P_MAX_INDEX  
01130     );
01132 
01138     Comparison Compare(const PObject & obj) const;
01140 
01149     virtual unsigned GetSubType() const;
01151 
01162     virtual PBoolean OnSendingPDU(
01163       H245_VideoCapability & pdu  
01164     ) const;
01165 
01174     virtual PBoolean OnSendingPDU(
01175       H245_VideoMode & pdu  
01176     ) const;
01177 
01186     virtual PBoolean OnReceivedPDU(
01187       const H245_VideoCapability & pdu  
01188     );
01189 
01192     virtual PBoolean IsMatch(
01193       const PASN_Choice & subTypePDU  
01194     ) const;
01196 };
01197 
01205 class H323GenericVideoCapability : public H323VideoCapability,
01206                                    public H323GenericCapabilityInfo
01207 {
01208   PCLASSINFO(H323GenericVideoCapability, H323VideoCapability);
01209 
01210   public:
01215     H323GenericVideoCapability(
01216       const PString & capabilityId,    
01217       PINDEX maxBitRate = 0           
01218     );
01220 
01226     Comparison Compare(const PObject & obj) const;
01228 
01236     virtual unsigned GetSubType() const;
01238 
01249     virtual PBoolean OnSendingPDU(
01250       H245_VideoCapability & pdu,  
01251       CommandType type             
01252     ) const;
01253 
01262     virtual PBoolean OnSendingPDU(
01263       H245_VideoMode & pdu  
01264     ) const;
01265 
01274     virtual PBoolean OnReceivedPDU(
01275       const H245_VideoCapability & pdu,  
01276       CommandType type                   
01277     );
01278 
01281     virtual PBoolean IsMatch(
01282       const PASN_Choice & subTypePDU  
01283     ) const;
01285 };
01286 
01287 
01288 #if OPAL_H239
01289 
01292 class H323ExtendedVideoCapability : public H323GenericVideoCapability
01293 {
01294   PCLASSINFO(H323ExtendedVideoCapability, H323GenericVideoCapability);
01295 
01296   public:
01301     H323ExtendedVideoCapability(
01302       const PString & identifier   
01303     );
01305 
01313     virtual unsigned GetSubType() const;
01315     
01326     virtual PBoolean OnSendingPDU(
01327       H245_VideoCapability & pdu,  
01328       CommandType type             
01329     ) const;
01330 
01339     virtual PBoolean OnSendingPDU(
01340       H245_VideoMode & pdu  
01341     ) const;
01342 
01351     virtual PBoolean OnReceivedPDU(
01352       const H245_VideoCapability & pdu,  
01353       CommandType type                   
01354     );
01355 
01358     virtual PBoolean IsMatch(
01359       const PASN_Choice & subTypePDU  
01360     ) const;
01362 
01363   protected:
01364     OpalMediaFormatList m_videoFormats;
01365 };
01366 
01367 
01369 
01372 class H323GenericControlCapability : public H323Capability,
01373                                      public H323GenericCapabilityInfo
01374 {
01375   PCLASSINFO(H323GenericControlCapability, H323Capability);
01376 
01377   public:
01382     H323GenericControlCapability(
01383       const PString & identifier  
01384     );
01386 
01392     virtual MainTypes GetMainType() const;
01393 
01399     virtual unsigned GetSubType() const;
01401 
01412     virtual PBoolean OnSendingPDU(
01413       H245_Capability & pdu  
01414     ) const;
01415 
01423     virtual PBoolean OnSendingPDU(
01424       H245_ModeElement & pdu  
01425     ) const;
01426 
01436     virtual PBoolean OnReceivedPDU(
01437       const H245_Capability & pdu  
01438     );
01439 
01442     virtual PBoolean IsMatch(
01443       const PASN_Choice & subTypePDU  
01444     ) const;
01446 
01454     virtual H323Channel * CreateChannel(
01455       H323Connection & connection,    
01456       H323Channel::Directions dir,    
01457       unsigned sessionID,             
01458       const H245_H2250LogicalChannelParameters * param
01460     ) const;
01462 };
01463 
01464 
01466 
01467 class H323H239VideoCapability : public H323ExtendedVideoCapability
01468 {
01469   PCLASSINFO(H323H239VideoCapability, H323ExtendedVideoCapability);
01470 
01471   public:
01476     H323H239VideoCapability(
01477       const OpalMediaFormat & videoFormat
01478     );
01480 
01486     Comparison Compare(const PObject & obj) const;
01487 
01490     virtual PObject * Clone() const;
01491 
01494     void PrintOn(ostream & strm) const;
01496 
01501     virtual PString GetFormatName() const;
01503 
01514     virtual PBoolean OnSendingPDU(
01515       H245_VideoCapability & pdu,  
01516       CommandType type             
01517     ) const;
01518 
01527     virtual PBoolean OnReceivedPDU(
01528       const H245_VideoCapability & pdu,  
01529       CommandType type                   
01530     );
01532 };
01533 
01534 
01536 
01537 class H323H239ControlCapability : public H323GenericControlCapability
01538 {
01539   PCLASSINFO(H323H239ControlCapability, H323GenericControlCapability);
01540 
01541   public:
01546     H323H239ControlCapability();
01548 
01553     virtual PObject * Clone() const;
01555 
01560     virtual PString GetFormatName() const;
01562 };
01563 
01564 
01565 #endif  // OPAL_H239
01566 
01567 #endif  // OPAL_VIDEO
01568 
01569 
01576 class H323DataCapability : public H323Capability
01577 {
01578   PCLASSINFO(H323DataCapability, H323Capability);
01579 
01580   public:
01585     H323DataCapability(
01586       unsigned maxBitRate = 0  
01587     );
01589 
01595     virtual MainTypes GetMainType() const;
01597 
01607     virtual unsigned GetDefaultSessionID() const;
01609 
01620     virtual PBoolean OnSendingPDU(
01621       H245_Capability & pdu  
01622     ) const;
01623 
01632     virtual PBoolean OnSendingPDU(
01633       H245_DataType & pdu  
01634     ) const;
01635 
01644     virtual PBoolean OnSendingPDU(
01645       H245_ModeElement & pdu  
01646     ) const;
01647 
01655     virtual PBoolean OnSendingPDU(
01656       H245_DataApplicationCapability & pdu  
01657     ) const;
01658     virtual PBoolean OnSendingPDU(
01659       H245_DataApplicationCapability & pdu, 
01660       CommandType type                      
01661     ) const;
01662 
01671     virtual PBoolean OnSendingPDU(
01672       H245_DataMode & pdu  
01673     ) const = 0;
01674 
01684     virtual PBoolean OnReceivedPDU(
01685       const H245_Capability & pdu  
01686     );
01687 
01695     virtual PBoolean OnReceivedPDU(
01696       const H245_DataType & pdu,  
01697       PBoolean receiver               
01698     );
01699 
01707     virtual PBoolean OnReceivedPDU(
01708       const H245_DataApplicationCapability & pdu  
01709     );
01710     virtual PBoolean OnReceivedPDU(
01711       const H245_DataApplicationCapability & pdu, 
01712       CommandType type                            
01713     );
01715 
01716   protected:
01717     unsigned maxBitRate;
01718 };
01719 
01720 
01728 class H323NonStandardDataCapability : public H323DataCapability,
01729                                       public H323NonStandardCapabilityInfo
01730 {
01731   PCLASSINFO(H323NonStandardDataCapability, H323DataCapability);
01732 
01733   public:
01738     H323NonStandardDataCapability(
01739       unsigned maxBitRate,            
01740       const BYTE * dataBlock = NULL,  
01741       PINDEX dataSize = 0,            
01742       PINDEX comparisonOffset = 0,    
01743       PINDEX comparisonLength = P_MAX_INDEX  
01744     );
01745 
01748     H323NonStandardDataCapability(
01749       unsigned maxBitRate,            
01750       const PString & oid,            
01751       const BYTE * dataBlock = NULL,  
01752       PINDEX dataSize = 0,            
01753       PINDEX comparisonOffset = 0,    
01754       PINDEX comparisonLength = P_MAX_INDEX  
01755     );
01756 
01759     H323NonStandardDataCapability(
01760       unsigned maxBitRate,            
01761       BYTE country,                   
01762       BYTE extension,                 
01763       WORD maufacturer,               
01764       const BYTE * dataBlock = NULL,  
01765       PINDEX dataSize = 0,            
01766       PINDEX comparisonOffset = 0,    
01767       PINDEX comparisonLength = P_MAX_INDEX  
01768     );
01770 
01776     Comparison Compare(const PObject & obj) const;
01778 
01787     virtual unsigned GetSubType() const;
01789 
01800     virtual PBoolean OnSendingPDU(
01801       H245_DataApplicationCapability & pdu  
01802     ) const;
01803 
01812     virtual PBoolean OnSendingPDU(
01813       H245_DataMode & pdu  
01814     ) const;
01815 
01824     virtual PBoolean OnReceivedPDU(
01825       const H245_DataApplicationCapability & pdu  
01826     );
01827 
01830     virtual PBoolean IsMatch(
01831       const PASN_Choice & subTypePDU  
01832     ) const;
01834 };
01835 
01836 
01838 // Known audio codecs
01839 
01842 class H323_G711Capability : public H323AudioCapability
01843 {
01844   PCLASSINFO(H323_G711Capability, H323AudioCapability)
01845 
01846   public:
01848     enum Mode {
01850       ALaw,
01852       muLaw
01853     };
01855     enum Speed {
01857       At64k,
01859       At56k
01860     };
01861 
01866     H323_G711Capability(
01867       Mode mode = muLaw,    
01868       Speed speed = At64k   
01869     );
01871 
01876     virtual PObject * Clone() const;
01878 
01887     virtual unsigned GetSubType() const;
01888 
01891     virtual PString GetFormatName() const;
01893 
01894   protected:
01895     Mode     mode;
01896     Speed    speed;
01897 };
01898 
01900 
01903 class H323_UserInputCapability : public H323Capability
01904 {
01905   PCLASSINFO(H323_UserInputCapability, H323Capability);
01906 
01907   public:
01910     enum SubTypes {
01911       BasicString,
01912       IA5String,
01913       GeneralString,
01914       SignalToneH245,
01915       HookFlashH245,
01916       SignalToneRFC2833,
01917       NumSubTypes
01918     };
01919     static const char * GetSubTypeName(SubTypes subType);
01920     friend ostream & operator<<(ostream & strm, SubTypes subType) { return strm << GetSubTypeName(subType); }
01921 
01926     H323_UserInputCapability(
01927       SubTypes subType
01928     );
01930 
01935     virtual PObject * Clone() const;
01937 
01945     virtual MainTypes GetMainType() const;
01946 
01950     virtual unsigned  GetSubType()  const;
01951 
01954     virtual PString GetFormatName() const;
01956 
01964     virtual H323Channel * CreateChannel(
01965       H323Connection & connection,    
01966       H323Channel::Directions dir,    
01967       unsigned sessionID,             
01968       const H245_H2250LogicalChannelParameters * param
01970     ) const;
01972 
01982     virtual PBoolean OnSendingPDU(
01983       H245_Capability & pdu  
01984     ) const;
01985 
01993     virtual PBoolean OnSendingPDU(
01994       H245_DataType & pdu  
01995     ) const;
01996 
02005     virtual PBoolean OnSendingPDU(
02006       H245_ModeElement & pdu  
02007     ) const;
02008 
02018     virtual PBoolean OnReceivedPDU(
02019       const H245_Capability & pdu  
02020     );
02021 
02029     virtual PBoolean OnReceivedPDU(
02030       const H245_DataType & pdu,  
02031       PBoolean receiver               
02032     );
02033 
02042     virtual PBoolean IsUsable(
02043       const H323Connection & connection
02044     ) const;
02046 
02047     static void AddAllCapabilities(
02048       H323Capabilities & capabilities,  
02049       PINDEX descriptorNum,             
02050       PINDEX simultaneous,              
02051       bool includeRFC2833 = true
02052     );
02053 
02054   protected:
02055     SubTypes subType;
02056 };
02057 
02058 
02059 
02061 
02062 PARRAY(H323CapabilitiesList, H323Capability);
02063 
02064 PARRAY(H323CapabilitiesListArray, H323CapabilitiesList);
02065 
02066 class H323SimultaneousCapabilities : public H323CapabilitiesListArray
02067 {
02068   PCLASSINFO(H323SimultaneousCapabilities, H323CapabilitiesListArray);
02069   public:
02070     PBoolean SetSize(PINDEX newSize);
02071 };
02072 
02073 
02074 PARRAY(H323CapabilitiesSetArray, H323SimultaneousCapabilities);
02075 
02076 
02077 class H323CapabilitiesSet : public H323CapabilitiesSetArray
02078 {
02079   PCLASSINFO(H323CapabilitiesSet, H323CapabilitiesSetArray);
02080   public:
02082     PBoolean SetSize(PINDEX newSize);
02083 };
02084 
02085 
02088 class H323Capabilities : public PObject
02089 {
02090     PCLASSINFO(H323Capabilities, PObject);
02091   public:
02096     H323Capabilities();
02097 
02100     H323Capabilities(
02101       const H323Connection & connection,      
02102       const H245_TerminalCapabilitySet & pdu  
02103     );
02104 
02109     H323Capabilities(
02110       const H323Capabilities & original 
02111     );
02112 
02117     H323Capabilities & operator=(
02118       const H323Capabilities & original 
02119     );
02121 
02126     void PrintOn(
02127       ostream & strm    
02128     ) const;
02130 
02135     PINDEX GetSize() const { return table.GetSize(); }
02136 
02139     H323Capability & operator[](PINDEX i) const { return table[i]; }
02140 
02161     PINDEX SetCapability(
02162       PINDEX descriptorNum, 
02163       PINDEX simultaneous,  
02164       H323Capability * cap  
02165     );
02166 
02169     PINDEX AddMediaFormat(
02170       PINDEX descriptorNum,    
02171       PINDEX simultaneous,     
02172       const OpalMediaFormat & mediaFormat 
02173     );
02174 
02179     PINDEX AddAllCapabilities(
02180       PINDEX descriptorNum,    
02181       PINDEX simultaneous,     
02182       const PString & name,    
02183       PBoolean exact = false       
02184     );
02185 
02186     // this function is retained for backwards compatibility
02187     PINDEX AddAllCapabilities(
02188       const H323EndPoint &,    
02189       PINDEX descriptorNum,    
02190       PINDEX simultaneous,     
02191       const PString & name,    
02192       PBoolean exact = false       
02193     )
02194     { return AddAllCapabilities(descriptorNum, simultaneous, name, exact); }
02195 
02204     void Add(
02205       H323Capability * capability   
02206     );
02207 
02214     H323Capability * Copy(
02215       const H323Capability & capability   
02216     );
02217 
02222     void Remove(
02223       H323Capability * capability   
02224     );
02225 
02230     void Remove(
02231       const PString & formatName   
02232     );
02233 
02237     void Remove(
02238       const PStringArray & formatNames  
02239     );
02240 
02243     void RemoveAll();
02244 
02252     H323Capability * FindCapability(
02253       unsigned capabilityNumber
02254     ) const;
02255 
02271     H323Capability * FindCapability(
02272       const PString & formatName, 
02273       H323Capability::CapabilityDirection direction = H323Capability::e_Unknown,
02275       PBoolean exact = false       
02276     ) const;
02277 
02283     H323Capability * FindCapability(
02284       H323Capability::CapabilityDirection direction 
02285     ) const;
02286 
02294     H323Capability * FindCapability(
02295       const H323Capability & capability 
02296     ) const;
02297 
02303     H323Capability * FindCapability(
02304       const H245_Capability & cap  
02305     ) const;
02306 
02312     H323Capability * FindCapability(
02313       const H245_DataType & dataType  
02314     ) const;
02315 
02321     H323Capability * FindCapability(
02322       const H245_ModeElement & modeElement  
02323     ) const;
02324 
02330     H323Capability * FindCapability(
02331       H323Capability::MainTypes mainType, 
02332       unsigned subType = UINT_MAX         
02333     ) const;
02334 
02337     void BuildPDU(
02338       const H323Connection & connection,  
02339       H245_TerminalCapabilitySet & pdu    
02340     ) const;
02341 
02344     PBoolean Merge(
02345       const H323Capabilities & newCaps
02346     );
02347 
02354     void Reorder(
02355       const PStringArray & preferenceOrder  
02356     );
02357 
02360     PBoolean IsAllowed(
02361       const H323Capability & capability
02362     );
02363 
02366     PBoolean IsAllowed(
02367       unsigned capabilityNumber
02368     );
02369 
02372     PBoolean IsAllowed(
02373       const H323Capability & capability1,
02374       const H323Capability & capability2
02375     );
02376 
02379     PBoolean IsAllowed(
02380       unsigned capabilityNumber1,
02381       unsigned capabilityNumber2
02382     );
02383 
02386     OpalMediaFormatList GetMediaFormats() const;
02387 
02388     const PStringSet & GetMediaPacketizations() const { return mediaPacketizations; }
02390 
02391   protected:
02392     void SetMediaPacketizations(const PStringSet & packetizations) { mediaPacketizations = packetizations; }
02393     
02394     H323CapabilitiesList table;
02395     H323CapabilitiesSet  set;
02396     PStringSet           mediaPacketizations;
02397 };
02398 
02399 
02401 
02402 /* New capability registration macros based on abstract factories
02403  */
02404 typedef PFactory<H323Capability, std::string> H323CapabilityFactory;
02405 
02406 #define H323_REGISTER_CAPABILITY(cls, capName)   static H323CapabilityFactory::Worker<cls> cls##Factory(capName, true); \
02407 
02408 
02409 #endif // OPAL_H323
02410 
02411 #endif // OPAL_H323_H323CAPS_H
02412 
02413