OPAL  Version 3.12.9
h323caps.h
Go to the documentation of this file.
1 /*
2  * h323caps.h
3  *
4  * H.323 protocol handler
5  *
6  * Open H323 Library
7  *
8  * Copyright (c) 1998-2001 Equivalence Pty. Ltd.
9  *
10  * The contents of this file are subject to the Mozilla Public License
11  * Version 1.0 (the "License"); you may not use this file except in
12  * compliance with the License. You may obtain a copy of the License at
13  * http://www.mozilla.org/MPL/
14  *
15  * Software distributed under the License is distributed on an "AS IS"
16  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
17  * the License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * The Original Code is Open H323 Library.
21  *
22  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
23  *
24  * Portions of this code were written with the assisance of funding from
25  * Vovida Networks, Inc. http://www.vovida.com.
26  *
27  * Contributor(s): ______________________________________.
28  *
29  * $Revision: 30205 $
30  * $Author: rjongbloed $
31  * $Date: 2013-07-31 10:33:53 +1000 (Wed, 31 Jul 2013) $
32  */
33 
34 #ifndef OPAL_H323_H323CAPS_H
35 #define OPAL_H323_H323CAPS_H
36 
37 #ifdef P_USE_PRAGMA
38 #pragma interface
39 #endif
40 
41 #include <opal/buildopts.h>
42 
43 #if OPAL_H323
44 
45 #include <opal/mediafmt.h>
46 #include <h323/channels.h>
47 
48 
49 /* The following classes have forward references to avoid including the VERY
50  large header files for H225 and H245. If an application requires access
51  to the protocol classes they can include them, but for simple usage their
52  inclusion can be avoided.
53  */
54 class PASN_Choice;
55 class H245_Capability;
56 class H245_DataType;
57 class H245_ModeElement;
58 class H245_AudioCapability;
59 class H245_AudioMode;
60 class H245_VideoCapability;
61 class H245_VideoMode;
62 class H245_DataApplicationCapability;
63 class H245_DataMode;
64 class H245_DataProtocolCapability;
65 class H245_H2250LogicalChannelParameters;
66 class H245_TerminalCapabilitySet;
67 class H245_NonStandardParameter;
68 class H323Connection;
69 class H323Capabilities;
70 class H245_CapabilityIdentifier;
71 class H245_GenericCapability;
72 class H245_GenericParameter;
73 
74 
75 #if OPAL_H239
77 #endif
78 
79 
81 
95 class H323Capability : public PObject
96 {
97  PCLASSINFO(H323Capability, PObject);
98 
99  public:
104  H323Capability();
106 
112  Comparison Compare(const PObject & obj) const;
113 
116  void PrintOn(ostream & strm) const;
118 
121  enum MainTypes {
134  };
135 
141  virtual MainTypes GetMainType() const = 0;
142 
146  virtual unsigned GetSubType() const = 0;
147 
150  virtual PString GetFormatName() const = 0;
152 
158  static H323Capability * Create(
159  const PString & name
160  );
161 
162  enum {
167  };
168 
177  virtual unsigned GetDefaultSessionID() const;
178 
187  virtual void SetTxFramesInPacket(
188  unsigned frames
189  );
190 
195  virtual unsigned GetTxFramesInPacket() const;
196 
201  virtual unsigned GetRxFramesInPacket() const;
202 
208  virtual H323Channel * CreateChannel(
209  H323Connection & connection,
211  unsigned sessionID,
212  const H245_H2250LogicalChannelParameters * param
214  ) const = 0;
216 
219  enum CommandType {
223  };
224 
232  virtual PBoolean OnSendingPDU(
233  H245_Capability & pdu
234  ) const = 0;
235 
243  virtual PBoolean OnSendingPDU(
244  H245_DataType & pdu
245  ) const;
246 
254  virtual PBoolean OnSendingPDU(
255  H245_ModeElement & pdu
256  ) const = 0;
257 
270  virtual PBoolean OnReceivedPDU(
271  const H245_Capability & pdu
272  );
273 
281  virtual PBoolean OnReceivedPDU(
282  const H245_DataType & pdu,
283  PBoolean receiver
284  );
285 
288  virtual PBoolean IsMatch(
289  const PASN_Choice & subTypePDU,
290  const PString & mediaPacketization
291  ) const;
292 
300  virtual PBoolean IsUsable(
301  const H323Connection & connection
302  ) const;
304 
314  };
315 
319 
324  ) { capabilityDirection = dir; }
325 
327  unsigned GetCapabilityNumber() const { return assignedCapabilityNumber; }
328 
330  void SetCapabilityNumber(unsigned num) { assignedCapabilityNumber = num; }
331 
335 
338  bool UpdateMediaFormat(
339  const OpalMediaFormat & format
340  );
341 
344 
348 
349 #if PTRACING
350  friend ostream & operator<<(ostream & o , MainTypes t);
351  friend ostream & operator<<(ostream & o , CapabilityDirection d);
352 #endif
353 
354  protected:
356 
359 
361 
362  private:
363  P_REMOVE_VIRTUAL(PBoolean, IsMatch(const PASN_Choice &) const, false);
364 
365  friend class H323Capabilities;
366 };
367 
368 
369 
379 {
380  public:
381  typedef PObject::Comparison (*CompareFuncType)(struct PluginCodec_H323NonStandardCodecData *);
382 
387  const BYTE * dataBlock,
388  PINDEX dataSize
389  );
390 
394  const BYTE * dataBlock,
395  PINDEX dataSize,
396  PINDEX comparisonOffset = 0,
397  PINDEX comparisonLength = P_MAX_INDEX
398  );
399 
403  const PString & oid,
404  const BYTE * dataBlock,
405  PINDEX dataSize,
406  PINDEX comparisonOffset = 0,
407  PINDEX comparisonLength = P_MAX_INDEX
408  );
409 
413  BYTE country,
414  BYTE extension,
415  WORD maufacturer,
416  const BYTE * dataBlock,
417  PINDEX dataSize,
418  PINDEX comparisonOffset = 0,
419  PINDEX comparisonLength = P_MAX_INDEX
420  );
421 
425 
430  virtual PBoolean OnSendingPDU(
431  PBYTEArray & data
432  ) const;
433 
438  virtual PBoolean OnReceivedPDU(
439  const PBYTEArray & data
440  );
441 
442  PBoolean IsMatch(const H245_NonStandardParameter & param) const;
443 
444  PObject::Comparison CompareParam(
445  const H245_NonStandardParameter & param
446  ) const;
447 
448  protected:
449  PBoolean OnSendingNonStandardPDU(
450  PASN_Choice & pdu,
451  unsigned nonStandardTag
452  ) const;
453  PBoolean OnReceivedNonStandardPDU(
454  const PASN_Choice & pdu,
455  unsigned nonStandardTag
456  );
457 
458  PObject::Comparison CompareInfo(
460  ) const;
461  PObject::Comparison CompareData(
462  const PBYTEArray & data
463  ) const;
464 
465  PString oid;
469  PBYTEArray nonStandardData;
473 };
474 
485 {
486  public:
488  const PString & id,
489  unsigned maxBitRate,
490  bool fixedBitRate
491  );
492 
494 
495  protected:
496  virtual PBoolean OnSendingGenericPDU(
497  H245_GenericCapability & pdu,
498  const OpalMediaFormat & mediaFormat,
500  ) const;
501  virtual PBoolean OnReceivedGenericPDU(
502  OpalMediaFormat & mediaFormat,
503  const H245_GenericCapability & pdu,
505  );
506 
507  PBoolean IsMatch(
508  const OpalMediaFormat & mediaFormat,
509  const H245_GenericCapability & param
510  ) const;
511  PObject::Comparison CompareInfo(
512  const H323GenericCapabilityInfo & obj
513  ) const;
514 
515 
516  PString m_identifier;
517  unsigned m_maxBitRate;
519 };
520 
528 {
530 
531  public:
536  virtual H323Channel * CreateChannel(
537  H323Connection & connection,
539  unsigned sessionID,
540  const H245_H2250LogicalChannelParameters * param
542  ) const;
543 
546  virtual ~H323RealTimeCapability();
548 };
549 
550 
558 {
560 
561  public:
568 
574  virtual MainTypes GetMainType() const;
576 
587  virtual unsigned GetDefaultSessionID() const;
588 
597  virtual void SetTxFramesInPacket(
598  unsigned frames
599  );
600 
606  virtual unsigned GetTxFramesInPacket() const;
607 
613  virtual unsigned GetRxFramesInPacket() const;
615 
626  virtual PBoolean OnSendingPDU(
627  H245_Capability & pdu
628  ) const;
629 
638  virtual PBoolean OnSendingPDU(
639  H245_DataType & pdu
640  ) const;
641 
650  virtual PBoolean OnSendingPDU(
651  H245_ModeElement & pdu
652  ) const;
653 
662  virtual PBoolean OnSendingPDU(
663  H245_AudioCapability & pdu,
664  unsigned packetSize
665  ) const;
666  virtual PBoolean OnSendingPDU(
667  H245_AudioCapability & pdu,
668  unsigned packetSize,
669  CommandType type
670  ) const;
671 
680  virtual PBoolean OnSendingPDU(
681  H245_AudioMode & pdu
682  ) const;
683 
695  virtual PBoolean OnReceivedPDU(
696  const H245_Capability & pdu
697  );
698 
708  virtual PBoolean OnReceivedPDU(
709  const H245_DataType & pdu,
710  PBoolean receiver
711  );
712 
721  virtual PBoolean OnReceivedPDU(
722  const H245_AudioCapability & pdu,
723  unsigned & packetSize
724  );
725  virtual PBoolean OnReceivedPDU(
726  const H245_AudioCapability & pdu,
727  unsigned & packetSize,
728  CommandType type
729  );
731 };
732 
733 
743 {
745 
746  public:
751  const BYTE * dataBlock,
752  PINDEX dataSize
753  );
757  const BYTE * dataBlock = NULL,
758  PINDEX dataSize = 0,
759  PINDEX comparisonOffset = 0,
760  PINDEX comparisonLength = P_MAX_INDEX
761  );
762 
766  const PString & oid,
767  const BYTE * dataBlock = NULL,
768  PINDEX dataSize = 0,
769  PINDEX comparisonOffset = 0,
770  PINDEX comparisonLength = P_MAX_INDEX
771  );
772 
776  BYTE country,
777  BYTE extension,
778  WORD maufacturer,
779  const BYTE * dataBlock = NULL,
780  PINDEX dataSize = 0,
781  PINDEX comparisonOffset = 0,
782  PINDEX comparisonLength = P_MAX_INDEX
783  );
785 
791  Comparison Compare(const PObject & obj) const;
793 
801  virtual unsigned GetSubType() const;
803 
814  virtual PBoolean OnSendingPDU(
815  H245_AudioCapability & pdu,
816  unsigned packetSize
817  ) const;
818 
827  virtual PBoolean OnSendingPDU(
828  H245_AudioMode & pdu
829  ) const;
830 
839  virtual PBoolean OnReceivedPDU(
840  const H245_AudioCapability & pdu,
841  unsigned & packetSize
842  );
843 
846  virtual PBoolean IsMatch(
847  const PASN_Choice & subTypePDU,
848  const PString & mediaPacketization
849  ) const;
851 };
852 
862 {
864 
865  public:
871  const PString & capabilityId,
872  unsigned fixedBitRate
873  );
875 
881  Comparison Compare(const PObject & obj) const;
883 
891  virtual unsigned GetSubType() const;
893 
904  virtual PBoolean OnSendingPDU(
905  H245_AudioCapability & pdu,
906  unsigned packetSize,
907  CommandType type
908  ) const;
909 
918  virtual PBoolean OnSendingPDU(
919  H245_AudioMode & pdu
920  ) const;
921 
930  virtual PBoolean OnReceivedPDU(
931  const H245_AudioCapability & pdu,
932  unsigned & packetSize,
933  CommandType type
934  );
935 
938  virtual PBoolean IsMatch(
939  const PASN_Choice & subTypePDU,
940  const PString & mediaPacketization
941  ) const;
943 };
944 
945 
946 template <const char * oid, const OpalAudioFormat & fmtFunc(), unsigned fixedBitRate = 0>
948 {
949  public:
951  : H323GenericAudioCapability(oid, fixedBitRate)
952  {
953  }
954 
955  virtual PObject * Clone() const
956  {
957  return new H323GenericAudioCapabilityTemplate(*this);
958  }
959 
960  virtual PString GetFormatName() const
961  {
962  return fmtFunc();
963  }
964 };
965 
966 
967 #if OPAL_VIDEO
968 
976 {
978 
979  public:
985  virtual MainTypes GetMainType() const;
987 
998  virtual unsigned GetDefaultSessionID() const;
1000 
1011  virtual PBoolean OnSendingPDU(
1012  H245_Capability & pdu
1013  ) const;
1014 
1023  virtual PBoolean OnSendingPDU(
1024  H245_DataType & pdu
1025  ) const;
1026 
1035  virtual PBoolean OnSendingPDU(
1036  H245_ModeElement & pdu
1037  ) const;
1038 
1046  virtual PBoolean OnSendingPDU(
1047  H245_VideoCapability & pdu
1048  ) const;
1049  virtual PBoolean OnSendingPDU(
1050  H245_VideoCapability & pdu,
1051  CommandType type
1052  ) const;
1053 
1062  virtual PBoolean OnSendingPDU(
1063  H245_VideoMode & pdu
1064  ) const;
1065 
1075  virtual PBoolean OnReceivedPDU(
1076  const H245_Capability & pdu
1077  );
1078 
1086  virtual PBoolean OnReceivedPDU(
1087  const H245_DataType & pdu,
1088  PBoolean receiver
1089  );
1090 
1098  virtual PBoolean OnReceivedPDU(
1099  const H245_VideoCapability & pdu
1100  );
1101  virtual PBoolean OnReceivedPDU(
1102  const H245_VideoCapability & pdu,
1103  CommandType type
1104  );
1106 };
1107 
1108 
1118 {
1120 
1121  public:
1126  const BYTE * dataBlock,
1127  PINDEX dataSize
1128  );
1132  const BYTE * dataBlock = NULL,
1133  PINDEX dataSize = 0,
1134  PINDEX comparisonOffset = 0,
1135  PINDEX comparisonLength = P_MAX_INDEX
1136  );
1137 
1141  const PString & oid,
1142  const BYTE * dataBlock = NULL,
1143  PINDEX dataSize = 0,
1144  PINDEX comparisonOffset = 0,
1145  PINDEX comparisonLength = P_MAX_INDEX
1146  );
1147 
1151  BYTE country,
1152  BYTE extension,
1153  WORD maufacturer,
1154  const BYTE * dataBlock = NULL,
1155  PINDEX dataSize = 0,
1156  PINDEX comparisonOffset = 0,
1157  PINDEX comparisonLength = P_MAX_INDEX
1158  );
1160 
1166  Comparison Compare(const PObject & obj) const;
1168 
1177  virtual unsigned GetSubType() const;
1179 
1190  virtual PBoolean OnSendingPDU(
1191  H245_VideoCapability & pdu
1192  ) const;
1193 
1202  virtual PBoolean OnSendingPDU(
1203  H245_VideoMode & pdu
1204  ) const;
1205 
1214  virtual PBoolean OnReceivedPDU(
1215  const H245_VideoCapability & pdu
1216  );
1217 
1220  virtual PBoolean IsMatch(
1221  const PASN_Choice & subTypePDU,
1222  const PString & mediaPacketization
1223  ) const;
1225 };
1226 
1236 {
1238 
1239  public:
1245  const PString & capabilityId,
1246  PINDEX maxBitRate = 0
1247  );
1249 
1255  Comparison Compare(const PObject & obj) const;
1257 
1265  virtual unsigned GetSubType() const;
1267 
1278  virtual PBoolean OnSendingPDU(
1279  H245_VideoCapability & pdu,
1280  CommandType type
1281  ) const;
1282 
1291  virtual PBoolean OnSendingPDU(
1292  H245_VideoMode & pdu
1293  ) const;
1294 
1303  virtual PBoolean OnReceivedPDU(
1304  const H245_VideoCapability & pdu,
1305  CommandType type
1306  );
1307 
1310  virtual PBoolean IsMatch(
1311  const PASN_Choice & subTypePDU,
1312  const PString & mediaPacketization
1313  ) const;
1315 };
1316 
1317 
1318 template <const char * oid, const OpalVideoFormat & fmtFunc()>
1320 {
1321  public:
1324  {
1325  }
1326 
1327  virtual PObject * Clone() const
1328  {
1329  return new H323GenericVideoCapabilityTemplate(*this);
1330  }
1331 
1332  virtual PString GetFormatName() const
1333  {
1334  return fmtFunc();
1335  }
1336 };
1337 
1338 
1339 #if OPAL_H239
1340 
1344 {
1346 
1347  public:
1353  const PString & identifier
1354  );
1356 
1364  virtual unsigned GetSubType() const;
1366 
1377  virtual PBoolean OnSendingPDU(
1378  H245_VideoCapability & pdu,
1379  CommandType type
1380  ) const;
1381 
1390  virtual PBoolean OnSendingPDU(
1391  H245_VideoMode & pdu
1392  ) const;
1393 
1402  virtual PBoolean OnReceivedPDU(
1403  const H245_VideoCapability & pdu,
1404  CommandType type
1405  );
1406 
1409  virtual PBoolean IsMatch(
1410  const PASN_Choice & subTypePDU,
1411  const PString & mediaPacketization
1412  ) const;
1414 
1415  protected:
1417 };
1418 
1419 
1421 
1426 {
1428 
1429  public:
1435  const PString & identifier
1436  );
1438 
1444  virtual MainTypes GetMainType() const;
1445 
1451  virtual unsigned GetSubType() const;
1453 
1464  virtual PBoolean OnSendingPDU(
1465  H245_Capability & pdu
1466  ) const;
1467 
1475  virtual PBoolean OnSendingPDU(
1476  H245_ModeElement & pdu
1477  ) const;
1478 
1488  virtual PBoolean OnReceivedPDU(
1489  const H245_Capability & pdu
1490  );
1491 
1494  virtual PBoolean IsMatch(
1495  const PASN_Choice & subTypePDU,
1496  const PString & mediaPacketization
1497  ) const;
1499 
1507  virtual H323Channel * CreateChannel(
1508  H323Connection & connection,
1510  unsigned sessionID,
1511  const H245_H2250LogicalChannelParameters * param
1513  ) const;
1515 };
1516 
1517 
1519 
1521 {
1523 
1524  public:
1530  const OpalMediaFormat & videoFormat
1531  );
1533 
1539  Comparison Compare(const PObject & obj) const;
1540 
1543  virtual PObject * Clone() const;
1545 
1550  virtual PString GetFormatName() const;
1552 
1563  virtual PBoolean OnSendingPDU(
1564  H245_VideoCapability & pdu,
1565  CommandType type
1566  ) const;
1567 
1576  virtual PBoolean OnReceivedPDU(
1577  const H245_VideoCapability & pdu,
1578  CommandType type
1579  );
1581 };
1582 
1583 
1585 
1587 {
1589 
1590  public:
1597 
1602  virtual PObject * Clone() const;
1604 
1609  virtual PString GetFormatName() const;
1611 };
1612 
1613 
1614 #endif // OPAL_H239
1615 
1616 #endif // OPAL_VIDEO
1617 
1618 
1626 {
1627  PCLASSINFO(H323DataCapability, H323Capability);
1628 
1629  public:
1635  unsigned maxBitRate = 0
1636  );
1638 
1644  virtual MainTypes GetMainType() const;
1646 
1656  virtual unsigned GetDefaultSessionID() const;
1658 
1669  virtual PBoolean OnSendingPDU(
1670  H245_Capability & pdu
1671  ) const;
1672 
1681  virtual PBoolean OnSendingPDU(
1682  H245_DataType & pdu
1683  ) const;
1684 
1693  virtual PBoolean OnSendingPDU(
1694  H245_ModeElement & pdu
1695  ) const;
1696 
1704  virtual PBoolean OnSendingPDU(
1705  H245_DataApplicationCapability & pdu
1706  ) const;
1707  virtual PBoolean OnSendingPDU(
1708  H245_DataApplicationCapability & pdu,
1709  CommandType type
1710  ) const;
1711 
1720  virtual PBoolean OnSendingPDU(
1721  H245_DataMode & pdu
1722  ) const = 0;
1723 
1733  virtual PBoolean OnReceivedPDU(
1734  const H245_Capability & pdu
1735  );
1736 
1744  virtual PBoolean OnReceivedPDU(
1745  const H245_DataType & pdu,
1746  PBoolean receiver
1747  );
1748 
1756  virtual PBoolean OnReceivedPDU(
1757  const H245_DataApplicationCapability & pdu
1758  );
1759  virtual PBoolean OnReceivedPDU(
1760  const H245_DataApplicationCapability & pdu,
1761  CommandType type
1762  );
1764 
1765  protected:
1766  unsigned maxBitRate;
1767 };
1768 
1769 
1779 {
1781 
1782  public:
1788  unsigned maxBitRate,
1789  const BYTE * dataBlock = NULL,
1790  PINDEX dataSize = 0,
1791  PINDEX comparisonOffset = 0,
1792  PINDEX comparisonLength = P_MAX_INDEX
1793  );
1794 
1798  unsigned maxBitRate,
1799  const PString & oid,
1800  const BYTE * dataBlock = NULL,
1801  PINDEX dataSize = 0,
1802  PINDEX comparisonOffset = 0,
1803  PINDEX comparisonLength = P_MAX_INDEX
1804  );
1805 
1809  unsigned maxBitRate,
1810  BYTE country,
1811  BYTE extension,
1812  WORD maufacturer,
1813  const BYTE * dataBlock = NULL,
1814  PINDEX dataSize = 0,
1815  PINDEX comparisonOffset = 0,
1816  PINDEX comparisonLength = P_MAX_INDEX
1817  );
1819 
1825  Comparison Compare(const PObject & obj) const;
1827 
1836  virtual unsigned GetSubType() const;
1838 
1849  virtual PBoolean OnSendingPDU(
1850  H245_DataApplicationCapability & pdu
1851  ) const;
1852 
1861  virtual PBoolean OnSendingPDU(
1862  H245_DataMode & pdu
1863  ) const;
1864 
1873  virtual PBoolean OnReceivedPDU(
1874  const H245_DataApplicationCapability & pdu
1875  );
1876 
1879  virtual PBoolean IsMatch(
1880  const PASN_Choice & subTypePDU,
1881  const PString & mediaPacketization
1882  ) const;
1884 };
1885 
1886 
1888 // Known audio codecs
1889 
1893 {
1895 
1896  public:
1898  enum Mode {
1903  };
1905  enum Speed {
1910  };
1911 
1917  Mode mode = muLaw,
1918  Speed speed = At64k
1919  );
1921 
1926  virtual PObject * Clone() const;
1928 
1937  virtual unsigned GetSubType() const;
1938 
1941  virtual PString GetFormatName() const;
1943 
1944  protected:
1947 };
1948 
1950 
1954 {
1956 
1957  public:
1960  enum SubTypes {
1968  };
1969  static const char * GetSubTypeName(SubTypes subType);
1970  friend ostream & operator<<(ostream & strm, SubTypes subType) { return strm << GetSubTypeName(subType); }
1971 
1978  );
1980 
1985  virtual PObject * Clone() const;
1987 
1995  virtual MainTypes GetMainType() const;
1996 
2000  virtual unsigned GetSubType() const;
2001 
2004  virtual PString GetFormatName() const;
2006 
2014  virtual H323Channel * CreateChannel(
2015  H323Connection & connection,
2017  unsigned sessionID,
2018  const H245_H2250LogicalChannelParameters * param
2020  ) const;
2022 
2032  virtual PBoolean OnSendingPDU(
2033  H245_Capability & pdu
2034  ) const;
2035 
2043  virtual PBoolean OnSendingPDU(
2044  H245_DataType & pdu
2045  ) const;
2046 
2055  virtual PBoolean OnSendingPDU(
2056  H245_ModeElement & pdu
2057  ) const;
2058 
2068  virtual PBoolean OnReceivedPDU(
2069  const H245_Capability & pdu
2070  );
2071 
2079  virtual PBoolean OnReceivedPDU(
2080  const H245_DataType & pdu,
2081  PBoolean receiver
2082  );
2083 
2092  virtual PBoolean IsUsable(
2093  const H323Connection & connection
2094  ) const;
2096 
2097  static void AddAllCapabilities(
2098  H323Capabilities & capabilities,
2099  PINDEX descriptorNum,
2100  PINDEX simultaneous,
2101  bool includeRFC2833 = true
2102  );
2103 
2104  protected:
2106 };
2107 
2108 
2109 
2111 
2112 PARRAY(H323CapabilitiesList, H323Capability);
2113 
2114 PARRAY(H323CapabilitiesListArray, H323CapabilitiesList);
2115 
2116 class H323SimultaneousCapabilities : public H323CapabilitiesListArray
2117 {
2118  PCLASSINFO(H323SimultaneousCapabilities, H323CapabilitiesListArray);
2119  public:
2120  PBoolean SetSize(PINDEX newSize);
2121 };
2122 
2123 
2124 PARRAY(H323CapabilitiesSetArray, H323SimultaneousCapabilities);
2125 
2126 
2127 class H323CapabilitiesSet : public H323CapabilitiesSetArray
2128 {
2129  PCLASSINFO(H323CapabilitiesSet, H323CapabilitiesSetArray);
2130  public:
2132  PBoolean SetSize(PINDEX newSize);
2133 };
2134 
2135 
2138 class H323Capabilities : public PObject
2139 {
2140  PCLASSINFO(H323Capabilities, PObject);
2141  public:
2146  H323Capabilities();
2147 
2151  const H323Connection & connection,
2152  const H245_TerminalCapabilitySet & pdu
2153  );
2154 
2160  const H323Capabilities & original
2161  );
2162 
2168  const H323Capabilities & original
2169  );
2171 
2176  void PrintOn(
2177  ostream & strm
2178  ) const;
2180 
2185  PINDEX GetSize() const { return table.GetSize(); }
2186 
2189  H323Capability & operator[](PINDEX i) const { return table[i]; }
2190 
2211  PINDEX SetCapability(
2212  PINDEX descriptorNum,
2213  PINDEX simultaneous,
2214  H323Capability * cap
2215  );
2216 
2219  PINDEX AddMediaFormat(
2220  PINDEX descriptorNum,
2221  PINDEX simultaneous,
2222  const OpalMediaFormat & mediaFormat,
2225  );
2226 
2231  PINDEX AddAllCapabilities(
2232  PINDEX descriptorNum,
2233  PINDEX simultaneous,
2234  const PString & name,
2235  PBoolean exact = false
2236  );
2237 
2238  // this function is retained for backwards compatibility
2240  const H323EndPoint &,
2241  PINDEX descriptorNum,
2242  PINDEX simultaneous,
2243  const PString & name,
2244  PBoolean exact = false
2245  )
2246  { return AddAllCapabilities(descriptorNum, simultaneous, name, exact); }
2247 
2256  void Add(
2257  H323Capability * capability
2258  );
2259 
2266  H323Capability * Copy(
2267  const H323Capability & capability
2268  );
2269 
2274  void Remove(
2275  H323Capability * capability
2276  );
2277 
2282  void Remove(
2283  const PString & formatName
2284  );
2285 
2289  void Remove(
2290  const PStringArray & formatNames
2291  );
2292 
2295  void RemoveAll();
2296 
2305  unsigned capabilityNumber
2306  ) const;
2307 
2324  const PString & formatName,
2327  PBoolean exact = false
2328  ) const;
2329 
2337  ) const;
2338 
2347  const H323Capability & capability
2348  ) const;
2349 
2356  const H245_Capability & cap
2357  ) const;
2358 
2365  const H245_DataType & dataType,
2366  const PString & mediaPacketization = PString::Empty()
2367  ) const;
2368 
2375  const H245_ModeElement & modeElement,
2376  const PString & mediaPacketization = PString::Empty()
2377  ) const;
2378 
2385  H323Capability::MainTypes mainType,
2386  unsigned subType = UINT_MAX
2387  ) const;
2388 
2391  void BuildPDU(
2392  const H323Connection & connection,
2393  H245_TerminalCapabilitySet & pdu
2394  ) const;
2395 
2398  PBoolean Merge(
2399  const H323Capabilities & newCaps
2400  );
2401 
2408  void Reorder(
2409  const PStringArray & preferenceOrder
2410  );
2411 
2414  PBoolean IsAllowed(
2415  const H323Capability & capability
2416  );
2417 
2420  PBoolean IsAllowed(
2421  unsigned capabilityNumber
2422  );
2423 
2426  PBoolean IsAllowed(
2427  const H323Capability & capability1,
2428  const H323Capability & capability2
2429  );
2430 
2433  PBoolean IsAllowed(
2434  unsigned capabilityNumber1,
2435  unsigned capabilityNumber2
2436  );
2437 
2441 
2442  const PStringSet & GetMediaPacketizations() const { return m_mediaPacketizations; }
2444 
2445  protected:
2446  H323CapabilitiesList table;
2449 };
2450 
2451 
2453 
2454 /* New capability registration macros based on abstract factories
2455  */
2456 typedef PFactory<H323Capability, std::string> H323CapabilityFactory;
2457 
2458 #define H323_REGISTER_CAPABILITY(cls, capName) static H323CapabilityFactory::Worker<cls> cls##Factory(capName, true); \
2459 
2460 
2461 #endif // OPAL_H323
2462 
2463 #endif // OPAL_H323_H323CAPS_H
2464 
2465