OPAL  Version 3.10.10
connection.h
Go to the documentation of this file.
1 /*
2  * connection.h
3  *
4  * Telephony connection abstraction
5  *
6  * Open Phone Abstraction Library (OPAL)
7  * Formally known as the Open H323 project.
8  *
9  * Copyright (c) 2001 Equivalence Pty. Ltd.
10  *
11  * The contents of this file are subject to the Mozilla Public License
12  * Version 1.0 (the "License"); you may not use this file except in
13  * compliance with the License. You may obtain a copy of the License at
14  * http://www.mozilla.org/MPL/
15  *
16  * Software distributed under the License is distributed on an "AS IS"
17  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
18  * the License for the specific language governing rights and limitations
19  * under the License.
20  *
21  * The Original Code is Open Phone Abstraction Library.
22  *
23  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
24  *
25  * Contributor(s): Post Increment
26  * Portions of this code were written with the assistance of funding from
27  * US Joint Forces Command Joint Concept Development & Experimentation (J9)
28  * http://www.jfcom.mil/about/abt_j9.htm
29  *
30  * $Revision: 28445 $
31  * $Author: rjongbloed $
32  * $Date: 2012-10-02 20:11:02 -0500 (Tue, 02 Oct 2012) $
33  */
34 
35 #ifndef OPAL_OPAL_CONNECTION_H
36 #define OPAL_OPAL_CONNECTION_H
37 
38 #ifdef P_USE_PRAGMA
39 #pragma interface
40 #endif
41 
42 #include <opal/buildopts.h>
43 
44 #include <opal/mediafmt.h>
45 #include <opal/mediastrm.h>
46 #include <opal/guid.h>
47 #include <opal/transports.h>
48 #include <ptclib/dtmf.h>
49 #include <ptlib/safecoll.h>
50 #include <rtp/rtp.h>
51 
52 #if OPAL_HAS_IM
53 #include <im/t140.h>
54 #include <im/rfc4103.h>
55 #include <im/im.h>
56 #endif
57 
58 #if P_LUA
59 #include <ptclib/lua.h>
60 #endif
61 
62 class OpalEndPoint;
63 class OpalCall;
65 class OpalEchoCanceler;
66 class OpalRFC2833Proto;
67 class OpalRFC2833Info;
68 class PURL;
69 
70 
71 #define OPAL_URL_PARAM_PREFIX "OPAL-"
72 
73 #define OPAL_OPT_AUTO_START "AutoStart"
74 #define OPAL_OPT_CALL_IDENTIFIER "Call-Identifier"
75 #define OPAL_OPT_CALLING_PARTY_URL "Calling-Party-URL"
76 #define OPAL_OPT_CALLING_PARTY_NUMBER "Calling-Party-Number"
77 #define OPAL_OPT_CALLING_PARTY_NAME "Calling-Party-Name"
78 #define OPAL_OPT_CALLING_PARTY_DOMAIN "Calling-Party-Domain"
79 #define OPAL_OPT_CALLING_DISPLAY_NAME "Calling-Display-Name"
80 #define OPAL_OPT_CALLED_PARTY_NAME "Called-Party-Name"
81 #define OPAL_OPT_CALLED_DISPLAY_NAME "Called-Display-Name"
82 #define OPAL_OPT_REDIRECTING_PARTY "Redirecting-Party"
83 #define OPAL_OPT_PRESENTATION_BLOCK "Presentation-Block"
84 #define OPAL_OPT_ORIGINATOR_ADDRESS "Originator-Address"
85 #define OPAL_OPT_INTERFACE "Interface"
86 #define OPAL_OPT_USER_INPUT_MODE "User-Input-Mode"
87 #define OPAL_OPT_ENABLE_INBAND_DTMF "EnableInbandDTMF"
89 #define OPAL_OPT_ENABLE_INBAND_DTMF "EnableInbandDTMF"
90 #define OPAL_OPT_DETECT_INBAND_DTMF "DetectInBandDTMF"
91 #define OPAL_OPT_SEND_INBAND_DTMF "SendInBandDTMF"
92 #define OPAL_OPT_DTMF_MULT "dtmfmult"
93 #define OPAL_OPT_DTMF_DIV "dtmfdiv"
94 #define OPAL_OPT_DISABLE_JITTER "Disable-Jitter"
95 #define OPAL_OPT_MAX_JITTER "Max-Jitter"
96 #define OPAL_OPT_MIN_JITTER "Min-Jitter"
97 #define OPAL_OPT_RECORD_AUDIO "Record-Audio"
98 #define OPAL_OPT_ALERTING_TYPE "Alerting-Type"
99 #define OPAL_OPT_REMOVE_CODEC "Remove-Codec"
100 
101 
313 {
314  public:
315  OpalProductInfo();
316 
317  static OpalProductInfo & Default();
318 
319  friend ostream & operator<<(ostream & strm, const OpalProductInfo & info);
320  PCaselessString AsString() const;
321 
322  PCaselessString vendor;
323  PCaselessString name;
324  PCaselessString version;
325  PCaselessString comments;
326 
330 
331  private:
332  OpalProductInfo(bool);
333 };
334 
335 
353 class OpalConnection : public PSafeObject
354 {
355  PCLASSINFO(OpalConnection, PSafeObject);
356  public:
394  };
395 
396  struct CallEndReason {
399  unsigned cause = 0
400  ) : code(reason), q931(cause) { }
401  explicit CallEndReason(
402  long reason
403  ) : code((CallEndReasonCodes)(reason&0xff)), q931((reason>>8)&0xff) { }
404 
405  __inline operator CallEndReasonCodes() const { return code; }
406 
407  __inline int AsInteger() const { return code|(q931<<8); }
408 
409  CallEndReasonCodes code:8; // Normalised OPAL code
410  unsigned q931:8; // PSTN Interworking code, actually Q.850
411  };
412 
413 #if PTRACING
414  friend ostream & operator<<(ostream & o, CallEndReason reason);
415 #endif
416 
427  };
428 #if PTRACING
429  friend ostream & operator<<(ostream & o, AnswerCallResponse s);
430 #endif
431 
434  enum Options {
435  FastStartOptionDisable = 0x0001, // H.323 specific
438 
439  H245TunnelingOptionDisable = 0x0004, // H.323 specific
442 
443  H245inSetupOptionDisable = 0x0010, // H.323 specific
446 
447  DetectInBandDTMFOptionDisable = 0x0040, // SIP and H.323
450 
451  RTPAggregationDisable = 0x0100, // SIP and H.323
454 
455  SendDTMFAsDefault = 0x0000, // SIP and H.323
457  SendDTMFAsTone = 0x0800,
459  SendDTMFMask = 0x0c00
460  };
461 
462  class StringOptions : public PStringOptions
463  {
464  public:
469  void ExtractFromURL(
470  PURL & url
471  );
472  };
473 
479  OpalCall & call,
481  const PString & token,
482  unsigned options = 0,
483  OpalConnection::StringOptions * stringOptions = NULL
484  );
485 
488  ~OpalConnection();
490 
497  void PrintOn(
498  ostream & strm
499  ) const;
501 
518  virtual bool IsNetworkConnection() const = 0;
519 
523  enum Phases {
534  };
535 
540  __inline Phases GetPhase() const { return m_phase; }
541 
543  __inline bool IsEstablished() const { return m_phase == EstablishedPhase; }
544 
546  __inline bool IsReleased() const { return m_phase >= ReleasingPhase; }
547 
552  void SetPhase(
553  Phases phaseToSet
554  );
555 
565 
568  static PString GetCallEndReasonText(CallEndReason reason);
570 
573  static void SetCallEndReasonText(CallEndReasonCodes reasonCode, const PString & newText);
574 
579  virtual void SetCallEndReason(
580  CallEndReason reason
581  );
582 
592  void ClearCall(
593  CallEndReason reason = EndedByLocalUser,
594  PSyncPoint * sync = NULL
595  );
596 
601  virtual void ClearCallSynchronous(
602  PSyncPoint * sync,
603  CallEndReason reason = EndedByLocalUser
604  );
605 
609  unsigned GetQ931Cause() const { return callEndReason.q931; }
610 
614  void SetQ931Cause(unsigned v) { callEndReason.q931 = v; }
615 
622  virtual bool TransferConnection(
623  const PString & remoteParty
624  );
625 
633  virtual bool Hold(
634  bool fromRemote,
635  bool placeOnHold
636  );
637 
642  virtual bool IsOnHold(
643  bool fromRemote
644  );
645 
650  virtual void OnHold(
651  bool fromRemote,
652  bool onHold
653  );
655 
683  virtual PBoolean OnIncomingConnection(unsigned int options, OpalConnection::StringOptions * stringOptions);
684 
691  virtual PBoolean SetUpConnection() = 0;
692 
696  virtual PBoolean OnSetUpConnection();
697 
698 
713  virtual void OnProceeding();
714 
725  virtual void OnAlerting();
726 
737  virtual PBoolean SetAlerting(
738  const PString & calleeName,
739  PBoolean withMedia
740  ) = 0;
741 
759  const PString & callerName
760  );
761 
772  virtual void AnsweringCall(
773  AnswerCallResponse response
774  );
775 
790  virtual void OnConnected();
791 
802  virtual PBoolean SetConnected();
803 
815  virtual void OnEstablished();
816 
864  virtual bool OnTransferNotify(
865  const PStringToString & info,
866  const OpalConnection * transferringConnection
868  );
869 
878  virtual void Release(
879  CallEndReason reason = EndedByLocalUser,
880  bool synchronous = false
881  );
882 
900  virtual void OnReleased();
902 
913  virtual PString GetDestinationAddress();
914 
924  virtual PBoolean ForwardCall(
925  const PString & forwardParty
926  );
927 
930  PSafePtr<OpalConnection> GetOtherPartyConnection() const;
931 
934  template <class cls> PSafePtr<cls> GetOtherPartyConnectionAs() const { return PSafePtrCast<OpalConnection, cls>(GetOtherPartyConnection()); }
936 
945  virtual OpalMediaFormatList GetMediaFormats() const;
946 
952 
966  virtual void AdjustMediaFormats(
967  bool local,
968  const OpalConnection * otherConnection,
969  OpalMediaFormatList & mediaFormats
970  ) const;
971 
979  virtual unsigned GetNextSessionID(
980  const OpalMediaType & mediaType,
981  bool isSource
982  );
983 
991  const OpalMediaType & mediaType
992  ) const;
993 
996  virtual void AutoStartMediaStreams(
997  bool force = false
998  );
999 
1000 #if OPAL_FAX
1001 
1003  virtual bool SwitchFaxMediaStreams(
1004  bool toT38
1005  );
1006 
1011  virtual void OnSwitchedFaxMediaStreams(
1012  bool toT38,
1013  bool success
1014  );
1015 
1020  virtual bool OnSwitchingFaxMediaStreams(
1021  bool toT38
1022  );
1023 #endif
1024 
1028  const OpalMediaFormat & mediaFormat,
1029  unsigned sessionID,
1030  bool isSource
1031  );
1032 
1035  virtual bool CloseMediaStream(
1036  unsigned sessionId,
1037  bool source
1038  );
1039 
1042  virtual bool CloseMediaStream(
1043  OpalMediaStream & stream
1044  );
1045 
1053  bool RemoveMediaStream(
1054  OpalMediaStream & strm
1055  );
1056 
1059  virtual void StartMediaStreams();
1060 
1063  virtual void CloseMediaStreams();
1064 
1067  virtual void PauseMediaStreams(
1068  bool paused
1069  );
1070 
1073  virtual void OnPauseMediaStream(
1074  OpalMediaStream & strm,
1075  bool paused
1076  );
1077 
1091  const OpalMediaFormat & mediaFormat,
1092  unsigned sessionID,
1093  PBoolean isSource
1094  );
1095 
1103  const PString & streamID,
1104  bool source
1105  ) const;
1106 
1113  unsigned sessionId,
1114  bool source
1115  ) const;
1116 
1128  const OpalMediaType & mediaType,
1129  bool source,
1130  OpalMediaStreamPtr previous = NULL
1131  ) const;
1132 
1144  virtual PBoolean OnOpenMediaStream(
1145  OpalMediaStream & stream
1146  );
1147 
1152  virtual void OnClosedMediaStream(
1153  const OpalMediaStream & stream
1154  );
1155 
1164  virtual void OnPatchMediaStream(
1165  PBoolean isSource,
1166  OpalMediaPatch & patch
1167  );
1168 
1171  virtual void OnStartMediaPatch(
1172  OpalMediaPatch & patch
1173  );
1174 
1177  virtual void OnStopMediaPatch(
1178  OpalMediaPatch & patch
1179  );
1180 
1186  virtual bool OnMediaCommand(
1187  OpalMediaStream & stream,
1188  const OpalMediaCommand & command
1189  );
1190 
1195  virtual void AttachRFC2833HandlerToPatch(PBoolean isSource, OpalMediaPatch & patch);
1196 
1202  virtual PBoolean IsMediaBypassPossible(
1203  unsigned sessionID
1204  ) const;
1205 
1206 #if OPAL_VIDEO
1207 
1209  virtual PBoolean CreateVideoInputDevice(
1210  const OpalMediaFormat & mediaFormat,
1211  PVideoInputDevice * & device,
1212  PBoolean & autoDelete
1213  );
1214 
1218  virtual PBoolean CreateVideoOutputDevice(
1219  const OpalMediaFormat & mediaFormat,
1220  PBoolean preview,
1221  PVideoOutputDevice * & device,
1222  PBoolean & autoDelete
1223  );
1224 
1230  virtual bool SendVideoUpdatePicture(
1231  unsigned sessionID = 0,
1232  bool force = false
1233  ) const;
1234 #endif
1235 
1239  virtual PBoolean SetAudioVolume(
1240  PBoolean source,
1241  unsigned percentage
1242  );
1243 
1247  virtual PBoolean GetAudioVolume(
1248  PBoolean source,
1249  unsigned & percentage
1250  );
1251 
1254  virtual bool SetAudioMute(
1255  bool source,
1256  bool mute
1257  );
1258 
1261  virtual bool GetAudioMute(
1262  bool source,
1263  bool & mute
1264  );
1265 
1269  virtual unsigned GetAudioSignalLevel(
1270  PBoolean source
1271  );
1273 
1278  unsigned GetBandwidthAvailable() const { return bandwidthAvailable; }
1279 
1284  virtual PBoolean SetBandwidthAvailable(
1285  unsigned newBandwidth,
1286  PBoolean force = false
1287  );
1288 
1293  virtual unsigned GetBandwidthUsed() const;
1294 
1303  virtual PBoolean SetBandwidthUsed(
1304  unsigned releasedBandwidth,
1305  unsigned requiredBandwidth
1306  );
1308 
1319 
1321  };
1322 #if PTRACING
1323  friend ostream & operator<<(ostream & o, SendUserInputModes m);
1324 #endif
1325 
1328  virtual void SetSendUserInputMode(SendUserInputModes mode);
1329 
1333 
1340 
1347  virtual PBoolean SendUserInputString(
1348  const PString & value
1349  );
1350 
1367  virtual PBoolean SendUserInputTone(
1368  char tone,
1369  unsigned duration = 0
1370  );
1371 
1378  virtual void OnUserInputString(
1379  const PString & value
1380  );
1381 
1388  virtual void OnUserInputTone(
1389  char tone,
1390  unsigned duration
1391  );
1392 
1397  unsigned duration = 500
1398  ) { SendUserInputTone('!', duration); }
1399 
1402  virtual PString GetUserInput(
1403  unsigned timeout = 30
1404  );
1405 
1410  virtual void SetUserInput(
1411  const PString & input
1412  );
1413 
1416  virtual PString ReadUserInput(
1417  const char * terminators = "#\r\n",
1418  unsigned lastDigitTimeout = 4,
1419  unsigned firstDigitTimeout = 30
1420  );
1421 
1428  virtual PBoolean PromptUserInput(
1429  PBoolean play
1430  );
1432 
1437  virtual bool GarbageCollection();
1439 
1444  OpalEndPoint & GetEndPoint() const { return endpoint; }
1445 
1448  OpalCall & GetCall() const { return ownerCall; }
1449 
1452  const PString & GetToken() const { return callToken; }
1453 
1456  PBoolean IsOriginating() const { return originating; }
1457 
1460  const PTime & GetPhaseTime(Phases phase) const { return m_phaseTime[phase]; }
1461 
1464  const PTime & GetSetupUpTime() const { return m_phaseTime[SetUpPhase]; }
1465 
1468  const PTime & GetAlertingTime() const { return m_phaseTime[AlertingPhase]; }
1469 
1474  const PTime & GetConnectionStartTime() const { return m_phaseTime[ConnectedPhase]; }
1475 
1478  const PTime & GetConnectionEndTime() const { return m_phaseTime[ReleasingPhase]; }
1479 
1482  const OpalProductInfo & GetProductInfo() const { return productInfo; }
1483 
1487  const OpalProductInfo & info
1488  ) { productInfo = info; }
1489 
1492  virtual PString GetPrefixName() const;
1493 
1496  const PString & GetLocalPartyName() const { return localPartyName; }
1497 
1500  virtual void SetLocalPartyName(const PString & name);
1501 
1504  virtual PString GetLocalPartyURL() const;
1505 
1508  const PString & GetDisplayName() const { return displayName; }
1509 
1512  void SetDisplayName(const PString & name) { displayName = name; }
1513 
1519  virtual bool IsPresentationBlocked() const;
1520 
1523  const PString & GetRemotePartyName() const { return remotePartyName; }
1524 
1527  void SetRemotePartyName(const PString & name) { remotePartyName = name; }
1528 
1537  const PString & GetRemotePartyNumber() const { return remotePartyNumber; }
1538 
1544  const PString & GetRemotePartyAddress() const { return remotePartyAddress; }
1545 
1548  void SetRemotePartyAddress(const PString & addr) { remotePartyAddress = addr; }
1549 
1556  virtual PString GetRemotePartyURL() const;
1557 
1561  const PString & GetRedirectingParty() const { return m_redirectingParty; }
1562 
1566  void SetRedirectingParty(const PString & party) { m_redirectingParty = party; }
1567 
1568  // Deprecated - backward compatibility only
1569  const PString GetRemotePartyCallbackURL() const { return GetRemotePartyURL(); }
1570 
1574  PCaselessString GetRemoteApplication() const { return remoteProductInfo.AsString(); }
1575 
1579 
1580 
1587  const PString & GetCalledPartyName() const { return m_calledPartyName; }
1588 
1595  const PString & GetCalledPartyNumber() const { return m_calledPartyNumber; }
1596 
1604  virtual PString GetCalledPartyURL();
1605 
1606  /* Internal function to copy party names from "network" connection to
1607  "non-network" connection such as OpalPCSSConnection. This allows
1608  the non-network GetRemoteAddress() function and its ilk to return
1609  the intuitive value, i.e. the value from the OTHER connection.
1610  */
1611  void CopyPartyNames(const OpalConnection & other);
1612 
1613 
1627  virtual PString GetAlertingType() const;
1628 
1642  virtual bool SetAlertingType(const PString & info);
1643 
1651  virtual PString GetCallInfo() const;
1652 
1656  unsigned GetMinAudioJitterDelay() const { return minAudioJitterDelay; }
1657 
1661  unsigned GetMaxAudioJitterDelay() const { return maxAudioJitterDelay; }
1662 
1665  void SetAudioJitterDelay(
1666  unsigned minDelay,
1667  unsigned maxDelay
1668  );
1669 
1673 
1674 #if OPAL_AEC
1675 
1677  OpalEchoCanceler * GetEchoCanceler() const { return echoCanceler; }
1678 #endif
1679 
1683  virtual PString GetIdentifier() const;
1684 
1693  virtual PINDEX GetMaxRtpPayloadSize() const;
1694 
1695  virtual OpalTransport & GetTransport() const
1696  { return *(OpalTransport *)NULL; }
1697 
1698  PDICTIONARY(MediaAddressesDict, POrdinalKey, OpalTransportAddress);
1699  MediaAddressesDict & GetMediaTransportAddresses()
1700  { return mediaTransportAddresses; }
1701 
1702 #if OPAL_STATISTICS
1703 
1706 #endif
1707 
1708 
1710  const StringOptions & GetStringOptions() const { return m_stringOptions; }
1711 
1713  void SetStringOptions(
1714  const StringOptions & options,
1715  bool overwrite
1716  );
1717 
1719  virtual void OnApplyStringOptions();
1720 
1721 #if OPAL_HAS_MIXER
1722 
1723  virtual void EnableRecording();
1724  virtual void DisableRecording();
1725 
1726 #endif
1727 
1728 #if 0 //OPAL_HAS_IM
1729 
1732  virtual bool TransmitInternalIM(
1733  const OpalMediaFormat & format,
1734  RTP_IMFrame & body
1735  );
1736 
1740  virtual void OnReceiveInternalIM(
1741  const OpalMediaFormat & format,
1742  RTP_IMFrame & body
1743  );
1744 
1748  virtual bool TransmitExternalIM(
1749  const OpalMediaFormat & format,
1750  RTP_IMFrame & body
1751  );
1752 
1756  virtual bool OnReceiveExternalIM(
1757  const OpalMediaFormat & format,
1758  RTP_IMFrame & body
1759  );
1760 
1765  RFC4103Context & GetRFC4103Context(PINDEX i) { return m_rfc4103Context[i]; };
1766 
1767  protected:
1768  RFC4103Context m_rfc4103Context[2];
1769 
1770 #endif
1771 
1772  protected:
1773  void OnConnectedInternal();
1774 
1775  PDECLARE_NOTIFIER(PThread, OpalConnection, OnReleaseThreadMain);
1776 
1777 #if OPAL_HAS_MIXER
1779 #if OPAL_VIDEO
1781 #endif
1782  void OnStartRecording(OpalMediaPatch * patch);
1783  void OnStopRecording(OpalMediaPatch * patch);
1784 #endif
1785 
1786  // Member variables
1789 
1790  private:
1791  PMutex m_phaseMutex;
1792  Phases m_phase;
1793 
1794  protected:
1795  PString callToken;
1796  PBoolean originating;
1799  PString displayName;
1809 
1813 
1815 #if OPAL_AEC
1816  OpalEchoCanceler * echoCanceler;
1817 #endif
1819 
1821  MediaAddressesDict mediaTransportAddresses;
1822  PSafeList<OpalMediaStream> mediaStreams;
1823 
1827 
1828  // The In-Band DTMF detector. This is used inside an audio filter which is
1829  // added to the audio channel.
1830 #if OPAL_PTLIB_DTMF
1831  PDTMFDecoder m_dtmfDecoder;
1832  bool m_detectInBandDTMF;
1833  unsigned m_dtmfScaleMultiplier;
1834  unsigned m_dtmfScaleDivisor;
1835  PNotifier m_dtmfDetectNotifier;
1836  PDECLARE_NOTIFIER(RTP_DataFrame, OpalConnection, OnDetectInBandDTMF);
1837 
1838  bool m_sendInBandDTMF;
1839  OpalMediaFormat m_dtmfSendFormat;
1840  PBYTEArray m_inBandDTMF;
1841  PINDEX m_emittedInBandDTMF;
1842  PMutex m_inBandMutex;
1843  PNotifier m_dtmfSendNotifier;
1844  PDECLARE_NOTIFIER(RTP_DataFrame, OpalConnection, OnSendInBandDTMF);
1845 #endif
1846 
1847 #if PTRACING
1848  friend ostream & operator<<(ostream & o, Phases p);
1849 #endif
1850 
1852 
1853 #if OPAL_HAS_MIXER
1856 #if OPAL_VIDEO
1858 #endif
1859 #endif
1860 
1861 #if OPAL_STATISTICS
1863 #endif
1864 
1865  struct AutoStartInfo {
1866  unsigned preferredSessionId; // preferred session ID (only used for originating)
1867  OpalMediaType::AutoStartMode autoStart;// Mode for this session when the call is started
1868  };
1869 
1870  class AutoStartMap : public std::map<OpalMediaType, AutoStartInfo>
1871  {
1872  public:
1873  AutoStartMap();
1874  void Initialise(const OpalConnection::StringOptions & stringOptions);
1875  OpalMediaType::AutoStartMode GetAutoStart(const OpalMediaType & mediaType) const;
1876  void SetAutoStart(const OpalMediaType & mediaType, OpalMediaType::AutoStartMode autoStart);
1877 
1878  protected:
1880  PMutex m_mutex;
1881 
1882  };
1884 
1885 #if OPAL_FAX
1886  enum {
1891 #endif
1892 
1893 #if P_LUA
1894  protected:
1895  PLua m_lua;
1896  bool m_luaScriptLoaded;
1897 
1898  public:
1899  PLUA_BINDING_START(OpalConnection)
1900  PLUA_BINDING2(LuaSetOption, "SetOption")
1901  PLUA_BINDING_END()
1902  PLUA_DECLARE_FUNCTION(LuaSetOption);
1903 #endif
1904 
1905  // A version of PTime where default constructor creates invalid times
1906  class ZeroTime : public PTime
1907  {
1908  public:
1909  ZeroTime() : PTime(0) { }
1910  };
1912 
1913  private:
1914  P_REMOVE_VIRTUAL(PBoolean, OnIncomingConnection(unsigned int), false);
1915  P_REMOVE_VIRTUAL(PBoolean, OnIncomingConnection(), false);
1916  P_REMOVE_VIRTUAL(PBoolean, IsConnectionOnHold(), false);
1917  P_REMOVE_VIRTUAL_VOID(OnMediaPatchStart(unsigned, bool));
1918  P_REMOVE_VIRTUAL_VOID(OnMediaPatchStop(unsigned, bool));
1919  P_REMOVE_VIRTUAL_VOID(AdjustMediaFormats(OpalMediaFormatList &) const);
1920  P_REMOVE_VIRTUAL_VOID(AdjustMediaFormats(OpalMediaFormatList &, OpalConnection *) const);
1921  P_REMOVE_VIRTUAL_VOID(AdjustMediaFormats(bool,OpalMediaFormatList &,OpalConnection *) const);
1922  P_REMOVE_VIRTUAL_VOID(PreviewPeerMediaFormats(const OpalMediaFormatList &));
1923  P_REMOVE_VIRTUAL(bool, HoldConnection(), false);
1924  P_REMOVE_VIRTUAL(bool, RetrieveConnection(), false);
1925  P_REMOVE_VIRTUAL(bool, IsConnectionOnHold(bool), false);
1926  P_REMOVE_VIRTUAL_VOID(ApplyStringOptions(OpalConnection::StringOptions &));
1927  P_REMOVE_VIRTUAL(bool, OnTransferNotify(const PStringToString &), false);
1928  P_REMOVE_VIRTUAL_VOID(OnSwitchedFaxMediaStreams(bool));
1929 };
1930 
1931 #endif // OPAL_OPAL_CONNECTION_H
1932 
1933 
1934 // End of File ///////////////////////////////////////////////////////////////
PDECLARE_NOTIFIER(PThread, OpalConnection, OnReleaseThreadMain)
const PString & GetCalledPartyNumber() const
Definition: connection.h:1595
Definition: connection.h:457
const PString & GetCalledPartyName() const
Definition: connection.h:1587
virtual bool OnTransferNotify(const PStringToString &info, const OpalConnection *transferringConnection)
void SetProductInfo(const OpalProductInfo &info)
Definition: connection.h:1486
virtual void OnReleased()
CallEndReason callEndReason
Definition: connection.h:1806
virtual bool Hold(bool fromRemote, bool placeOnHold)
virtual void OnUserInputString(const PString &value)
Call cleared because the line is out of service,.
Definition: connection.h:391
Definition: endpoint.h:67
PCaselessString name
Definition: connection.h:323
Remote endpoint congested.
Definition: connection.h:381
Definition: connection.h:458
virtual PBoolean CreateVideoInputDevice(const OpalMediaFormat &mediaFormat, PVideoInputDevice *&device, PBoolean &autoDelete)
virtual void OnUserInputTone(char tone, unsigned duration)
The remote party host off line.
Definition: connection.h:384
There is agreement on having a call, usually means billing will apply.
Definition: connection.h:528
virtual void OnHold(bool fromRemote, bool onHold)
Definition: connection.h:453
Answer the call with a h323 progress, or sip 183 session in progress, or ...
Definition: connection.h:425
virtual OpalMediaStream * CreateMediaStream(const OpalMediaFormat &mediaFormat, unsigned sessionID, PBoolean isSource)
enum OpalConnection::@30 m_faxMediaStreamsSwitchState
OpalEndPoint & GetEndPoint() const
Definition: connection.h:1444
OpalEndPoint & endpoint
Definition: connection.h:1788
void ClearCall(CallEndReason reason=EndedByLocalUser, PSyncPoint *sync=NULL)
virtual void OnAlerting()
const PString & GetDisplayName() const
Definition: connection.h:1508
Definition: connection.h:459
ZeroTime m_phaseTime[NumPhases]
Definition: connection.h:1911
unsigned m_VideoUpdateRequestsSent
Definition: connection.h:1862
ZeroTime()
Definition: connection.h:1909
Definition: im.h:382
Options
Definition: connection.h:434
Definition: mediacmd.h:43
OpalCall & GetCall() const
Definition: connection.h:1448
virtual void OnSwitchedFaxMediaStreams(bool toT38, bool success)
Call cleared due to an enforced duration limit.
Definition: connection.h:387
void SetAudioJitterDelay(unsigned minDelay, unsigned maxDelay)
virtual PBoolean ForwardCall(const PString &forwardParty)
unsigned minAudioJitterDelay
Definition: connection.h:1824
virtual void ClearCallSynchronous(PSyncPoint *sync, CallEndReason reason=EndedByLocalUser)
The remote says there is a phone ringing, somewhere.
Definition: connection.h:527
PCaselessString GetRemoteApplication() const
Definition: connection.h:1574
virtual OpalTransport & GetTransport() const
Definition: connection.h:1695
Local endpoint congested.
Definition: connection.h:379
virtual bool CloseMediaStream(unsigned sessionId, bool source)
WORD manufacturerCode
Definition: connection.h:329
PCaselessString version
Definition: connection.h:324
CallEndReason GetCallEndReason() const
Definition: connection.h:564
virtual PBoolean SetBandwidthAvailable(unsigned newBandwidth, PBoolean force=false)
Definition: transports.h:703
virtual PString GetIdentifier() const
PSafePtr< OpalMediaStream > OpalMediaStreamPtr
Definition: mediastrm.h:442
virtual OpalMediaFormatList GetLocalMediaFormats()
As for AnswerCallPending but starts media channels.
Definition: connection.h:423
friend ostream & operator<<(ostream &strm, const OpalProductInfo &info)
Definition: connection.h:451
virtual PBoolean SendUserInputTone(char tone, unsigned duration=0)
Definition: connection.h:1313
unsigned q931
Definition: connection.h:410
OpalSilenceDetector * GetSilenceDetector() const
Definition: connection.h:1672
void SetStringOptions(const StringOptions &options, bool overwrite)
Set the string options associated with this connection.
virtual void OnPauseMediaStream(OpalMediaStream &strm, bool paused)
CallEndReasonCodes
Definition: connection.h:361
virtual PString GetLocalPartyURL() const
Definition: mediatype.h:57
AutoStartMap m_autoStartInfo
Definition: connection.h:1883
OpalMediaFormat m_filterMediaFormat
Definition: connection.h:1818
Remote endpoint stopped calling.
Definition: connection.h:369
Definition: connection.h:1316
OpalSilenceDetector * silenceDetector
Definition: connection.h:1814
As for AnswerCallPending but does not send Alerting PDU.
Definition: connection.h:422
virtual AnswerCallResponse OnAnswerCall(const PString &callerName)
virtual bool SwitchFaxMediaStreams(bool toT38)
void SetRedirectingParty(const PString &party)
Definition: connection.h:1566
PSafeList< OpalMediaStream > mediaStreams
Definition: connection.h:1822
PString m_redirectingParty
Definition: connection.h:1805
void OnStopRecording(OpalMediaPatch *patch)
Call was forwarded using FACILITY message.
Definition: connection.h:376
OpalConnection(OpalCall &call, OpalEndPoint &endpoint, const PString &token, unsigned options=0, OpalConnection::StringOptions *stringOptions=NULL)
virtual void EnableRecording()
OpalMediaFormatList m_localMediaFormats
Definition: connection.h:1820
PString m_calledPartyName
Definition: connection.h:1808
CallEndReason(long reason)
Definition: connection.h:401
Call cleared because another call is answered.
Definition: connection.h:392
Hangup packet has been sent/received, media and control not yet stopped.
Definition: connection.h:531
virtual PString GetUserInput(unsigned timeout=30)
virtual void SetUserInput(const PString &input)
Definition: connection.h:445
virtual void OnPatchMediaStream(PBoolean isSource, OpalMediaPatch &patch)
Definition: connection.h:452
Transport connection failed to establish call.
Definition: connection.h:371
PString remotePartyName
Definition: connection.h:1800
void OnConnectedInternal()
unsigned maxAudioJitterDelay
Definition: connection.h:1825
unsigned bandwidthAvailable
Definition: connection.h:1826
Has just sent/received the initial SETUP/INVITE packet.
Definition: connection.h:525
Could not find common capabilities.
Definition: connection.h:375
Could not reach the remote party.
Definition: connection.h:382
Answer the call continuing with the connection.
Definition: connection.h:419
virtual PBoolean OnIncomingConnection(unsigned int options, OpalConnection::StringOptions *stringOptions)
The remote party is not running an endpoint.
Definition: connection.h:383
Local endpoint application cleared call.
Definition: connection.h:363
void SetDisplayName(const PString &name)
Definition: connection.h:1512
Local endpoint did not accept call OnIncomingCall()=false.
Definition: connection.h:364
Definition: silencedetect.h:43
Media is established, streams are all operational.
Definition: connection.h:529
Definition: connection.h:444
PString m_calledPartyNumber
Definition: connection.h:1807
virtual PBoolean SetConnected()
Definition: connection.h:437
void SetQ931Cause(unsigned v)
Definition: connection.h:614
Definition: rfc2833.h:65
virtual PString GetRemotePartyURL() const
virtual void OnConnected()
Definition: connection.h:418
Transport error cleared call.
Definition: connection.h:370
virtual void Release(CallEndReason reason=EndedByLocalUser, bool synchronous=false)
virtual void OnStopMediaPatch(OpalMediaPatch &patch)
virtual void AnsweringCall(AnswerCallResponse response)
Definition: mediafmt.h:72
Definition: connection.h:436
SendUserInputModes
Definition: connection.h:1311
Refuse the call sending a release complete.
Definition: connection.h:420
Indicates the OpalConnection instance has just been constructed.
Definition: connection.h:524
PString callToken
Definition: connection.h:1795
PString m_recordingFilename
Definition: connection.h:1854
virtual PBoolean GetAudioVolume(PBoolean source, unsigned &percentage)
virtual void OnProceeding()
Definition: connection.h:441
virtual OpalMediaStreamPtr OpenMediaStream(const OpalMediaFormat &mediaFormat, unsigned sessionID, bool isSource)
AnswerCallResponse
Definition: connection.h:417
unsigned GetVideoUpdateRequestsSent() const
Definition: connection.h:1705
Definition: connection.h:462
virtual unsigned GetBandwidthUsed() const
PNotifier m_recordVideoNotifier
Definition: connection.h:1857
virtual bool TransferConnection(const PString &remoteParty)
unsigned preferredSessionId
Definition: connection.h:1866
virtual bool IsOnHold(bool fromRemote)
void SetPhase(Phases phaseToSet)
void PrintOn(ostream &strm) const
unsigned GetBandwidthAvailable() const
Definition: connection.h:1278
Definition: rtp.h:71
virtual PBoolean SetBandwidthUsed(unsigned releasedBandwidth, unsigned requiredBandwidth)
virtual SendUserInputModes GetRealSendUserInputMode() const
Definition: connection.h:1339
PString GetCallEndReasonText() const
Definition: connection.h:569
virtual PBoolean SetUpConnection()=0
Definition: patch.h:60
virtual bool IsPresentationBlocked() const
const PTime & GetConnectionEndTime() const
Definition: connection.h:1478
Definition: connection.h:1318
static OpalProductInfo & Default()
Number of available phases. Can be used to indicate an unknown phase.
Definition: connection.h:533
virtual void OnEstablished()
Definition: mediafmt.h:724
BYTE t35CountryCode
Definition: connection.h:327
void Initialise(const OpalConnection::StringOptions &stringOptions)
Answer the call and destroy the current call.
Definition: connection.h:426
CallEndReason(CallEndReasonCodes reason=NumCallEndReasons, unsigned cause=0)
Definition: connection.h:397
Definition: call.h:65
AutoStartMode
Definition: mediatype.h:90
virtual void SetLocalPartyName(const PString &name)
PCaselessString vendor
Definition: connection.h:322
Remote endpoint did not answer in required time.
Definition: connection.h:368
const PString & GetRemotePartyNumber() const
Definition: connection.h:1537
void SetRemotePartyName(const PString &name)
Definition: connection.h:1527
Call cleared due to missing ringback tone.
Definition: connection.h:390
OpalMediaType::AutoStartMode autoStart
Definition: connection.h:1867
Definition: connection.h:1870
PMutex m_mutex
Definition: connection.h:1880
virtual void AdjustMediaFormats(bool local, const OpalConnection *otherConnection, OpalMediaFormatList &mediaFormats) const
unsigned GetQ931Cause() const
Definition: connection.h:609
Local endpoint busy.
Definition: connection.h:378
PCaselessString AsString() const
OpalMediaStreamPtr GetMediaStream(const PString &streamID, bool source) const
void SetAutoStart(const OpalMediaType &mediaType, OpalMediaType::AutoStartMode autoStart)
CallEndReasonCodes code
Definition: connection.h:409
__inline Phases GetPhase() const
Definition: connection.h:540
__inline bool IsEstablished() const
Return true if connection is in the established phase.
Definition: connection.h:543
Call cleared due to missing dial tone.
Definition: connection.h:389
const PTime & GetConnectionStartTime() const
Definition: connection.h:1474
PString displayName
Definition: connection.h:1799
const OpalProductInfo & GetRemoteProductInfo() const
Definition: connection.h:1578
const PTime & GetAlertingTime() const
Definition: connection.h:1468
virtual bool SetAudioMute(bool source, bool mute)
Phases
Definition: connection.h:523
Definition: rfc2833.h:112
OpalProductInfo productInfo
Definition: connection.h:1797
Remote endpoint refused call.
Definition: connection.h:367
PString remotePartyURL
Definition: connection.h:1801
ostream & operator<<(ostream &strm, OpalSilenceDetector::Mode mode)
virtual PBoolean OnSetUpConnection()
virtual SendUserInputModes GetSendUserInputMode() const
Definition: connection.h:1332
PCaselessString comments
Definition: connection.h:325
Send an Alerting PDU and wait for AnsweringCall()
Definition: connection.h:421
PString remotePartyNumber
Definition: connection.h:1803
Definition: echocancel.h:51
const PString & GetToken() const
Definition: connection.h:1452
void CopyPartyNames(const OpalConnection &other)
virtual PINDEX GetMaxRtpPayloadSize() const
const PTime & GetPhaseTime(Phases phase) const
Definition: connection.h:1460
Definition: connection.h:440
void SetRemotePartyAddress(const PString &addr)
Definition: connection.h:1548
PSafePtr< OpalConnection > GetOtherPartyConnection() const
virtual PString GetDestinationAddress()
virtual void OnClosedMediaStream(const OpalMediaStream &stream)
virtual bool GetAudioMute(bool source, bool &mute)
Definition: connection.h:396
PSafePtr< cls > GetOtherPartyConnectionAs() const
Definition: connection.h:934
static void SetCallEndReasonText(CallEndReasonCodes reasonCode, const PString &newText)
MediaAddressesDict mediaTransportAddresses
Definition: connection.h:1821
Call cleared because gatekeeper admission request failed.
Definition: connection.h:393
bool RemoveMediaStream(OpalMediaStream &strm)
virtual bool IsNetworkConnection() const =0
Definition: connection.h:435
virtual PBoolean CreateVideoOutputDevice(const OpalMediaFormat &mediaFormat, PBoolean preview, PVideoOutputDevice *&device, PBoolean &autoDelete)
virtual unsigned GetAudioSignalLevel(PBoolean source)
Definition: connection.h:1315
virtual PString GetCallInfo() const
PBoolean IsOriginating() const
Definition: connection.h:1456
virtual PBoolean SendUserInputString(const PString &value)
PString remotePartyAddress
Definition: connection.h:1804
SendUserInputModes sendUserInputMode
Definition: connection.h:1810
virtual PString GetCalledPartyURL()
unsigned GetMaxAudioJitterDelay() const
Definition: connection.h:1661
Call failed as could not get enough bandwidth.
Definition: connection.h:374
MediaAddressesDict & GetMediaTransportAddresses()
Definition: connection.h:1699
void SendUserInputHookFlash(unsigned duration=500)
Definition: connection.h:1396
Definition: mediastrm.h:111
Call failed a security check and was ended.
Definition: connection.h:377
OpalCall & ownerCall
Definition: connection.h:1787
PString localPartyName
Definition: connection.h:1798
As for AnswerCallDeferred but starts media channels.
Definition: connection.h:424
virtual bool SetAlertingType(const PString &info)
virtual PBoolean PromptUserInput(PBoolean play)
bool m_initialised
Definition: connection.h:1879
Definition: connection.h:1314
Call cleared due to invalid conference ID.
Definition: connection.h:388
virtual PString GetAlertingType() const
Definition: connection.h:443
Local endpoint declined to answer call.
Definition: connection.h:365
Definition: rfc4103.h:44
Definition: connection.h:353
const PString & GetRemotePartyName() const
Definition: connection.h:1523
void OnStartRecording(OpalMediaPatch *patch)
OpalProductInfo remoteProductInfo
Definition: connection.h:1802
Media and control streams have been terminated.
Definition: connection.h:532
virtual void SetSendUserInputMode(SendUserInputModes mode)
virtual PString GetPrefixName() const
const PString & GetRedirectingParty() const
Definition: connection.h:1561
const PString & GetLocalPartyName() const
Definition: connection.h:1496
const PString GetRemotePartyCallbackURL() const
Definition: connection.h:1569
virtual bool OnMediaCommand(OpalMediaStream &stream, const OpalMediaCommand &command)
The receipt of SETUP/INVITE has been acknowledged.
Definition: connection.h:526
Gatekeeper has cleared call.
Definition: connection.h:372
const OpalProductInfo & GetProductInfo() const
Definition: connection.h:1482
unsigned GetMinAudioJitterDelay() const
Definition: connection.h:1656
Definition: connection.h:1865
virtual OpalMediaType::AutoStartMode GetAutoStart(const OpalMediaType &mediaType) const
__inline bool IsReleased() const
Return true if connection is in the established phase.
Definition: connection.h:546
const StringOptions & GetStringOptions() const
Get the string options associated with this connection.
Definition: connection.h:1710
virtual void OnApplyStringOptions()
Call back for connection to act on changed string options.
const PTime & GetSetupUpTime() const
Definition: connection.h:1464
Definition: transports.h:149
BYTE t35Extension
Definition: connection.h:328
PSyncPoint userInputAvailable
Definition: connection.h:1812
PString userInputString
Definition: connection.h:1811
Connection is in the process of being forwarded.
Definition: connection.h:530
virtual unsigned GetNextSessionID(const OpalMediaType &mediaType, bool isSource)
virtual void SetCallEndReason(CallEndReason reason)
virtual void StartMediaStreams()
virtual void PauseMediaStreams(bool paused)
virtual bool OnSwitchingFaxMediaStreams(bool toT38)
void ExtractFromURL(PURL &url)
PNotifier m_recordAudioNotifier
Definition: connection.h:1855
Remote endpoint application cleared call.
Definition: connection.h:366
__inline int AsInteger() const
Definition: connection.h:407
virtual void AttachRFC2833HandlerToPatch(PBoolean isSource, OpalMediaPatch &patch)
virtual bool SendVideoUpdatePicture(unsigned sessionID=0, bool force=false) const
Definition: connection.h:456
virtual OpalMediaFormatList GetMediaFormats() const
virtual void CloseMediaStreams()
PBoolean originating
Definition: connection.h:1796
virtual bool GarbageCollection()
virtual PBoolean SetAudioVolume(PBoolean source, unsigned percentage)
Definition: connection.h:1906
StringOptions m_stringOptions
Definition: connection.h:1851
virtual void DisableRecording()
Call failed as could not find user (in GK)
Definition: connection.h:373
OpalMediaType::AutoStartMode GetAutoStart(const OpalMediaType &mediaType) const
The remote failed temporarily app may retry.
Definition: connection.h:385
virtual void OnStartMediaPatch(OpalMediaPatch &patch)
Definition: connection.h:362
Definition: connection.h:439
PDICTIONARY(MediaAddressesDict, POrdinalKey, OpalTransportAddress)
virtual PBoolean OnOpenMediaStream(OpalMediaStream &stream)
Definition: connection.h:1312
virtual PString ReadUserInput(const char *terminators="#\r\n", unsigned lastDigitTimeout=4, unsigned firstDigitTimeout=30)
Definition: connection.h:312
The remote ended the call with unmapped Q.931 cause code.
Definition: connection.h:386
virtual PBoolean SetAlerting(const PString &calleeName, PBoolean withMedia)=0
const PString & GetRemotePartyAddress() const
Definition: connection.h:1544
Definition: connection.h:449
virtual void AutoStartMediaStreams(bool force=false)
Definition: connection.h:455
Remote endpoint busy.
Definition: connection.h:380
virtual PBoolean IsMediaBypassPossible(unsigned sessionID) const