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
01617 #if 0
01618
01621 class H323_G728Capability : public H323AudioCapability
01622 {
01623 PCLASSINFO(H323_G728Capability, H323AudioCapability)
01624
01625 public:
01630 H323_G728Capability();
01632
01637 virtual PObject * Clone() const;
01639
01645 virtual unsigned GetSubType() const;
01646
01649 virtual PString GetFormatName() const;
01651 };
01652
01653
01656 class H323_G729Capability : public H323AudioCapability
01657 {
01658 PCLASSINFO(H323_G729Capability, H323AudioCapability)
01659
01660 public:
01662 enum Mode {
01663 e_Normal,
01664 e_AnnexA,
01665 e_AnnexB,
01666 e_AnnexA_AnnexB
01667 };
01668
01673 H323_G729Capability(
01674 Mode mode
01675 );
01677
01682 virtual PObject * Clone() const;
01684
01690 virtual unsigned GetSubType() const;
01691
01694 virtual PString GetFormatName() const;
01696
01697 protected:
01698 Mode mode;
01699 };
01700
01701
01704 class H323_G7231Capability : public H323AudioCapability
01705 {
01706 PCLASSINFO(H323_G7231Capability, H323AudioCapability)
01707
01708 public:
01713 H323_G7231Capability(
01714 PBoolean allowSIDFrames = PTrue
01715 );
01717
01722 virtual PObject * Clone() const;
01724
01730 virtual unsigned GetSubType() const;
01731
01734 virtual PString GetFormatName() const;
01736
01746 virtual PBoolean OnSendingPDU(
01747 H245_AudioCapability & pdu,
01748 unsigned packetSize
01749 ) const;
01750
01758 virtual PBoolean OnReceivedPDU(
01759 const H245_AudioCapability & pdu,
01760 unsigned & packetSize
01761 );
01763
01764 protected:
01765 PBoolean allowSIDFrames;
01766 };
01767
01768
01771 class H323_GSM0610Capability : public H323AudioCapability
01772 {
01773 PCLASSINFO(H323_GSM0610Capability, H323AudioCapability)
01774
01775 public:
01780 H323_GSM0610Capability();
01782
01787 virtual PObject * Clone() const;
01789
01798 virtual unsigned GetSubType() const;
01799
01802 virtual PString GetFormatName() const;
01803
01812 virtual void SetTxFramesInPacket(
01813 unsigned frames
01814 );
01816
01826 virtual PBoolean OnSendingPDU(
01827 H245_AudioCapability & pdu,
01828 unsigned packetSize
01829 ) const;
01830
01838 virtual PBoolean OnReceivedPDU(
01839 const H245_AudioCapability & pdu,
01840 unsigned & packetSize
01841 );
01843 };
01844
01845 #endif
01846
01847
01849
01852 class H323_UserInputCapability : public H323Capability
01853 {
01854 PCLASSINFO(H323_UserInputCapability, H323Capability);
01855
01856 public:
01859 enum SubTypes {
01860 BasicString,
01861 IA5String,
01862 GeneralString,
01863 SignalToneH245,
01864 HookFlashH245,
01865 SignalToneRFC2833,
01866 NumSubTypes
01867 };
01868 static const char * GetSubTypeName(SubTypes subType);
01869 friend ostream & operator<<(ostream & strm, SubTypes subType) { return strm << GetSubTypeName(subType); }
01870
01875 H323_UserInputCapability(
01876 SubTypes subType
01877 );
01879
01884 virtual PObject * Clone() const;
01886
01894 virtual MainTypes GetMainType() const;
01895
01899 virtual unsigned GetSubType() const;
01900
01903 virtual PString GetFormatName() const;
01905
01913 virtual H323Channel * CreateChannel(
01914 H323Connection & connection,
01915 H323Channel::Directions dir,
01916 unsigned sessionID,
01917 const H245_H2250LogicalChannelParameters * param
01919 ) const;
01921
01931 virtual PBoolean OnSendingPDU(
01932 H245_Capability & pdu
01933 ) const;
01934
01942 virtual PBoolean OnSendingPDU(
01943 H245_DataType & pdu
01944 ) const;
01945
01954 virtual PBoolean OnSendingPDU(
01955 H245_ModeElement & pdu
01956 ) const;
01957
01967 virtual PBoolean OnReceivedPDU(
01968 const H245_Capability & pdu
01969 );
01970
01978 virtual PBoolean OnReceivedPDU(
01979 const H245_DataType & pdu,
01980 PBoolean receiver
01981 );
01982
01991 virtual PBoolean IsUsable(
01992 const H323Connection & connection
01993 ) const;
01995
01996 static void AddAllCapabilities(
01997 H323Capabilities & capabilities,
01998 PINDEX descriptorNum,
01999 PINDEX simultaneous
02000 );
02001
02002 protected:
02003 SubTypes subType;
02004 };
02005
02006
02007
02009
02010 PARRAY(H323CapabilitiesList, H323Capability);
02011
02012 PARRAY(H323CapabilitiesListArray, H323CapabilitiesList);
02013
02014 class H323SimultaneousCapabilities : public H323CapabilitiesListArray
02015 {
02016 PCLASSINFO(H323SimultaneousCapabilities, H323CapabilitiesListArray);
02017 public:
02018 PBoolean SetSize(PINDEX newSize);
02019 };
02020
02021
02022 PARRAY(H323CapabilitiesSetArray, H323SimultaneousCapabilities);
02023
02024
02025 class H323CapabilitiesSet : public H323CapabilitiesSetArray
02026 {
02027 PCLASSINFO(H323CapabilitiesSet, H323CapabilitiesSetArray);
02028 public:
02030 PBoolean SetSize(PINDEX newSize);
02031 };
02032
02033
02036 class H323Capabilities : public PObject
02037 {
02038 PCLASSINFO(H323Capabilities, PObject);
02039 public:
02044 H323Capabilities();
02045
02048 H323Capabilities(
02049 const H323Connection & connection,
02050 const H245_TerminalCapabilitySet & pdu
02051 );
02052
02057 H323Capabilities(
02058 const H323Capabilities & original
02059 );
02060
02065 H323Capabilities & operator=(
02066 const H323Capabilities & original
02067 );
02069
02074 void PrintOn(
02075 ostream & strm
02076 ) const;
02078
02083 PINDEX GetSize() const { return table.GetSize(); }
02084
02087 H323Capability & operator[](PINDEX i) const { return table[i]; }
02088
02109 PINDEX SetCapability(
02110 PINDEX descriptorNum,
02111 PINDEX simultaneous,
02112 H323Capability * cap
02113 );
02114
02117 PINDEX AddMediaFormat(
02118 PINDEX descriptorNum,
02119 PINDEX simultaneous,
02120 const OpalMediaFormat & mediaFormat
02121 );
02122
02127 PINDEX AddAllCapabilities(
02128 PINDEX descriptorNum,
02129 PINDEX simultaneous,
02130 const PString & name,
02131 PBoolean exact = PFalse
02132 );
02133
02134
02135 PINDEX AddAllCapabilities(
02136 const H323EndPoint &,
02137 PINDEX descriptorNum,
02138 PINDEX simultaneous,
02139 const PString & name,
02140 PBoolean exact = PFalse
02141 )
02142 { return AddAllCapabilities(descriptorNum, simultaneous, name, exact); }
02143
02152 void Add(
02153 H323Capability * capability
02154 );
02155
02162 H323Capability * Copy(
02163 const H323Capability & capability
02164 );
02165
02170 void Remove(
02171 H323Capability * capability
02172 );
02173
02178 void Remove(
02179 const PString & formatName
02180 );
02181
02185 void Remove(
02186 const PStringArray & formatNames
02187 );
02188
02191 void RemoveAll();
02192
02200 H323Capability * FindCapability(
02201 unsigned capabilityNumber
02202 ) const;
02203
02219 H323Capability * FindCapability(
02220 const PString & formatName,
02221 H323Capability::CapabilityDirection direction = H323Capability::e_Unknown,
02223 PBoolean exact = PFalse
02224 ) const;
02225
02231 H323Capability * FindCapability(
02232 H323Capability::CapabilityDirection direction
02233 ) const;
02234
02242 H323Capability * FindCapability(
02243 const H323Capability & capability
02244 ) const;
02245
02251 H323Capability * FindCapability(
02252 const H245_Capability & cap
02253 ) const;
02254
02260 H323Capability * FindCapability(
02261 const H245_DataType & dataType
02262 ) const;
02263
02269 H323Capability * FindCapability(
02270 const H245_ModeElement & modeElement
02271 ) const;
02272
02278 H323Capability * FindCapability(
02279 H323Capability::MainTypes mainType,
02280 unsigned subType = UINT_MAX
02281 ) const;
02282
02285 void BuildPDU(
02286 const H323Connection & connection,
02287 H245_TerminalCapabilitySet & pdu
02288 ) const;
02289
02292 PBoolean Merge(
02293 const H323Capabilities & newCaps
02294 );
02295
02302 void Reorder(
02303 const PStringArray & preferenceOrder
02304 );
02305
02308 PBoolean IsAllowed(
02309 const H323Capability & capability
02310 );
02311
02314 PBoolean IsAllowed(
02315 unsigned capabilityNumber
02316 );
02317
02320 PBoolean IsAllowed(
02321 const H323Capability & capability1,
02322 const H323Capability & capability2
02323 );
02324
02327 PBoolean IsAllowed(
02328 unsigned capabilityNumber1,
02329 unsigned capabilityNumber2
02330 );
02331
02334 OpalMediaFormatList GetMediaFormats() const;
02335
02336 const PStringSet & GetMediaPacketizations() const { return mediaPacketizations; }
02338
02339 protected:
02340 H323CapabilitiesList table;
02341 H323CapabilitiesSet set;
02342 PStringSet mediaPacketizations;
02343 };
02344
02345
02347
02348
02349
02350 typedef PFactory<H323Capability, std::string> H323CapabilityFactory;
02351
02352 #define H323_REGISTER_CAPABILITY(cls, capName) static H323CapabilityFactory::Worker<cls> cls##Factory(capName, true); \
02353
02354
02355 #endif // OPAL_H323
02356
02357 #endif // OPAL_H323_H323CAPS_H
02358
02359