From 025644120d48ad13f1bb1fd82d9cc8f61c505364 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 23 Nov 2008 13:30:42 +0000 Subject: [PATCH] move more socket functions common to Winsock and BSD implementations to common code git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56938 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gsocket.h | 8 ++- include/wx/msw/gsockmsw.h | 4 -- include/wx/private/fd.h | 12 ---- include/wx/private/socket.h | 41 ++++++++++++ include/wx/unix/gsockunx.h | 4 -- src/common/socket.cpp | 109 +++++++++++++++++++++++++++++++ src/msw/gsocket.cpp | 118 +--------------------------------- src/unix/gsocket.cpp | 125 +----------------------------------- 8 files changed, 160 insertions(+), 261 deletions(-) create mode 100644 include/wx/private/socket.h diff --git a/include/wx/gsocket.h b/include/wx/gsocket.h index e8a0338dea..e7d362e247 100644 --- a/include/wx/gsocket.h +++ b/include/wx/gsocket.h @@ -169,9 +169,15 @@ public: // the given wxSocket (and inherits its attributes such as timeout) static GSocket *Create(wxSocketBase& wxsocket); - void SetTimeout(unsigned long millisec); virtual ~GSocketBase(); + void SetTimeout(unsigned long millisec); + + GSocketError SetLocal(GAddress *address); + GSocketError SetPeer(GAddress *address); + GAddress *GetLocal(); + GAddress *GetPeer(); + GSocketEventFlags Select(GSocketEventFlags flags); virtual GSocket *WaitConnection(wxSocketBase& wxsocket) = 0; diff --git a/include/wx/msw/gsockmsw.h b/include/wx/msw/gsockmsw.h index d7d256a36d..81202a2564 100644 --- a/include/wx/msw/gsockmsw.h +++ b/include/wx/msw/gsockmsw.h @@ -38,10 +38,6 @@ public: virtual GSocket *WaitConnection(wxSocketBase& wxsocket); - GSocketError SetLocal(GAddress *address); - GSocketError SetPeer(GAddress *address); - GAddress *GetLocal(); - GAddress *GetPeer(); GSocketError SetServer(); // not used under MSW diff --git a/include/wx/private/fd.h b/include/wx/private/fd.h index 462b9bdf3a..38c286e445 100644 --- a/include/wx/private/fd.h +++ b/include/wx/private/fd.h @@ -51,16 +51,4 @@ #define wxFD_CLR(fd, fds) FD_CLR(fd, fds) #endif // __INTELC__/!__INTELC__ -// this is for Windows where configure doesn't define this -#ifndef SOCKOPTLEN_T - #define SOCKOPTLEN_T int -#endif - -/* - * MSW defines this, Unices don't. - */ -#ifndef INVALID_SOCKET - #define INVALID_SOCKET (-1) -#endif - #endif // _WX_PRIVATE_FD_H_ diff --git a/include/wx/private/socket.h b/include/wx/private/socket.h new file mode 100644 index 0000000000..9b20bf60cc --- /dev/null +++ b/include/wx/private/socket.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/private/socket.h +// Purpose: various wxSocket-related private declarations +// Author: Vadim Zeitlin +// Created: 2008-11-23 +// RCS-ID: $Id$ +// Copyright: (c) 2008 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_PRIVATE_SOCKET_H_ +#define _WX_PRIVATE_SOCKET_H_ + +// these definitions are for MSW when we don't use configure, otherwise these +// symbols are defined by configure +#ifndef WX_SOCKLEN_T + #define WX_SOCKLEN_T int +#endif + +#ifndef SOCKOPTLEN_T + #define SOCKOPTLEN_T int +#endif + +// define some symbols which winsock.h defines but traditional BSD headers +// don't +#ifndef INVALID_SOCKET + #define INVALID_SOCKET (-1) +#endif + +#ifndef SOCKET_ERROR + #define SOCKET_ERROR (-1) +#endif + +#if wxUSE_IPV6 + typedef struct sockaddr_storage wxSockAddr; +#else + typedef struct sockaddr wxSockAddr; +#endif + +#endif // _WX_PRIVATE_SOCKET_H_ + diff --git a/include/wx/unix/gsockunx.h b/include/wx/unix/gsockunx.h index d90bb540b7..0d57fe5a2f 100644 --- a/include/wx/unix/gsockunx.h +++ b/include/wx/unix/gsockunx.h @@ -23,10 +23,6 @@ public: virtual void Shutdown(); virtual GSocket *WaitConnection(wxSocketBase& wxsocket); - GSocketError SetLocal(GAddress *address); - GSocketError SetPeer(GAddress *address); - GAddress *GetLocal(); - GAddress *GetPeer(); GSocketError SetServer(); bool SetReusable(); bool SetBroadcast(); diff --git a/src/common/socket.cpp b/src/common/socket.cpp index c167ebf14b..6826063517 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -41,7 +41,9 @@ #include "wx/stopwatch.h" #include "wx/thread.h" #include "wx/evtloop.h" + #include "wx/private/fd.h" +#include "wx/private/socket.h" // DLL options compatibility check: #include "wx/build.h" @@ -244,6 +246,113 @@ void GSocketBase::NotifyOnStateChange(GSocketEvent event) m_wxsocket->OnRequest(static_cast(event)); } +/* Address handling */ + +/* GSocket_SetLocal: + * GSocket_GetLocal: + * GSocket_SetPeer: + * GSocket_GetPeer: + * Set or get the local or peer address for this socket. The 'set' + * functions return GSOCK_NOERROR on success, an error code otherwise. + * The 'get' functions return a pointer to a GAddress object on success, + * or NULL otherwise, in which case they set the error code of the + * corresponding GSocket. + * + * Error codes: + * GSOCK_INVSOCK - the socket is not valid. + * GSOCK_INVADDR - the address is not valid. + */ +GSocketError GSocketBase::SetLocal(GAddress *address) +{ + /* the socket must be initialized, or it must be a server */ + if (m_fd != INVALID_SOCKET && !m_server) + { + m_error = GSOCK_INVSOCK; + return GSOCK_INVSOCK; + } + + /* check address */ + if (address == NULL || address->m_family == GSOCK_NOFAMILY) + { + m_error = GSOCK_INVADDR; + return GSOCK_INVADDR; + } + + if (m_local) + GAddress_destroy(m_local); + + m_local = GAddress_copy(address); + + return GSOCK_NOERROR; +} + +GSocketError GSocketBase::SetPeer(GAddress *address) +{ + /* check address */ + if (address == NULL || address->m_family == GSOCK_NOFAMILY) + { + m_error = GSOCK_INVADDR; + return GSOCK_INVADDR; + } + + if (m_peer) + GAddress_destroy(m_peer); + + m_peer = GAddress_copy(address); + + return GSOCK_NOERROR; +} + +GAddress *GSocketBase::GetLocal() +{ + GAddress *address; + wxSockAddr addr; + WX_SOCKLEN_T size = sizeof(addr); + GSocketError err; + + /* try to get it from the m_local var first */ + if (m_local) + return GAddress_copy(m_local); + + /* else, if the socket is initialized, try getsockname */ + if (m_fd == INVALID_SOCKET) + { + m_error = GSOCK_INVSOCK; + return NULL; + } + + if (getsockname(m_fd, (sockaddr*)&addr, &size) == SOCKET_ERROR) + { + m_error = GSOCK_IOERR; + return NULL; + } + + /* got a valid address from getsockname, create a GAddress object */ + if ((address = GAddress_new()) == NULL) + { + m_error = GSOCK_MEMERR; + return NULL; + } + + if ((err = _GAddress_translate_from(address, (sockaddr*)&addr, size)) != GSOCK_NOERROR) + { + GAddress_destroy(address); + m_error = err; + return NULL; + } + + return address; +} + +GAddress *GSocketBase::GetPeer() +{ + /* try to get it from the m_peer var */ + if (m_peer) + return GAddress_copy(m_peer); + + return NULL; +} + // ========================================================================== // wxSocketBase // ========================================================================== diff --git a/src/msw/gsocket.cpp b/src/msw/gsocket.cpp index c973bbd9de..d701ed4caf 100644 --- a/src/msw/gsocket.cpp +++ b/src/msw/gsocket.cpp @@ -75,16 +75,7 @@ wxFORCE_LINK_MODULE(gsockmsw) #include #include -/* if we use configure for MSW WX_SOCKLEN_T will be already defined */ -#ifndef WX_SOCKLEN_T -# define WX_SOCKLEN_T int -#endif - -#if wxUSE_IPV6 -typedef struct sockaddr_storage wxSockAddr; -#else -typedef struct sockaddr wxSockAddr; -#endif +#include "wx/private/socket.h" bool GSocket_Init() { @@ -117,113 +108,6 @@ void GSocket::Close() m_fd = INVALID_SOCKET; } -/* Address handling */ - -/* GSocket_SetLocal: - * GSocket_GetLocal: - * GSocket_SetPeer: - * GSocket_GetPeer: - * Set or get the local or peer address for this socket. The 'set' - * functions return GSOCK_NOERROR on success, an error code otherwise. - * The 'get' functions return a pointer to a GAddress object on success, - * or NULL otherwise, in which case they set the error code of the - * corresponding GSocket. - * - * Error codes: - * GSOCK_INVSOCK - the socket is not valid. - * GSOCK_INVADDR - the address is not valid. - */ -GSocketError GSocket::SetLocal(GAddress *address) -{ - /* the socket must be initialized, or it must be a server */ - if (m_fd != INVALID_SOCKET && !m_server) - { - m_error = GSOCK_INVSOCK; - return GSOCK_INVSOCK; - } - - /* check address */ - if (address == NULL || address->m_family == GSOCK_NOFAMILY) - { - m_error = GSOCK_INVADDR; - return GSOCK_INVADDR; - } - - if (m_local) - GAddress_destroy(m_local); - - m_local = GAddress_copy(address); - - return GSOCK_NOERROR; -} - -GSocketError GSocket::SetPeer(GAddress *address) -{ - /* check address */ - if (address == NULL || address->m_family == GSOCK_NOFAMILY) - { - m_error = GSOCK_INVADDR; - return GSOCK_INVADDR; - } - - if (m_peer) - GAddress_destroy(m_peer); - - m_peer = GAddress_copy(address); - - return GSOCK_NOERROR; -} - -GAddress *GSocket::GetLocal() -{ - GAddress *address; - wxSockAddr addr; - WX_SOCKLEN_T size = sizeof(addr); - GSocketError err; - - /* try to get it from the m_local var first */ - if (m_local) - return GAddress_copy(m_local); - - /* else, if the socket is initialized, try getsockname */ - if (m_fd == INVALID_SOCKET) - { - m_error = GSOCK_INVSOCK; - return NULL; - } - - if (getsockname(m_fd, (sockaddr*)&addr, &size) == SOCKET_ERROR) - { - m_error = GSOCK_IOERR; - return NULL; - } - - /* got a valid address from getsockname, create a GAddress object */ - if ((address = GAddress_new()) == NULL) - { - m_error = GSOCK_MEMERR; - return NULL; - } - - if ((err = _GAddress_translate_from(address, (sockaddr*)&addr, size)) != GSOCK_NOERROR) - { - GAddress_destroy(address); - m_error = err; - return NULL; - } - - return address; -} - -GAddress *GSocket::GetPeer() -{ - /* try to get it from the m_peer var */ - if (m_peer) - return GAddress_copy(m_peer); - - return NULL; -} - /* Server specific parts */ /* GSocket_SetServer: diff --git a/src/unix/gsocket.cpp b/src/unix/gsocket.cpp index a7e54ff58b..e9db270e6b 100644 --- a/src/unix/gsocket.cpp +++ b/src/unix/gsocket.cpp @@ -29,6 +29,8 @@ #if wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) +#include "wx/private/socket.h" + #include #include #ifdef __VISAGECPP__ @@ -443,12 +445,6 @@ struct servent *wxGetservbyname_r(const char *port, const char *protocol, # define GSocket_Debug(args) #endif /* __GSOCKET_DEBUG__ */ -#if wxUSE_IPV6 -typedef struct sockaddr_storage wxSockAddr; -#else -typedef struct sockaddr wxSockAddr; -#endif - /* Table of GUI-related functions. We must call them indirectly because * of wxBase and GUI separation: */ @@ -512,123 +508,6 @@ void GSocket::Shutdown() GSocketBase::Shutdown(); } -/* Address handling */ - -/* GSocket_SetLocal: - * GSocket_GetLocal: - * GSocket_SetPeer: - * GSocket_GetPeer: - * Set or get the local or peer address for this socket. The 'set' - * functions return GSOCK_NOERROR on success, an error code otherwise. - * The 'get' functions return a pointer to a GAddress object on success, - * or NULL otherwise, in which case they set the error code of the - * corresponding GSocket. - * - * Error codes: - * GSOCK_INVSOCK - the socket is not valid. - * GSOCK_INVADDR - the address is not valid. - */ -GSocketError GSocket::SetLocal(GAddress *address) -{ - assert(this); - - /* the socket must be initialized, or it must be a server */ - if ((m_fd != INVALID_SOCKET && !m_server)) - { - m_error = GSOCK_INVSOCK; - return GSOCK_INVSOCK; - } - - /* check address */ - if (address == NULL || address->m_family == GSOCK_NOFAMILY) - { - m_error = GSOCK_INVADDR; - return GSOCK_INVADDR; - } - - if (m_local) - GAddress_destroy(m_local); - - m_local = GAddress_copy(address); - - return GSOCK_NOERROR; -} - -GSocketError GSocket::SetPeer(GAddress *address) -{ - assert(this); - - /* check address */ - if (address == NULL || address->m_family == GSOCK_NOFAMILY) - { - m_error = GSOCK_INVADDR; - return GSOCK_INVADDR; - } - - if (m_peer) - GAddress_destroy(m_peer); - - m_peer = GAddress_copy(address); - - return GSOCK_NOERROR; -} - -GAddress *GSocket::GetLocal() -{ - GAddress *address; - wxSockAddr addr; - WX_SOCKLEN_T size = sizeof(addr); - GSocketError err; - - assert(this); - - /* try to get it from the m_local var first */ - if (m_local) - return GAddress_copy(m_local); - - /* else, if the socket is initialized, try getsockname */ - if (m_fd == INVALID_SOCKET) - { - m_error = GSOCK_INVSOCK; - return NULL; - } - - if (getsockname(m_fd, (sockaddr*)&addr, (WX_SOCKLEN_T *) &size) < 0) - { - m_error = GSOCK_IOERR; - return NULL; - } - - /* got a valid address from getsockname, create a GAddress object */ - address = GAddress_new(); - if (address == NULL) - { - m_error = GSOCK_MEMERR; - return NULL; - } - - err = _GAddress_translate_from(address, (sockaddr*)&addr, size); - if (err != GSOCK_NOERROR) - { - GAddress_destroy(address); - m_error = err; - return NULL; - } - - return address; -} - -GAddress *GSocket::GetPeer() -{ - assert(this); - - /* try to get it from the m_peer var */ - if (m_peer) - return GAddress_copy(m_peer); - - return NULL; -} - /* Server specific parts */ /* GSocket_SetServer: -- 2.47.2