OPAL  Version 3.18.8
transports.h
Go to the documentation of this file.
1 /*
2  * transport.h
3  *
4  * Transport declarations
5  *
6  * Open Phone Abstraction Library (OPAL)
7  * Formally known as the Open H323 project.
8  *
9  * Copyright (c) 2001 Equivalence Pty. Ltd.
10  * Portions Copyright (C) 2006 by Post Increment
11  *
12  * The contents of this file are subject to the Mozilla Public License
13  * Version 1.0 (the "License"); you may not use this file except in
14  * compliance with the License. You may obtain a copy of the License at
15  * http://www.mozilla.org/MPL/
16  *
17  * Software distributed under the License is distributed on an "AS IS"
18  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
19  * the License for the specific language governing rights and limitations
20  * under the License.
21  *
22  * The Original Code is Open Phone Abstraction Library.
23  *
24  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
25  *
26  * Contributor(s): Post Increment
27  * Portions of this code were written with the assistance of funding from
28  * US Joint Forces Command Joint Concept Development & Experimentation (J9)
29  * http://www.jfcom.mil/about/abt_j9.htm
30  */
31 
32 #ifndef OPAL_OPAL_TRANSPORT_H
33 #define OPAL_OPAL_TRANSPORT_H
34 
35 #ifdef P_USE_PRAGMA
36 #pragma interface
37 #endif
38 
39 #include <opal_config.h>
40 
41 #include <ptlib/sockets.h>
42 #include <ptclib/psockbun.h>
43 #include <ptclib/http.h>
44 
45 
46 class OpalManager;
47 class OpalEndPoint;
48 class OpalListener;
49 class OpalTransport;
51 
52 typedef PSafePtr<OpalTransport> OpalTransportPtr;
53 
54 
56 
151 class OpalTransportAddress : public PCaselessString
152 {
153  PCLASSINFO(OpalTransportAddress, PCaselessString);
154  public:
155  static const PCaselessString & IpPrefix();
156  static const PCaselessString & UdpPrefix();
157  static const PCaselessString & TcpPrefix();
158 #if OPAL_PTLIB_SSL
159  static const PCaselessString & TlsPrefix();
160 #if OPAL_PTLIB_HTTP
161  static const PCaselessString & WsPrefix(); // RFC6455 WebSocket (yes, still needs SSL)
162  static const PCaselessString & WssPrefix(); // RFC6455 WebSocket over TLS
163 #endif
164 #endif
165 
170  const char * address,
171  WORD port = 0,
172  const char * proto = NULL
173  );
175  const PString & address,
176  WORD port = 0,
177  const char * proto = NULL
178  );
180  const PIPSocket::Address & ip,
181  WORD port = 0,
182  const char * proto = NULL
183  );
185  const PIPSocket::AddressAndPort & ap,
186  const char * proto = NULL
187  );
188 
190  virtual PObject * Clone() const { return new OpalTransportAddress(*this); }
192 
200  PBoolean IsEquivalent(
201  const OpalTransportAddress & address,
202  bool wildcards = false
203  ) const;
204 
207  PBoolean IsCompatible(
208  const OpalTransportAddress & address
209  ) const;
210 
213  PCaselessString GetProtoPrefix() const { return Left(Find('$')+1); }
214 
215  // For backward compatibility
216  PCaselessString GetProto(bool withDollar = false) const { return Left(Find('$')+(withDollar?1:0)); }
217 
221  PBoolean GetIpAddress(PIPSocket::Address & ip) const;
222 
226  PBoolean GetIpAndPort(PIPSocket::Address & ip, WORD & port) const;
227  PBoolean GetIpAndPort(PIPSocketAddressAndPort & ipPort) const;
228 
232  virtual PString GetHostName(
233  bool includeService = false
234  ) const;
235 
236  enum BindOptions {
244  };
245 
278  OpalEndPoint & endpoint,
279  BindOptions option
280  ) const;
281 
309  virtual OpalTransport * CreateTransport(
310  OpalEndPoint & endpoint,
311  BindOptions option = HostOnly
312  ) const;
314 
315 
316  protected:
318  WORD port,
319  const char * proto
320  );
321 
323 };
324 
325 
326 class OpalTransportAddressArray : public PArray<OpalTransportAddress>
327 {
328  typedef PArray<OpalTransportAddress> ParentClass;
329  PCLASSINFO_WITH_CLONE(OpalTransportAddressArray, ParentClass);
330 
331  public:
332  OpalTransportAddressArray(PINDEX initialSize = 0)
333  : ParentClass(initialSize) { }
335  const PString & address
336  ) { AppendString(address); }
338  const OpalTransportAddress & address
339  ) { AppendAddress(address); }
341  const PCollection & coll
342  ) { AppendStringCollection(coll); }
343 
345  bool AppendAddress(
346  const OpalTransportAddress & address,
347  bool unique = false
348  );
349 
361  bool AppendString(
362  const PString & address
363  );
364 
371  const PCollection & coll
372  );
373 
375  bool SetAddressPair(
376  const OpalTransportAddress & addr1,
377  const OpalTransportAddress & addr2
378  );
379 
385  void GetIpAndPort(
386  PINDEX index,
387  PIPAddressAndPort & ap
388  );
389 
390  protected:
391  bool AddInterfaces(const PIPAddress & network, const PIPAddress & mask, const PString & portStr);
392 };
393 
394 
395 
396 
398 
411 class OpalListener : public PObject
412 {
413  PCLASSINFO(OpalListener, PObject);
414  public:
419  OpalListener(
420  OpalEndPoint & endpoint
421  );
423 
428  void PrintOn(
429  ostream & strm
430  ) const;
432 
435  enum ThreadMode {
439  };
440 
441  typedef PNotifierTemplate<const OpalTransportPtr &> AcceptHandler;
442  #define PDECLARE_AcceptHandlerNotifier(cls, fn) PDECLARE_NOTIFIER2(OpalListener, cls, fn, const OpalTransportPtr &)
443 
458  virtual bool Open(
459  const AcceptHandler & acceptHandler,
461  );
462 
465  virtual bool IsOpen() const = 0;
466 
469  virtual void Close() = 0;
470 
471 #if OPAL_PTLIB_NAT
472 
474  virtual bool ChangedNAT() { return true; }
475 #endif // OPAL_PTLIB_NAT
476 
479  virtual OpalTransport * Accept(
480  const PTimeInterval & timeout
481  ) = 0;
482 
485  virtual OpalTransport * CreateTransport(
486  const OpalTransportAddress & localAddress,
487  const OpalTransportAddress & remoteAddress
488  ) const = 0;
489 
496  const OpalTransportAddress & remoteAddress = OpalTransportAddress(),
497  const OpalTransportAddress & defaultAddress = OpalTransportAddress() // If INADDR_ANY
498  ) const = 0;
499 
502  void CloseWait();
503 
509 
510  virtual const PCaselessString & GetProtoPrefix() const = 0;
511 
512  protected:
521  void ListenForConnections();
522  void TransportThreadMain(OpalTransportPtr transport);
523 
525  PThread * m_thread;
528 
529  private:
530  OpalListener(const OpalListener & other) : PObject(other), m_endpoint(other.m_endpoint) { }
531  void operator=(const OpalListener &) { }
532 
533  friend class OpalHTTPConnector;
534 };
535 
536 
537 PLIST(OpalListenerList, OpalListener);
538 
539 
541 {
542  PCLASSINFO(OpalListenerIP, OpalListener);
543  public:
549  OpalEndPoint & endpoint,
550  PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
551  WORD port = 0,
552  PBoolean exclusive = true
553  );
555  OpalEndPoint & endpoint,
556  const OpalTransportAddress & binding,
558  );
560 
569  const OpalTransportAddress & remoteAddress = OpalTransportAddress(),
570  const OpalTransportAddress & defaultAddress = OpalTransportAddress() // If INADDR_ANY
571  ) const;
573 
576  WORD GetListenerPort() const { return m_binding.GetPort(); }
578 
579 
580  protected:
581  bool CanCreateTransport(
582  const OpalTransportAddress & localAddress,
583  const OpalTransportAddress & remoteAddress
584  ) const;
585 
586  PIPSocketAddressAndPort m_binding;
588 };
589 
590 
592 {
593  PCLASSINFO(OpalListenerTCP, OpalListenerIP);
594  public:
600  OpalEndPoint & endpoint,
601  PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
602  WORD port = 0,
603  PBoolean exclusive = true
604  );
606  OpalEndPoint & endpoint,
607  const OpalTransportAddress & binding,
609  );
610 
615 
638  virtual bool Open(
639  const AcceptHandler & acceptHandler,
641  );
642 
645  virtual bool IsOpen() const;
646 
649  virtual void Close();
650 
653  virtual OpalTransport * Accept(
654  const PTimeInterval & timeout
655  );
656 
659  virtual OpalTransport * CreateTransport(
660  const OpalTransportAddress & localAddress,
661  const OpalTransportAddress & remoteAddress
662  ) const;
664 
665 
666  protected:
667  virtual const PCaselessString & GetProtoPrefix() const;
668  virtual OpalTransport * OnAccept(PTCPSocket * socket);
669 
670  PTCPSocket m_listener;
671 };
672 
673 
675 {
676  PCLASSINFO(OpalListenerUDP, OpalListenerIP);
677  public:
683  OpalEndPoint & endpoint,
684  PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
685  WORD port = 0,
686  PBoolean exclusive = true
687  );
689  OpalEndPoint & endpoint,
690  const OpalTransportAddress & binding,
692  );
693 
698 
721  virtual bool Open(
722  const AcceptHandler & acceptHandler,
724  );
725 
728  virtual bool IsOpen() const;
729 
732  virtual void Close();
733 
734 #if OPAL_PTLIB_NAT
735 
737  virtual bool ChangedNAT();
738 #endif // OPAL_PTLIB_NAT
739 
742  virtual OpalTransport * Accept(
743  const PTimeInterval & timeout
744  );
745 
748  virtual OpalTransport * CreateTransport(
749  const OpalTransportAddress & localAddress,
750  const OpalTransportAddress & remoteAddress
751  ) const;
752 
759  const OpalTransportAddress & remoteAddress = OpalTransportAddress(),
760  const OpalTransportAddress & defaultAddress = OpalTransportAddress() // If INADDR_ANY
761  ) const;
763 
769  PINDEX size
770  ) { m_bufferSize = size; }
772 
773 
774  protected:
775  virtual const PCaselessString & GetProtoPrefix() const;
776 
777  PMonitoredSocketsPtr m_listenerBundle;
778  PINDEX m_bufferSize;
779 };
780 
781 
783 
788 class OpalTransport : public PSafeObject
789 {
790  PCLASSINFO(OpalTransport, PSafeObject);
791  protected:
796  OpalTransport(OpalEndPoint & endpoint, PChannel * channel);
797 
798  public:
801  ~OpalTransport();
803 
808  void PrintOn(
809  ostream & strm
810  ) const;
811 
826  virtual PBoolean Write(
827  const void * buf,
828  PINDEX len
829  );
831 
836  virtual PBoolean IsReliable() const = 0;
837 
841  virtual bool IsAuthenticated(
842  const PString & /*domain*/
843  ) const { return true; }
844 
851  virtual PString GetInterface() const = 0;
852 
859  virtual bool SetInterface(
860  const PString & iface
861  );
862 
865  virtual OpalTransportAddress GetLocalAddress() const = 0;
866 
869  virtual OpalTransportAddress GetRemoteAddress() const = 0;
870 
876  virtual PBoolean SetRemoteAddress(
877  const OpalTransportAddress & address
878  ) = 0;
879 
882  virtual PBoolean Connect() = 0;
883 
886  PBoolean ConnectTo(
887  const OpalTransportAddress & address
888  ) { return SetRemoteAddress(address) && Connect(); }
889 
892  virtual PBoolean Close();
893 
896  void CloseWait();
897 
902 
905  virtual PBoolean IsCompatibleTransport(
906  const OpalTransportAddress & address
907  ) const = 0;
908 
915  };
916 
927  virtual void SetPromiscuous(
928  PromisciousModes promiscuous
929  );
930 
936 
941  virtual PString GetLastReceivedInterface() const;
942 
952  virtual PBoolean ReadPDU(
953  PBYTEArray & packet
954  ) = 0;
955 
961  virtual PBoolean WritePDU(
962  const PBYTEArray & pdu
963  ) = 0;
964 
965  typedef PNotifierTemplate<bool &> WriteConnectCallback;
966  #define PDECLARE_WriteConnectCallback(cls, fn) PDECLARE_NOTIFIER2(OpalTransport, cls, fn, bool &)
967 
980  virtual bool WriteConnect(
981  const WriteConnectCallback & function
982  );
983 
993  void SetKeepAlive(
994  const PTimeInterval & timeout,
995  const PBYTEArray & data
996  );
997 
999  bool HasKeepAlive() const { return !m_keepAliveData.IsEmpty() && m_keepAliveTimer.IsRunning(); }
1000 
1003  virtual void AttachThread(
1004  PThread * thread
1005  );
1006 
1009  virtual PBoolean IsRunning() const;
1011 
1012  OpalEndPoint & GetEndPoint() const { return m_endpoint; }
1013 
1016  virtual const PCaselessString & GetProtoPrefix() const = 0;
1017 
1018  bool IsOpen() const;
1019  bool IsGood() const;
1020  PChannel::Errors GetErrorCode(PChannel::ErrorGroup group = PChannel::NumErrorGroups) const;
1021  PString GetErrorText(PChannel::ErrorGroup group = PChannel::NumErrorGroups) const;
1022  int GetErrorNumber(PChannel::ErrorGroup group = PChannel::NumErrorGroups) const;
1023  void SetReadTimeout(const PTimeInterval & t);
1024 
1025  PChannel * GetChannel() const { return m_channel; }
1026 
1027  bool IsIdle() const { return m_referenceCount == 0 && m_idleTimer.HasExpired(); }
1028  void ResetIdle();
1029 
1032 
1033  protected:
1034  PDECLARE_NOTIFIER(PTimer, OpalTransport, KeepAlive);
1035 
1037  PChannel * m_channel;
1038  PThread * m_thread;
1039  PCriticalSection m_threadMutex;
1041  PBYTEArray m_keepAliveData;
1042  PSimpleTimer m_idleTimer;
1043  atomic<unsigned> m_referenceCount;
1044 
1045  private:
1046  OpalTransport(const OpalTransport & other) : PSafeObject(other), m_endpoint(other.m_endpoint), m_referenceCount(0) { }
1047  void operator=(const OpalTransport &) { }
1048 };
1049 
1050 
1052 {
1053  PCLASSINFO(OpalTransportIP, OpalTransport);
1054  protected:
1060  OpalEndPoint & endpoint,
1061  PChannel * channel,
1062  PIPSocket::Address binding,
1063  WORD port
1064  );
1066 
1067  public:
1072  virtual PString GetInterface() const;
1073 
1076  virtual OpalTransportAddress GetLocalAddress() const;
1077 
1080  virtual OpalTransportAddress GetRemoteAddress() const;
1081 
1087  virtual PBoolean SetRemoteAddress(
1088  const OpalTransportAddress & address
1089  );
1090 
1092 
1093  protected:
1096  virtual const PCaselessString & GetProtoPrefix() const = 0;
1097 
1098  PIPAddress m_binding;
1099  PIPSocketAddressAndPort m_localAP; // Address of the local (NAT adjusted)
1100  PIPSocketAddressAndPort m_remoteAP; // Address of the remote host
1101 };
1102 
1103 
1105 {
1106  PCLASSINFO(OpalTransportTCP, OpalTransportIP);
1107  public:
1113  OpalEndPoint & endpoint,
1114  PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1115  WORD port = 0,
1116  bool dummy = false
1117  );
1119  OpalEndPoint & endpoint,
1120  PChannel * socket
1121  );
1122 
1126 
1131  virtual PBoolean IsReliable() const;
1132 
1135  virtual PBoolean IsCompatibleTransport(
1136  const OpalTransportAddress & address
1137  ) const;
1138 
1141  virtual PBoolean Connect();
1142 
1152  virtual PBoolean ReadPDU(
1153  PBYTEArray & pdu
1154  );
1155 
1161  virtual PBoolean WritePDU(
1162  const PBYTEArray & pdu
1163  );
1165 
1179  void SetPDULengthFormat(int fmt,int off)
1180  {
1181  m_pduLengthFormat = fmt;
1182  m_pduLengthOffset = off;
1183  }
1184 
1185  protected:
1188  virtual const PCaselessString & GetProtoPrefix() const;
1189 
1190  bool OnConnectedSocket(PTCPSocket * socket);
1191 
1194 };
1195 
1196 
1198 {
1199  PCLASSINFO(OpalTransportUDP, OpalTransportIP);
1200  public:
1206  OpalEndPoint & endpoint,
1207  PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1208  WORD port = 0,
1209  bool reuseAddr = false,
1210  bool preOpen = false
1211  );
1212 
1216  OpalEndPoint & endpoint,
1217  const PMonitoredSocketsPtr & sockets,
1218  const PString & iface,
1219  const OpalTransportAddress & remoteAddress
1220  );
1221 
1225 
1228  virtual PBoolean Read(
1229  void * buffer,
1230  PINDEX length
1231  );
1233 
1238  virtual PBoolean IsReliable() const;
1239 
1242  virtual PBoolean IsCompatibleTransport(
1243  const OpalTransportAddress & address
1244  ) const;
1245 
1253  virtual PBoolean Connect();
1254 
1257  virtual PString GetInterface() const;
1258 
1265  virtual bool SetInterface(
1266  const PString & iface
1267  );
1268 
1271  virtual OpalTransportAddress GetLocalAddress() const;
1272 
1278  virtual PBoolean SetRemoteAddress(
1279  const OpalTransportAddress & address
1280  );
1281 
1293  virtual void SetPromiscuous(
1294  PromisciousModes promiscuous
1295  );
1296 
1302 
1307  virtual PString GetLastReceivedInterface() const;
1308 
1318  virtual PBoolean ReadPDU(
1319  PBYTEArray & packet
1320  );
1321 
1327  virtual PBoolean WritePDU(
1328  const PBYTEArray & pdu
1329  );
1330 
1341  virtual bool WriteConnect(
1342  const WriteConnectCallback & function
1343  );
1344 
1348  PINDEX size
1349  ) { m_bufferSize = size; }
1351 
1352  protected:
1355  virtual const PCaselessString & GetProtoPrefix() const;
1356 
1359  PBYTEArray m_preReadPacket;
1361 
1362  friend class OpalListenerUDP;
1363 };
1364 
1365 
1367 
1368 class OpalInternalTransport : public PObject
1369 {
1370  PCLASSINFO(OpalInternalTransport, PObject);
1371  public:
1372  virtual bool Parse(
1373  OpalTransportAddress & address,
1374  WORD port
1375  ) const = 0;
1376 
1377  virtual PString GetHostName(
1378  const OpalTransportAddress & address,
1379  bool includeService
1380  ) const;
1381 
1382  virtual PBoolean GetIpAndPort(
1383  const OpalTransportAddress & address,
1384  PIPSocket::Address & ip,
1385  WORD & port
1386  ) const;
1387 
1388  virtual OpalListener * CreateListener(
1389  const OpalTransportAddress & address,
1390  OpalEndPoint & endpoint,
1392  ) const = 0;
1393 
1394  virtual OpalTransport * CreateTransport(
1395  const OpalTransportAddress & address,
1396  OpalEndPoint & endpoint,
1398  ) const = 0;
1399 };
1400 
1401 
1403 
1405 {
1407  public:
1408  virtual bool Parse(
1409  OpalTransportAddress & address,
1410  WORD port
1411  ) const;
1412  virtual PString GetHostName(
1413  const OpalTransportAddress & address,
1414  bool includeService
1415  ) const;
1416  virtual PBoolean GetIpAndPort(
1417  const OpalTransportAddress & address,
1418  PIPSocket::Address & ip,
1419  WORD & port
1420  ) const;
1421 
1422  static PBoolean GetAdjustedIpAndPort(const OpalTransportAddress & address,
1423  OpalEndPoint & endpoint,
1425  PIPSocketAddressAndPort & ap,
1426  PBoolean & reuseAddr);
1427 };
1428 
1429 template <class ListenerType, class TransportType, unsigned AltTypeOption, class AltTypeClass>
1431 {
1432  public:
1434  const OpalTransportAddress & address,
1435  OpalEndPoint & endpoint,
1437  ) const
1438  {
1439  return new ListenerType(endpoint, address, options);
1440  }
1441 
1443  const OpalTransportAddress & address,
1444  OpalEndPoint & endpoint,
1446  ) const
1447  {
1448  PIPSocketAddressAndPort ap;
1449  PBoolean reuseAddr;
1450  if (GetAdjustedIpAndPort(address, endpoint, options, ap, reuseAddr)) {
1451  if (options == AltTypeOption)
1452  return new AltTypeClass(endpoint, ap.GetAddress(), 0, reuseAddr);
1453  else
1454  return new TransportType(endpoint, ap.GetAddress(), 0, reuseAddr);
1455  }
1456  return NULL;
1457  }
1458 };
1459 
1462 
1463 
1465 
1466 
1467 #if OPAL_PTLIB_SSL
1468 
1469 class PSSLContext;
1470 class PSSLChannel;
1471 
1472 class OpalListenerTLS : public OpalListenerTCP
1473 {
1474  PCLASSINFO(OpalListenerTLS, OpalListenerTCP);
1475  public:
1476  OpalListenerTLS(
1477  OpalEndPoint & endpoint,
1478  PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1479  WORD port = 0,
1480  PBoolean exclusive = true
1481  );
1482  OpalListenerTLS(
1483  OpalEndPoint & endpoint,
1484  const OpalTransportAddress & binding,
1486  );
1487 
1490  ~OpalListenerTLS();
1491 
1492  virtual PBoolean Open(const AcceptHandler & acceptHandler, ThreadMode mode = SpawnNewThreadMode);
1493  virtual const PCaselessString & GetProtoPrefix() const;
1494  virtual OpalTransport * CreateTransport(
1495  const OpalTransportAddress & localAddress,
1496  const OpalTransportAddress & remoteAddress
1497  ) const;
1498 
1499  protected:
1500  virtual OpalTransport * OnAccept(PTCPSocket * socket);
1501 
1502  PSSLContext * m_sslContext;
1503 };
1504 
1505 
1506 class OpalTransportTLS : public OpalTransportTCP
1507 {
1508  PCLASSINFO(OpalTransportTLS, OpalTransportTCP);
1509  public:
1510  OpalTransportTLS(
1511  OpalEndPoint & endpoint,
1512  PChannel * ssl
1513  );
1514 
1515  OpalTransportTLS(
1516  OpalEndPoint & endpoint,
1517  PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1518  WORD port = 0,
1519  bool dummy = false
1520  );
1521 
1523  ~OpalTransportTLS();
1524 
1525  // Overrides
1526  virtual PBoolean IsCompatibleTransport(const OpalTransportAddress & address) const;
1527  virtual PBoolean Connect();
1528  virtual const PCaselessString & GetProtoPrefix() const;
1529  virtual bool IsAuthenticated(const PString & domain) const;
1530 };
1531 
1532 
1534 
1535 typedef OpalTransportTLS OpalTransportTCPS; // For backward compatibility
1536 typedef OpalListenerTLS OpalListenerTCPS;
1537 
1538 
1540 
1541 #if OPAL_PTLIB_HTTP
1542 
1543 class OpalListenerWS : public OpalListenerTCP
1544 {
1545  PCLASSINFO(OpalListenerWS, OpalListenerTCP);
1546 public:
1551  OpalListenerWS(
1552  OpalEndPoint & endpoint,
1553  PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1554  WORD port = 0,
1555  bool exclusive = true
1556  );
1557  OpalListenerWS(
1558  OpalEndPoint & endpoint,
1559  const OpalTransportAddress & binding,
1561  );
1562 
1565  virtual OpalTransport * CreateTransport(
1566  const OpalTransportAddress & localAddress,
1567  const OpalTransportAddress & remoteAddress
1568  ) const;
1569 
1570 protected:
1571  virtual const PCaselessString & GetProtoPrefix() const;
1572  virtual OpalTransport * OnAccept(PTCPSocket * socket);
1573 };
1574 
1575 
1576 class OpalListenerWSS : public OpalListenerTLS
1577 {
1578  PCLASSINFO(OpalListenerWSS, OpalListenerTLS);
1579 public:
1580  OpalListenerWSS(
1581  OpalEndPoint & endpoint,
1582  PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1583  WORD port = 0,
1584  PBoolean exclusive = true
1585  );
1586  OpalListenerWSS(
1587  OpalEndPoint & endpoint,
1588  const OpalTransportAddress & binding,
1590  );
1591 
1592  virtual const PCaselessString & GetProtoPrefix() const;
1593 
1594 protected:
1595  virtual OpalTransport * OnAccept(PTCPSocket * socket);
1596 };
1597 
1598 
1599 class OpalTransportWS : public OpalTransportTCP
1600 {
1601  PCLASSINFO(OpalTransportWS, OpalTransportTCP);
1602 public:
1603  OpalTransportWS(
1604  OpalEndPoint & endpoint,
1605  PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1606  WORD port = 0,
1607  bool dummy = false
1608  );
1609  OpalTransportWS(
1610  OpalEndPoint & endpoint,
1611  PChannel * socket
1612  );
1613 
1616  virtual PBoolean Connect();
1617 
1627  virtual PBoolean ReadPDU(
1628  PBYTEArray & pdu
1629  );
1630 
1636  virtual PBoolean WritePDU(
1637  const PBYTEArray & pdu
1638  );
1639 
1640  virtual PBoolean IsCompatibleTransport(const OpalTransportAddress & address) const;
1641  virtual const PCaselessString & GetProtoPrefix() const;
1642 };
1643 
1644 
1645 class OpalTransportWSS : public OpalTransportTLS
1646 {
1647  PCLASSINFO(OpalTransportWSS, OpalTransportTLS);
1648 public:
1649  OpalTransportWSS(
1650  OpalEndPoint & endpoint,
1651  PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1652  WORD port = 0,
1653  bool dummy = false
1654  );
1655  OpalTransportWSS(
1656  OpalEndPoint & endpoint,
1657  PChannel * socket
1658  );
1659 
1662  virtual PBoolean Connect();
1663 
1673  virtual PBoolean ReadPDU(
1674  PBYTEArray & pdu
1675  );
1676 
1682  virtual PBoolean WritePDU(
1683  const PBYTEArray & pdu
1684  );
1685 
1686  virtual PBoolean IsCompatibleTransport(const OpalTransportAddress & address) const;
1687  virtual const PCaselessString & GetProtoPrefix() const;
1688 };
1689 
1690 
1693 
1694 
1695 class OpalHTTPConnector : public PHTTPResource
1696 {
1697  PCLASSINFO(OpalHTTPConnector, PHTTPResource)
1698  public:
1699  OpalHTTPConnector(
1700  OpalManager & manager,
1701  const PURL & url
1702  );
1703  OpalHTTPConnector(
1704  OpalManager & manager,
1705  const PURL & url,
1706  const PHTTPAuthority & auth
1707  );
1708 
1709  virtual bool OnWebSocket(PHTTPServer & server, PHTTPConnectionInfo & connectInfo);
1710 
1711  protected:
1712  OpalManager & m_manager;
1713 };
1714 
1715 
1716 #endif // OPAL_PTLIB_HTTP
1717 #endif // OPAL_PTLIB_SSL
1718 
1719 
1720 #endif // OPAL_OPAL_TRANSPORT_H
1721 
1722 
1723 // End of File ///////////////////////////////////////////////////////////////
virtual PString GetInterface() const
virtual bool Open(const AcceptHandler &acceptHandler, ThreadMode mode=SpawnNewThreadMode)
Definition: transports.h:1051
static const PCaselessString & IpPrefix()
Definition: manager.h:150
static PBoolean GetAdjustedIpAndPort(const OpalTransportAddress &address, OpalEndPoint &endpoint, OpalTransportAddress::BindOptions option, PIPSocketAddressAndPort &ap, PBoolean &reuseAddr)
void SetKeepAlive(const PTimeInterval &timeout, const PBYTEArray &data)
static const PCaselessString & TcpPrefix()
Definition: endpoint.h:65
virtual PBoolean IsRunning() const
ThreadMode m_threadMode
Definition: transports.h:527
virtual void Close()
virtual void AttachThread(PThread *thread)
bool AppendAddress(const OpalTransportAddress &address, bool unique=false)
Append one address to array.
OpalEndPoint & m_endpoint
Definition: transports.h:524
Definition: transports.h:437
PMonitoredSocketsPtr m_listenerBundle
Definition: transports.h:777
virtual const PCaselessString & GetProtoPrefix() const =0
void Reference()
Definition: transports.h:1030
~OpalTransportUDP()
Destroy the UDP channel.
bool IsGood() const
virtual OpalTransportAddress GetLocalAddress() const
OpalTransportAddressArray(const PCollection &coll)
Definition: transports.h:340
virtual OpalTransport * Accept(const PTimeInterval &timeout)
OpalInternalIPTransportTemplate< OpalListenerTCP, OpalTransportTCP, OpalTransportAddress::Datagram, OpalTransportUDP > OpalInternalTCPTransport
Definition: transports.h:1460
virtual PBoolean Write(const void *buf, PINDEX len)
virtual PBoolean WritePDU(const PBYTEArray &pdu)=0
virtual PBoolean GetIpAndPort(const OpalTransportAddress &address, PIPSocket::Address &ip, WORD &port) const
virtual OpalTransportAddress GetRemoteAddress() const =0
virtual bool Open(const AcceptHandler &acceptHandler, ThreadMode mode=SpawnNewThreadMode)
virtual OpalTransport * Accept(const PTimeInterval &timeout)=0
virtual const PCaselessString & GetProtoPrefix() const
void ListenForConnections()
virtual OpalListener * CreateListener(const OpalTransportAddress &address, OpalEndPoint &endpoint, OpalTransportAddress::BindOptions options) const =0
virtual PString GetInterface() const
virtual PString GetHostName(const OpalTransportAddress &address, bool includeService) const
virtual OpalTransport * CreateTransport(const OpalTransportAddress &address, OpalEndPoint &endpoint, OpalTransportAddress::BindOptions options) const =0
PChannel * GetChannel() const
Definition: transports.h:1025
static const PCaselessString & UdpPrefix()
Definition: transports.h:238
bool m_exclusiveListener
Definition: transports.h:587
virtual bool Parse(OpalTransportAddress &address, WORD port) const =0
bool m_preReadOK
Definition: transports.h:1360
virtual const PCaselessString & GetProtoPrefix() const
Definition: transports.h:788
OpalTransportAddressArray(const PString &address)
Definition: transports.h:334
int m_pduLengthOffset
Definition: transports.h:1193
PCaselessString GetProto(bool withDollar=false) const
Definition: transports.h:216
virtual PBoolean Connect()
PINDEX m_bufferSize
Definition: transports.h:778
PCriticalSection m_threadMutex
Definition: transports.h:1039
Definition: transports.h:911
virtual const PCaselessString & GetProtoPrefix() const =0
OpalListenerUDP(OpalEndPoint &endpoint, PIPSocket::Address binding=PIPSocket::GetDefaultIpAny(), WORD port=0, PBoolean exclusive=true)
virtual bool Open(const AcceptHandler &acceptHandler, ThreadMode mode=SpawnNewThreadMode)
PBoolean ConnectTo(const OpalTransportAddress &address)
Definition: transports.h:886
void CloseWait()
virtual OpalTransportAddress GetLocalAddress(const OpalTransportAddress &remoteAddress=OpalTransportAddress(), const OpalTransportAddress &defaultAddress=OpalTransportAddress()) const
PBYTEArray m_keepAliveData
Definition: transports.h:1041
Definition: transports.h:242
PIPSocketAddressAndPort m_localAP
Definition: transports.h:1099
virtual OpalTransport * CreateTransport(const OpalTransportAddress &localAddress, const OpalTransportAddress &remoteAddress) const
void GetIpAndPort(PINDEX index, PIPAddressAndPort &ap)
Definition: transports.h:674
OpalTransport * CreateTransport(const OpalTransportAddress &address, OpalEndPoint &endpoint, OpalTransportAddress::BindOptions options) const
Definition: transports.h:1442
OpalTransportIP(OpalEndPoint &endpoint, PChannel *channel, PIPSocket::Address binding, WORD port)
PBYTEArray m_preReadPacket
Definition: transports.h:1359
virtual OpalTransport * CreateTransport(const OpalTransportAddress &localAddress, const OpalTransportAddress &remoteAddress) const =0
virtual OpalTransport * CreateTransport(const OpalTransportAddress &localAddress, const OpalTransportAddress &remoteAddress) const
PBoolean IsCompatible(const OpalTransportAddress &address) const
PromisciousModes
Definition: transports.h:910
bool IsIdle() const
Definition: transports.h:1027
Definition: transports.h:1104
virtual PBoolean IsReliable() const
virtual PBoolean IsCompatibleTransport(const OpalTransportAddress &address) const
OpalTransportTCP(OpalEndPoint &endpoint, PIPSocket::Address binding=PIPSocket::GetDefaultIpAny(), WORD port=0, bool dummy=false)
Definition: transports.h:239
virtual PString GetLastReceivedInterface() const
OpalInternalIPTransportTemplate< OpalListenerUDP, OpalTransportUDP, OpalTransportAddress::Streamed, OpalTransportTCP > OpalInternalUDPTransport
Definition: transports.h:1461
Definition: transports.h:240
virtual bool IsOpen() const
virtual bool WriteConnect(const WriteConnectCallback &function)
virtual PBoolean Connect()
int m_pduLengthFormat
Definition: transports.h:1192
virtual bool Parse(OpalTransportAddress &address, WORD port) const
Definition: transports.h:411
bool AppendStringCollection(const PCollection &coll)
virtual const PCaselessString & GetProtoPrefix() const =0
PNotifierTemplate< bool & > WriteConnectCallback
Definition: transports.h:965
PChannel::Errors GetErrorCode(PChannel::ErrorGroup group=PChannel::NumErrorGroups) const
virtual PBoolean SetRemoteAddress(const OpalTransportAddress &address)=0
PBoolean GetIpAddress(PIPSocket::Address &ip) const
PTimer m_keepAliveTimer
Definition: transports.h:1040
PBoolean GetIpAndPort(PIPSocket::Address &ip, WORD &port) const
Definition: transports.h:913
virtual PBoolean IsReliable() const =0
Definition: transports.h:241
PThread * m_thread
Thread handling the transport.
Definition: transports.h:1038
void PrintOn(ostream &strm) const
bool IsOpen() const
void CleanUpOnTermination()
Definition: transports.h:901
void ResetIdle()
virtual PBoolean SetRemoteAddress(const OpalTransportAddress &address)
Definition: transports.h:243
OpalTransportAddressArray(const OpalTransportAddress &address)
Definition: transports.h:337
Definition: transports.h:912
virtual OpalTransport * Accept(const PTimeInterval &timeout)
virtual PString GetInterface() const =0
virtual OpalTransportAddress GetLastReceivedAddress() const
void SetReadTimeout(const PTimeInterval &t)
virtual bool WriteConnect(const WriteConnectCallback &function)
OpalTransportUDP(OpalEndPoint &endpoint, PIPSocket::Address binding=PIPSocket::GetDefaultIpAny(), WORD port=0, bool reuseAddr=false, bool preOpen=false)
OpalListenerIP(OpalEndPoint &endpoint, PIPSocket::Address binding=PIPSocket::GetDefaultIpAny(), WORD port=0, PBoolean exclusive=true)
virtual PBoolean Close()
bool OnConnectedSocket(PTCPSocket *socket)
void SetBufferSize(PINDEX size)
Definition: transports.h:1347
virtual PObject * Clone() const
Clone function.
Definition: transports.h:190
virtual PBoolean GetIpAndPort(const OpalTransportAddress &address, PIPSocket::Address &ip, WORD &port) const
PCaselessString GetProtoPrefix() const
Definition: transports.h:213
virtual PString GetHostName(bool includeService=false) const
PSimpleTimer m_idleTimer
Definition: transports.h:1042
void SetInternalTransport(WORD port, const char *proto)
virtual PBoolean ReadPDU(PBYTEArray &packet)
OpalListener * CreateListener(OpalEndPoint &endpoint, BindOptions option) const
virtual OpalTransportAddress GetLocalAddress(const OpalTransportAddress &remoteAddress=OpalTransportAddress(), const OpalTransportAddress &defaultAddress=OpalTransportAddress()) const
Definition: transports.h:438
virtual void SetPromiscuous(PromisciousModes promiscuous)
void PrintOn(ostream &strm) const
PChannel * m_channel
Definition: transports.h:1037
AcceptHandler m_acceptHandler
Definition: transports.h:526
virtual const PCaselessString & GetProtoPrefix() const
virtual void Close()
Definition: transports.h:1430
void CloseWait()
Definition: transports.h:914
~OpalTransportTCP()
Destroy the TCP channel.
PLIST(H323LogicalChannelList, H323Channel)
virtual PBoolean WritePDU(const PBYTEArray &pdu)
virtual bool SetInterface(const PString &iface)
Definition: transports.h:1404
virtual PBoolean IsCompatibleTransport(const OpalTransportAddress &address) const
virtual PBoolean ReadPDU(PBYTEArray &pdu)
Definition: transports.h:540
virtual bool SetInterface(const PString &iface)
virtual OpalTransportAddress GetLastReceivedAddress() const
PIPAddress m_binding
Definition: transports.h:1098
PString GetErrorText(PChannel::ErrorGroup group=PChannel::NumErrorGroups) const
virtual PBoolean IsReliable() const
virtual bool IsAuthenticated(const PString &) const
Definition: transports.h:841
virtual PString GetHostName(const OpalTransportAddress &address, bool includeService) const
WORD GetListenerPort() const
Definition: transports.h:576
bool HasKeepAlive() const
Indicate keep alive is active.
Definition: transports.h:999
virtual OpalTransport * OnAccept(PTCPSocket *socket)
Definition: transports.h:237
virtual PBoolean SetRemoteAddress(const OpalTransportAddress &address)
virtual PBoolean ReadPDU(PBYTEArray &packet)=0
void Dereference()
Definition: transports.h:1031
virtual bool IsOpen() const
PSafePtr< OpalTransport > OpalTransportPtr
Definition: transports.h:50
PNotifierTemplate< const OpalTransportPtr & > AcceptHandler
Definition: transports.h:441
PINDEX m_bufferSize
Definition: transports.h:1358
Definition: transports.h:436
void TransportThreadMain(OpalTransportPtr transport)
virtual OpalTransportAddress GetLocalAddress() const =0
Definition: transports.h:591
virtual OpalTransportAddress GetLocalAddress() const
virtual OpalTransport * CreateTransport(OpalEndPoint &endpoint, BindOptions option=HostOnly) const
PThread * m_thread
Definition: transports.h:525
bool CanCreateTransport(const OpalTransportAddress &localAddress, const OpalTransportAddress &remoteAddress) const
BindOptions
Definition: transports.h:236
virtual PBoolean WritePDU(const PBYTEArray &pdu)
virtual OpalTransportAddress GetLocalAddress(const OpalTransportAddress &remoteAddress=OpalTransportAddress(), const OpalTransportAddress &defaultAddress=OpalTransportAddress()) const =0
Definition: transports.h:1197
bool AddInterfaces(const PIPAddress &network, const PIPAddress &mask, const PString &portStr)
virtual OpalTransportAddress GetRemoteAddress() const
virtual PString GetLastReceivedInterface() const
virtual const PCaselessString & GetProtoPrefix() const
virtual PBoolean IsCompatibleTransport(const OpalTransportAddress &address) const =0
Promiscious modes for transport.
OpalListener * CreateListener(const OpalTransportAddress &address, OpalEndPoint &endpoint, OpalTransportAddress::BindOptions options) const
Definition: transports.h:1433
virtual void Close()=0
OpalInternalTransport * m_transport
Definition: transports.h:322
PTCPSocket m_listener
Definition: transports.h:670
virtual bool IsOpen() const =0
virtual PBoolean Read(void *buffer, PINDEX length)
Definition: transports.h:1368
ThreadMode
Definition: transports.h:435
PIPSocketAddressAndPort m_remoteAP
Definition: transports.h:1100
void CleanUpOnTermination()
Definition: transports.h:507
OpalEndPoint & GetEndPoint() const
Definition: transports.h:1012
Definition: transports.h:151
Definition: transports.h:326
void SetPDULengthFormat(int fmt, int off)
Definition: transports.h:1179
OpalTransportAddressArray(PINDEX initialSize=0)
Definition: transports.h:332
OpalTransport(OpalEndPoint &endpoint, PChannel *channel)
friend class OpalHTTPConnector
Definition: transports.h:533
atomic< unsigned > m_referenceCount
Definition: transports.h:1043
PBoolean IsEquivalent(const OpalTransportAddress &address, bool wildcards=false) const
OpalEndPoint & m_endpoint
Definition: transports.h:1036
virtual void SetPromiscuous(PromisciousModes promiscuous)
int GetErrorNumber(PChannel::ErrorGroup group=PChannel::NumErrorGroups) const
PIPSocketAddressAndPort m_binding
Definition: transports.h:586
bool SetAddressPair(const OpalTransportAddress &addr1, const OpalTransportAddress &addr2)
Set the array to 1 or 2 entries.
void SetBufferSize(PINDEX size)
Definition: transports.h:768
PDECLARE_NOTIFIER(PTimer, OpalTransport, KeepAlive)
OpalListener(OpalEndPoint &endpoint)
bool AppendString(const PString &address)
virtual PBoolean Connect()=0
OpalListenerTCP(OpalEndPoint &endpoint, PIPSocket::Address binding=PIPSocket::GetDefaultIpAny(), WORD port=0, PBoolean exclusive=true)
OpalManager & m_manager
Definition: transports.h:1357