diff options
Diffstat (limited to 'src/Runtime/ogl-runtime/src/foundation/windows/SocketImpl.h')
m--------- | src/Runtime/ogl-runtime | 0 | ||||
-rw-r--r-- | src/Runtime/ogl-runtime/src/foundation/windows/SocketImpl.h | 506 |
2 files changed, 0 insertions, 506 deletions
diff --git a/src/Runtime/ogl-runtime b/src/Runtime/ogl-runtime new file mode 160000 +Subproject 2025912174c4cf99270b7439ec3b021e1d089ae diff --git a/src/Runtime/ogl-runtime/src/foundation/windows/SocketImpl.h b/src/Runtime/ogl-runtime/src/foundation/windows/SocketImpl.h deleted file mode 100644 index f72203bd..00000000 --- a/src/Runtime/ogl-runtime/src/foundation/windows/SocketImpl.h +++ /dev/null @@ -1,506 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 or (at your option) any later version -** approved by the KDE Free Qt Foundation. The licenses are as published by -** the Free Software Foundation and appearing in the file LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/* -LuaSocket 3.0 license -Copyright � 2004-2013 Diego Nehab - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -*/ - -#ifndef FOUNDATION_WINDOWS_SOCKET_IMPL_H -#define FOUNDATION_WINDOWS_SOCKET_IMPL_H -#pragma once -#include <winsock.h> -#pragma warning(disable : 4127) -#pragma warning(disable : 4702) - -namespace qt3ds { -namespace foundation { - namespace socketimpl { - - // Functions take from lua socket implementation. Note that it has an MIT license. - - enum { - IO_DONE = 0, /* operation completed successfully */ - IO_TIMEOUT = -1, /* operation timed out */ - IO_CLOSED = -2, /* the connection has been closed */ - IO_UNKNOWN = -3 - }; - - /*-------------------------------------------------------------------------*\ - * I/O error strings - \*-------------------------------------------------------------------------*/ - const char *io_strerror(int err) - { - switch (err) { - case IO_DONE: - return NULL; - case IO_CLOSED: - return "closed"; - case IO_TIMEOUT: - return "timeout"; - default: - return "unknown error"; - } - } - - typedef int socklen_t; - typedef SOCKET t_socket; - typedef t_socket *p_socket; - typedef struct sockaddr SA; - -#define SOCKET_INVALID (INVALID_SOCKET) - - static const char *wstrerror(int err) - { - switch (err) { - case WSAEINTR: - return "Interrupted function call"; - case WSAEACCES: - return "Permission denied"; - case WSAEFAULT: - return "Bad address"; - case WSAEINVAL: - return "Invalid argument"; - case WSAEMFILE: - return "Too many open files"; - case WSAEWOULDBLOCK: - return "Resource temporarily unavailable"; - case WSAEINPROGRESS: - return "Operation now in progress"; - case WSAEALREADY: - return "Operation already in progress"; - case WSAENOTSOCK: - return "Socket operation on nonsocket"; - case WSAEDESTADDRREQ: - return "Destination address required"; - case WSAEMSGSIZE: - return "Message too long"; - case WSAEPROTOTYPE: - return "Protocol wrong type for socket"; - case WSAENOPROTOOPT: - return "Bad protocol option"; - case WSAEPROTONOSUPPORT: - return "Protocol not supported"; - case WSAESOCKTNOSUPPORT: - return "Socket type not supported"; - case WSAEOPNOTSUPP: - return "Operation not supported"; - case WSAEPFNOSUPPORT: - return "Protocol family not supported"; - case WSAEAFNOSUPPORT: - return "Address family not supported by protocol family"; - case WSAEADDRINUSE: - return "Address already in use"; - case WSAEADDRNOTAVAIL: - return "Cannot assign requested address"; - case WSAENETDOWN: - return "Network is down"; - case WSAENETUNREACH: - return "Network is unreachable"; - case WSAENETRESET: - return "Network dropped connection on reset"; - case WSAECONNABORTED: - return "Software caused connection abort"; - case WSAECONNRESET: - return "Connection reset by peer"; - case WSAENOBUFS: - return "No buffer space available"; - case WSAEISCONN: - return "Socket is already connected"; - case WSAENOTCONN: - return "Socket is not connected"; - case WSAESHUTDOWN: - return "Cannot send after socket shutdown"; - case WSAETIMEDOUT: - return "Connection timed out"; - case WSAECONNREFUSED: - return "Connection refused"; - case WSAEHOSTDOWN: - return "Host is down"; - case WSAEHOSTUNREACH: - return "No route to host"; - case WSAEPROCLIM: - return "Too many processes"; - case WSASYSNOTREADY: - return "Network subsystem is unavailable"; - case WSAVERNOTSUPPORTED: - return "Winsock.dll version out of range"; - case WSANOTINITIALISED: - return "Successful WSAStartup not yet performed"; - case WSAEDISCON: - return "Graceful shutdown in progress"; - case WSAHOST_NOT_FOUND: - return "Host not found"; - case WSATRY_AGAIN: - return "Nonauthoritative host not found"; - case WSANO_RECOVERY: - return "Nonrecoverable name lookup error"; - case WSANO_DATA: - return "Valid name, no data record of requested type"; - default: - return "Unknown error"; - } - } - - const char *socket_strerror(int err) - { - switch (err) { - case WSAEADDRINUSE: - return "address already in use"; - case WSAECONNREFUSED: - return "connection refused"; - case WSAEISCONN: - return "already connected"; - case WSAEACCES: - return "permission denied"; - case WSAECONNABORTED: - return "closed"; - case WSAECONNRESET: - return "closed"; - case WSAETIMEDOUT: - return "timeout"; - default: - return wstrerror(err); - } - } - - int socket_open(void) - { - WSADATA wsaData; - WORD wVersionRequested = MAKEWORD(2, 0); - int err = WSAStartup(wVersionRequested, &wsaData); - if (err != 0) - return 0; - if ((LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0) - && (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)) { - WSACleanup(); - return 0; - } - return 1; - } - - /*-------------------------------------------------------------------------*\ - * Close module - \*-------------------------------------------------------------------------*/ - int socket_close(void) - { - WSACleanup(); - return 1; - } - -/*-------------------------------------------------------------------------*\ -* Wait for readable/writable/connected socket with timeout -\*-------------------------------------------------------------------------*/ -#define WAITFD_R 1 -#define WAITFD_W 2 -#define WAITFD_E 4 -#define WAITFD_C (WAITFD_E | WAITFD_W) - - static int socket_waitfd(p_socket ps, int sw, QT3DSU32 timeoutMilliseconds) - { - int ret; - fd_set rfds, wfds, efds, *rp = NULL, *wp = NULL, *ep = NULL; - struct timeval tv, *tp = NULL; - if (timeoutMilliseconds == 0) - return IO_TIMEOUT; /* optimize timeout == 0 case */ - if (sw & WAITFD_R) { - FD_ZERO(&rfds); - FD_SET(*ps, &rfds); - rp = &rfds; - } - if (sw & WAITFD_W) { - FD_ZERO(&wfds); - FD_SET(*ps, &wfds); - wp = &wfds; - } - if (sw & WAITFD_C) { - FD_ZERO(&efds); - FD_SET(*ps, &efds); - ep = &efds; - } - if (timeoutMilliseconds >= 0.0) { - tv.tv_sec = (int)(timeoutMilliseconds / 1000); - QT3DSU32 leftover = timeoutMilliseconds % 1000; - tv.tv_usec = (int)(leftover * 100000); - tp = &tv; - } - ret = select(0, rp, wp, ep, tp); - if (ret == -1) - return WSAGetLastError(); - if (ret == 0) - return IO_TIMEOUT; - if (sw == WAITFD_C && FD_ISSET(*ps, &efds)) - return IO_CLOSED; - return IO_DONE; - } - - static int socket_send(p_socket ps, const char *data, size_t count, size_t *sent, - QT3DSU32 timeoutMilliseconds) - { - int err; - *sent = 0; - /* avoid making system calls on closed sockets */ - if (*ps == SOCKET_INVALID) - return IO_CLOSED; - /* loop until we send something or we give up on error */ - for (;;) { - /* try to send something */ - int put = send(*ps, data, (int)count, 0); - /* if we sent something, we are done */ - if (put > 0) { - *sent = put; - return IO_DONE; - } - /* deal with failure */ - err = WSAGetLastError(); - /* we can only proceed if there was no serious error */ - if (err != WSAEWOULDBLOCK) - return err; - /* avoid busy wait */ - if ((err = socket_waitfd(ps, WAITFD_W, timeoutMilliseconds)) != IO_DONE) - return err; - } - /* can't reach here */ - return IO_UNKNOWN; - } - /*-------------------------------------------------------------------------*\ - * Receive with timeout - \*-------------------------------------------------------------------------*/ - static int socket_recv(p_socket ps, char *data, size_t count, size_t *got, - QT3DSU32 timeoutMilliseconds) - { - int err; - *got = 0; - if (*ps == SOCKET_INVALID) - return IO_CLOSED; - for (;;) { - int taken = recv(*ps, data, (int)count, 0); - if (taken > 0) { - *got = taken; - return IO_DONE; - } - if (taken == 0) - return IO_CLOSED; - err = WSAGetLastError(); - if (err != WSAEWOULDBLOCK) - return err; - if ((err = socket_waitfd(ps, WAITFD_R, timeoutMilliseconds)) != IO_DONE) - return err; - } - return IO_UNKNOWN; - } - - void socket_setblocking(p_socket ps) - { - u_long argp = 0; - ioctlsocket(*ps, FIONBIO, &argp); - } - - /*-------------------------------------------------------------------------*\ - * Put socket into non-blocking mode - \*-------------------------------------------------------------------------*/ - void socket_setnonblocking(p_socket ps) - { - u_long argp = 1; - ioctlsocket(*ps, FIONBIO, &argp); - } - - int socket_listen(p_socket ps, int backlog) - { - int err = IO_DONE; - socket_setblocking(ps); - if (listen(*ps, backlog) < 0) - err = WSAGetLastError(); - socket_setnonblocking(ps); - return err; - } - - /*-------------------------------------------------------------------------*\ - * Accept with timeout - \*-------------------------------------------------------------------------*/ - static int socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *len, QT3DSU32 tm) - { - SA daddr; - socklen_t dlen = sizeof(daddr); - if (*ps == SOCKET_INVALID) - return IO_CLOSED; - if (!addr) - addr = &daddr; - if (!len) - len = &dlen; - for (;;) { - int err; - /* try to get client socket */ - if ((*pa = accept(*ps, addr, len)) != SOCKET_INVALID) - return IO_DONE; - /* find out why we failed */ - err = WSAGetLastError(); - /* if we failed because there was no connectoin, keep trying */ - if (err != WSAEWOULDBLOCK && err != WSAECONNABORTED) - return err; - /* call select to avoid busy wait */ - if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) - return err; - } - /* can't reach here */ - return IO_UNKNOWN; - } - - int socket_gethostbyaddr(const char *addr, socklen_t len, struct hostent **hp) - { - *hp = gethostbyaddr(addr, len, AF_INET); - if (*hp) - return IO_DONE; - else - return WSAGetLastError(); - } - - int socket_gethostbyname(const char *addr, struct hostent **hp) - { - *hp = gethostbyname(addr); - if (*hp) - return IO_DONE; - else - return WSAGetLastError(); - } - - /*-------------------------------------------------------------------------*\ - * Error translation functions - \*-------------------------------------------------------------------------*/ - const char *socket_hoststrerror(int err) - { - if (err <= 0) - return io_strerror(err); - switch (err) { - case WSAHOST_NOT_FOUND: - return "host not found"; - default: - return wstrerror(err); - } - } - /*-------------------------------------------------------------------------*\ - * Close and inutilize socket - \*-------------------------------------------------------------------------*/ - void socket_destroy(p_socket ps) - { - if (*ps != SOCKET_INVALID) { - socket_setblocking(ps); /* close can take a long time on WIN32 */ - closesocket(*ps); - *ps = SOCKET_INVALID; - } - } - - /*-------------------------------------------------------------------------*\ - * - \*-------------------------------------------------------------------------*/ - void socket_shutdown(p_socket ps, int how) - { - socket_setblocking(ps); - shutdown(*ps, how); - } - - int socket_create(p_socket ps, int domain, int type, int protocol) - { - *ps = socket(domain, type, protocol); - if (*ps != SOCKET_INVALID) - return IO_DONE; - else - return WSAGetLastError(); - } - - /*-------------------------------------------------------------------------*\ - * Connects or returns error message - \*-------------------------------------------------------------------------*/ - int socket_connect(p_socket ps, SA *addr, socklen_t len, QT3DSU32 tm) - { - int err; - /* don't call on closed socket */ - if (*ps == SOCKET_INVALID) - return IO_CLOSED; - /* ask system to connect */ - if (connect(*ps, addr, len) == 0) - return IO_DONE; - /* make sure the system is trying to connect */ - err = WSAGetLastError(); - if (err != WSAEWOULDBLOCK && err != WSAEINPROGRESS) - return err; - /* zero timeout case optimization */ - if (tm == 0) - return IO_TIMEOUT; - /* we wait until something happens */ - err = socket_waitfd(ps, WAITFD_C, tm); - if (err == IO_CLOSED) { - int len = sizeof(err); - /* give windows time to set the error (yes, disgusting) */ - Sleep(10); - /* find out why we failed */ - getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *)&err, &len); - /* we KNOW there was an error. if 'why' is 0, we will return - * "unknown error", but it's not really our fault */ - return err > 0 ? err : IO_UNKNOWN; - } else - return err; - } - - /*-------------------------------------------------------------------------*\ - * Binds or returns error message - \*-------------------------------------------------------------------------*/ - int socket_bind(p_socket ps, SA *addr, socklen_t len) - { - int err = IO_DONE; - socket_setblocking(ps); - if (bind(*ps, addr, len) < 0) - err = WSAGetLastError(); - socket_setnonblocking(ps); - return err; - } - } -} -} - -#endif
\ No newline at end of file |