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