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: 19522 $
00030  * $Author: rjongbloed $
00031  * $Date: 2008-02-15 11:37:24 +0000 (Fri, 15 Feb 2008) $
00032  */
00033 
00034 #ifndef __OPAL_H323CAPS_H
00035 #define __OPAL_H323CAPS_H
00036 
00037 #ifdef P_USE_PRAGMA
00038 #pragma interface
00039 #endif
00040 
00041 
00042 #include <opal/mediafmt.h>
00043 #include <h323/channels.h>
00044 
00045 
00046 /* The following classes have forward references to avoid including the VERY
00047    large header files for H225 and H245. If an application requires access
00048    to the protocol classes they can include them, but for simple usage their
00049    inclusion can be avoided.
00050  */
00051 class PASN_Choice;
00052 class H245_Capability;
00053 class H245_DataType;
00054 class H245_ModeElement;
00055 class H245_AudioCapability;
00056 class H245_AudioMode;
00057 class H245_VideoCapability;
00058 class H245_VideoMode;
00059 class H245_DataApplicationCapability;
00060 class H245_DataMode;
00061 class H245_DataProtocolCapability;
00062 class H245_H2250LogicalChannelParameters;
00063 class H245_TerminalCapabilitySet;
00064 class H245_NonStandardParameter;
00065 class H323Connection;
00066 class H323Capabilities;
00067 class H245_CapabilityIdentifier;
00068 class H245_GenericCapability;
00069 class H245_GenericParameter;
00070 
00072 
00086 class H323Capability : public PObject
00087 {
00088   PCLASSINFO(H323Capability, PObject);
00089 
00090   public:
00095     H323Capability();
00097 
00103     Comparison Compare(const PObject & obj) const;
00104 
00107     void PrintOn(ostream & strm) const;
00109 
00112     enum MainTypes {
00114       e_Audio,
00116       e_Video,
00118       e_Data,
00120       e_UserInput,
00122       e_NumMainTypes
00123     };
00124 
00130     virtual MainTypes GetMainType() const = 0;
00131 
00135     virtual unsigned  GetSubType()  const = 0;
00136 
00139     virtual PString GetFormatName() const = 0;
00141 
00147     static H323Capability * Create(
00148       const PString & name     
00149     );
00150 
00159     virtual unsigned GetDefaultSessionID() const;
00160 
00169     virtual void SetTxFramesInPacket(
00170       unsigned frames   
00171     );
00172 
00177     virtual unsigned GetTxFramesInPacket() const;
00178 
00183     virtual unsigned GetRxFramesInPacket() const;
00184 
00190     virtual H323Channel * CreateChannel(
00191       H323Connection & connection,    
00192       H323Channel::Directions dir,    
00193       unsigned sessionID,             
00194       const H245_H2250LogicalChannelParameters * param
00196     ) const = 0;
00198 
00201     enum CommandType {
00202       e_TCS,
00203       e_OLC,
00204       e_ReqMode
00205     };
00206 
00214     virtual PBoolean OnSendingPDU(
00215       H245_Capability & pdu  
00216     ) const = 0;
00217 
00225     virtual PBoolean OnSendingPDU(
00226       H245_DataType & pdu  
00227     ) const = 0;
00228 
00236     virtual PBoolean OnSendingPDU(
00237       H245_ModeElement & pdu  
00238     ) const = 0;
00239 
00252     virtual PBoolean OnReceivedPDU(
00253       const H245_Capability & pdu 
00254     );
00255 
00263     virtual PBoolean OnReceivedPDU(
00264       const H245_DataType & pdu,  
00265       PBoolean receiver               
00266     ) = 0;
00267 
00270     virtual PBoolean IsMatch(
00271       const PASN_Choice & subTypePDU  
00272     ) const;
00273 
00281     virtual PBoolean IsUsable(
00282       const H323Connection & connection
00283     ) const;
00285 
00288     enum CapabilityDirection {
00289       e_Unknown,
00290       e_Receive,
00291       e_Transmit,
00292       e_ReceiveAndTransmit,
00293       e_NoDirection,
00294       NumCapabilityDirections
00295     };
00296 
00299     CapabilityDirection GetCapabilityDirection() const { return capabilityDirection; }
00300 
00303     void SetCapabilityDirection(
00304       CapabilityDirection dir   
00305     ) { capabilityDirection = dir; }
00306 
00308     unsigned GetCapabilityNumber() const { return assignedCapabilityNumber; }
00309 
00311     void SetCapabilityNumber(unsigned num) { assignedCapabilityNumber = num; }
00312 
00315     OpalMediaFormat GetMediaFormat() const;
00316 
00319     bool SetMediaFormatOptions(
00320       const OpalMediaFormat & format
00321     );
00322 
00324     RTP_DataFrame::PayloadTypes GetPayloadType() const { return rtpPayloadType; }
00325 
00327     void SetPayloadType(RTP_DataFrame::PayloadTypes pt) { rtpPayloadType = pt; }
00328 
00330     virtual void AttachQoS(RTP_QOS *) { }
00332 
00333 #if PTRACING
00334     friend ostream & operator<<(ostream & o , MainTypes t);
00335     friend ostream & operator<<(ostream & o , CapabilityDirection d);
00336 #endif
00337 
00338   protected:
00339     OpalMediaFormat & GetWritableMediaFormat();
00340 
00341     unsigned            assignedCapabilityNumber;  
00342     CapabilityDirection capabilityDirection;
00343     RTP_DataFrame::PayloadTypes rtpPayloadType;
00344 
00345   private:
00346     OpalMediaFormat     mediaFormat;
00347 
00348   friend class H323Capabilities;
00349 };
00350 
00351 
00352 
00361 class H323NonStandardCapabilityInfo
00362 {
00363   public:
00364     typedef PObject::Comparison (*CompareFuncType)(struct PluginCodec_H323NonStandardCodecData *);
00365 
00368     H323NonStandardCapabilityInfo(
00369       CompareFuncType compareFunc,
00370       const BYTE * dataBlock,         
00371       PINDEX dataSize                 
00372     );
00373 
00376     H323NonStandardCapabilityInfo(
00377       const BYTE * dataBlock,         
00378       PINDEX dataSize,                
00379       PINDEX comparisonOffset = 0,    
00380       PINDEX comparisonLength = P_MAX_INDEX  
00381     );
00382 
00385     H323NonStandardCapabilityInfo(
00386       const PString & oid,
00387       const BYTE * dataBlock,         
00388       PINDEX dataSize,                
00389       PINDEX comparisonOffset = 0,
00390       PINDEX comparisonLength = P_MAX_INDEX
00391     );
00392 
00395     H323NonStandardCapabilityInfo(
00396       BYTE country,                  
00397       BYTE extension,                
00398       WORD maufacturer,              
00399       const BYTE * dataBlock,         
00400       PINDEX dataSize,                
00401       PINDEX comparisonOffset = 0,    
00402       PINDEX comparisonLength = P_MAX_INDEX  
00403     );
00404 
00407     virtual ~H323NonStandardCapabilityInfo();
00408 
00413     virtual PBoolean OnSendingPDU(
00414       PBYTEArray & data  
00415     ) const;
00416 
00421     virtual PBoolean OnReceivedPDU(
00422       const PBYTEArray & data  
00423     );
00424 
00425     PBoolean IsMatch(const H245_NonStandardParameter & param) const;
00426 
00427     PObject::Comparison CompareParam(
00428       const H245_NonStandardParameter & param
00429     ) const;
00430 
00431   protected:
00432     PBoolean OnSendingNonStandardPDU(
00433       PASN_Choice & pdu,
00434       unsigned nonStandardTag
00435     ) const;
00436     PBoolean OnReceivedNonStandardPDU(
00437       const PASN_Choice & pdu,
00438       unsigned nonStandardTag
00439     );
00440 
00441     PObject::Comparison CompareInfo(
00442       const H323NonStandardCapabilityInfo & obj
00443     ) const;
00444     PObject::Comparison CompareData(
00445       const PBYTEArray & data  
00446     ) const;
00447 
00448     PString    oid;
00449     BYTE       t35CountryCode;
00450     BYTE       t35Extension;
00451     WORD       manufacturerCode;
00452     PBYTEArray nonStandardData;
00453     PINDEX     comparisonOffset;
00454     PINDEX     comparisonLength;
00455     CompareFuncType compareFunc;
00456 };
00457 
00467 class H323GenericCapabilityInfo
00468 {
00469   public:
00470     H323GenericCapabilityInfo(
00471       const PString & id,     
00472       PINDEX maxBitRate = 0   
00473     );
00474     H323GenericCapabilityInfo(const H323GenericCapabilityInfo & obj);
00475     virtual ~H323GenericCapabilityInfo();
00476 
00477   protected:
00478     virtual PBoolean OnSendingGenericPDU(
00479       H245_GenericCapability & pdu,
00480       const OpalMediaFormat & mediaFormat,
00481       H323Capability::CommandType type
00482     ) const;
00483     virtual PBoolean OnReceivedGenericPDU(
00484       OpalMediaFormat & mediaFormat,
00485       const H245_GenericCapability & pdu,
00486       H323Capability::CommandType type
00487     );
00488 
00489     PBoolean IsMatch(
00490       const H245_GenericCapability & param  
00491     ) const;
00492     PObject::Comparison CompareInfo(
00493       const H323GenericCapabilityInfo & obj
00494     ) const;
00495 
00496 
00497     H245_CapabilityIdentifier * identifier;
00498     unsigned                    maxBitRate;
00499 };
00500 
00507 class H323RealTimeCapability : public H323Capability
00508 {
00509   PCLASSINFO(H323RealTimeCapability, H323Capability);
00510 
00511   public:
00516     virtual H323Channel * CreateChannel(
00517       H323Connection & connection,    
00518       H323Channel::Directions dir,    
00519       unsigned sessionID,             
00520       const H245_H2250LogicalChannelParameters * param
00522     ) const;
00523 
00524     H323RealTimeCapability();
00525     H323RealTimeCapability(const H323RealTimeCapability &rtc);
00526     virtual ~H323RealTimeCapability();
00527     void AttachQoS(RTP_QOS * _rtpqos);
00528 
00529   protected:
00530     RTP_QOS * rtpqos;
00532 };
00533 
00534 #if OPAL_AUDIO
00535 
00542 class H323AudioCapability : public H323RealTimeCapability
00543 {
00544   PCLASSINFO(H323AudioCapability, H323RealTimeCapability);
00545 
00546   public:
00551     H323AudioCapability();
00553 
00559     virtual MainTypes GetMainType() const;
00561 
00572     virtual unsigned GetDefaultSessionID() const;
00573 
00582     virtual void SetTxFramesInPacket(
00583       unsigned frames   
00584     );
00585 
00591     virtual unsigned GetTxFramesInPacket() const;
00592 
00598     virtual unsigned GetRxFramesInPacket() const;
00600 
00611     virtual PBoolean OnSendingPDU(
00612       H245_Capability & pdu  
00613     ) const;
00614 
00623     virtual PBoolean OnSendingPDU(
00624       H245_DataType & pdu  
00625     ) const;
00626 
00635     virtual PBoolean OnSendingPDU(
00636       H245_ModeElement & pdu  
00637     ) const;
00638 
00647     virtual PBoolean OnSendingPDU(
00648       H245_AudioCapability & pdu,  
00649       unsigned packetSize          
00650     ) const;
00651     virtual PBoolean OnSendingPDU(
00652       H245_AudioCapability & pdu,  
00653       unsigned packetSize,         
00654       CommandType type             
00655     ) const;
00656 
00665     virtual PBoolean OnSendingPDU(
00666       H245_AudioMode & pdu  
00667     ) const;
00668 
00680     virtual PBoolean OnReceivedPDU(
00681       const H245_Capability & pdu  
00682     );
00683 
00693     virtual PBoolean OnReceivedPDU(
00694       const H245_DataType & pdu,  
00695       PBoolean receiver               
00696     );
00697 
00706     virtual PBoolean OnReceivedPDU(
00707       const H245_AudioCapability & pdu,  
00708       unsigned & packetSize              
00709     );
00710     virtual PBoolean OnReceivedPDU(
00711       const H245_AudioCapability & pdu,  
00712       unsigned & packetSize,             
00713       CommandType type                   
00714     );
00716 };
00717 
00718 
00726 class H323NonStandardAudioCapability : public H323AudioCapability,
00727                                        public H323NonStandardCapabilityInfo
00728 {
00729   PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00730 
00731   public:
00734     H323NonStandardAudioCapability(
00735       H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00736       const BYTE * dataBlock,         
00737       PINDEX dataSize                 
00738     );
00741     H323NonStandardAudioCapability(
00742       const BYTE * dataBlock = NULL,  
00743       PINDEX dataSize = 0,            
00744       PINDEX comparisonOffset = 0,    
00745       PINDEX comparisonLength = P_MAX_INDEX  
00746      );
00747 
00750     H323NonStandardAudioCapability(
00751       const PString & oid,            
00752       const BYTE * dataBlock = NULL,  
00753       PINDEX dataSize = 0,            
00754       PINDEX comparisonOffset = 0,    
00755       PINDEX comparisonLength = P_MAX_INDEX  
00756     );
00757 
00760     H323NonStandardAudioCapability(
00761       BYTE country,                   
00762       BYTE extension,                 
00763       WORD maufacturer,               
00764       const BYTE * dataBlock = NULL,  
00765       PINDEX dataSize = 0,            
00766       PINDEX comparisonOffset = 0,    
00767       PINDEX comparisonLength = P_MAX_INDEX  
00768     );
00770 
00776     Comparison Compare(const PObject & obj) const;
00778 
00786     virtual unsigned GetSubType() const;
00788 
00799     virtual PBoolean OnSendingPDU(
00800       H245_AudioCapability & pdu,  
00801       unsigned packetSize          
00802     ) const;
00803 
00812     virtual PBoolean OnSendingPDU(
00813       H245_AudioMode & pdu  
00814     ) const;
00815 
00824     virtual PBoolean OnReceivedPDU(
00825       const H245_AudioCapability & pdu,  
00826       unsigned & packetSize              
00827     );
00828 
00831     virtual PBoolean IsMatch(
00832       const PASN_Choice & subTypePDU  
00833     ) const;
00835 };
00836 
00844 class H323GenericAudioCapability : public H323AudioCapability,
00845                                    public H323GenericCapabilityInfo
00846 {
00847   PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00848 
00849   public:
00854     H323GenericAudioCapability(
00855       const PString & capabilityId,    
00856       PINDEX maxBitRate = 0                
00857     );
00859 
00865     Comparison Compare(const PObject & obj) const;
00867 
00875     virtual unsigned GetSubType() const;
00877 
00888     virtual PBoolean OnSendingPDU(
00889       H245_AudioCapability & pdu,  
00890       unsigned packetSize,         
00891       CommandType type             
00892     ) const;
00893 
00902     virtual PBoolean OnSendingPDU(
00903       H245_AudioMode & pdu  
00904     ) const;
00905 
00914     virtual PBoolean OnReceivedPDU(
00915       const H245_AudioCapability & pdu,  
00916       unsigned & packetSize,             
00917       CommandType type                   
00918     );
00919 
00922     virtual PBoolean IsMatch(
00923       const PASN_Choice & subTypePDU  
00924     ) const;
00926 };
00927 
00928 #endif  // OPAL_AUDIO
00929 
00930 #if OPAL_VIDEO
00931 
00938 class H323VideoCapability : public H323RealTimeCapability
00939 {
00940   PCLASSINFO(H323VideoCapability, H323RealTimeCapability);
00941 
00942   public:
00948     virtual MainTypes GetMainType() const;
00950 
00961     virtual unsigned GetDefaultSessionID() const;
00963 
00974     virtual PBoolean OnSendingPDU(
00975       H245_Capability & pdu  
00976     ) const;
00977 
00986     virtual PBoolean OnSendingPDU(
00987       H245_DataType & pdu  
00988     ) const;
00989 
00998     virtual PBoolean OnSendingPDU(
00999       H245_ModeElement & pdu  
01000     ) const;
01001 
01009     virtual PBoolean OnSendingPDU(
01010       H245_VideoCapability & pdu  
01011     ) const;
01012     virtual PBoolean OnSendingPDU(
01013       H245_VideoCapability & pdu,  
01014       CommandType type             
01015     ) const;
01016 
01025     virtual PBoolean OnSendingPDU(
01026       H245_VideoMode & pdu  
01027     ) const = 0;
01028 
01038     virtual PBoolean OnReceivedPDU(
01039       const H245_Capability & pdu  
01040     );
01041 
01049     virtual PBoolean OnReceivedPDU(
01050       const H245_DataType & pdu,  
01051       PBoolean receiver               
01052     );
01053 
01061     virtual PBoolean OnReceivedPDU(
01062       const H245_VideoCapability & pdu  
01063     );
01064     virtual PBoolean OnReceivedPDU(
01065       const H245_VideoCapability & pdu,  
01066       CommandType type                   
01067     );
01069 };
01070 
01071 
01079 class H323NonStandardVideoCapability : public H323VideoCapability,
01080                                        public H323NonStandardCapabilityInfo
01081 {
01082   PCLASSINFO(H323NonStandardVideoCapability, H323VideoCapability);
01083 
01084   public:
01087     H323NonStandardVideoCapability(
01088       H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
01089       const BYTE * dataBlock,         
01090       PINDEX dataSize                 
01091     );
01094     H323NonStandardVideoCapability(
01095       const BYTE * dataBlock = NULL,  
01096       PINDEX dataSize = 0,            
01097       PINDEX comparisonOffset = 0,    
01098       PINDEX comparisonLength = P_MAX_INDEX  
01099     );
01100 
01103     H323NonStandardVideoCapability(
01104       const PString & oid,            
01105       const BYTE * dataBlock = NULL,  
01106       PINDEX dataSize = 0,            
01107       PINDEX comparisonOffset = 0,    
01108       PINDEX comparisonLength = P_MAX_INDEX  
01109     );
01110 
01113     H323NonStandardVideoCapability(
01114       BYTE country,                   
01115       BYTE extension,                 
01116       WORD maufacturer,               
01117       const BYTE * dataBlock = NULL,  
01118       PINDEX dataSize = 0,            
01119       PINDEX comparisonOffset = 0,    
01120       PINDEX comparisonLength = P_MAX_INDEX  
01121     );
01123 
01129     Comparison Compare(const PObject & obj) const;
01131 
01140     virtual unsigned GetSubType() const;
01142 
01153     virtual PBoolean OnSendingPDU(
01154       H245_VideoCapability & pdu  
01155     ) const;
01156 
01165     virtual PBoolean OnSendingPDU(
01166       H245_VideoMode & pdu  
01167     ) const;
01168 
01177     virtual PBoolean OnReceivedPDU(
01178       const H245_VideoCapability & pdu  
01179     );
01180 
01183     virtual PBoolean IsMatch(
01184       const PASN_Choice & subTypePDU  
01185     ) const;
01187 };
01188 
01196 class H323GenericVideoCapability : public H323VideoCapability,
01197                                    public H323GenericCapabilityInfo
01198 {
01199   PCLASSINFO(H323GenericVideoCapability, H323VideoCapability);
01200 
01201   public:
01206     H323GenericVideoCapability(
01207       const PString & capabilityId,    
01208       PINDEX maxBitRate = 0            
01209     );
01211 
01217     Comparison Compare(const PObject & obj) const;
01219 
01227     virtual unsigned GetSubType() const;
01229 
01240     virtual PBoolean OnSendingPDU(
01241       H245_VideoCapability & pdu,  
01242       CommandType type             
01243     ) const;
01244 
01253     virtual PBoolean OnSendingPDU(
01254       H245_VideoMode & pdu  
01255     ) const;
01256 
01265     virtual PBoolean OnReceivedPDU(
01266       const H245_VideoCapability & pdu,  
01267       CommandType type                   
01268     );
01270 
01273     virtual PBoolean IsMatch(
01274       const PASN_Choice & subTypePDU  
01275     ) const;
01276 };
01277 
01278 #endif  // OPAL_VIDEO
01279 
01286 class H323DataCapability : public H323Capability
01287 {
01288   PCLASSINFO(H323DataCapability, H323Capability);
01289 
01290   public:
01295     H323DataCapability(
01296       unsigned maxBitRate = 0  
01297     );
01299 
01305     virtual MainTypes GetMainType() const;
01307 
01317     virtual unsigned GetDefaultSessionID() const;
01319 
01330     virtual PBoolean OnSendingPDU(
01331       H245_Capability & pdu  
01332     ) const;
01333 
01342     virtual PBoolean OnSendingPDU(
01343       H245_DataType & pdu  
01344     ) const;
01345 
01354     virtual PBoolean OnSendingPDU(
01355       H245_ModeElement & pdu  
01356     ) const;
01357 
01365     virtual PBoolean OnSendingPDU(
01366       H245_DataApplicationCapability & pdu  
01367     ) const;
01368     virtual PBoolean OnSendingPDU(
01369       H245_DataApplicationCapability & pdu, 
01370       CommandType type                      
01371     ) const;
01372 
01381     virtual PBoolean OnSendingPDU(
01382       H245_DataMode & pdu  
01383     ) const = 0;
01384 
01394     virtual PBoolean OnReceivedPDU(
01395       const H245_Capability & pdu  
01396     );
01397 
01405     virtual PBoolean OnReceivedPDU(
01406       const H245_DataType & pdu,  
01407       PBoolean receiver               
01408     );
01409 
01417     virtual PBoolean OnReceivedPDU(
01418       const H245_DataApplicationCapability & pdu  
01419     );
01420     virtual PBoolean OnReceivedPDU(
01421       const H245_DataApplicationCapability & pdu, 
01422       CommandType type                            
01423     );
01425 
01426   protected:
01427     unsigned maxBitRate;
01428 };
01429 
01430 
01438 class H323NonStandardDataCapability : public H323DataCapability,
01439                                       public H323NonStandardCapabilityInfo
01440 {
01441   PCLASSINFO(H323NonStandardDataCapability, H323DataCapability);
01442 
01443   public:
01448     H323NonStandardDataCapability(
01449       unsigned maxBitRate,            
01450       const BYTE * dataBlock = NULL,  
01451       PINDEX dataSize = 0,            
01452       PINDEX comparisonOffset = 0,    
01453       PINDEX comparisonLength = P_MAX_INDEX  
01454     );
01455 
01458     H323NonStandardDataCapability(
01459       unsigned maxBitRate,            
01460       const PString & oid,            
01461       const BYTE * dataBlock = NULL,  
01462       PINDEX dataSize = 0,            
01463       PINDEX comparisonOffset = 0,    
01464       PINDEX comparisonLength = P_MAX_INDEX  
01465     );
01466 
01469     H323NonStandardDataCapability(
01470       unsigned maxBitRate,            
01471       BYTE country,                   
01472       BYTE extension,                 
01473       WORD maufacturer,               
01474       const BYTE * dataBlock = NULL,  
01475       PINDEX dataSize = 0,            
01476       PINDEX comparisonOffset = 0,    
01477       PINDEX comparisonLength = P_MAX_INDEX  
01478     );
01480 
01486     Comparison Compare(const PObject & obj) const;
01488 
01497     virtual unsigned GetSubType() const;
01499 
01510     virtual PBoolean OnSendingPDU(
01511       H245_DataApplicationCapability & pdu  
01512     ) const;
01513 
01522     virtual PBoolean OnSendingPDU(
01523       H245_DataMode & pdu  
01524     ) const;
01525 
01534     virtual PBoolean OnReceivedPDU(
01535       const H245_DataApplicationCapability & pdu  
01536     );
01537 
01540     virtual PBoolean IsMatch(
01541       const PASN_Choice & subTypePDU  
01542     ) const;
01544 };
01545 
01546 
01548 // Known audio codecs
01549 
01552 class H323_G711Capability : public H323AudioCapability
01553 {
01554   PCLASSINFO(H323_G711Capability, H323AudioCapability)
01555 
01556   public:
01558     enum Mode {
01560       ALaw,
01562       muLaw
01563     };
01565     enum Speed {
01567       At64k,
01569       At56k
01570     };
01571 
01576     H323_G711Capability(
01577       Mode mode = muLaw,    
01578       Speed speed = At64k   
01579     );
01581 
01586     virtual PObject * Clone() const;
01588 
01597     virtual unsigned GetSubType() const;
01598 
01601     virtual PString GetFormatName() const;
01603 
01604   protected:
01605     Mode     mode;
01606     Speed    speed;
01607 };
01608 
01609 #if 0
01610 
01613 class H323_G728Capability : public H323AudioCapability
01614 {
01615   PCLASSINFO(H323_G728Capability, H323AudioCapability)
01616 
01617   public:
01622     H323_G728Capability();
01624 
01629     virtual PObject * Clone() const;
01631 
01637     virtual unsigned GetSubType() const;
01638 
01641     virtual PString GetFormatName() const;
01643 };
01644 
01645 
01648 class H323_G729Capability : public H323AudioCapability
01649 {
01650   PCLASSINFO(H323_G729Capability, H323AudioCapability)
01651 
01652   public:
01654     enum Mode {
01655       e_Normal,
01656       e_AnnexA,
01657       e_AnnexB,
01658       e_AnnexA_AnnexB
01659     };
01660 
01665     H323_G729Capability(
01666       Mode mode 
01667     );
01669 
01674     virtual PObject * Clone() const;
01676 
01682     virtual unsigned GetSubType() const;
01683 
01686     virtual PString GetFormatName() const;
01688 
01689   protected:
01690     Mode mode;
01691 };
01692 
01693 
01696 class H323_G7231Capability : public H323AudioCapability
01697 {
01698   PCLASSINFO(H323_G7231Capability, H323AudioCapability)
01699 
01700   public:
01705     H323_G7231Capability(
01706       PBoolean allowSIDFrames = PTrue   
01707     );
01709 
01714     virtual PObject * Clone() const;
01716 
01722     virtual unsigned GetSubType() const;
01723 
01726     virtual PString GetFormatName() const;
01728 
01738     virtual PBoolean OnSendingPDU(
01739       H245_AudioCapability & pdu,  
01740       unsigned packetSize          
01741     ) const;
01742 
01750     virtual PBoolean OnReceivedPDU(
01751       const H245_AudioCapability & pdu,  
01752       unsigned & packetSize              
01753     );
01755 
01756   protected:
01757     PBoolean allowSIDFrames;
01758 };
01759 
01760 
01763 class H323_GSM0610Capability : public H323AudioCapability
01764 {
01765   PCLASSINFO(H323_GSM0610Capability, H323AudioCapability)
01766 
01767   public:
01772     H323_GSM0610Capability();
01774 
01779     virtual PObject * Clone() const;
01781 
01790     virtual unsigned GetSubType() const;
01791 
01794     virtual PString GetFormatName() const;
01795 
01804     virtual void SetTxFramesInPacket(
01805       unsigned frames   
01806     );
01808 
01818     virtual PBoolean OnSendingPDU(
01819       H245_AudioCapability & pdu,  
01820       unsigned packetSize          
01821     ) const;
01822 
01830     virtual PBoolean OnReceivedPDU(
01831       const H245_AudioCapability & pdu,  
01832       unsigned & packetSize              
01833     );
01835 };
01836 
01837 #endif
01838 
01839 
01841 
01844 class H323_UserInputCapability : public H323Capability
01845 {
01846   PCLASSINFO(H323_UserInputCapability, H323Capability);
01847 
01848   public:
01851     enum SubTypes {
01852       BasicString,
01853       IA5String,
01854       GeneralString,
01855       SignalToneH245,
01856       HookFlashH245,
01857       SignalToneRFC2833,
01858       NumSubTypes
01859     };
01860     static const char * GetSubTypeName(SubTypes subType);
01861     friend ostream & operator<<(ostream & strm, SubTypes subType) { return strm << GetSubTypeName(subType); }
01862 
01867     H323_UserInputCapability(
01868       SubTypes subType
01869     );
01871 
01876     virtual PObject * Clone() const;
01878 
01886     virtual MainTypes GetMainType() const;
01887 
01891     virtual unsigned  GetSubType()  const;
01892 
01895     virtual PString GetFormatName() const;
01897 
01905     virtual H323Channel * CreateChannel(
01906       H323Connection & connection,    
01907       H323Channel::Directions dir,    
01908       unsigned sessionID,             
01909       const H245_H2250LogicalChannelParameters * param
01911     ) const;
01913 
01923     virtual PBoolean OnSendingPDU(
01924       H245_Capability & pdu  
01925     ) const;
01926 
01934     virtual PBoolean OnSendingPDU(
01935       H245_DataType & pdu  
01936     ) const;
01937 
01946     virtual PBoolean OnSendingPDU(
01947       H245_ModeElement & pdu  
01948     ) const;
01949 
01959     virtual PBoolean OnReceivedPDU(
01960       const H245_Capability & pdu  
01961     );
01962 
01970     virtual PBoolean OnReceivedPDU(
01971       const H245_DataType & pdu,  
01972       PBoolean receiver               
01973     );
01974 
01983     virtual PBoolean IsUsable(
01984       const H323Connection & connection
01985     ) const;
01987 
01988     static void AddAllCapabilities(
01989       H323Capabilities & capabilities,        
01990       PINDEX descriptorNum,   
01991       PINDEX simultaneous     
01992     );
01993 
01994   protected:
01995     SubTypes subType;
01996 };
01997 
01998 
01999 
02001 
02002 PARRAY(H323CapabilitiesList, H323Capability);
02003 
02004 PARRAY(H323CapabilitiesListArray, H323CapabilitiesList);
02005 
02006 class H323SimultaneousCapabilities : public H323CapabilitiesListArray
02007 {
02008   PCLASSINFO(H323SimultaneousCapabilities, H323CapabilitiesListArray);
02009   public:
02010     PBoolean SetSize(PINDEX newSize);
02011 };
02012 
02013 
02014 PARRAY(H323CapabilitiesSetArray, H323SimultaneousCapabilities);
02015 
02016 
02017 class H323CapabilitiesSet : public H323CapabilitiesSetArray
02018 {
02019   PCLASSINFO(H323CapabilitiesSet, H323CapabilitiesSetArray);
02020   public:
02022     PBoolean SetSize(PINDEX newSize);
02023 };
02024 
02025 
02028 class H323Capabilities : public PObject
02029 {
02030     PCLASSINFO(H323Capabilities, PObject);
02031   public:
02036     H323Capabilities();
02037 
02040     H323Capabilities(
02041       const H323Connection & connection,      
02042       const H245_TerminalCapabilitySet & pdu  
02043     );
02044 
02049     H323Capabilities(
02050       const H323Capabilities & original 
02051     );
02052 
02057     H323Capabilities & operator=(
02058       const H323Capabilities & original 
02059     );
02061 
02066     void PrintOn(
02067       ostream & strm    
02068     ) const;
02070 
02075     PINDEX GetSize() const { return table.GetSize(); }
02076 
02079     H323Capability & operator[](PINDEX i) const { return table[i]; }
02080 
02101     PINDEX SetCapability(
02102       PINDEX descriptorNum, 
02103       PINDEX simultaneous,  
02104       H323Capability * cap  
02105     );
02106 
02109     PINDEX AddMediaFormat(
02110       PINDEX descriptorNum,    
02111       PINDEX simultaneous,     
02112       const OpalMediaFormat & mediaFormat 
02113     );
02114 
02119     PINDEX AddAllCapabilities(
02120       PINDEX descriptorNum,    
02121       PINDEX simultaneous,     
02122       const PString & name,    
02123       PBoolean exact = PFalse       
02124     );
02125 
02126     // this function is retained for backwards compatibility
02127     PINDEX AddAllCapabilities(
02128       const H323EndPoint &,    
02129       PINDEX descriptorNum,    
02130       PINDEX simultaneous,     
02131       const PString & name,    
02132       PBoolean exact = PFalse       
02133     )
02134     { return AddAllCapabilities(descriptorNum, simultaneous, name, exact); }
02135 
02144     void Add(
02145       H323Capability * capability   
02146     );
02147 
02154     H323Capability * Copy(
02155       const H323Capability & capability   
02156     );
02157 
02162     void Remove(
02163       H323Capability * capability   
02164     );
02165 
02170     void Remove(
02171       const PString & formatName   
02172     );
02173 
02177     void Remove(
02178       const PStringArray & formatNames  
02179     );
02180 
02183     void RemoveAll();
02184 
02192     H323Capability * FindCapability(
02193       unsigned capabilityNumber
02194     ) const;
02195 
02211     H323Capability * FindCapability(
02212       const PString & formatName, 
02213       H323Capability::CapabilityDirection direction = H323Capability::e_Unknown,
02215       PBoolean exact = PFalse       
02216     ) const;
02217 
02223     H323Capability * FindCapability(
02224       H323Capability::CapabilityDirection direction 
02225     ) const;
02226 
02234     H323Capability * FindCapability(
02235       const H323Capability & capability 
02236     ) const;
02237 
02243     H323Capability * FindCapability(
02244       const H245_Capability & cap  
02245     ) const;
02246 
02252     H323Capability * FindCapability(
02253       const H245_DataType & dataType  
02254     ) const;
02255 
02261     H323Capability * FindCapability(
02262       const H245_ModeElement & modeElement  
02263     ) const;
02264 
02270     H323Capability * FindCapability(
02271       H323Capability::MainTypes mainType, 
02272       unsigned subType = UINT_MAX         
02273     ) const;
02274 
02277     void BuildPDU(
02278       const H323Connection & connection,  
02279       H245_TerminalCapabilitySet & pdu    
02280     ) const;
02281 
02284     PBoolean Merge(
02285       const H323Capabilities & newCaps
02286     );
02287 
02294     void Reorder(
02295       const PStringArray & preferenceOrder  
02296     );
02297 
02300     PBoolean IsAllowed(
02301       const H323Capability & capability
02302     );
02303 
02306     PBoolean IsAllowed(
02307       unsigned capabilityNumber
02308     );
02309 
02312     PBoolean IsAllowed(
02313       const H323Capability & capability1,
02314       const H323Capability & capability2
02315     );
02316 
02319     PBoolean IsAllowed(
02320       unsigned capabilityNumber1,
02321       unsigned capabilityNumber2
02322     );
02323 
02326     OpalMediaFormatList GetMediaFormats() const;
02327 
02328     const PStringSet & GetMediaPacketizations() const { return mediaPacketizations; }
02330 
02331   protected:
02332     H323CapabilitiesList table;
02333     H323CapabilitiesSet  set;
02334     PStringSet           mediaPacketizations;
02335 };
02336 
02337 
02339 
02340 /* New capability registration macros based on abstract factories
02341  */
02342 typedef PFactory<H323Capability, std::string> H323CapabilityFactory;
02343 
02344 #define H323_REGISTER_CAPABILITY(cls, capName)   static H323CapabilityFactory::Worker<cls> cls##Factory(capName, true); \
02345 
02346 #endif // __OPAL_H323CAPS_H
02347 
02348 

Generated on Fri Mar 7 07:36:29 2008 for OPAL by  doxygen 1.5.1