32 #ifndef OPAL_OPAL_TRANSPORT_H
33 #define OPAL_OPAL_TRANSPORT_H
41 #include <ptlib/sockets.h>
42 #include <ptclib/psockbun.h>
43 #include <ptclib/http.h>
155 static const PCaselessString &
IpPrefix();
156 static const PCaselessString &
UdpPrefix();
157 static const PCaselessString &
TcpPrefix();
159 static const PCaselessString & TlsPrefix();
161 static const PCaselessString & WsPrefix();
162 static const PCaselessString & WssPrefix();
170 const char * address,
172 const char * proto = NULL
175 const PString & address,
177 const char * proto = NULL
180 const PIPSocket::Address & ip,
182 const char * proto = NULL
185 const PIPSocket::AddressAndPort & ap,
186 const char * proto = NULL
202 bool wildcards =
false
216 PCaselessString
GetProto(
bool withDollar =
false)
const {
return Left(Find(
'$')+(withDollar?1:0)); }
226 PBoolean
GetIpAndPort(PIPSocket::Address & ip, WORD & port)
const;
227 PBoolean
GetIpAndPort(PIPSocketAddressAndPort & ipPort)
const;
233 bool includeService =
false
328 typedef PArray<OpalTransportAddress> ParentClass;
333 : ParentClass(initialSize) { }
335 const PString & address
341 const PCollection & coll
362 const PString & address
371 const PCollection & coll
387 PIPAddressAndPort & ap
391 bool AddInterfaces(
const PIPAddress & network,
const PIPAddress & mask,
const PString & portStr);
442 #define PDECLARE_AcceptHandlerNotifier(cls, fn) PDECLARE_NOTIFIER2(OpalListener, cls, fn, const OpalTransportPtr &)
465 virtual bool IsOpen()
const = 0;
469 virtual void Close() = 0;
474 virtual bool ChangedNAT() {
return true; }
475 #endif // OPAL_PTLIB_NAT
480 const PTimeInterval & timeout
550 PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
552 PBoolean exclusive =
true
601 PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
603 PBoolean exclusive =
true
645 virtual bool IsOpen()
const;
649 virtual void Close();
654 const PTimeInterval & timeout
684 PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
686 PBoolean exclusive =
true
728 virtual bool IsOpen()
const;
732 virtual void Close();
737 virtual bool ChangedNAT();
738 #endif // OPAL_PTLIB_NAT
743 const PTimeInterval & timeout
826 virtual PBoolean
Write(
843 )
const {
return true; }
860 const PString & iface
882 virtual PBoolean
Connect() = 0;
892 virtual PBoolean
Close();
962 const PBYTEArray & pdu
966 #define PDECLARE_WriteConnectCallback(cls, fn) PDECLARE_NOTIFIER2(OpalTransport, cls, fn, bool &)
994 const PTimeInterval & timeout,
995 const PBYTEArray & data
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;
1062 PIPSocket::Address binding,
1114 PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1162 const PBYTEArray & pdu
1207 PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1209 bool reuseAddr =
false,
1210 bool preOpen =
false
1217 const PMonitoredSocketsPtr & sockets,
1218 const PString & iface,
1228 virtual PBoolean
Read(
1266 const PString & iface
1328 const PBYTEArray & pdu
1384 PIPSocket::Address & ip,
1418 PIPSocket::Address & ip,
1425 PIPSocketAddressAndPort & ap,
1426 PBoolean & reuseAddr);
1429 template <
class ListenerType,
class TransportType,
unsigned AltTypeOption,
class AltTypeClass>
1439 return new ListenerType(endpoint, address, options);
1448 PIPSocketAddressAndPort ap;
1451 if (options == AltTypeOption)
1452 return new AltTypeClass(endpoint, ap.GetAddress(), 0, reuseAddr);
1454 return new TransportType(endpoint, ap.GetAddress(), 0, reuseAddr);
1478 PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1480 PBoolean exclusive =
true
1492 virtual PBoolean
Open(
const AcceptHandler & acceptHandler, ThreadMode mode = SpawnNewThreadMode);
1502 PSSLContext * m_sslContext;
1517 PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1523 ~OpalTransportTLS();
1535 typedef OpalTransportTLS OpalTransportTCPS;
1536 typedef OpalListenerTLS OpalListenerTCPS;
1553 PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1555 bool exclusive =
true
1576 class OpalListenerWSS :
public OpalListenerTLS
1578 PCLASSINFO(OpalListenerWSS, OpalListenerTLS);
1582 PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1584 PBoolean exclusive =
true
1592 virtual const PCaselessString & GetProtoPrefix()
const;
1605 PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1637 const PBYTEArray & pdu
1645 class OpalTransportWSS :
public OpalTransportTLS
1647 PCLASSINFO(OpalTransportWSS, OpalTransportTLS);
1651 PIPSocket::Address binding = PIPSocket::GetDefaultIpAny(),
1662 virtual PBoolean Connect();
1673 virtual PBoolean ReadPDU(
1682 virtual PBoolean WritePDU(
1683 const PBYTEArray & pdu
1687 virtual const PCaselessString & GetProtoPrefix()
const;
1695 class OpalHTTPConnector :
public PHTTPResource
1697 PCLASSINFO(OpalHTTPConnector, PHTTPResource)
1706 const PHTTPAuthority & auth
1709 virtual
bool OnWebSocket(PHTTPServer & server, PHTTPConnectionInfo & connectInfo);
1716 #endif // OPAL_PTLIB_HTTP
1717 #endif // OPAL_PTLIB_SSL
1720 #endif // OPAL_OPAL_TRANSPORT_H
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 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.
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
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
void CleanUpOnTermination()
Definition: transports.h:901
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)
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
Definition: transports.h:1430
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
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