00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
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
00050
00051
00052
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_NumMainTypes
00126 };
00127
00133 virtual MainTypes GetMainType() const = 0;
00134
00138 virtual unsigned GetSubType() const = 0;
00139
00142 virtual PString GetFormatName() const = 0;
00144
00150 static H323Capability * Create(
00151 const PString & name
00152 );
00153
00154 enum {
00155 DefaultAudioSessionID = 1,
00156 DefaultVideoSessionID = 2,
00157 DefaultDataSessionID = 3,
00158 DefaultH224SessionID = 4
00159 };
00160
00169 virtual unsigned GetDefaultSessionID() const;
00170
00179 virtual void SetTxFramesInPacket(
00180 unsigned frames
00181 );
00182
00187 virtual unsigned GetTxFramesInPacket() const;
00188
00193 virtual unsigned GetRxFramesInPacket() const;
00194
00200 virtual H323Channel * CreateChannel(
00201 H323Connection & connection,
00202 H323Channel::Directions dir,
00203 unsigned sessionID,
00204 const H245_H2250LogicalChannelParameters * param
00206 ) const = 0;
00208
00211 enum CommandType {
00212 e_TCS,
00213 e_OLC,
00214 e_ReqMode
00215 };
00216
00224 virtual PBoolean OnSendingPDU(
00225 H245_Capability & pdu
00226 ) const = 0;
00227
00235 virtual PBoolean OnSendingPDU(
00236 H245_DataType & pdu
00237 ) const;
00238
00246 virtual PBoolean OnSendingPDU(
00247 H245_ModeElement & pdu
00248 ) const = 0;
00249
00262 virtual PBoolean OnReceivedPDU(
00263 const H245_Capability & pdu
00264 );
00265
00273 virtual PBoolean OnReceivedPDU(
00274 const H245_DataType & pdu,
00275 PBoolean receiver
00276 );
00277
00280 virtual PBoolean IsMatch(
00281 const PASN_Choice & subTypePDU
00282 ) const;
00283
00291 virtual PBoolean IsUsable(
00292 const H323Connection & connection
00293 ) const;
00295
00298 enum CapabilityDirection {
00299 e_Unknown,
00300 e_Receive,
00301 e_Transmit,
00302 e_ReceiveAndTransmit,
00303 e_NoDirection,
00304 NumCapabilityDirections
00305 };
00306
00309 CapabilityDirection GetCapabilityDirection() const { return capabilityDirection; }
00310
00313 void SetCapabilityDirection(
00314 CapabilityDirection dir
00315 ) { capabilityDirection = dir; }
00316
00318 unsigned GetCapabilityNumber() const { return assignedCapabilityNumber; }
00319
00321 void SetCapabilityNumber(unsigned num) { assignedCapabilityNumber = num; }
00322
00325 OpalMediaFormat GetMediaFormat() const;
00326
00329 bool SetMediaFormatOptions(
00330 const OpalMediaFormat & format
00331 );
00332
00334 RTP_DataFrame::PayloadTypes GetPayloadType() const { return rtpPayloadType; }
00335
00337 void SetPayloadType(RTP_DataFrame::PayloadTypes pt) { rtpPayloadType = pt; }
00338
00340 virtual void AttachQoS(RTP_QOS *) { }
00342
00343 #if PTRACING
00344 friend ostream & operator<<(ostream & o , MainTypes t);
00345 friend ostream & operator<<(ostream & o , CapabilityDirection d);
00346 #endif
00347
00348 protected:
00349 OpalMediaFormat & GetWritableMediaFormat();
00350
00351 unsigned assignedCapabilityNumber;
00352 CapabilityDirection capabilityDirection;
00353 RTP_DataFrame::PayloadTypes rtpPayloadType;
00354
00355 private:
00356 mutable OpalMediaFormat mediaFormat;
00357
00358 friend class H323Capabilities;
00359 };
00360
00361
00362
00371 class H323NonStandardCapabilityInfo
00372 {
00373 public:
00374 typedef PObject::Comparison (*CompareFuncType)(struct PluginCodec_H323NonStandardCodecData *);
00375
00378 H323NonStandardCapabilityInfo(
00379 CompareFuncType compareFunc,
00380 const BYTE * dataBlock,
00381 PINDEX dataSize
00382 );
00383
00386 H323NonStandardCapabilityInfo(
00387 const BYTE * dataBlock,
00388 PINDEX dataSize,
00389 PINDEX comparisonOffset = 0,
00390 PINDEX comparisonLength = P_MAX_INDEX
00391 );
00392
00395 H323NonStandardCapabilityInfo(
00396 const PString & oid,
00397 const BYTE * dataBlock,
00398 PINDEX dataSize,
00399 PINDEX comparisonOffset = 0,
00400 PINDEX comparisonLength = P_MAX_INDEX
00401 );
00402
00405 H323NonStandardCapabilityInfo(
00406 BYTE country,
00407 BYTE extension,
00408 WORD maufacturer,
00409 const BYTE * dataBlock,
00410 PINDEX dataSize,
00411 PINDEX comparisonOffset = 0,
00412 PINDEX comparisonLength = P_MAX_INDEX
00413 );
00414
00417 virtual ~H323NonStandardCapabilityInfo();
00418
00423 virtual PBoolean OnSendingPDU(
00424 PBYTEArray & data
00425 ) const;
00426
00431 virtual PBoolean OnReceivedPDU(
00432 const PBYTEArray & data
00433 );
00434
00435 PBoolean IsMatch(const H245_NonStandardParameter & param) const;
00436
00437 PObject::Comparison CompareParam(
00438 const H245_NonStandardParameter & param
00439 ) const;
00440
00441 protected:
00442 PBoolean OnSendingNonStandardPDU(
00443 PASN_Choice & pdu,
00444 unsigned nonStandardTag
00445 ) const;
00446 PBoolean OnReceivedNonStandardPDU(
00447 const PASN_Choice & pdu,
00448 unsigned nonStandardTag
00449 );
00450
00451 PObject::Comparison CompareInfo(
00452 const H323NonStandardCapabilityInfo & obj
00453 ) const;
00454 PObject::Comparison CompareData(
00455 const PBYTEArray & data
00456 ) const;
00457
00458 PString oid;
00459 BYTE t35CountryCode;
00460 BYTE t35Extension;
00461 WORD manufacturerCode;
00462 PBYTEArray nonStandardData;
00463 PINDEX comparisonOffset;
00464 PINDEX comparisonLength;
00465 CompareFuncType compareFunc;
00466 };
00467
00477 class H323GenericCapabilityInfo
00478 {
00479 public:
00480 H323GenericCapabilityInfo(
00481 const PString & id,
00482 PINDEX maxBitRate = 0
00483 );
00484 H323GenericCapabilityInfo(const H323GenericCapabilityInfo & obj);
00485 virtual ~H323GenericCapabilityInfo();
00486
00487 protected:
00488 virtual PBoolean OnSendingGenericPDU(
00489 H245_GenericCapability & pdu,
00490 const OpalMediaFormat & mediaFormat,
00491 H323Capability::CommandType type
00492 ) const;
00493 virtual PBoolean OnReceivedGenericPDU(
00494 OpalMediaFormat & mediaFormat,
00495 const H245_GenericCapability & pdu,
00496 H323Capability::CommandType type
00497 );
00498
00499 PBoolean IsMatch(
00500 const H245_GenericCapability & param
00501 ) const;
00502 PObject::Comparison CompareInfo(
00503 const H323GenericCapabilityInfo & obj
00504 ) const;
00505
00506
00507 H245_CapabilityIdentifier * identifier;
00508 unsigned maxBitRate;
00509 };
00510
00517 class H323RealTimeCapability : public H323Capability
00518 {
00519 PCLASSINFO(H323RealTimeCapability, H323Capability);
00520
00521 public:
00526 virtual H323Channel * CreateChannel(
00527 H323Connection & connection,
00528 H323Channel::Directions dir,
00529 unsigned sessionID,
00530 const H245_H2250LogicalChannelParameters * param
00532 ) const;
00533
00534 H323RealTimeCapability();
00535 H323RealTimeCapability(const H323RealTimeCapability &rtc);
00536 virtual ~H323RealTimeCapability();
00537 void AttachQoS(RTP_QOS * _rtpqos);
00538
00539 protected:
00540 RTP_QOS * rtpqos;
00542 };
00543
00544
00551 class H323AudioCapability : public H323RealTimeCapability
00552 {
00553 PCLASSINFO(H323AudioCapability, H323RealTimeCapability);
00554
00555 public:
00560 H323AudioCapability();
00562
00568 virtual MainTypes GetMainType() const;
00570
00581 virtual unsigned GetDefaultSessionID() const;
00582
00591 virtual void SetTxFramesInPacket(
00592 unsigned frames
00593 );
00594
00600 virtual unsigned GetTxFramesInPacket() const;
00601
00607 virtual unsigned GetRxFramesInPacket() const;
00609
00620 virtual PBoolean OnSendingPDU(
00621 H245_Capability & pdu
00622 ) const;
00623
00632 virtual PBoolean OnSendingPDU(
00633 H245_DataType & pdu
00634 ) const;
00635
00644 virtual PBoolean OnSendingPDU(
00645 H245_ModeElement & pdu
00646 ) const;
00647
00656 virtual PBoolean OnSendingPDU(
00657 H245_AudioCapability & pdu,
00658 unsigned packetSize
00659 ) const;
00660 virtual PBoolean OnSendingPDU(
00661 H245_AudioCapability & pdu,
00662 unsigned packetSize,
00663 CommandType type
00664 ) const;
00665
00674 virtual PBoolean OnSendingPDU(
00675 H245_AudioMode & pdu
00676 ) const;
00677
00689 virtual PBoolean OnReceivedPDU(
00690 const H245_Capability & pdu
00691 );
00692
00702 virtual PBoolean OnReceivedPDU(
00703 const H245_DataType & pdu,
00704 PBoolean receiver
00705 );
00706
00715 virtual PBoolean OnReceivedPDU(
00716 const H245_AudioCapability & pdu,
00717 unsigned & packetSize
00718 );
00719 virtual PBoolean OnReceivedPDU(
00720 const H245_AudioCapability & pdu,
00721 unsigned & packetSize,
00722 CommandType type
00723 );
00725 };
00726
00727
00735 class H323NonStandardAudioCapability : public H323AudioCapability,
00736 public H323NonStandardCapabilityInfo
00737 {
00738 PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00739
00740 public:
00743 H323NonStandardAudioCapability(
00744 H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
00745 const BYTE * dataBlock,
00746 PINDEX dataSize
00747 );
00750 H323NonStandardAudioCapability(
00751 const BYTE * dataBlock = NULL,
00752 PINDEX dataSize = 0,
00753 PINDEX comparisonOffset = 0,
00754 PINDEX comparisonLength = P_MAX_INDEX
00755 );
00756
00759 H323NonStandardAudioCapability(
00760 const PString & oid,
00761 const BYTE * dataBlock = NULL,
00762 PINDEX dataSize = 0,
00763 PINDEX comparisonOffset = 0,
00764 PINDEX comparisonLength = P_MAX_INDEX
00765 );
00766
00769 H323NonStandardAudioCapability(
00770 BYTE country,
00771 BYTE extension,
00772 WORD maufacturer,
00773 const BYTE * dataBlock = NULL,
00774 PINDEX dataSize = 0,
00775 PINDEX comparisonOffset = 0,
00776 PINDEX comparisonLength = P_MAX_INDEX
00777 );
00779
00785 Comparison Compare(const PObject & obj) const;
00787
00795 virtual unsigned GetSubType() const;
00797
00808 virtual PBoolean OnSendingPDU(
00809 H245_AudioCapability & pdu,
00810 unsigned packetSize
00811 ) const;
00812
00821 virtual PBoolean OnSendingPDU(
00822 H245_AudioMode & pdu
00823 ) const;
00824
00833 virtual PBoolean OnReceivedPDU(
00834 const H245_AudioCapability & pdu,
00835 unsigned & packetSize
00836 );
00837
00840 virtual PBoolean IsMatch(
00841 const PASN_Choice & subTypePDU
00842 ) const;
00844 };
00845
00853 class H323GenericAudioCapability : public H323AudioCapability,
00854 public H323GenericCapabilityInfo
00855 {
00856 PCLASSINFO(H323NonStandardAudioCapability, H323AudioCapability);
00857
00858 public:
00863 H323GenericAudioCapability(
00864 const PString & capabilityId,
00865 PINDEX maxBitRate = 0
00866 );
00868
00874 Comparison Compare(const PObject & obj) const;
00876
00884 virtual unsigned GetSubType() const;
00886
00897 virtual PBoolean OnSendingPDU(
00898 H245_AudioCapability & pdu,
00899 unsigned packetSize,
00900 CommandType type
00901 ) const;
00902
00911 virtual PBoolean OnSendingPDU(
00912 H245_AudioMode & pdu
00913 ) const;
00914
00923 virtual PBoolean OnReceivedPDU(
00924 const H245_AudioCapability & pdu,
00925 unsigned & packetSize,
00926 CommandType type
00927 );
00928
00931 virtual PBoolean IsMatch(
00932 const PASN_Choice & subTypePDU
00933 ) const;
00935 };
00936
00937
00938 #if OPAL_VIDEO
00939
00946 class H323VideoCapability : public H323RealTimeCapability
00947 {
00948 PCLASSINFO(H323VideoCapability, H323RealTimeCapability);
00949
00950 public:
00956 virtual MainTypes GetMainType() const;
00958
00969 virtual unsigned GetDefaultSessionID() const;
00971
00982 virtual PBoolean OnSendingPDU(
00983 H245_Capability & pdu
00984 ) const;
00985
00994 virtual PBoolean OnSendingPDU(
00995 H245_DataType & pdu
00996 ) const;
00997
01006 virtual PBoolean OnSendingPDU(
01007 H245_ModeElement & pdu
01008 ) const;
01009
01017 virtual PBoolean OnSendingPDU(
01018 H245_VideoCapability & pdu
01019 ) const;
01020 virtual PBoolean OnSendingPDU(
01021 H245_VideoCapability & pdu,
01022 CommandType type
01023 ) const;
01024
01033 virtual PBoolean OnSendingPDU(
01034 H245_VideoMode & pdu
01035 ) const = 0;
01036
01046 virtual PBoolean OnReceivedPDU(
01047 const H245_Capability & pdu
01048 );
01049
01057 virtual PBoolean OnReceivedPDU(
01058 const H245_DataType & pdu,
01059 PBoolean receiver
01060 );
01061
01069 virtual PBoolean OnReceivedPDU(
01070 const H245_VideoCapability & pdu
01071 );
01072 virtual PBoolean OnReceivedPDU(
01073 const H245_VideoCapability & pdu,
01074 CommandType type
01075 );
01077 };
01078
01079
01087 class H323NonStandardVideoCapability : public H323VideoCapability,
01088 public H323NonStandardCapabilityInfo
01089 {
01090 PCLASSINFO(H323NonStandardVideoCapability, H323VideoCapability);
01091
01092 public:
01095 H323NonStandardVideoCapability(
01096 H323NonStandardCapabilityInfo::CompareFuncType compareFunc,
01097 const BYTE * dataBlock,
01098 PINDEX dataSize
01099 );
01102 H323NonStandardVideoCapability(
01103 const BYTE * dataBlock = NULL,
01104 PINDEX dataSize = 0,
01105 PINDEX comparisonOffset = 0,
01106 PINDEX comparisonLength = P_MAX_INDEX
01107 );
01108
01111 H323NonStandardVideoCapability(
01112 const PString & oid,
01113 const BYTE * dataBlock = NULL,
01114 PINDEX dataSize = 0,
01115 PINDEX comparisonOffset = 0,
01116 PINDEX comparisonLength = P_MAX_INDEX
01117 );
01118
01121 H323NonStandardVideoCapability(
01122 BYTE country,
01123 BYTE extension,
01124 WORD maufacturer,
01125 const BYTE * dataBlock = NULL,
01126 PINDEX dataSize = 0,
01127 PINDEX comparisonOffset = 0,
01128 PINDEX comparisonLength = P_MAX_INDEX
01129 );
01131
01137 Comparison Compare(const PObject & obj) const;
01139
01148 virtual unsigned GetSubType() const;
01150
01161 virtual PBoolean OnSendingPDU(
01162 H245_VideoCapability & pdu
01163 ) const;
01164
01173 virtual PBoolean OnSendingPDU(
01174 H245_VideoMode & pdu
01175 ) const;
01176
01185 virtual PBoolean OnReceivedPDU(
01186 const H245_VideoCapability & pdu
01187 );
01188
01191 virtual PBoolean IsMatch(
01192 const PASN_Choice & subTypePDU
01193 ) const;
01195 };
01196
01204 class H323GenericVideoCapability : public H323VideoCapability,
01205 public H323GenericCapabilityInfo
01206 {
01207 PCLASSINFO(H323GenericVideoCapability, H323VideoCapability);
01208
01209 public:
01214 H323GenericVideoCapability(
01215 const PString & capabilityId,
01216 PINDEX maxBitRate = 0
01217 );
01219
01225 Comparison Compare(const PObject & obj) const;
01227
01235 virtual unsigned GetSubType() const;
01237
01248 virtual PBoolean OnSendingPDU(
01249 H245_VideoCapability & pdu,
01250 CommandType type
01251 ) const;
01252
01261 virtual PBoolean OnSendingPDU(
01262 H245_VideoMode & pdu
01263 ) const;
01264
01273 virtual PBoolean OnReceivedPDU(
01274 const H245_VideoCapability & pdu,
01275 CommandType type
01276 );
01278
01281 virtual PBoolean IsMatch(
01282 const PASN_Choice & subTypePDU
01283 ) const;
01284 };
01285
01286 #endif // OPAL_VIDEO
01287
01294 class H323DataCapability : public H323Capability
01295 {
01296 PCLASSINFO(H323DataCapability, H323Capability);
01297
01298 public:
01303 H323DataCapability(
01304 unsigned maxBitRate = 0
01305 );
01307
01313 virtual MainTypes GetMainType() const;
01315
01325 virtual unsigned GetDefaultSessionID() const;
01327
01338 virtual PBoolean OnSendingPDU(
01339 H245_Capability & pdu
01340 ) const;
01341
01350 virtual PBoolean OnSendingPDU(
01351 H245_DataType & pdu
01352 ) const;
01353
01362 virtual PBoolean OnSendingPDU(
01363 H245_ModeElement & pdu
01364 ) const;
01365
01373 virtual PBoolean OnSendingPDU(
01374 H245_DataApplicationCapability & pdu
01375 ) const;
01376 virtual PBoolean OnSendingPDU(
01377 H245_DataApplicationCapability & pdu,
01378 CommandType type
01379 ) const;
01380
01389 virtual PBoolean OnSendingPDU(
01390 H245_DataMode & pdu
01391 ) const = 0;
01392
01402 virtual PBoolean OnReceivedPDU(
01403 const H245_Capability & pdu
01404 );
01405
01413 virtual PBoolean OnReceivedPDU(
01414 const H245_DataType & pdu,
01415 PBoolean receiver
01416 );
01417
01425 virtual PBoolean OnReceivedPDU(
01426 const H245_DataApplicationCapability & pdu
01427 );
01428 virtual PBoolean OnReceivedPDU(
01429 const H245_DataApplicationCapability & pdu,
01430 CommandType type
01431 );
01433
01434 protected:
01435 unsigned maxBitRate;
01436 };
01437
01438
01446 class H323NonStandardDataCapability : public H323DataCapability,
01447 public H323NonStandardCapabilityInfo
01448 {
01449 PCLASSINFO(H323NonStandardDataCapability, H323DataCapability);
01450
01451 public:
01456 H323NonStandardDataCapability(
01457 unsigned maxBitRate,
01458 const BYTE * dataBlock = NULL,
01459 PINDEX dataSize = 0,
01460 PINDEX comparisonOffset = 0,
01461 PINDEX comparisonLength = P_MAX_INDEX
01462 );
01463
01466 H323NonStandardDataCapability(
01467 unsigned maxBitRate,
01468 const PString & oid,
01469 const BYTE * dataBlock = NULL,
01470 PINDEX dataSize = 0,
01471 PINDEX comparisonOffset = 0,
01472 PINDEX comparisonLength = P_MAX_INDEX
01473 );
01474
01477 H323NonStandardDataCapability(
01478 unsigned maxBitRate,
01479 BYTE country,
01480 BYTE extension,
01481 WORD maufacturer,
01482 const BYTE * dataBlock = NULL,
01483 PINDEX dataSize = 0,
01484 PINDEX comparisonOffset = 0,
01485 PINDEX comparisonLength = P_MAX_INDEX
01486 );
01488
01494 Comparison Compare(const PObject & obj) const;
01496
01505 virtual unsigned GetSubType() const;
01507
01518 virtual PBoolean OnSendingPDU(
01519 H245_DataApplicationCapability & pdu
01520 ) const;
01521
01530 virtual PBoolean OnSendingPDU(
01531 H245_DataMode & pdu
01532 ) const;
01533
01542 virtual PBoolean OnReceivedPDU(
01543 const H245_DataApplicationCapability & pdu
01544 );
01545
01548 virtual PBoolean IsMatch(
01549 const PASN_Choice & subTypePDU
01550 ) const;
01552 };
01553
01554
01556
01557
01560 class H323_G711Capability : public H323AudioCapability
01561 {
01562 PCLASSINFO(H323_G711Capability, H323AudioCapability)
01563
01564 public:
01566 enum Mode {
01568 ALaw,
01570 muLaw
01571 };
01573 enum Speed {
01575 At64k,
01577 At56k
01578 };
01579
01584 H323_G711Capability(
01585 Mode mode = muLaw,
01586 Speed speed = At64k
01587 );
01589
01594 virtual PObject * Clone() const;
01596
01605 virtual unsigned GetSubType() const;
01606
01609 virtual PString GetFormatName() const;
01611
01612 protected:
01613 Mode mode;
01614 Speed speed;
01615 };
01616
01618
01621 class H323_UserInputCapability : public H323Capability
01622 {
01623 PCLASSINFO(H323_UserInputCapability, H323Capability);
01624
01625 public:
01628 enum SubTypes {
01629 BasicString,
01630 IA5String,
01631 GeneralString,
01632 SignalToneH245,
01633 HookFlashH245,
01634 SignalToneRFC2833,
01635 NumSubTypes
01636 };
01637 static const char * GetSubTypeName(SubTypes subType);
01638 friend ostream & operator<<(ostream & strm, SubTypes subType) { return strm << GetSubTypeName(subType); }
01639
01644 H323_UserInputCapability(
01645 SubTypes subType
01646 );
01648
01653 virtual PObject * Clone() const;
01655
01663 virtual MainTypes GetMainType() const;
01664
01668 virtual unsigned GetSubType() const;
01669
01672 virtual PString GetFormatName() const;
01674
01682 virtual H323Channel * CreateChannel(
01683 H323Connection & connection,
01684 H323Channel::Directions dir,
01685 unsigned sessionID,
01686 const H245_H2250LogicalChannelParameters * param
01688 ) const;
01690
01700 virtual PBoolean OnSendingPDU(
01701 H245_Capability & pdu
01702 ) const;
01703
01711 virtual PBoolean OnSendingPDU(
01712 H245_DataType & pdu
01713 ) const;
01714
01723 virtual PBoolean OnSendingPDU(
01724 H245_ModeElement & pdu
01725 ) const;
01726
01736 virtual PBoolean OnReceivedPDU(
01737 const H245_Capability & pdu
01738 );
01739
01747 virtual PBoolean OnReceivedPDU(
01748 const H245_DataType & pdu,
01749 PBoolean receiver
01750 );
01751
01760 virtual PBoolean IsUsable(
01761 const H323Connection & connection
01762 ) const;
01764
01765 static void AddAllCapabilities(
01766 H323Capabilities & capabilities,
01767 PINDEX descriptorNum,
01768 PINDEX simultaneous
01769 );
01770
01771 protected:
01772 SubTypes subType;
01773 };
01774
01775
01776
01778
01779 PARRAY(H323CapabilitiesList, H323Capability);
01780
01781 PARRAY(H323CapabilitiesListArray, H323CapabilitiesList);
01782
01783 class H323SimultaneousCapabilities : public H323CapabilitiesListArray
01784 {
01785 PCLASSINFO(H323SimultaneousCapabilities, H323CapabilitiesListArray);
01786 public:
01787 PBoolean SetSize(PINDEX newSize);
01788 };
01789
01790
01791 PARRAY(H323CapabilitiesSetArray, H323SimultaneousCapabilities);
01792
01793
01794 class H323CapabilitiesSet : public H323CapabilitiesSetArray
01795 {
01796 PCLASSINFO(H323CapabilitiesSet, H323CapabilitiesSetArray);
01797 public:
01799 PBoolean SetSize(PINDEX newSize);
01800 };
01801
01802
01805 class H323Capabilities : public PObject
01806 {
01807 PCLASSINFO(H323Capabilities, PObject);
01808 public:
01813 H323Capabilities();
01814
01817 H323Capabilities(
01818 const H323Connection & connection,
01819 const H245_TerminalCapabilitySet & pdu
01820 );
01821
01826 H323Capabilities(
01827 const H323Capabilities & original
01828 );
01829
01834 H323Capabilities & operator=(
01835 const H323Capabilities & original
01836 );
01838
01843 void PrintOn(
01844 ostream & strm
01845 ) const;
01847
01852 PINDEX GetSize() const { return table.GetSize(); }
01853
01856 H323Capability & operator[](PINDEX i) const { return table[i]; }
01857
01878 PINDEX SetCapability(
01879 PINDEX descriptorNum,
01880 PINDEX simultaneous,
01881 H323Capability * cap
01882 );
01883
01886 PINDEX AddMediaFormat(
01887 PINDEX descriptorNum,
01888 PINDEX simultaneous,
01889 const OpalMediaFormat & mediaFormat
01890 );
01891
01896 PINDEX AddAllCapabilities(
01897 PINDEX descriptorNum,
01898 PINDEX simultaneous,
01899 const PString & name,
01900 PBoolean exact = PFalse
01901 );
01902
01903
01904 PINDEX AddAllCapabilities(
01905 const H323EndPoint &,
01906 PINDEX descriptorNum,
01907 PINDEX simultaneous,
01908 const PString & name,
01909 PBoolean exact = PFalse
01910 )
01911 { return AddAllCapabilities(descriptorNum, simultaneous, name, exact); }
01912
01921 void Add(
01922 H323Capability * capability
01923 );
01924
01931 H323Capability * Copy(
01932 const H323Capability & capability
01933 );
01934
01939 void Remove(
01940 H323Capability * capability
01941 );
01942
01947 void Remove(
01948 const PString & formatName
01949 );
01950
01954 void Remove(
01955 const PStringArray & formatNames
01956 );
01957
01960 void RemoveAll();
01961
01969 H323Capability * FindCapability(
01970 unsigned capabilityNumber
01971 ) const;
01972
01988 H323Capability * FindCapability(
01989 const PString & formatName,
01990 H323Capability::CapabilityDirection direction = H323Capability::e_Unknown,
01992 PBoolean exact = PFalse
01993 ) const;
01994
02000 H323Capability * FindCapability(
02001 H323Capability::CapabilityDirection direction
02002 ) const;
02003
02011 H323Capability * FindCapability(
02012 const H323Capability & capability
02013 ) const;
02014
02020 H323Capability * FindCapability(
02021 const H245_Capability & cap
02022 ) const;
02023
02029 H323Capability * FindCapability(
02030 const H245_DataType & dataType
02031 ) const;
02032
02038 H323Capability * FindCapability(
02039 const H245_ModeElement & modeElement
02040 ) const;
02041
02047 H323Capability * FindCapability(
02048 H323Capability::MainTypes mainType,
02049 unsigned subType = UINT_MAX
02050 ) const;
02051
02054 void BuildPDU(
02055 const H323Connection & connection,
02056 H245_TerminalCapabilitySet & pdu
02057 ) const;
02058
02061 PBoolean Merge(
02062 const H323Capabilities & newCaps
02063 );
02064
02071 void Reorder(
02072 const PStringArray & preferenceOrder
02073 );
02074
02077 PBoolean IsAllowed(
02078 const H323Capability & capability
02079 );
02080
02083 PBoolean IsAllowed(
02084 unsigned capabilityNumber
02085 );
02086
02089 PBoolean IsAllowed(
02090 const H323Capability & capability1,
02091 const H323Capability & capability2
02092 );
02093
02096 PBoolean IsAllowed(
02097 unsigned capabilityNumber1,
02098 unsigned capabilityNumber2
02099 );
02100
02103 OpalMediaFormatList GetMediaFormats() const;
02104
02105 const PStringSet & GetMediaPacketizations() const { return mediaPacketizations; }
02107
02108 protected:
02109 void SetMediaPacketizations(const PStringSet & packetizations) { mediaPacketizations = packetizations; }
02110
02111 H323CapabilitiesList table;
02112 H323CapabilitiesSet set;
02113 PStringSet mediaPacketizations;
02114 };
02115
02116
02118
02119
02120
02121 typedef PFactory<H323Capability, std::string> H323CapabilityFactory;
02122
02123 #define H323_REGISTER_CAPABILITY(cls, capName) static H323CapabilityFactory::Worker<cls> cls##Factory(capName, true); \
02124
02125
02126 #endif // OPAL_H323
02127
02128 #endif // OPAL_H323_H323CAPS_H
02129
02130