cec: clean up lib/platform
[deb_libcec.git] / src / lib / platform / sockets / tcp.h
index ef9c418aaa82568d7b24008e0e8be5c487605add..ffc372ccacfcad10e7cb90a7d4c7aff94bfc5849 100644 (file)
 
 #include "socket.h"
 
-#if defined(__WINDOWS__)
-#include "../windows/os-tcp.h"
-#else
-#include "../posix/os-tcp.h"
-#endif
-
 using namespace std;
 
 namespace PLATFORM
 {
-  class CTcpSocket : public CSocket
+  class CTcpSocket : public CCommonSocket<tcp_socket_t>
   {
     public:
-      CTcpSocket(void) {};
+      CTcpSocket(const CStdString &strHostname, uint16_t iPort) :
+        CCommonSocket<tcp_socket_t>(INVALID_SOCKET_VALUE, strHostname),
+        m_iPort(iPort) {}
+
       virtual ~CTcpSocket(void) {}
 
-      virtual bool Open(const CStdString &strHostname, uint16_t iPort, uint64_t nTimeout)
+      virtual bool Open(uint64_t iTimeoutMs = 0)
       {
         bool bReturn(false);
         struct addrinfo *address(NULL), *addr(NULL);
-        CLockObject lock(m_mutex);
-        if (!TcpResolveAddress(strHostname.c_str(), iPort, &m_iError, &address))
+        if (!TcpResolveAddress(m_strName.c_str(), m_iPort, &m_iError, &address))
         {
           m_strError = strerror(m_iError);
           return bReturn;
@@ -62,8 +58,8 @@ namespace PLATFORM
 
         for(addr = address; !bReturn && addr; addr = addr->ai_next)
         {
-          m_socket = TcpCreateSocket(addr, &m_iError, nTimeout);
-          if (m_socket != INVALID_SOCKET && m_socket != SOCKET_ERROR)
+          m_socket = TcpCreateSocket(addr, &m_iError, iTimeoutMs);
+          if (m_socket != INVALID_SOCKET_VALUE)
             bReturn = true;
           else
             m_strError = strerror(m_iError);
@@ -73,34 +69,62 @@ namespace PLATFORM
         return bReturn;
       }
 
+      virtual void Close(void)
+      {
+        TcpSocketClose(m_socket);
+        m_socket = INVALID_SOCKET_VALUE;
+      }
+
       virtual void Shutdown(void)
       {
-        CLockObject lock(m_mutex);
-        if (m_socket != INVALID_SOCKET && m_socket != SOCKET_ERROR)
-          TcpShutdownSocket(m_socket);
-        m_socket = INVALID_SOCKET;
-        m_strError = "";
+        TcpSocketShutdown(m_socket);
+        m_socket = INVALID_SOCKET_VALUE;
+      }
+
+      virtual ssize_t Write(void* data, size_t len)
+      {
+        return TcpSocketWrite(m_socket, &m_iError, data, len);
+      }
+
+      virtual ssize_t Read(void* data, size_t len, uint64_t iTimeoutMs = 0)
+      {
+        return TcpSocketRead(m_socket, &m_iError, data, len, iTimeoutMs);
       }
 
-  protected:
-    virtual socket_t TcpCreateSocket(struct addrinfo* addr, int* iError, uint64_t iTimeout)
-    {
-      socket_t fdSock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
-      if (fdSock == INVALID_SOCKET || fdSock == SOCKET_ERROR)
+      virtual bool IsOpen(void)
       {
-        *iError = errno;
-        return (socket_t)SOCKET_ERROR;
+        return m_socket != INVALID_SOCKET_VALUE;
       }
 
-      if (!TcpConnectSocket(fdSock, addr, iError, iTimeout))
+    protected:
+      virtual tcp_socket_t TcpCreateSocket(struct addrinfo* addr, int* iError, uint64_t iTimeout)
       {
-        SocketClose(fdSock);
-        return (socket_t)SOCKET_ERROR;
+        tcp_socket_t fdSock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
+        if (fdSock == INVALID_SOCKET_VALUE)
+        {
+          *iError = errno;
+          return (tcp_socket_t)INVALID_SOCKET_VALUE;
+        }
+
+        if (!TcpConnectSocket(fdSock, addr, iError, iTimeout))
+        {
+          TcpSocketClose(fdSock);
+          return (tcp_socket_t)INVALID_SOCKET_VALUE;
+        }
+
+        TcpSetNoDelay(fdSock);
+
+        return fdSock;
       }
 
-      TcpSetNoDelay(fdSock);
+      uint16_t   m_iPort;
+  };
 
-      return fdSock;
-    }
+  class CTcpConnection : public CProtectedSocket<CTcpSocket>
+  {
+  public:
+    CTcpConnection(const CStdString &strHostname, uint16_t iPort) :
+      CProtectedSocket<CTcpSocket> (new CTcpSocket(strHostname, iPort)) {}
+    virtual ~CTcpConnection(void) {}
   };
 };