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_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
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
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
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