OPAL  Version 3.14.3
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: 32525 $
30  * $Author: rjongbloed $
31  * $Date: 2014-08-14 18:25:56 +1000 (Thu, 14 Aug 2014) $
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_config.h>
42 
43 #if OPAL_H323
44 
45 #include <opal/mediafmt.h>
46 #include <h323/channels.h>
47 #include <opal/mediasession.h>
48 
49 
50 /* The following classes have forward references to avoid including the VERY
51  large header files for H225 and H245. If an application requires access
52  to the protocol classes they can include them, but for simple usage their
53  inclusion can be avoided.
54  */
55 class PASN_Object;
56 class PASN_Choice;
57 class H245_Capability;
58 class H245_DataType;
59 class H245_ModeElement;
60 class H245_AudioCapability;
61 class H245_AudioMode;
62 class H245_VideoCapability;
63 class H245_VideoMode;
64 class H245_DataApplicationCapability;
65 class H245_DataMode;
66 class H245_DataProtocolCapability;
67 class H245_H2250LogicalChannelParameters;
68 class H245_TerminalCapabilitySet;
69 class H245_NonStandardParameter;
70 class H323Connection;
71 class H323Capabilities;
72 class H245_CapabilityIdentifier;
73 class H245_GenericCapability;
74 class H245_GenericParameter;
75 class H245_EncryptionSync;
76 class H245_EncryptionAuthenticationAndIntegrity;
77 class H235SecurityCapability;
78 
79 #if OPAL_H239
81 #endif
82 
83 
85 
99 class H323Capability : public PObject
100 {
101  PCLASSINFO(H323Capability, PObject);
102 
103  public:
108  H323Capability();
109  H323Capability(const H323Capability & other);
110  H323Capability & operator=(const H323Capability & other);
111 
114  ~H323Capability();
116 
122  Comparison Compare(const PObject & obj) const;
123 
126  void PrintOn(ostream & strm) const;
128 
131  enum MainTypes {
140  };
141 
147  virtual MainTypes GetMainType() const = 0;
148 
152  virtual unsigned GetSubType() const = 0;
153 
156  virtual PString GetFormatName() const = 0;
158 
164  static H323Capability * Create(
165  const PString & name
166  );
167 
168  enum {
174  };
175 
184  virtual unsigned GetDefaultSessionID() const;
185 
194  virtual void SetTxFramesInPacket(
195  unsigned frames
196  );
197 
202  virtual unsigned GetTxFramesInPacket() const;
203 
208  virtual unsigned GetRxFramesInPacket() const;
209 
215  virtual H323Channel * CreateChannel(
216  H323Connection & connection,
218  unsigned sessionID,
219  const H245_H2250LogicalChannelParameters * param
221  ) const;
223 
226  enum CommandType {
230  };
231 
239  virtual PBoolean OnSendingPDU(
240  H245_Capability & pdu
241  ) const = 0;
242 
250  virtual PBoolean OnSendingPDU(
251  H245_DataType & pdu
252  ) const;
253 
261  virtual PBoolean OnSendingPDU(
262  H245_ModeElement & pdu
263  ) const;
264 
277  virtual PBoolean OnReceivedPDU(
278  const H245_Capability & pdu
279  );
280 
288  virtual PBoolean OnReceivedPDU(
289  const H245_DataType & pdu,
290  PBoolean receiver
291  );
292 
295  virtual PBoolean IsMatch(
296  const PASN_Object & subTypePDU,
297  const PString & mediaPacketization
298  ) const;
299 
307  virtual PBoolean IsUsable(
308  const H323Connection & connection
309  ) const;
311 
321  };
322 
326 
331  ) { capabilityDirection = dir; }
332 
334  unsigned GetCapabilityNumber() const { return assignedCapabilityNumber; }
335 
337  void SetCapabilityNumber(unsigned num) { assignedCapabilityNumber = num; }
338 
342 
345  bool UpdateMediaFormat(
346  const OpalMediaFormat & format
347  );
348 
351 
354 
355 #if OPAL_H235_6 || OPAL_H235_8
356 
357  const OpalMediaCryptoSuite * GetCryptoSuite() const;
358 
360  void SetCryptoSuite(const OpalMediaCryptoSuite & cryptoSuite);
361 
363  virtual bool OnSendingPDU(
364  H245_EncryptionSync & encryptionSync,
365  const H323Connection & connection,
366  unsigned sessionID,
367  bool rx
368  );
369 
371  virtual bool OnReceivedPDU(
372  const H245_EncryptionSync & encryptionSync,
373  const H323Connection & connection,
374  unsigned sessionID,
375  bool rx
376  );
377 
379  virtual bool PostTCS(
380  const H323Connection & connection,
381  const H323Capabilities & capabilities
382  );
383 #endif
384 
385 
386 #if PTRACING
387  friend ostream & operator<<(ostream & o , MainTypes t);
388  friend ostream & operator<<(ostream & o , CapabilityDirection d);
389 #endif
390 
391  protected:
393 
396 
398 
399 #if OPAL_H235_6 || OPAL_H235_8
400  H235SecurityCapability * m_cryptoCapability;
401 #endif
402 
403  private:
404  P_REMOVE_VIRTUAL(PBoolean, IsMatch(const PASN_Choice &) const, false);
405 
406  friend class H323Capabilities;
407 };
408 
409 
410 
420 {
421  public:
422  typedef PObject::Comparison (*CompareFuncType)(struct PluginCodec_H323NonStandardCodecData *);
423 
428  const BYTE * dataBlock,
429  PINDEX dataSize
430  );
431 
435  const BYTE * dataBlock,
436  PINDEX dataSize,
437  PINDEX comparisonOffset = 0,
438  PINDEX comparisonLength = P_MAX_INDEX
439  );
440 
444  const PString & oid,
445  const BYTE * dataBlock,
446  PINDEX dataSize,
447  PINDEX comparisonOffset = 0,
448  PINDEX comparisonLength = P_MAX_INDEX
449  );
450 
454  BYTE country,
455  BYTE extension,
456  WORD maufacturer,
457  const BYTE * dataBlock,
458  PINDEX dataSize,
459  PINDEX comparisonOffset = 0,
460  PINDEX comparisonLength = P_MAX_INDEX
461  );
462 
466 
471  virtual PBoolean OnSendingPDU(
472  PBYTEArray & data
473  ) const;
474 
479  virtual PBoolean OnReceivedPDU(
480  const PBYTEArray & data
481  );
482 
483  PBoolean IsMatch(const H245_NonStandardParameter & param) const;
484 
485  PObject::Comparison CompareParam(
486  const H245_NonStandardParameter & param
487  ) const;
488 
489  protected:
490  PBoolean OnSendingNonStandardPDU(
491  PASN_Choice & pdu,
492  unsigned nonStandardTag
493  ) const;
494  PBoolean OnReceivedNonStandardPDU(
495  const PASN_Choice & pdu,
496  unsigned nonStandardTag
497  );
498 
499  PObject::Comparison CompareInfo(
501  ) const;
502  PObject::Comparison CompareData(
503  const PBYTEArray & data
504  ) const;
505 
506  PString oid;
510  PBYTEArray nonStandardData;
514 };
515 
526 {
527  public:
529  const PString & id,
530  unsigned maxBitRate,
531  bool fixedBitRate
532  );
533 
535 
536  protected:
537  virtual PBoolean OnSendingGenericPDU(
538  H245_GenericCapability & pdu,
539  const OpalMediaFormat & mediaFormat,
541  ) const;
542  virtual PBoolean OnReceivedGenericPDU(
543  OpalMediaFormat & mediaFormat,
544  const H245_GenericCapability & pdu,
546  );
547 
548  PBoolean IsMatch(
549  const OpalMediaFormat & mediaFormat,
550  const H245_GenericCapability & param
551  ) const;
552  PObject::Comparison CompareInfo(
553  const H323GenericCapabilityInfo & obj
554  ) const;
555 
556 
557  PString m_identifier;
559  enum {
563  } m_bitRateMode;
564 };
565 
573 {
575 
576  public:
581  virtual ~H323RealTimeCapability();
583 
588  virtual H323Channel * CreateChannel(
589  H323Connection & connection,
591  unsigned sessionID,
592  const H245_H2250LogicalChannelParameters * param
594  ) const;
596 };
597 
598 
606 {
608 
609  public:
616 
622  virtual MainTypes GetMainType() const;
624 
635  virtual unsigned GetDefaultSessionID() const;
636 
645  virtual void SetTxFramesInPacket(
646  unsigned frames
647  );
648 
654  virtual unsigned GetTxFramesInPacket() const;
655 
661  virtual unsigned GetRxFramesInPacket() const;
663 
674  virtual PBoolean OnSendingPDU(
675  H245_Capability & pdu
676  ) const;
677 
686  virtual PBoolean OnSendingPDU(
687  H245_DataType & pdu
688  ) const;
689 
698  virtual PBoolean OnSendingPDU(
699  H245_ModeElement & pdu
700  ) const;
701 
710  virtual PBoolean OnSendingPDU(
711  H245_AudioCapability & pdu,
712  unsigned packetSize
713  ) const;
714  virtual PBoolean OnSendingPDU(
715  H245_AudioCapability & pdu,
716  unsigned packetSize,
717  CommandType type
718  ) const;
719 
728  virtual PBoolean OnSendingPDU(
729  H245_AudioMode & pdu
730  ) const;
731 
743  virtual PBoolean OnReceivedPDU(
744  const H245_Capability & pdu
745  );
746 
756  virtual PBoolean OnReceivedPDU(
757  const H245_DataType & pdu,
758  PBoolean receiver
759  );
760 
769  virtual PBoolean OnReceivedPDU(
770  const H245_AudioCapability & pdu,
771  unsigned & packetSize
772  );
773  virtual PBoolean OnReceivedPDU(
774  const H245_AudioCapability & pdu,
775  unsigned & packetSize,
776  CommandType type
777  );
779 };
780 
781 
791 {
793 
794  public:
799  const BYTE * dataBlock,
800  PINDEX dataSize
801  );
805  const BYTE * dataBlock = NULL,
806  PINDEX dataSize = 0,
807  PINDEX comparisonOffset = 0,
808  PINDEX comparisonLength = P_MAX_INDEX
809  );
810 
814  const PString & oid,
815  const BYTE * dataBlock = NULL,
816  PINDEX dataSize = 0,
817  PINDEX comparisonOffset = 0,
818  PINDEX comparisonLength = P_MAX_INDEX
819  );
820 
824  BYTE country,
825  BYTE extension,
826  WORD maufacturer,
827  const BYTE * dataBlock = NULL,
828  PINDEX dataSize = 0,
829  PINDEX comparisonOffset = 0,
830  PINDEX comparisonLength = P_MAX_INDEX
831  );
833 
839  Comparison Compare(const PObject & obj) const;
841 
849  virtual unsigned GetSubType() const;
851 
862  virtual PBoolean OnSendingPDU(
863  H245_AudioCapability & pdu,
864  unsigned packetSize
865  ) const;
866 
875  virtual PBoolean OnSendingPDU(
876  H245_AudioMode & pdu
877  ) const;
878 
887  virtual PBoolean OnReceivedPDU(
888  const H245_AudioCapability & pdu,
889  unsigned & packetSize
890  );
891 
894  virtual PBoolean IsMatch(
895  const PASN_Object & subTypePDU,
896  const PString & mediaPacketization
897  ) const;
899 };
900 
910 {
912 
913  public:
919  const PString & capabilityId,
920  unsigned fixedBitRate
921  );
923 
929  Comparison Compare(const PObject & obj) const;
931 
939  virtual unsigned GetSubType() const;
941 
952  virtual PBoolean OnSendingPDU(
953  H245_AudioCapability & pdu,
954  unsigned packetSize,
955  CommandType type
956  ) const;
957 
966  virtual PBoolean OnSendingPDU(
967  H245_AudioMode & pdu
968  ) const;
969 
978  virtual PBoolean OnReceivedPDU(
979  const H245_AudioCapability & pdu,
980  unsigned & packetSize,
981  CommandType type
982  );
983 
986  virtual PBoolean IsMatch(
987  const PASN_Object & subTypePDU,
988  const PString & mediaPacketization
989  ) const;
991 };
992 
993 
994 template <const char * oid, const OpalAudioFormat & fmtFunc(), unsigned fixedBitRate = 0>
996 {
997  public:
999  : H323GenericAudioCapability(oid, fixedBitRate)
1000  {
1001  }
1002 
1003  virtual PObject * Clone() const
1004  {
1005  return new H323GenericAudioCapabilityTemplate(*this);
1006  }
1007 
1008  virtual PString GetFormatName() const
1009  {
1010  return fmtFunc();
1011  }
1012 };
1013 
1014 
1015 #if OPAL_VIDEO
1016 
1024 {
1026 
1027  public:
1033  virtual MainTypes GetMainType() const;
1035 
1046  virtual unsigned GetDefaultSessionID() const;
1048 
1059  virtual PBoolean OnSendingPDU(
1060  H245_Capability & pdu
1061  ) const;
1062 
1071  virtual PBoolean OnSendingPDU(
1072  H245_DataType & pdu
1073  ) const;
1074 
1083  virtual PBoolean OnSendingPDU(
1084  H245_ModeElement & pdu
1085  ) const;
1086 
1094  virtual PBoolean OnSendingPDU(
1095  H245_VideoCapability & pdu
1096  ) const;
1097  virtual PBoolean OnSendingPDU(
1098  H245_VideoCapability & pdu,
1099  CommandType type
1100  ) const;
1101 
1110  virtual PBoolean OnSendingPDU(
1111  H245_VideoMode & pdu
1112  ) const;
1113 
1123  virtual PBoolean OnReceivedPDU(
1124  const H245_Capability & pdu
1125  );
1126 
1134  virtual PBoolean OnReceivedPDU(
1135  const H245_DataType & pdu,
1136  PBoolean receiver
1137  );
1138 
1146  virtual PBoolean OnReceivedPDU(
1147  const H245_VideoCapability & pdu
1148  );
1149  virtual PBoolean OnReceivedPDU(
1150  const H245_VideoCapability & pdu,
1151  CommandType type
1152  );
1154 };
1155 
1156 
1166 {
1168 
1169  public:
1174  const BYTE * dataBlock,
1175  PINDEX dataSize
1176  );
1180  const BYTE * dataBlock = NULL,
1181  PINDEX dataSize = 0,
1182  PINDEX comparisonOffset = 0,
1183  PINDEX comparisonLength = P_MAX_INDEX
1184  );
1185 
1189  const PString & oid,
1190  const BYTE * dataBlock = NULL,
1191  PINDEX dataSize = 0,
1192  PINDEX comparisonOffset = 0,
1193  PINDEX comparisonLength = P_MAX_INDEX
1194  );
1195 
1199  BYTE country,
1200  BYTE extension,
1201  WORD maufacturer,
1202  const BYTE * dataBlock = NULL,
1203  PINDEX dataSize = 0,
1204  PINDEX comparisonOffset = 0,
1205  PINDEX comparisonLength = P_MAX_INDEX
1206  );
1208 
1214  Comparison Compare(const PObject & obj) const;
1216 
1225  virtual unsigned GetSubType() const;
1227 
1238  virtual PBoolean OnSendingPDU(
1239  H245_VideoCapability & pdu
1240  ) const;
1241 
1250  virtual PBoolean OnSendingPDU(
1251  H245_VideoMode & pdu
1252  ) const;
1253 
1262  virtual PBoolean OnReceivedPDU(
1263  const H245_VideoCapability & pdu
1264  );
1265 
1268  virtual PBoolean IsMatch(
1269  const PASN_Object & subTypePDU,
1270  const PString & mediaPacketization
1271  ) const;
1273 };
1274 
1284 {
1286 
1287  public:
1293  const PString & capabilityId,
1294  unsigned fixedBitRate = 0
1295  );
1297 
1303  Comparison Compare(const PObject & obj) const;
1305 
1313  virtual unsigned GetSubType() const;
1315 
1326  virtual PBoolean OnSendingPDU(
1327  H245_VideoCapability & pdu,
1328  CommandType type
1329  ) const;
1330 
1339  virtual PBoolean OnSendingPDU(
1340  H245_VideoMode & pdu
1341  ) const;
1342 
1351  virtual PBoolean OnReceivedPDU(
1352  const H245_VideoCapability & pdu,
1353  CommandType type
1354  );
1355 
1358  virtual PBoolean IsMatch(
1359  const PASN_Object & subTypePDU,
1360  const PString & mediaPacketization
1361  ) const;
1363 };
1364 
1365 
1366 template <const char * oid, const OpalVideoFormat & fmtFunc()>
1368 {
1369  public:
1372  {
1373  }
1374 
1375  virtual PObject * Clone() const
1376  {
1377  return new H323GenericVideoCapabilityTemplate(*this);
1378  }
1379 
1380  virtual PString GetFormatName() const
1381  {
1382  return fmtFunc();
1383  }
1384 };
1385 
1386 
1387 #if OPAL_H239
1388 
1392 {
1394 
1395  public:
1401  const PString & identifier
1402  );
1404 
1412  virtual unsigned GetSubType() const;
1414 
1425  virtual PBoolean OnSendingPDU(
1426  H245_VideoCapability & pdu,
1427  CommandType type
1428  ) const;
1429 
1438  virtual PBoolean OnSendingPDU(
1439  H245_VideoMode & pdu
1440  ) const;
1441 
1450  virtual PBoolean OnReceivedPDU(
1451  const H245_VideoCapability & pdu,
1452  CommandType type
1453  );
1454 
1457  virtual PBoolean IsMatch(
1458  const PASN_Object & subTypePDU,
1459  const PString & mediaPacketization
1460  ) const;
1462 
1463  protected:
1465 };
1466 
1467 
1469 
1474 {
1476 
1477  public:
1483  const PString & identifier
1484  );
1486 
1492  virtual MainTypes GetMainType() const;
1493 
1499  virtual unsigned GetSubType() const;
1501 
1512  virtual PBoolean OnSendingPDU(
1513  H245_Capability & pdu
1514  ) const;
1515 
1525  virtual PBoolean OnReceivedPDU(
1526  const H245_Capability & pdu
1527  );
1528 
1531  virtual PBoolean IsMatch(
1532  const PASN_Object & subTypePDU,
1533  const PString & mediaPacketization
1534  ) const;
1536 };
1537 
1538 
1540 
1542 {
1544 
1545  public:
1551  const OpalMediaFormat & videoFormat
1552  );
1554 
1560  Comparison Compare(const PObject & obj) const;
1561 
1564  virtual PObject * Clone() const;
1566 
1571  virtual PString GetFormatName() const;
1573 
1584  virtual PBoolean OnSendingPDU(
1585  H245_VideoCapability & pdu,
1586  CommandType type
1587  ) const;
1588 
1597  virtual PBoolean OnReceivedPDU(
1598  const H245_VideoCapability & pdu,
1599  CommandType type
1600  );
1602 };
1603 
1604 
1606 
1608 {
1610 
1611  public:
1618 
1623  virtual PObject * Clone() const;
1625 
1630  virtual PString GetFormatName() const;
1632 };
1633 
1634 
1635 #endif // OPAL_H239
1636 
1637 #endif // OPAL_VIDEO
1638 
1639 
1641 
1642 #if OPAL_H235_6 || OPAL_H235_8
1643 
1644 class H235SecurityCapability : public H323Capability
1645 {
1646  PCLASSINFO(H235SecurityCapability, H323Capability);
1647 
1648  public:
1653  H235SecurityCapability(
1654  const H323Capability & mediaCapability
1655  );
1657 
1665  virtual MainTypes GetMainType() const;
1666 
1670  virtual unsigned GetSubType() const;
1671 
1674  virtual PString GetFormatName() const;
1675 
1683  virtual PBoolean OnSendingPDU(
1684  H245_Capability & pdu
1685  ) const;
1686 
1699  virtual PBoolean OnReceivedPDU(
1700  const H245_Capability & pdu
1701  );
1702 
1704  virtual bool OnSendingPDU(
1705  H245_EncryptionSync & encryptionSync,
1706  const H323Connection & connection,
1707  unsigned sessionID,
1708  bool rx
1709  );
1710 
1712  virtual bool OnReceivedPDU(
1713  const H245_EncryptionSync & encryptionSync,
1714  const H323Connection & connection,
1715  unsigned sessionID,
1716  bool rx
1717  );
1718 
1720  virtual bool PostTCS(
1721  const H323Connection & connection,
1722  const H323Capabilities & capabilities
1723  );
1725 
1726  virtual bool OnSendingPDU(H245_EncryptionAuthenticationAndIntegrity & pdu) const = 0;
1727  virtual bool OnReceivedPDU(const H245_EncryptionAuthenticationAndIntegrity & pdu) = 0;
1728 
1729  virtual bool OnSendingPDU(H245_EncryptionSync & encryptionSync, const H323Connection & connection, const OpalMediaCryptoKeyList & keys) = 0;
1730  virtual bool OnReceivedPDU(const H245_EncryptionSync & encryptionSync, const H323Connection & connection, OpalMediaCryptoKeyList & keys) = 0;
1731 
1732  unsigned GetMediaCapabilityNumber() const { return m_mediaCapabilityNumber; }
1733  const OpalMediaCryptoSuite::List & GetCryptoSuites() const { return m_cryptoSuites; }
1734  void SetCryptoSuites(const OpalMediaCryptoSuite::List & cryptoSuites) { m_cryptoSuites = cryptoSuites; }
1735 
1736  static void AddAllCapabilities(
1737  H323Capabilities & capabilities,
1738  const PStringArray & cryptoSuites,
1739  const char * prefix
1740  );
1741 
1742  protected:
1743  unsigned m_mediaCapabilityNumber;
1744  PString m_mediaCapabilityName;
1745  OpalMediaCryptoSuite::List m_cryptoSuites;
1746 };
1747 
1748 #endif // OPAL_H235_6 || OPAL_H235_8
1749 
1750 
1752 
1753 #if OPAL_H235_6
1754 
1755 class H235SecurityAlgorithmCapability : public H235SecurityCapability
1756 {
1757  PCLASSINFO(H235SecurityAlgorithmCapability, H235SecurityCapability);
1758 
1759  public:
1764  H235SecurityAlgorithmCapability(
1765  const H323Capability & mediaCapability
1766  );
1768 
1773  virtual PObject * Clone() const;
1775 
1780  virtual PBoolean IsMatch(
1781  const PASN_Object & subTypePDU,
1782  const PString & mediaPacketization
1783  ) const;
1785 
1786  virtual bool OnSendingPDU(H245_EncryptionAuthenticationAndIntegrity & pdu) const;
1787  virtual bool OnReceivedPDU(const H245_EncryptionAuthenticationAndIntegrity & pdu);
1788 
1789  virtual bool OnSendingPDU(H245_EncryptionSync & encryptionSync, const H323Connection & connection, const OpalMediaCryptoKeyList & keys);
1790  virtual bool OnReceivedPDU(const H245_EncryptionSync & encryptionSync, const H323Connection & connection, OpalMediaCryptoKeyList & keys);
1791 };
1792 
1793 #endif // OPAL_H235_6
1794 
1795 
1797 
1798 #if OPAL_H235_8
1799 
1800 class H235SecurityGenericCapability : public H235SecurityCapability,
1802 {
1803  PCLASSINFO(H235SecurityGenericCapability, H235SecurityCapability);
1804 
1805  public:
1810  H235SecurityGenericCapability(
1811  const H323Capability & mediaCapability
1812  );
1814 
1819  virtual PObject * Clone() const;
1821 
1826  virtual PBoolean IsMatch(
1827  const PASN_Object & subTypePDU,
1828  const PString & mediaPacketization
1829  ) const;
1831 
1832  virtual bool OnSendingPDU(H245_EncryptionAuthenticationAndIntegrity & pdu) const;
1833  virtual bool OnReceivedPDU(const H245_EncryptionAuthenticationAndIntegrity & pdu);
1834 
1835  virtual bool OnSendingPDU(H245_EncryptionSync & encryptionSync, const H323Connection & connection, const OpalMediaCryptoKeyList & keys);
1836  virtual bool OnReceivedPDU(const H245_EncryptionSync & encryptionSync, const H323Connection & connection, OpalMediaCryptoKeyList & keys);
1837 };
1838 
1839 #endif // OPAL_H235_8
1840 
1841 
1843 
1851 {
1852  PCLASSINFO(H323DataCapability, H323Capability);
1853 
1854  public:
1860  unsigned maxBitRate
1861  );
1863 
1869  virtual MainTypes GetMainType() const;
1871 
1881  virtual unsigned GetDefaultSessionID() const;
1883 
1894  virtual PBoolean OnSendingPDU(
1895  H245_Capability & pdu
1896  ) const;
1897 
1906  virtual PBoolean OnSendingPDU(
1907  H245_DataType & pdu
1908  ) const;
1909 
1918  virtual PBoolean OnSendingPDU(
1919  H245_ModeElement & pdu
1920  ) const;
1921 
1929  virtual PBoolean OnSendingPDU(
1930  H245_DataApplicationCapability & pdu
1931  ) const;
1932  virtual PBoolean OnSendingPDU(
1933  H245_DataApplicationCapability & pdu,
1934  CommandType type
1935  ) const;
1936 
1945  virtual PBoolean OnSendingPDU(
1946  H245_DataMode & pdu
1947  ) const = 0;
1948 
1958  virtual PBoolean OnReceivedPDU(
1959  const H245_Capability & pdu
1960  );
1961 
1969  virtual PBoolean OnReceivedPDU(
1970  const H245_DataType & pdu,
1971  PBoolean receiver
1972  );
1973 
1981  virtual PBoolean OnReceivedPDU(
1982  const H245_DataApplicationCapability & pdu
1983  );
1984  virtual PBoolean OnReceivedPDU(
1985  const H245_DataApplicationCapability & pdu,
1986  CommandType type
1987  );
1989 
1990  protected:
1992 };
1993 
1994 
2004 {
2006 
2007  public:
2013  unsigned maxBitRate,
2014  const BYTE * dataBlock = NULL,
2015  PINDEX dataSize = 0,
2016  PINDEX comparisonOffset = 0,
2017  PINDEX comparisonLength = P_MAX_INDEX
2018  );
2019 
2023  unsigned maxBitRate,
2024  const PString & oid,
2025  const BYTE * dataBlock = NULL,
2026  PINDEX dataSize = 0,
2027  PINDEX comparisonOffset = 0,
2028  PINDEX comparisonLength = P_MAX_INDEX
2029  );
2030 
2034  unsigned maxBitRate,
2035  BYTE country,
2036  BYTE extension,
2037  WORD maufacturer,
2038  const BYTE * dataBlock = NULL,
2039  PINDEX dataSize = 0,
2040  PINDEX comparisonOffset = 0,
2041  PINDEX comparisonLength = P_MAX_INDEX
2042  );
2044 
2050  Comparison Compare(const PObject & obj) const;
2052 
2061  virtual unsigned GetSubType() const;
2063 
2074  virtual PBoolean OnSendingPDU(
2075  H245_DataApplicationCapability & pdu
2076  ) const;
2077 
2086  virtual PBoolean OnSendingPDU(
2087  H245_DataMode & pdu
2088  ) const;
2089 
2098  virtual PBoolean OnReceivedPDU(
2099  const H245_DataApplicationCapability & pdu
2100  );
2101 
2104  virtual PBoolean IsMatch(
2105  const PASN_Object & subTypePDU,
2106  const PString & mediaPacketization
2107  ) const;
2109 };
2110 
2111 
2121 {
2123 
2124  public:
2130  const PString & capabilityId,
2131  unsigned fixedBitRate
2132  );
2134 
2140  Comparison Compare(const PObject & obj) const;
2142 
2150  virtual unsigned GetSubType() const;
2152 
2163  virtual PBoolean OnSendingPDU(
2164  H245_DataApplicationCapability & pdu,
2165  CommandType type
2166  ) const;
2167 
2176  virtual PBoolean OnSendingPDU(
2177  H245_DataMode & pdu
2178  ) const;
2179 
2188  virtual PBoolean OnReceivedPDU(
2189  const H245_DataApplicationCapability & pdu,
2190  CommandType type
2191  );
2192 
2195  virtual PBoolean IsMatch(
2196  const PASN_Object & subTypePDU,
2197  const PString & mediaPacketization
2198  ) const;
2200 };
2201 
2202 
2204 // Known audio codecs
2205 
2209 {
2211 
2212  public:
2214  enum Mode {
2219  };
2221  enum Speed {
2226  };
2227 
2233  Mode mode = muLaw,
2234  Speed speed = At64k
2235  );
2237 
2242  virtual PObject * Clone() const;
2244 
2253  virtual unsigned GetSubType() const;
2254 
2257  virtual PString GetFormatName() const;
2259 
2260  protected:
2263 };
2264 
2266 
2270 {
2272 
2273  public:
2276  enum SubTypes {
2284  };
2285  static const char * GetSubTypeName(SubTypes subType);
2286  friend ostream & operator<<(ostream & strm, SubTypes subType) { return strm << GetSubTypeName(subType); }
2287 
2294  );
2296 
2301  virtual PObject * Clone() const;
2303 
2311  virtual MainTypes GetMainType() const;
2312 
2316  virtual unsigned GetSubType() const;
2317 
2320  virtual PString GetFormatName() const;
2322 
2332  virtual PBoolean OnSendingPDU(
2333  H245_Capability & pdu
2334  ) const;
2335 
2343  virtual PBoolean OnSendingPDU(
2344  H245_DataType & pdu
2345  ) const;
2346 
2356  virtual PBoolean OnReceivedPDU(
2357  const H245_Capability & pdu
2358  );
2359 
2367  virtual PBoolean OnReceivedPDU(
2368  const H245_DataType & pdu,
2369  PBoolean receiver
2370  );
2371 
2380  virtual PBoolean IsUsable(
2381  const H323Connection & connection
2382  ) const;
2384 
2385  static void AddAllCapabilities(
2386  H323Capabilities & capabilities,
2387  PINDEX descriptorNum,
2388  PINDEX simultaneous,
2389  H323Capability * rfc2833 = NULL
2390  );
2391 
2392  protected:
2394 };
2395 
2396 
2398 
2399 #if OPAL_RTP_FEC
2400 
2401 class H323FECCapability : public H323Capability
2402 {
2403  PCLASSINFO(H323FECCapability, H323Capability);
2404 
2405 public:
2410  H323FECCapability(
2411  const OpalMediaFormat & mediaFormat,
2412  unsigned protectedCapability
2413  );
2415 
2423  virtual MainTypes GetMainType() const;
2424 
2428  virtual unsigned GetSubType() const;
2429 
2432  virtual PString GetFormatName() const;
2433 
2441  virtual PBoolean OnSendingPDU(
2442  H245_Capability & pdu
2443  ) const;
2444 
2457  virtual PBoolean OnReceivedPDU(
2458  const H245_Capability & pdu
2459  );
2461 
2462  unsigned GetProtectedCapability() const
2463  {
2464  return m_protectedCapability;
2465  }
2466 
2467  static void AddAllCapabilities(
2468  H323Capabilities & capabilities,
2469  const OpalMediaFormatList & localFormats
2470  );
2471 
2472 protected:
2473  PString m_scheme;
2474  unsigned m_protectedCapability;
2475 };
2476 
2477 #endif // OPAL_RTP_FEC
2478 
2479 
2481 
2482 PARRAY(H323CapabilitiesList, H323Capability);
2483 
2484 PARRAY(H323CapabilitiesListArray, H323CapabilitiesList);
2485 
2486 class H323SimultaneousCapabilities : public H323CapabilitiesListArray
2487 {
2488  PCLASSINFO(H323SimultaneousCapabilities, H323CapabilitiesListArray);
2489  public:
2491 
2492  PBoolean SetSize(PINDEX newSize);
2493 
2495 };
2496 
2497 
2498 PARRAY(H323CapabilitiesSetArray, H323SimultaneousCapabilities);
2499 
2500 
2501 class H323CapabilitiesSet : public H323CapabilitiesSetArray
2502 {
2503  PCLASSINFO(H323CapabilitiesSet, H323CapabilitiesSetArray);
2504  public:
2506  PBoolean SetSize(PINDEX newSize);
2507 };
2508 
2509 
2512 class H323Capabilities : public PObject
2513 {
2514  PCLASSINFO(H323Capabilities, PObject);
2515  public:
2520  H323Capabilities();
2521 
2525  H323Connection & connection,
2526  const H245_TerminalCapabilitySet & pdu
2527  );
2528 
2534  const H323Capabilities & original
2535  );
2536 
2542  const H323Capabilities & original
2543  );
2545 
2550  void PrintOn(
2551  ostream & strm
2552  ) const;
2554 
2559  PINDEX GetSize() const { return m_table.GetSize(); }
2560 
2563  H323Capability & operator[](PINDEX i) const { return m_table[i]; }
2564 
2585  PINDEX SetCapability(
2586  PINDEX descriptorNum,
2587  PINDEX simultaneous,
2588  H323Capability * cap,
2589  H323Capability * before = NULL
2590  );
2591 
2594  PINDEX AddMediaFormat(
2595  PINDEX descriptorNum,
2596  PINDEX simultaneous,
2597  const OpalMediaFormat & mediaFormat,
2600  );
2601 
2606  PINDEX AddAllCapabilities(
2607  PINDEX descriptorNum,
2608  PINDEX simultaneous,
2609  const PString & name,
2610  PBoolean exact = false
2611  );
2612 
2613  // this function is retained for backwards compatibility
2615  const H323EndPoint &,
2616  PINDEX descriptorNum,
2617  PINDEX simultaneous,
2618  const PString & name,
2619  PBoolean exact = false
2620  )
2621  { return AddAllCapabilities(descriptorNum, simultaneous, name, exact); }
2622 
2631  void Add(
2632  H323Capability * capability
2633  );
2634 
2641  H323Capability * Copy(
2642  const H323Capability & capability
2643  );
2644 
2649  void Remove(
2650  H323Capability * capability
2651  );
2652 
2657  void Remove(
2658  const PString & formatName
2659  );
2660 
2664  void Remove(
2665  const PStringArray & formatNames
2666  );
2667 
2670  void RemoveAll();
2671 
2680  unsigned capabilityNumber
2681  ) const;
2682 
2699  const PString & formatName,
2702  PBoolean exact = false
2703  ) const;
2704 
2712  ) const;
2713 
2722  const H323Capability & capability
2723  ) const;
2724 
2731  const H245_Capability & cap
2732  ) const;
2733 
2740  const H245_DataType & dataType,
2741  const PString & mediaPacketization = PString::Empty()
2742  ) const;
2743 
2750  const H245_ModeElement & modeElement,
2751  const PString & mediaPacketization = PString::Empty()
2752  ) const;
2753 
2760  H323Capability::MainTypes mainType,
2761  unsigned subType = UINT_MAX
2762  ) const;
2763 
2766  void BuildPDU(
2767  const H323Connection & connection,
2768  H245_TerminalCapabilitySet & pdu
2769  ) const;
2770 
2773  PBoolean Merge(
2774  const H323Capabilities & newCaps
2775  );
2776 
2783  void Reorder(
2784  const PStringArray & preferenceOrder
2785  );
2786 
2789  PBoolean IsAllowed(
2790  const H323Capability & capability
2791  );
2792 
2795  PBoolean IsAllowed(
2796  unsigned capabilityNumber
2797  );
2798 
2801  PBoolean IsAllowed(
2802  const H323Capability & capability1,
2803  const H323Capability & capability2
2804  );
2805 
2808  PBoolean IsAllowed(
2809  unsigned capabilityNumber1,
2810  unsigned capabilityNumber2
2811  );
2812 
2816 
2817  const PStringSet & GetMediaPacketizations() const { return m_mediaPacketizations; }
2818 
2819  const H323CapabilitiesSet & GetSet() const { return m_set; }
2821 
2822  protected:
2823  H323CapabilitiesList m_table;
2826 };
2827 
2828 
2830 
2831 /* New capability registration macros based on abstract factories
2832  */
2833 typedef PFactory<H323Capability, std::string> H323CapabilityFactory;
2834 
2835 #define H323_REGISTER_CAPABILITY(cls, capName) PFACTORY_CREATE(H323CapabilityFactory, cls, capName, true)
2836 
2837 
2838 #endif // OPAL_H323
2839 
2840 #endif // OPAL_H323_H323CAPS_H
2841 
2842