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: 24489 $
00030  * $Author: rjongbloed $
00031  * $Date: 2010-06-10 23:58:11 -0500 (Thu, 10 Jun 2010) $
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 rtpPayloadType; }
00337 
00339     void SetPayloadType(RTP_DataFrame::PayloadTypes pt) { rtpPayloadType = 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     RTP_DataFrame::PayloadTypes rtpPayloadType;
00356 
00357   private:
00358     mutable OpalMediaFormat m_mediaFormat;
00359 
00360   friend class H323Capabilities;
00361 };
00362 
00363 
00364 
00373 class H323NonStandardCapabilityInfo
00374 {
00375   public:
00376     typedef PObject::Comparison (*CompareFuncType)(struct PluginCodec_H323NonStandardCodecData *);
00377 
00380     H323NonStandardCapabilityInfo(
00381       CompareFuncType compareFunc,
00382       const BYTE * dataBlock,         
00383       PINDEX dataSize                 
00384     );
00385 
00388     H323NonStandardCapabilityInfo(
00389       const BYTE * dataBlock,         
00390       PINDEX dataSize,                
00391       PINDEX comparisonOffset = 0,    
00392       PINDEX comparisonLength = P_MAX_INDEX  
00393     );
00394 
00397     H323NonStandardCapabilityInfo(
00398       const PString & oid,
00399       const BYTE * dataBlock,         
00400       PINDEX dataSize,                
00401       PINDEX comparisonOffset = 0,
00402       PINDEX comparisonLength = P_MAX_INDEX
00403     );
00404 
00407     H323NonStandardCapabilityInfo(
00408       BYTE country,                  
00409       BYTE extension,                
00410       WORD maufacturer,              
00411       const BYTE * dataBlock,         
00412       PINDEX dataSize,                
00413       PINDEX comparisonOffset = 0,    
00414       PINDEX comparisonLength = P_MAX_INDEX  
00415     );
00416 
00419     virtual ~H323NonStandardCapabilityInfo();
00420 
00425     virtual PBoolean OnSendingPDU(
00426       PBYTEArray & data  
00427     ) const;
00428 
00433     virtual PBoolean OnReceivedPDU(
00434       const PBYTEArray & data  
00435     );
00436 
00437     PBoolean IsMatch(const H245_NonStandardParameter & param) const;
00438 
00439     PObject::Comparison CompareParam(
00440       const H245_NonStandardParameter & param
00441     ) const;
00442 
00443   protected:
00444     PBoolean OnSendingNonStandardPDU(
00445       PASN_Choice & pdu,
00446       unsigned nonStandardTag
00447     ) const;
00448     PBoolean OnReceivedNonStandardPDU(
00449       const PASN_Choice & pdu,
00450       unsigned nonStandardTag
00451     );
00452 
00453     PObject::Comparison CompareInfo(
00454       const H323NonStandardCapabilityInfo & obj
00455     ) const;
00456     PObject::Comparison CompareData(
00457       const PBYTEArray & data  
00458     ) const;
00459 
00460     PString    oid;
00461     BYTE       t35CountryCode;
00462     BYTE       t35Extension;
00463     WORD       manufacturerCode;
00464     PBYTEArray nonStandardData;
00465     PINDEX     comparisonOffset;
00466     PINDEX     comparisonLength;
00467     CompareFuncType compareFunc;
00468 };
00469 
00479 class H323GenericCapabilityInfo
00480 {
00481   public:
00482     H323GenericCapabilityInfo(
00483       const PString & id,     
00484       unsigned maxBitRate = 0   
00485     );
00486 
00487     virtual ~H323GenericCapabilityInfo() { }
00488 
00489   protected:
00490     virtual PBoolean OnSendingGenericPDU(
00491       H245_GenericCapability & pdu,
00492       const OpalMediaFormat & mediaFormat,
00493       H323Capability::CommandType type
00494     ) const;
00495     virtual PBoolean OnReceivedGenericPDU(
00496       OpalMediaFormat & mediaFormat,
00497       const H245_GenericCapability & pdu,
00498       H323Capability::CommandType type
00499     );
00500 
00501     PBoolean IsMatch(
00502       const H245_GenericCapability & param  
00503     ) const;
00504     PObject::Comparison CompareInfo(
00505       const H323GenericCapabilityInfo & obj
00506     ) const;
00507 
00508 
00509     PString  m_identifier;
00510     unsigned maxBitRate;
00511 };
00512 
00519 class H323RealTimeCapability : public H323Capability
00520 {
00521   PCLASSINFO(H323RealTimeCapability, H323Capability);
00522 
00523   public:
00528     virtual H323Channel * CreateChannel(
00529       H323Connection & connection,    
00530       H323Channel::Directions dir,    
00531       unsigned sessionID,             
00532       const H245_H2250LogicalChannelParameters * param
00534     ) const;
00535 
00536     H323RealTimeCapability();
00537     H323RealTimeCapability(const H323RealTimeCapability &rtc);
00538     virtual ~H323RealTimeCapability();
00539     void AttachQoS(RTP_QOS * _rtpqos);
00540 
00541   protected:
00542     RTP_QOS * rtpqos;
00544 };
00545 
00546 
00553 class H323AudioCapability : public H323RealTimeCapability
00554 {
00555   PCLASSINFO(H323AudioCapability, H323RealTimeCapability);
00556 
00557   public:
00562     H323AudioCapability();
00564 
00570     virtual MainTypes GetMainType() const;
00572 
00583     virtual unsigned GetDefaultSessionID() const;
00584 
00593     virtual void SetTxFramesInPacket(
00594       unsigned frames   
00595     );
00596 
00602     virtual unsigned GetTxFramesInPacket() const;
00603 
00609     virtual unsigned GetRxFramesInPacket() const;
00611 
00622     virtual PBoolean OnSendingPDU(
00623       H245_Capability & pdu  
00624     ) const;
00625 
00634     virtual PBoolean OnSendingPDU(
00635       H245_DataType & pdu  
00636     ) const;
00637 
00646     virtual PBoolean OnSendingPDU(
00647       H245_ModeElement & pdu  
00648     ) const;
00649 
00658     virtual PBoolean OnSendingPDU(
00659       H245_AudioCapability & pdu,  
00660       unsigned packetSize          
00661     ) const;
00662     virtual PBoolean OnSendingPDU(
00663       H245_AudioCapability & pdu,  
00664       unsigned packetSize,         
00665       CommandType type             
00666     ) const;
00667 
00676     virtual PBoolean OnSendingPDU(
00677       H245_AudioMode & pdu  
00678     ) const;
00679 
00691     virtual PBoolean OnReceivedPDU(
00692       const H245_Capability & pdu  
00693     );
00694 
00704     virtual PBoolean OnReceivedPDU(
00705       const H245_DataType & pdu,  
00706       PBoolean receiver               
00707     );
00708 
00717     virtual PBoolean OnReceivedPDU(
00718       const H245_AudioCapability & pdu,  
00719       unsigned & packetSize              
00720     );
00721     virtual PBoolean OnReceivedPDU(
00722       const H245_AudioCapability & pdu,  
00723       unsigned & packetSize,             
00724       CommandType type                   
00725     );
00727 };
00728 
00729 
00737 class H323NonStandardAudioCapability : public H323AudioCapability,
00738                                        public H323NonStandardCapabilityInfo
00739 {
00740   PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00741 
00742   public:
00745     H323NonStandardAudioCapability(
00746       H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00747       const BYTE * dataBlock,         
00748       PINDEX dataSize                 
00749     );
00752     H323NonStandardAudioCapability(
00753       const BYTE * dataBlock = NULL,  
00754       PINDEX dataSize = 0,            
00755       PINDEX comparisonOffset = 0,    
00756       PINDEX comparisonLength = P_MAX_INDEX  
00757      );
00758 
00761     H323NonStandardAudioCapability(
00762       const PString & oid,            
00763       const BYTE * dataBlock = NULL,  
00764       PINDEX dataSize = 0,            
00765       PINDEX comparisonOffset = 0,    
00766       PINDEX comparisonLength = P_MAX_INDEX  
00767     );
00768 
00771     H323NonStandardAudioCapability(
00772       BYTE country,                   
00773       BYTE extension,                 
00774       WORD maufacturer,               
00775       const BYTE * dataBlock = NULL,  
00776       PINDEX dataSize = 0,            
00777       PINDEX comparisonOffset = 0,    
00778       PINDEX comparisonLength = P_MAX_INDEX  
00779     );
00781 
00787     Comparison Compare(const PObject & obj) const;
00789 
00797     virtual unsigned GetSubType() const;
00799 
00810     virtual PBoolean OnSendingPDU(
00811       H245_AudioCapability & pdu,  
00812       unsigned packetSize          
00813     ) const;
00814 
00823     virtual PBoolean OnSendingPDU(
00824       H245_AudioMode & pdu  
00825     ) const;
00826 
00835     virtual PBoolean OnReceivedPDU(
00836       const H245_AudioCapability & pdu,  
00837       unsigned & packetSize              
00838     );
00839 
00842     virtual PBoolean IsMatch(
00843       const PASN_Choice & subTypePDU  
00844     ) const;
00846 };
00847 
00855 class H323GenericAudioCapability : public H323AudioCapability,
00856                                    public H323GenericCapabilityInfo
00857 {
00858   PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00859 
00860   public:
00865     H323GenericAudioCapability(
00866       const PString & capabilityId,    
00867       PINDEX maxBitRate = 0               
00868     );
00870 
00876     Comparison Compare(const PObject & obj) const;
00878 
00886     virtual unsigned GetSubType() const;
00888 
00899     virtual PBoolean OnSendingPDU(
00900       H245_AudioCapability & pdu,  
00901       unsigned packetSize,         
00902       CommandType type             
00903     ) const;
00904 
00913     virtual PBoolean OnSendingPDU(
00914       H245_AudioMode & pdu  
00915     ) const;
00916 
00925     virtual PBoolean OnReceivedPDU(
00926       const H245_AudioCapability & pdu,  
00927       unsigned & packetSize,             
00928       CommandType type                   
00929     );
00930 
00933     virtual PBoolean IsMatch(
00934       const PASN_Choice & subTypePDU  
00935     ) const;
00937 };
00938 
00939 
00940 #if OPAL_VIDEO
00941 
00948 class H323VideoCapability : public H323RealTimeCapability
00949 {
00950   PCLASSINFO(H323VideoCapability, H323RealTimeCapability);
00951 
00952   public:
00958     virtual MainTypes GetMainType() const;
00960 
00971     virtual unsigned GetDefaultSessionID() const;
00973 
00984     virtual PBoolean OnSendingPDU(
00985       H245_Capability & pdu  
00986     ) const;
00987 
00996     virtual PBoolean OnSendingPDU(
00997       H245_DataType & pdu  
00998     ) const;
00999 
01008     virtual PBoolean OnSendingPDU(
01009       H245_ModeElement & pdu  
01010     ) const;
01011 
01019     virtual PBoolean OnSendingPDU(
01020       H245_VideoCapability & pdu  
01021     ) const;
01022     virtual PBoolean OnSendingPDU(
01023       H245_VideoCapability & pdu,  
01024       CommandType type             
01025     ) const;
01026 
01035     virtual PBoolean OnSendingPDU(
01036       H245_VideoMode & pdu  
01037     ) const = 0;
01038 
01048     virtual PBoolean OnReceivedPDU(
01049       const H245_Capability & pdu  
01050     );
01051 
01059     virtual PBoolean OnReceivedPDU(
01060       const H245_DataType & pdu,  
01061       PBoolean receiver               
01062     );
01063 
01071     virtual PBoolean OnReceivedPDU(
01072       const H245_VideoCapability & pdu  
01073     );
01074     virtual PBoolean OnReceivedPDU(
01075       const H245_VideoCapability & pdu,  
01076       CommandType type                   
01077     );
01079 };
01080 
01081 
01089 class H323NonStandardVideoCapability : public H323VideoCapability,
01090                                        public H323NonStandardCapabilityInfo
01091 {
01092   PCLASSINFO(H323NonStandardVideoCapability, H323VideoCapability);
01093 
01094   public:
01097     H323NonStandardVideoCapability(
01098       H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
01099       const BYTE * dataBlock,         
01100       PINDEX dataSize                 
01101     );
01104     H323NonStandardVideoCapability(
01105       const BYTE * dataBlock = NULL,  
01106       PINDEX dataSize = 0,            
01107       PINDEX comparisonOffset = 0,    
01108       PINDEX comparisonLength = P_MAX_INDEX  
01109     );
01110 
01113     H323NonStandardVideoCapability(
01114       const PString & oid,            
01115       const BYTE * dataBlock = NULL,  
01116       PINDEX dataSize = 0,            
01117       PINDEX comparisonOffset = 0,    
01118       PINDEX comparisonLength = P_MAX_INDEX  
01119     );
01120 
01123     H323NonStandardVideoCapability(
01124       BYTE country,                   
01125       BYTE extension,                 
01126       WORD maufacturer,               
01127       const BYTE * dataBlock = NULL,  
01128       PINDEX dataSize = 0,            
01129       PINDEX comparisonOffset = 0,    
01130       PINDEX comparisonLength = P_MAX_INDEX  
01131     );
01133 
01139     Comparison Compare(const PObject & obj) const;
01141 
01150     virtual unsigned GetSubType() const;
01152 
01163     virtual PBoolean OnSendingPDU(
01164       H245_VideoCapability & pdu  
01165     ) const;
01166 
01175     virtual PBoolean OnSendingPDU(
01176       H245_VideoMode & pdu  
01177     ) const;
01178 
01187     virtual PBoolean OnReceivedPDU(
01188       const H245_VideoCapability & pdu  
01189     );
01190 
01193     virtual PBoolean IsMatch(
01194       const PASN_Choice & subTypePDU  
01195     ) const;
01197 };
01198 
01206 class H323GenericVideoCapability : public H323VideoCapability,
01207                                    public H323GenericCapabilityInfo
01208 {
01209   PCLASSINFO(H323GenericVideoCapability, H323VideoCapability);
01210 
01211   public:
01216     H323GenericVideoCapability(
01217       const PString & capabilityId,    
01218       PINDEX maxBitRate = 0           
01219     );
01221 
01227     Comparison Compare(const PObject & obj) const;
01229 
01237     virtual unsigned GetSubType() const;
01239 
01250     virtual PBoolean OnSendingPDU(
01251       H245_VideoCapability & pdu,  
01252       CommandType type             
01253     ) const;
01254 
01263     virtual PBoolean OnSendingPDU(
01264       H245_VideoMode & pdu  
01265     ) const;
01266 
01275     virtual PBoolean OnReceivedPDU(
01276       const H245_VideoCapability & pdu,  
01277       CommandType type                   
01278     );
01279 
01282     virtual PBoolean IsMatch(
01283       const PASN_Choice & subTypePDU  
01284     ) const;
01286 };
01287 
01288 
01289 #if OPAL_H239
01290 
01293 class H323ExtendedVideoCapability : public H323GenericVideoCapability
01294 {
01295   PCLASSINFO(H323ExtendedVideoCapability, H323GenericVideoCapability);
01296 
01297   public:
01302     H323ExtendedVideoCapability(
01303       const PString & identifier   
01304     );
01306 
01314     virtual unsigned GetSubType() const;
01316     
01327     virtual PBoolean OnSendingPDU(
01328       H245_VideoCapability & pdu,  
01329       CommandType type             
01330     ) const;
01331 
01340     virtual PBoolean OnSendingPDU(
01341       H245_VideoMode & pdu  
01342     ) const;
01343 
01352     virtual PBoolean OnReceivedPDU(
01353       const H245_VideoCapability & pdu,  
01354       CommandType type                   
01355     );
01356 
01359     virtual PBoolean IsMatch(
01360       const PASN_Choice & subTypePDU  
01361     ) const;
01363 
01364   protected:
01365     OpalMediaFormatList m_videoFormats;
01366 };
01367 
01368 
01370 
01373 class H323GenericControlCapability : public H323Capability,
01374                                      public H323GenericCapabilityInfo
01375 {
01376   PCLASSINFO(H323GenericControlCapability, H323Capability);
01377 
01378   public:
01383     H323GenericControlCapability(
01384       const PString & identifier  
01385     );
01387 
01393     virtual MainTypes GetMainType() const;
01394 
01400     virtual unsigned GetSubType() const;
01402 
01413     virtual PBoolean OnSendingPDU(
01414       H245_Capability & pdu  
01415     ) const;
01416 
01424     virtual PBoolean OnSendingPDU(
01425       H245_ModeElement & pdu  
01426     ) const;
01427 
01437     virtual PBoolean OnReceivedPDU(
01438       const H245_Capability & pdu  
01439     );
01440 
01443     virtual PBoolean IsMatch(
01444       const PASN_Choice & subTypePDU  
01445     ) const;
01447 
01455     virtual H323Channel * CreateChannel(
01456       H323Connection & connection,    
01457       H323Channel::Directions dir,    
01458       unsigned sessionID,             
01459       const H245_H2250LogicalChannelParameters * param
01461     ) const;
01463 };
01464 
01465 
01467 
01468 class H323H239VideoCapability : public H323ExtendedVideoCapability
01469 {
01470   PCLASSINFO(H323H239VideoCapability, H323ExtendedVideoCapability);
01471 
01472   public:
01477     H323H239VideoCapability(
01478       const OpalMediaFormat & videoFormat
01479     );
01481 
01487     Comparison Compare(const PObject & obj) const;
01488 
01491     virtual PObject * Clone() const;
01492 
01495     void PrintOn(ostream & strm) const;
01497 
01502     virtual PString GetFormatName() const;
01504 
01515     virtual PBoolean OnSendingPDU(
01516       H245_VideoCapability & pdu,  
01517       CommandType type             
01518     ) const;
01519 
01528     virtual PBoolean OnReceivedPDU(
01529       const H245_VideoCapability & pdu,  
01530       CommandType type                   
01531     );
01533 };
01534 
01535 
01537 
01538 class H323H239ControlCapability : public H323GenericControlCapability
01539 {
01540   PCLASSINFO(H323H239ControlCapability, H323GenericControlCapability);
01541 
01542   public:
01547     H323H239ControlCapability();
01549 
01554     virtual PObject * Clone() const;
01556 
01561     virtual PString GetFormatName() const;
01563 };
01564 
01565 
01566 #endif  // OPAL_H239
01567 
01568 #endif  // OPAL_VIDEO
01569 
01570 
01577 class H323DataCapability : public H323Capability
01578 {
01579   PCLASSINFO(H323DataCapability, H323Capability);
01580 
01581   public:
01586     H323DataCapability(
01587       unsigned maxBitRate = 0  
01588     );
01590 
01596     virtual MainTypes GetMainType() const;
01598 
01608     virtual unsigned GetDefaultSessionID() const;
01610 
01621     virtual PBoolean OnSendingPDU(
01622       H245_Capability & pdu  
01623     ) const;
01624 
01633     virtual PBoolean OnSendingPDU(
01634       H245_DataType & pdu  
01635     ) const;
01636 
01645     virtual PBoolean OnSendingPDU(
01646       H245_ModeElement & pdu  
01647     ) const;
01648 
01656     virtual PBoolean OnSendingPDU(
01657       H245_DataApplicationCapability & pdu  
01658     ) const;
01659     virtual PBoolean OnSendingPDU(
01660       H245_DataApplicationCapability & pdu, 
01661       CommandType type                      
01662     ) const;
01663 
01672     virtual PBoolean OnSendingPDU(
01673       H245_DataMode & pdu  
01674     ) const = 0;
01675 
01685     virtual PBoolean OnReceivedPDU(
01686       const H245_Capability & pdu  
01687     );
01688 
01696     virtual PBoolean OnReceivedPDU(
01697       const H245_DataType & pdu,  
01698       PBoolean receiver               
01699     );
01700 
01708     virtual PBoolean OnReceivedPDU(
01709       const H245_DataApplicationCapability & pdu  
01710     );
01711     virtual PBoolean OnReceivedPDU(
01712       const H245_DataApplicationCapability & pdu, 
01713       CommandType type                            
01714     );
01716 
01717   protected:
01718     unsigned maxBitRate;
01719 };
01720 
01721 
01729 class H323NonStandardDataCapability : public H323DataCapability,
01730                                       public H323NonStandardCapabilityInfo
01731 {
01732   PCLASSINFO(H323NonStandardDataCapability, H323DataCapability);
01733 
01734   public:
01739     H323NonStandardDataCapability(
01740       unsigned maxBitRate,            
01741       const BYTE * dataBlock = NULL,  
01742       PINDEX dataSize = 0,            
01743       PINDEX comparisonOffset = 0,    
01744       PINDEX comparisonLength = P_MAX_INDEX  
01745     );
01746 
01749     H323NonStandardDataCapability(
01750       unsigned maxBitRate,            
01751       const PString & oid,            
01752       const BYTE * dataBlock = NULL,  
01753       PINDEX dataSize = 0,            
01754       PINDEX comparisonOffset = 0,    
01755       PINDEX comparisonLength = P_MAX_INDEX  
01756     );
01757 
01760     H323NonStandardDataCapability(
01761       unsigned maxBitRate,            
01762       BYTE country,                   
01763       BYTE extension,                 
01764       WORD maufacturer,               
01765       const BYTE * dataBlock = NULL,  
01766       PINDEX dataSize = 0,            
01767       PINDEX comparisonOffset = 0,    
01768       PINDEX comparisonLength = P_MAX_INDEX  
01769     );
01771 
01777     Comparison Compare(const PObject & obj) const;
01779 
01788     virtual unsigned GetSubType() const;
01790 
01801     virtual PBoolean OnSendingPDU(
01802       H245_DataApplicationCapability & pdu  
01803     ) const;
01804 
01813     virtual PBoolean OnSendingPDU(
01814       H245_DataMode & pdu  
01815     ) const;
01816 
01825     virtual PBoolean OnReceivedPDU(
01826       const H245_DataApplicationCapability & pdu  
01827     );
01828 
01831     virtual PBoolean IsMatch(
01832       const PASN_Choice & subTypePDU  
01833     ) const;
01835 };
01836 
01837 
01839 // Known audio codecs
01840 
01843 class H323_G711Capability : public H323AudioCapability
01844 {
01845   PCLASSINFO(H323_G711Capability, H323AudioCapability)
01846 
01847   public:
01849     enum Mode {
01851       ALaw,
01853       muLaw
01854     };
01856     enum Speed {
01858       At64k,
01860       At56k
01861     };
01862 
01867     H323_G711Capability(
01868       Mode mode = muLaw,    
01869       Speed speed = At64k   
01870     );
01872 
01877     virtual PObject * Clone() const;
01879 
01888     virtual unsigned GetSubType() const;
01889 
01892     virtual PString GetFormatName() const;
01894 
01895   protected:
01896     Mode     mode;
01897     Speed    speed;
01898 };
01899 
01901 
01904 class H323_UserInputCapability : public H323Capability
01905 {
01906   PCLASSINFO(H323_UserInputCapability, H323Capability);
01907 
01908   public:
01911     enum SubTypes {
01912       BasicString,
01913       IA5String,
01914       GeneralString,
01915       SignalToneH245,
01916       HookFlashH245,
01917       SignalToneRFC2833,
01918       NumSubTypes
01919     };
01920     static const char * GetSubTypeName(SubTypes subType);
01921     friend ostream & operator<<(ostream & strm, SubTypes subType) { return strm << GetSubTypeName(subType); }
01922 
01927     H323_UserInputCapability(
01928       SubTypes subType
01929     );
01931 
01936     virtual PObject * Clone() const;
01938 
01946     virtual MainTypes GetMainType() const;
01947 
01951     virtual unsigned  GetSubType()  const;
01952 
01955     virtual PString GetFormatName() const;
01957 
01965     virtual H323Channel * CreateChannel(
01966       H323Connection & connection,    
01967       H323Channel::Directions dir,    
01968       unsigned sessionID,             
01969       const H245_H2250LogicalChannelParameters * param
01971     ) const;
01973 
01983     virtual PBoolean OnSendingPDU(
01984       H245_Capability & pdu  
01985     ) const;
01986 
01994     virtual PBoolean OnSendingPDU(
01995       H245_DataType & pdu  
01996     ) const;
01997 
02006     virtual PBoolean OnSendingPDU(
02007       H245_ModeElement & pdu  
02008     ) const;
02009 
02019     virtual PBoolean OnReceivedPDU(
02020       const H245_Capability & pdu  
02021     );
02022 
02030     virtual PBoolean OnReceivedPDU(
02031       const H245_DataType & pdu,  
02032       PBoolean receiver               
02033     );
02034 
02043     virtual PBoolean IsUsable(
02044       const H323Connection & connection
02045     ) const;
02047 
02048     static void AddAllCapabilities(
02049       H323Capabilities & capabilities,        
02050       PINDEX descriptorNum,   
02051       PINDEX simultaneous     
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 = PFalse       
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 = PFalse       
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 = PFalse       
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 

Generated on Mon Feb 21 20:19:20 2011 for OPAL by  doxygen 1.4.7