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: 20627 $
00030  * $Author: rjongbloed $
00031  * $Date: 2008-07-28 01:58:31 +0000 (Mon, 28 Jul 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;
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     );
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     mutable 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 
00541 class H323AudioCapability : public H323RealTimeCapability
00542 {
00543   PCLASSINFO(H323AudioCapability, H323RealTimeCapability);
00544 
00545   public:
00550     H323AudioCapability();
00552 
00558     virtual MainTypes GetMainType() const;
00560 
00571     virtual unsigned GetDefaultSessionID() const;
00572 
00581     virtual void SetTxFramesInPacket(
00582       unsigned frames   
00583     );
00584 
00590     virtual unsigned GetTxFramesInPacket() const;
00591 
00597     virtual unsigned GetRxFramesInPacket() const;
00599 
00610     virtual PBoolean OnSendingPDU(
00611       H245_Capability & pdu  
00612     ) const;
00613 
00622     virtual PBoolean OnSendingPDU(
00623       H245_DataType & pdu  
00624     ) const;
00625 
00634     virtual PBoolean OnSendingPDU(
00635       H245_ModeElement & pdu  
00636     ) const;
00637 
00646     virtual PBoolean OnSendingPDU(
00647       H245_AudioCapability & pdu,  
00648       unsigned packetSize          
00649     ) const;
00650     virtual PBoolean OnSendingPDU(
00651       H245_AudioCapability & pdu,  
00652       unsigned packetSize,         
00653       CommandType type             
00654     ) const;
00655 
00664     virtual PBoolean OnSendingPDU(
00665       H245_AudioMode & pdu  
00666     ) const;
00667 
00679     virtual PBoolean OnReceivedPDU(
00680       const H245_Capability & pdu  
00681     );
00682 
00692     virtual PBoolean OnReceivedPDU(
00693       const H245_DataType & pdu,  
00694       PBoolean receiver               
00695     );
00696 
00705     virtual PBoolean OnReceivedPDU(
00706       const H245_AudioCapability & pdu,  
00707       unsigned & packetSize              
00708     );
00709     virtual PBoolean OnReceivedPDU(
00710       const H245_AudioCapability & pdu,  
00711       unsigned & packetSize,             
00712       CommandType type                   
00713     );
00715 };
00716 
00717 
00725 class H323NonStandardAudioCapability : public H323AudioCapability,
00726                                        public H323NonStandardCapabilityInfo
00727 {
00728   PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00729 
00730   public:
00733     H323NonStandardAudioCapability(
00734       H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00735       const BYTE * dataBlock,         
00736       PINDEX dataSize                 
00737     );
00740     H323NonStandardAudioCapability(
00741       const BYTE * dataBlock = NULL,  
00742       PINDEX dataSize = 0,            
00743       PINDEX comparisonOffset = 0,    
00744       PINDEX comparisonLength = P_MAX_INDEX  
00745      );
00746 
00749     H323NonStandardAudioCapability(
00750       const PString & oid,            
00751       const BYTE * dataBlock = NULL,  
00752       PINDEX dataSize = 0,            
00753       PINDEX comparisonOffset = 0,    
00754       PINDEX comparisonLength = P_MAX_INDEX  
00755     );
00756 
00759     H323NonStandardAudioCapability(
00760       BYTE country,                   
00761       BYTE extension,                 
00762       WORD maufacturer,               
00763       const BYTE * dataBlock = NULL,  
00764       PINDEX dataSize = 0,            
00765       PINDEX comparisonOffset = 0,    
00766       PINDEX comparisonLength = P_MAX_INDEX  
00767     );
00769 
00775     Comparison Compare(const PObject & obj) const;
00777 
00785     virtual unsigned GetSubType() const;
00787 
00798     virtual PBoolean OnSendingPDU(
00799       H245_AudioCapability & pdu,  
00800       unsigned packetSize          
00801     ) const;
00802 
00811     virtual PBoolean OnSendingPDU(
00812       H245_AudioMode & pdu  
00813     ) const;
00814 
00823     virtual PBoolean OnReceivedPDU(
00824       const H245_AudioCapability & pdu,  
00825       unsigned & packetSize              
00826     );
00827 
00830     virtual PBoolean IsMatch(
00831       const PASN_Choice & subTypePDU  
00832     ) const;
00834 };
00835 
00843 class H323GenericAudioCapability : public H323AudioCapability,
00844                                    public H323GenericCapabilityInfo
00845 {
00846   PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00847 
00848   public:
00853     H323GenericAudioCapability(
00854       const PString & capabilityId,    
00855       PINDEX maxBitRate = 0                
00856     );
00858 
00864     Comparison Compare(const PObject & obj) const;
00866 
00874     virtual unsigned GetSubType() const;
00876 
00887     virtual PBoolean OnSendingPDU(
00888       H245_AudioCapability & pdu,  
00889       unsigned packetSize,         
00890       CommandType type             
00891     ) const;
00892 
00901     virtual PBoolean OnSendingPDU(
00902       H245_AudioMode & pdu  
00903     ) const;
00904 
00913     virtual PBoolean OnReceivedPDU(
00914       const H245_AudioCapability & pdu,  
00915       unsigned & packetSize,             
00916       CommandType type                   
00917     );
00918 
00921     virtual PBoolean IsMatch(
00922       const PASN_Choice & subTypePDU  
00923     ) const;
00925 };
00926 
00927 
00928 #if OPAL_VIDEO
00929 
00936 class H323VideoCapability : public H323RealTimeCapability
00937 {
00938   PCLASSINFO(H323VideoCapability, H323RealTimeCapability);
00939 
00940   public:
00946     virtual MainTypes GetMainType() const;
00948 
00959     virtual unsigned GetDefaultSessionID() const;
00961 
00972     virtual PBoolean OnSendingPDU(
00973       H245_Capability & pdu  
00974     ) const;
00975 
00984     virtual PBoolean OnSendingPDU(
00985       H245_DataType & pdu  
00986     ) const;
00987 
00996     virtual PBoolean OnSendingPDU(
00997       H245_ModeElement & pdu  
00998     ) const;
00999 
01007     virtual PBoolean OnSendingPDU(
01008       H245_VideoCapability & pdu  
01009     ) const;
01010     virtual PBoolean OnSendingPDU(
01011       H245_VideoCapability & pdu,  
01012       CommandType type             
01013     ) const;
01014 
01023     virtual PBoolean OnSendingPDU(
01024       H245_VideoMode & pdu  
01025     ) const = 0;
01026 
01036     virtual PBoolean OnReceivedPDU(
01037       const H245_Capability & pdu  
01038     );
01039 
01047     virtual PBoolean OnReceivedPDU(
01048       const H245_DataType & pdu,  
01049       PBoolean receiver               
01050     );
01051 
01059     virtual PBoolean OnReceivedPDU(
01060       const H245_VideoCapability & pdu  
01061     );
01062     virtual PBoolean OnReceivedPDU(
01063       const H245_VideoCapability & pdu,  
01064       CommandType type                   
01065     );
01067 };
01068 
01069 
01077 class H323NonStandardVideoCapability : public H323VideoCapability,
01078                                        public H323NonStandardCapabilityInfo
01079 {
01080   PCLASSINFO(H323NonStandardVideoCapability, H323VideoCapability);
01081 
01082   public:
01085     H323NonStandardVideoCapability(
01086       H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
01087       const BYTE * dataBlock,         
01088       PINDEX dataSize                 
01089     );
01092     H323NonStandardVideoCapability(
01093       const BYTE * dataBlock = NULL,  
01094       PINDEX dataSize = 0,            
01095       PINDEX comparisonOffset = 0,    
01096       PINDEX comparisonLength = P_MAX_INDEX  
01097     );
01098 
01101     H323NonStandardVideoCapability(
01102       const PString & oid,            
01103       const BYTE * dataBlock = NULL,  
01104       PINDEX dataSize = 0,            
01105       PINDEX comparisonOffset = 0,    
01106       PINDEX comparisonLength = P_MAX_INDEX  
01107     );
01108 
01111     H323NonStandardVideoCapability(
01112       BYTE country,                   
01113       BYTE extension,                 
01114       WORD maufacturer,               
01115       const BYTE * dataBlock = NULL,  
01116       PINDEX dataSize = 0,            
01117       PINDEX comparisonOffset = 0,    
01118       PINDEX comparisonLength = P_MAX_INDEX  
01119     );
01121 
01127     Comparison Compare(const PObject & obj) const;
01129 
01138     virtual unsigned GetSubType() const;
01140 
01151     virtual PBoolean OnSendingPDU(
01152       H245_VideoCapability & pdu  
01153     ) const;
01154 
01163     virtual PBoolean OnSendingPDU(
01164       H245_VideoMode & pdu  
01165     ) const;
01166 
01175     virtual PBoolean OnReceivedPDU(
01176       const H245_VideoCapability & pdu  
01177     );
01178 
01181     virtual PBoolean IsMatch(
01182       const PASN_Choice & subTypePDU  
01183     ) const;
01185 };
01186 
01194 class H323GenericVideoCapability : public H323VideoCapability,
01195                                    public H323GenericCapabilityInfo
01196 {
01197   PCLASSINFO(H323GenericVideoCapability, H323VideoCapability);
01198 
01199   public:
01204     H323GenericVideoCapability(
01205       const PString & capabilityId,    
01206       PINDEX maxBitRate = 0            
01207     );
01209 
01215     Comparison Compare(const PObject & obj) const;
01217 
01225     virtual unsigned GetSubType() const;
01227 
01238     virtual PBoolean OnSendingPDU(
01239       H245_VideoCapability & pdu,  
01240       CommandType type             
01241     ) const;
01242 
01251     virtual PBoolean OnSendingPDU(
01252       H245_VideoMode & pdu  
01253     ) const;
01254 
01263     virtual PBoolean OnReceivedPDU(
01264       const H245_VideoCapability & pdu,  
01265       CommandType type                   
01266     );
01268 
01271     virtual PBoolean IsMatch(
01272       const PASN_Choice & subTypePDU  
01273     ) const;
01274 };
01275 
01276 #endif  // OPAL_VIDEO
01277 
01284 class H323DataCapability : public H323Capability
01285 {
01286   PCLASSINFO(H323DataCapability, H323Capability);
01287 
01288   public:
01293     H323DataCapability(
01294       unsigned maxBitRate = 0  
01295     );
01297 
01303     virtual MainTypes GetMainType() const;
01305 
01315     virtual unsigned GetDefaultSessionID() const;
01317 
01328     virtual PBoolean OnSendingPDU(
01329       H245_Capability & pdu  
01330     ) const;
01331 
01340     virtual PBoolean OnSendingPDU(
01341       H245_DataType & pdu  
01342     ) const;
01343 
01352     virtual PBoolean OnSendingPDU(
01353       H245_ModeElement & pdu  
01354     ) const;
01355 
01363     virtual PBoolean OnSendingPDU(
01364       H245_DataApplicationCapability & pdu  
01365     ) const;
01366     virtual PBoolean OnSendingPDU(
01367       H245_DataApplicationCapability & pdu, 
01368       CommandType type                      
01369     ) const;
01370 
01379     virtual PBoolean OnSendingPDU(
01380       H245_DataMode & pdu  
01381     ) const = 0;
01382 
01392     virtual PBoolean OnReceivedPDU(
01393       const H245_Capability & pdu  
01394     );
01395 
01403     virtual PBoolean OnReceivedPDU(
01404       const H245_DataType & pdu,  
01405       PBoolean receiver               
01406     );
01407 
01415     virtual PBoolean OnReceivedPDU(
01416       const H245_DataApplicationCapability & pdu  
01417     );
01418     virtual PBoolean OnReceivedPDU(
01419       const H245_DataApplicationCapability & pdu, 
01420       CommandType type                            
01421     );
01423 
01424   protected:
01425     unsigned maxBitRate;
01426 };
01427 
01428 
01436 class H323NonStandardDataCapability : public H323DataCapability,
01437                                       public H323NonStandardCapabilityInfo
01438 {
01439   PCLASSINFO(H323NonStandardDataCapability, H323DataCapability);
01440 
01441   public:
01446     H323NonStandardDataCapability(
01447       unsigned maxBitRate,            
01448       const BYTE * dataBlock = NULL,  
01449       PINDEX dataSize = 0,            
01450       PINDEX comparisonOffset = 0,    
01451       PINDEX comparisonLength = P_MAX_INDEX  
01452     );
01453 
01456     H323NonStandardDataCapability(
01457       unsigned maxBitRate,            
01458       const PString & oid,            
01459       const BYTE * dataBlock = NULL,  
01460       PINDEX dataSize = 0,            
01461       PINDEX comparisonOffset = 0,    
01462       PINDEX comparisonLength = P_MAX_INDEX  
01463     );
01464 
01467     H323NonStandardDataCapability(
01468       unsigned maxBitRate,            
01469       BYTE country,                   
01470       BYTE extension,                 
01471       WORD maufacturer,               
01472       const BYTE * dataBlock = NULL,  
01473       PINDEX dataSize = 0,            
01474       PINDEX comparisonOffset = 0,    
01475       PINDEX comparisonLength = P_MAX_INDEX  
01476     );
01478 
01484     Comparison Compare(const PObject & obj) const;
01486 
01495     virtual unsigned GetSubType() const;
01497 
01508     virtual PBoolean OnSendingPDU(
01509       H245_DataApplicationCapability & pdu  
01510     ) const;
01511 
01520     virtual PBoolean OnSendingPDU(
01521       H245_DataMode & pdu  
01522     ) const;
01523 
01532     virtual PBoolean OnReceivedPDU(
01533       const H245_DataApplicationCapability & pdu  
01534     );
01535 
01538     virtual PBoolean IsMatch(
01539       const PASN_Choice & subTypePDU  
01540     ) const;
01542 };
01543 
01544 
01546 // Known audio codecs
01547 
01550 class H323_G711Capability : public H323AudioCapability
01551 {
01552   PCLASSINFO(H323_G711Capability, H323AudioCapability)
01553 
01554   public:
01556     enum Mode {
01558       ALaw,
01560       muLaw
01561     };
01563     enum Speed {
01565       At64k,
01567       At56k
01568     };
01569 
01574     H323_G711Capability(
01575       Mode mode = muLaw,    
01576       Speed speed = At64k   
01577     );
01579 
01584     virtual PObject * Clone() const;
01586 
01595     virtual unsigned GetSubType() const;
01596 
01599     virtual PString GetFormatName() const;
01601 
01602   protected:
01603     Mode     mode;
01604     Speed    speed;
01605 };
01606 
01607 #if 0
01608 
01611 class H323_G728Capability : public H323AudioCapability
01612 {
01613   PCLASSINFO(H323_G728Capability, H323AudioCapability)
01614 
01615   public:
01620     H323_G728Capability();
01622 
01627     virtual PObject * Clone() const;
01629 
01635     virtual unsigned GetSubType() const;
01636 
01639     virtual PString GetFormatName() const;
01641 };
01642 
01643 
01646 class H323_G729Capability : public H323AudioCapability
01647 {
01648   PCLASSINFO(H323_G729Capability, H323AudioCapability)
01649 
01650   public:
01652     enum Mode {
01653       e_Normal,
01654       e_AnnexA,
01655       e_AnnexB,
01656       e_AnnexA_AnnexB
01657     };
01658 
01663     H323_G729Capability(
01664       Mode mode 
01665     );
01667 
01672     virtual PObject * Clone() const;
01674 
01680     virtual unsigned GetSubType() const;
01681 
01684     virtual PString GetFormatName() const;
01686 
01687   protected:
01688     Mode mode;
01689 };
01690 
01691 
01694 class H323_G7231Capability : public H323AudioCapability
01695 {
01696   PCLASSINFO(H323_G7231Capability, H323AudioCapability)
01697 
01698   public:
01703     H323_G7231Capability(
01704       PBoolean allowSIDFrames = PTrue   
01705     );
01707 
01712     virtual PObject * Clone() const;
01714 
01720     virtual unsigned GetSubType() const;
01721 
01724     virtual PString GetFormatName() const;
01726 
01736     virtual PBoolean OnSendingPDU(
01737       H245_AudioCapability & pdu,  
01738       unsigned packetSize          
01739     ) const;
01740 
01748     virtual PBoolean OnReceivedPDU(
01749       const H245_AudioCapability & pdu,  
01750       unsigned & packetSize              
01751     );
01753 
01754   protected:
01755     PBoolean allowSIDFrames;
01756 };
01757 
01758 
01761 class H323_GSM0610Capability : public H323AudioCapability
01762 {
01763   PCLASSINFO(H323_GSM0610Capability, H323AudioCapability)
01764 
01765   public:
01770     H323_GSM0610Capability();
01772 
01777     virtual PObject * Clone() const;
01779 
01788     virtual unsigned GetSubType() const;
01789 
01792     virtual PString GetFormatName() const;
01793 
01802     virtual void SetTxFramesInPacket(
01803       unsigned frames   
01804     );
01806 
01816     virtual PBoolean OnSendingPDU(
01817       H245_AudioCapability & pdu,  
01818       unsigned packetSize          
01819     ) const;
01820 
01828     virtual PBoolean OnReceivedPDU(
01829       const H245_AudioCapability & pdu,  
01830       unsigned & packetSize              
01831     );
01833 };
01834 
01835 #endif
01836 
01837 
01839 
01842 class H323_UserInputCapability : public H323Capability
01843 {
01844   PCLASSINFO(H323_UserInputCapability, H323Capability);
01845 
01846   public:
01849     enum SubTypes {
01850       BasicString,
01851       IA5String,
01852       GeneralString,
01853       SignalToneH245,
01854       HookFlashH245,
01855       SignalToneRFC2833,
01856       NumSubTypes
01857     };
01858     static const char * GetSubTypeName(SubTypes subType);
01859     friend ostream & operator<<(ostream & strm, SubTypes subType) { return strm << GetSubTypeName(subType); }
01860 
01865     H323_UserInputCapability(
01866       SubTypes subType
01867     );
01869 
01874     virtual PObject * Clone() const;
01876 
01884     virtual MainTypes GetMainType() const;
01885 
01889     virtual unsigned  GetSubType()  const;
01890 
01893     virtual PString GetFormatName() const;
01895 
01903     virtual H323Channel * CreateChannel(
01904       H323Connection & connection,    
01905       H323Channel::Directions dir,    
01906       unsigned sessionID,             
01907       const H245_H2250LogicalChannelParameters * param
01909     ) const;
01911 
01921     virtual PBoolean OnSendingPDU(
01922       H245_Capability & pdu  
01923     ) const;
01924 
01932     virtual PBoolean OnSendingPDU(
01933       H245_DataType & pdu  
01934     ) const;
01935 
01944     virtual PBoolean OnSendingPDU(
01945       H245_ModeElement & pdu  
01946     ) const;
01947 
01957     virtual PBoolean OnReceivedPDU(
01958       const H245_Capability & pdu  
01959     );
01960 
01968     virtual PBoolean OnReceivedPDU(
01969       const H245_DataType & pdu,  
01970       PBoolean receiver               
01971     );
01972 
01981     virtual PBoolean IsUsable(
01982       const H323Connection & connection
01983     ) const;
01985 
01986     static void AddAllCapabilities(
01987       H323Capabilities & capabilities,        
01988       PINDEX descriptorNum,   
01989       PINDEX simultaneous     
01990     );
01991 
01992   protected:
01993     SubTypes subType;
01994 };
01995 
01996 
01997 
01999 
02000 PARRAY(H323CapabilitiesList, H323Capability);
02001 
02002 PARRAY(H323CapabilitiesListArray, H323CapabilitiesList);
02003 
02004 class H323SimultaneousCapabilities : public H323CapabilitiesListArray
02005 {
02006   PCLASSINFO(H323SimultaneousCapabilities, H323CapabilitiesListArray);
02007   public:
02008     PBoolean SetSize(PINDEX newSize);
02009 };
02010 
02011 
02012 PARRAY(H323CapabilitiesSetArray, H323SimultaneousCapabilities);
02013 
02014 
02015 class H323CapabilitiesSet : public H323CapabilitiesSetArray
02016 {
02017   PCLASSINFO(H323CapabilitiesSet, H323CapabilitiesSetArray);
02018   public:
02020     PBoolean SetSize(PINDEX newSize);
02021 };
02022 
02023 
02026 class H323Capabilities : public PObject
02027 {
02028     PCLASSINFO(H323Capabilities, PObject);
02029   public:
02034     H323Capabilities();
02035 
02038     H323Capabilities(
02039       const H323Connection & connection,      
02040       const H245_TerminalCapabilitySet & pdu  
02041     );
02042 
02047     H323Capabilities(
02048       const H323Capabilities & original 
02049     );
02050 
02055     H323Capabilities & operator=(
02056       const H323Capabilities & original 
02057     );
02059 
02064     void PrintOn(
02065       ostream & strm    
02066     ) const;
02068 
02073     PINDEX GetSize() const { return table.GetSize(); }
02074 
02077     H323Capability & operator[](PINDEX i) const { return table[i]; }
02078 
02099     PINDEX SetCapability(
02100       PINDEX descriptorNum, 
02101       PINDEX simultaneous,  
02102       H323Capability * cap  
02103     );
02104 
02107     PINDEX AddMediaFormat(
02108       PINDEX descriptorNum,    
02109       PINDEX simultaneous,     
02110       const OpalMediaFormat & mediaFormat 
02111     );
02112 
02117     PINDEX AddAllCapabilities(
02118       PINDEX descriptorNum,    
02119       PINDEX simultaneous,     
02120       const PString & name,    
02121       PBoolean exact = PFalse       
02122     );
02123 
02124     // this function is retained for backwards compatibility
02125     PINDEX AddAllCapabilities(
02126       const H323EndPoint &,    
02127       PINDEX descriptorNum,    
02128       PINDEX simultaneous,     
02129       const PString & name,    
02130       PBoolean exact = PFalse       
02131     )
02132     { return AddAllCapabilities(descriptorNum, simultaneous, name, exact); }
02133 
02142     void Add(
02143       H323Capability * capability   
02144     );
02145 
02152     H323Capability * Copy(
02153       const H323Capability & capability   
02154     );
02155 
02160     void Remove(
02161       H323Capability * capability   
02162     );
02163 
02168     void Remove(
02169       const PString & formatName   
02170     );
02171 
02175     void Remove(
02176       const PStringArray & formatNames  
02177     );
02178 
02181     void RemoveAll();
02182 
02190     H323Capability * FindCapability(
02191       unsigned capabilityNumber
02192     ) const;
02193 
02209     H323Capability * FindCapability(
02210       const PString & formatName, 
02211       H323Capability::CapabilityDirection direction = H323Capability::e_Unknown,
02213       PBoolean exact = PFalse       
02214     ) const;
02215 
02221     H323Capability * FindCapability(
02222       H323Capability::CapabilityDirection direction 
02223     ) const;
02224 
02232     H323Capability * FindCapability(
02233       const H323Capability & capability 
02234     ) const;
02235 
02241     H323Capability * FindCapability(
02242       const H245_Capability & cap  
02243     ) const;
02244 
02250     H323Capability * FindCapability(
02251       const H245_DataType & dataType  
02252     ) const;
02253 
02259     H323Capability * FindCapability(
02260       const H245_ModeElement & modeElement  
02261     ) const;
02262 
02268     H323Capability * FindCapability(
02269       H323Capability::MainTypes mainType, 
02270       unsigned subType = UINT_MAX         
02271     ) const;
02272 
02275     void BuildPDU(
02276       const H323Connection & connection,  
02277       H245_TerminalCapabilitySet & pdu    
02278     ) const;
02279 
02282     PBoolean Merge(
02283       const H323Capabilities & newCaps
02284     );
02285 
02292     void Reorder(
02293       const PStringArray & preferenceOrder  
02294     );
02295 
02298     PBoolean IsAllowed(
02299       const H323Capability & capability
02300     );
02301 
02304     PBoolean IsAllowed(
02305       unsigned capabilityNumber
02306     );
02307 
02310     PBoolean IsAllowed(
02311       const H323Capability & capability1,
02312       const H323Capability & capability2
02313     );
02314 
02317     PBoolean IsAllowed(
02318       unsigned capabilityNumber1,
02319       unsigned capabilityNumber2
02320     );
02321 
02324     OpalMediaFormatList GetMediaFormats() const;
02325 
02326     const PStringSet & GetMediaPacketizations() const { return mediaPacketizations; }
02328 
02329   protected:
02330     H323CapabilitiesList table;
02331     H323CapabilitiesSet  set;
02332     PStringSet           mediaPacketizations;
02333 };
02334 
02335 
02337 
02338 /* New capability registration macros based on abstract factories
02339  */
02340 typedef PFactory<H323Capability, std::string> H323CapabilityFactory;
02341 
02342 #define H323_REGISTER_CAPABILITY(cls, capName)   static H323CapabilityFactory::Worker<cls> cls##Factory(capName, true); \
02343 
02344 #endif // __OPAL_H323CAPS_H
02345 
02346 

Generated on Mon Sep 15 11:49:05 2008 for OPAL by  doxygen 1.5.1