]> git.tdb.fi Git - libs/net.git/blobdiff - source/net/socket.cpp
Move most platform-specific code into overlay directories
[libs/net.git] / source / net / socket.cpp
index 031d077c44dcc194a095455d06dde3def3a62ccd..e8e5eaf6275eddb27634a0d473377bed18570d8b 100644 (file)
@@ -1,46 +1,10 @@
-#ifdef _WIN32
-#include <winsock2.h>
-#else
-#include <cerrno>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/socket.h>
-#endif
-#include <iostream>
+#include "platform_api.h"
 #include <msp/core/systemerror.h>
 #include <msp/io/handle_private.h>
-#include <msp/strings/format.h>
-#include <msp/time/rawtime_private.h>
-#include <msp/time/units.h>
 #include "sockaddr_private.h"
 #include "socket.h"
 #include "socket_private.h"
 
-namespace {
-
-#ifdef _WIN32
-class WinSockHelper
-{
-public:
-       WinSockHelper()
-       {
-               WSADATA wsa_data;
-               int err = WSAStartup(0x0002, &wsa_data);
-               if(err)
-                       std::cerr<<"Failed to initialize WinSock: "<<err<<'\n';
-       }
-
-       ~WinSockHelper()
-       {
-               WSACleanup();
-       }
-};
-
-WinSockHelper wsh;
-#endif
-
-}
-
 namespace Msp {
 namespace Net {
 
@@ -56,11 +20,7 @@ Socket::Socket(const Private &p):
        getsockname(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), &sa.size);
        local_addr = SockAddr::new_from_sys(sa);
 
-#ifdef _WIN32
-       *priv->event = CreateEvent(0, false, false, 0);
-#else
-       *priv->event = priv->handle;
-#endif
+       platform_init();
 }
 
 Socket::Socket(Family af, int type, int proto):
@@ -71,21 +31,12 @@ Socket::Socket(Family af, int type, int proto):
 
        priv->handle = socket(family_to_sys(af), type, proto);
 
-#ifdef _WIN32
-       *priv->event = CreateEvent(0, false, false, 0);
-#else
-       *priv->event = priv->handle;
-#endif
+       platform_init();
 }
 
 Socket::~Socket()
 {
-#ifdef _WIN32
-       closesocket(priv->handle);
-       CloseHandle(*priv->event);
-#else
-       ::close(priv->handle);
-#endif
+       platform_cleanup();
 
        delete local_addr;
        delete priv;
@@ -97,13 +48,7 @@ void Socket::set_block(bool b)
        if(b)
                mode = (mode|IO::M_NONBLOCK);
 
-#ifdef _WIN32
-       u_long flag = !b;
-       ioctlsocket(priv->handle, FIONBIO, &flag);
-#else
-       int flags = fcntl(priv->handle, F_GETFL);
-       fcntl(priv->handle, F_SETFL, (flags&O_NONBLOCK)|(b?0:O_NONBLOCK));
-#endif
+       priv->set_block(b);
 }
 
 const IO::Handle &Socket::get_event_handle()
@@ -130,36 +75,16 @@ const SockAddr &Socket::get_local_address() const
        return *local_addr;
 }
 
-void Socket::set_timeout(const Time::TimeDelta &timeout)
-{
-#ifndef _WIN32
-       timeval tv = Time::rawtime_to_timeval(timeout.raw());
-       priv->set_option(SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(timeval));
-       priv->set_option(SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(timeval));
-#else
-       DWORD msecs = static_cast<DWORD>(timeout/Time::msec);
-       priv->set_option(SOL_SOCKET, SO_RCVTIMEO, &msecs, sizeof(DWORD));
-       priv->set_option(SOL_SOCKET, SO_SNDTIMEO, &msecs, sizeof(DWORD));
-#endif
-}
-
-
-int Socket::Private::set_option(int level, int optname, const void *optval, socklen_t optlen)
-{
-#ifdef _WIN32
-       return setsockopt(handle, level, optname, reinterpret_cast<const char *>(optval), optlen);
-#else
-       return setsockopt(handle, level, optname, optval, optlen);
-#endif
-}
-
-int Socket::Private::get_option(int level, int optname, void *optval, socklen_t *optlen)
+void Socket::set_socket_events(unsigned e)
 {
-#ifdef _WIN32
-       return getsockopt(handle, level, optname, reinterpret_cast<char *>(optval), optlen);
-#else
-       return getsockopt(handle, level, optname, optval, optlen);
-#endif
+       IO::PollEvent pe = static_cast<IO::PollEvent>(e&4095);
+       if(e&S_CONNECT)
+               pe = pe|IO::P_OUTPUT;
+       if(e&S_ACCEPT)
+               pe = pe|IO::P_INPUT;
+
+       set_platform_events(e);
+       set_events(pe);
 }
 
 } // namespace Net