1 #include "api/internal/io/HostInfo_p.h"
2 #include "api/internal/io/TcpSocketEngine_p.h"
4 using namespace BamTools;
5 using namespace BamTools::Internal;
7 TcpSocketEngine::TcpSocketEngine(void)
8 : m_socketDescriptor(-1)
11 , m_socketError(TcpSocket::UnknownSocketError)
12 , m_socketState(TcpSocket::UnconnectedState)
15 TcpSocketEngine::TcpSocketEngine(const TcpSocketEngine& other)
16 : m_socketDescriptor(other.m_socketDescriptor)
17 // , m_localAddress(other.m_localAddress)
18 , m_remoteAddress(other.m_remoteAddress)
19 // , m_localPort(other.m_localPort)
20 , m_remotePort(other.m_remotePort)
21 , m_socketError(other.m_socketError)
22 , m_socketState(other.m_socketState)
23 , m_errorString(other.m_errorString)
26 TcpSocketEngine::~TcpSocketEngine(void) {
30 void TcpSocketEngine::Close(void) {
32 // close socket if we have valid FD
33 if ( m_socketDescriptor != -1 ) {
35 m_socketDescriptor = -1;
39 m_socketState = TcpSocket::UnconnectedState;
40 // m_localAddress.Clear();
41 m_remoteAddress.Clear();
46 bool TcpSocketEngine::Connect(const HostAddress& address, const uint16_t port) {
48 // return failure if invalid FD or already connected
49 if ( !IsValid() || (m_socketState == TcpSocket::ConnectedState) ) {
50 // TODO: set error string
54 // attempt to connect to host address on requested port
55 if ( !nativeConnect(address, port) ) {
56 // TODO: set error string
60 // if successful, store remote host address port & return success
61 // TODO: (later) fetch proxied remote & local host/port here
62 m_remoteAddress = address;
67 std::string TcpSocketEngine::GetErrorString(void) const {
71 //HostAddress TcpSocketEngine::GetLocalAddress(void) const {
72 // return m_localAddress;
75 //uint16_t TcpSocketEngine::GetLocalPort(void) const {
76 // return m_localPort;
79 HostAddress TcpSocketEngine::GetRemoteAddress(void) const {
80 return m_remoteAddress;
83 uint16_t TcpSocketEngine::GetRemotePort(void) const {
87 int TcpSocketEngine::GetSocketDescriptor(void) const {
88 return m_socketDescriptor;
91 TcpSocket::SocketError TcpSocketEngine::GetSocketError(void) {
95 TcpSocket::SocketState TcpSocketEngine::GetSocketState(void) {
99 bool TcpSocketEngine::Initialize(HostAddress::NetworkProtocol protocol) {
101 // close current socket if we have one open
105 // attempt to create new socket
106 return nativeCreateSocket(protocol);
109 bool TcpSocketEngine::IsValid(void) const {
110 return (m_socketDescriptor != -1);
113 int64_t TcpSocketEngine::NumBytesAvailable(void) const {
115 // return 0 if socket FD is invalid
117 // TODO: set error string
121 // otherwise check socket to see how much is ready
122 return nativeNumBytesAvailable();
125 int64_t TcpSocketEngine::Read(char* dest, size_t max) {
127 // return failure if can't read
128 if ( !IsValid() || (m_socketState != TcpSocket::ConnectedState) )
131 // otherwise return number of bytes read
132 return nativeRead(dest, max);
135 bool TcpSocketEngine::WaitForRead(int msec, bool* timedOut) {
137 // reset timedOut flag
140 // need to wait for our socket to be ready to read
141 int ret = nativeSelect(msec, true);
146 m_socketError = TcpSocket::SocketTimeoutError;
147 m_errorString = "socket timed out";
150 // return if any sockets available for reading
154 bool TcpSocketEngine::WaitForWrite(int msec, bool* timedOut) {
156 // reset timedOut flag
159 // need to wait for our socket to be ready to write
160 int ret = nativeSelect(msec, false);
165 m_socketError = TcpSocket::SocketTimeoutError;
166 m_errorString = "socket timed out";
169 // return if any sockets available for reading
173 int64_t TcpSocketEngine::Write(const char* data, size_t length) {
175 // return failure if can't write
176 if ( !IsValid() || (m_socketState != TcpSocket::ConnectedState) ) {
177 // TODO: set error string
181 // otherwise return number of bytes written
182 return nativeWrite(data, length);