]> git.tdb.fi Git - libs/net.git/blobdiff - source/streamsocket.cpp
Hide platform details of Socket behind pimpl
[libs/net.git] / source / streamsocket.cpp
index cd810d5253e14e2990d204c4af12096f5be7278b..c6cd214e18dc08dc1620cd190f27287dd8c6ce11 100644 (file)
@@ -3,19 +3,21 @@
 #endif
 #include <cerrno>
 #include <msp/core/systemerror.h>
+#include <msp/io/handle_private.h>
 #include <msp/io/poll.h>
 #include <msp/strings/format.h>
+#include "socket_private.h"
 #include "streamsocket.h"
 
 namespace Msp {
 namespace Net {
 
-StreamSocket::StreamSocket(SocketHandle h, const SockAddr &paddr):
-       Socket(h, paddr),
+StreamSocket::StreamSocket(const Private &p, const SockAddr &paddr):
+       Socket(p, paddr),
        connecting(false)
 {
 #ifdef WIN32
-       WSAEventSelect(handle, event, FD_READ|FD_CLOSE);
+       WSAEventSelect(priv->handle, *priv->event, FD_READ|FD_CLOSE);
 #endif
        set_events(IO::P_INPUT);
 }
@@ -27,7 +29,6 @@ StreamSocket::StreamSocket(Family af, int proto):
 
 int StreamSocket::poll_connect(const Time::TimeDelta &timeout)
 {
-       check_state(false);
        if(!connecting)
                throw bad_socket_state("not connecting");
 
@@ -57,7 +58,7 @@ int StreamSocket::poll_connect(const Time::TimeDelta &timeout)
                }
 
 #ifdef WIN32
-               WSAEventSelect(handle, event, FD_READ|FD_CLOSE);
+               WSAEventSelect(priv->handle, *priv->event, FD_READ|FD_CLOSE);
 #endif
                set_events(IO::P_INPUT);
 
@@ -71,8 +72,6 @@ int StreamSocket::poll_connect(const Time::TimeDelta &timeout)
 
 int StreamSocket::connect(const SockAddr &addr)
 {
-       check_state(false);
-
        if(connected)
                throw bad_socket_state("already connected");
 
@@ -80,21 +79,21 @@ int StreamSocket::connect(const SockAddr &addr)
        socklen_t size = addr.fill_sockaddr(sa);
 
 #ifdef WIN32
-       int err = WSAConnect(handle, reinterpret_cast<sockaddr *>(&sa), size, 0, 0, 0, 0);
+       int err = WSAConnect(priv->handle, reinterpret_cast<sockaddr *>(&sa), size, 0, 0, 0, 0);
        if(err==SOCKET_ERROR)
        {
                int err_code = WSAGetLastError();
                if(err_code==WSAEWOULDBLOCK)
                {
                        connecting = true;
-                       WSAEventSelect(handle, event, FD_CONNECT);
+                       WSAEventSelect(priv->handle, *priv->event, FD_CONNECT);
                        set_events(IO::P_OUTPUT);
                }
                else
                        throw system_error("connect", err_code);
        }
 #else
-       int err = ::connect(handle, reinterpret_cast<sockaddr *>(&sa), size);
+       int err = ::connect(priv->handle, reinterpret_cast<sockaddr *>(&sa), size);
        if(err==-1)
        {
                if(errno==EINPROGRESS)
@@ -112,7 +111,7 @@ int StreamSocket::connect(const SockAddr &addr)
 
        delete local_addr;
        size = sizeof(sockaddr_storage);
-       getsockname(handle, reinterpret_cast<sockaddr *>(&sa), &size);
+       getsockname(priv->handle, reinterpret_cast<sockaddr *>(&sa), &size);
        local_addr = SockAddr::create(sa);
 
        if(err==0)
@@ -144,7 +143,7 @@ void StreamSocket::on_event(IO::PollEvent ev)
                }
 
 #ifdef WIN32
-               WSAEventSelect(handle, event, FD_READ|FD_CLOSE);
+               WSAEventSelect(priv->handle, *priv->event, FD_READ|FD_CLOSE);
 #endif
                set_events((err==0) ? IO::P_INPUT : IO::P_NONE);
        }