]> git.tdb.fi Git - libs/net.git/blobdiff - source/net/streamsocket.cpp
Move most platform-specific code into overlay directories
[libs/net.git] / source / net / streamsocket.cpp
index da5069cee21603110213dcfd3bf6ecc3904ae2ab..11887d398c4b09a894c088fb4b3656cd49bf8c45 100644 (file)
@@ -1,9 +1,4 @@
-#ifdef _WIN32
-#include <winsock2.h>
-#else
-#include <sys/socket.h>
-#endif
-#include <cerrno>
+#include "platform_api.h"
 #include <msp/core/systemerror.h>
 #include <msp/io/handle_private.h>
 #include <msp/io/poll.h>
 #include <msp/core/systemerror.h>
 #include <msp/io/handle_private.h>
 #include <msp/io/poll.h>
@@ -18,10 +13,7 @@ namespace Net {
 StreamSocket::StreamSocket(const Private &p, const SockAddr &paddr):
        ClientSocket(p, paddr)
 {
 StreamSocket::StreamSocket(const Private &p, const SockAddr &paddr):
        ClientSocket(p, paddr)
 {
-#ifdef _WIN32
-       WSAEventSelect(priv->handle, *priv->event, FD_READ|FD_CLOSE);
-#endif
-       set_events(IO::P_INPUT);
+       set_socket_events(S_INPUT);
 }
 
 StreamSocket::StreamSocket(Family af, int proto):
 }
 
 StreamSocket::StreamSocket(Family af, int proto):
@@ -34,33 +26,13 @@ bool StreamSocket::connect(const SockAddr &addr)
                throw bad_socket_state("already connected");
 
        SockAddr::SysAddr sa = addr.to_sys();
                throw bad_socket_state("already connected");
 
        SockAddr::SysAddr sa = addr.to_sys();
-
-       int err = ::connect(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), sa.size);
-#ifdef _WIN32
-       if(err==SOCKET_ERROR)
+       int err = ::connect(priv->handle, reinterpret_cast<const sockaddr *>(&sa.addr), sa.size);
+       bool finished = check_sys_connect_error(err);
+       if(!finished)
        {
        {
-               int err_code = WSAGetLastError();
-               if(err_code==WSAEWOULDBLOCK)
-               {
-                       connecting = true;
-                       WSAEventSelect(priv->handle, *priv->event, FD_CONNECT);
-                       set_events(IO::P_OUTPUT);
-               }
-               else
-                       throw system_error("connect", err_code);
-       }
-#else
-       if(err==-1)
-       {
-               if(errno==EINPROGRESS)
-               {
-                       connecting = true;
-                       set_events(IO::P_OUTPUT);
-               }
-               else
-                       throw system_error("connect");
+               connecting = true;
+               set_socket_events(S_CONNECT);
        }
        }
-#endif
 
        delete peer_addr;
        peer_addr = addr.copy();
 
        delete peer_addr;
        peer_addr = addr.copy();
@@ -70,13 +42,10 @@ bool StreamSocket::connect(const SockAddr &addr)
        getsockname(priv->handle, reinterpret_cast<sockaddr *>(&lsa.addr), &lsa.size);
        local_addr = SockAddr::new_from_sys(lsa);
 
        getsockname(priv->handle, reinterpret_cast<sockaddr *>(&lsa.addr), &lsa.size);
        local_addr = SockAddr::new_from_sys(lsa);
 
-       if(err==0)
+       if(finished)
        {
                connected = true;
        {
                connected = true;
-#ifdef _WIN32
-               WSAEventSelect(priv->handle, *priv->event, FD_READ|FD_CLOSE);
-#endif
-               set_events(IO::P_INPUT);
+               set_socket_events(S_INPUT);
                signal_connect_finished.emit(0);
        }
 
                signal_connect_finished.emit(0);
        }
 
@@ -99,18 +68,11 @@ bool StreamSocket::poll_connect(const Time::TimeDelta &timeout)
 
                if(err!=0)
                {
 
                if(err!=0)
                {
-                       set_events(IO::P_NONE);
-#ifdef _WIN32
-                       throw system_error("connect", WSAGetLastError());
-#else
-                       throw system_error("connect");
-#endif
+                       set_socket_events(S_NONE);
+                       throw system_error("connect", err);
                }
 
                }
 
-#ifdef _WIN32
-               WSAEventSelect(priv->handle, *priv->event, FD_READ|FD_CLOSE);
-#endif
-               set_events(IO::P_INPUT);
+               set_socket_events(S_INPUT);
 
                connected = true;
        }
 
                connected = true;
        }
@@ -142,10 +104,7 @@ void StreamSocket::on_event(IO::PollEvent ev)
                        peer_addr = 0;
                }
 
                        peer_addr = 0;
                }
 
-#ifdef _WIN32
-               WSAEventSelect(priv->handle, *priv->event, FD_READ|FD_CLOSE);
-#endif
-               set_events((err==0) ? IO::P_INPUT : IO::P_NONE);
+               set_socket_events((err==0) ? S_INPUT : S_NONE);
        }
 }
 
        }
 }