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
This commit is contained in:
Vadim Zeitlin
2008-11-23 13:30:42 +00:00
parent 3a6ec3c880
commit 025644120d
8 changed files with 160 additions and 261 deletions

View File

@@ -169,9 +169,15 @@ public:
// the given wxSocket (and inherits its attributes such as timeout) // the given wxSocket (and inherits its attributes such as timeout)
static GSocket *Create(wxSocketBase& wxsocket); static GSocket *Create(wxSocketBase& wxsocket);
void SetTimeout(unsigned long millisec);
virtual ~GSocketBase(); virtual ~GSocketBase();
void SetTimeout(unsigned long millisec);
GSocketError SetLocal(GAddress *address);
GSocketError SetPeer(GAddress *address);
GAddress *GetLocal();
GAddress *GetPeer();
GSocketEventFlags Select(GSocketEventFlags flags); GSocketEventFlags Select(GSocketEventFlags flags);
virtual GSocket *WaitConnection(wxSocketBase& wxsocket) = 0; virtual GSocket *WaitConnection(wxSocketBase& wxsocket) = 0;

View File

@@ -38,10 +38,6 @@ public:
virtual GSocket *WaitConnection(wxSocketBase& wxsocket); virtual GSocket *WaitConnection(wxSocketBase& wxsocket);
GSocketError SetLocal(GAddress *address);
GSocketError SetPeer(GAddress *address);
GAddress *GetLocal();
GAddress *GetPeer();
GSocketError SetServer(); GSocketError SetServer();
// not used under MSW // not used under MSW

View File

@@ -51,16 +51,4 @@
#define wxFD_CLR(fd, fds) FD_CLR(fd, fds) #define wxFD_CLR(fd, fds) FD_CLR(fd, fds)
#endif // __INTELC__/!__INTELC__ #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_ #endif // _WX_PRIVATE_FD_H_

View File

@@ -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 <vadim@wxwidgets.org>
// 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_

View File

@@ -23,10 +23,6 @@ public:
virtual void Shutdown(); virtual void Shutdown();
virtual GSocket *WaitConnection(wxSocketBase& wxsocket); virtual GSocket *WaitConnection(wxSocketBase& wxsocket);
GSocketError SetLocal(GAddress *address);
GSocketError SetPeer(GAddress *address);
GAddress *GetLocal();
GAddress *GetPeer();
GSocketError SetServer(); GSocketError SetServer();
bool SetReusable(); bool SetReusable();
bool SetBroadcast(); bool SetBroadcast();

View File

@@ -41,7 +41,9 @@
#include "wx/stopwatch.h" #include "wx/stopwatch.h"
#include "wx/thread.h" #include "wx/thread.h"
#include "wx/evtloop.h" #include "wx/evtloop.h"
#include "wx/private/fd.h" #include "wx/private/fd.h"
#include "wx/private/socket.h"
// DLL options compatibility check: // DLL options compatibility check:
#include "wx/build.h" #include "wx/build.h"
@@ -244,6 +246,113 @@ void GSocketBase::NotifyOnStateChange(GSocketEvent event)
m_wxsocket->OnRequest(static_cast<wxSocketNotify>(event)); m_wxsocket->OnRequest(static_cast<wxSocketNotify>(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 // wxSocketBase
// ========================================================================== // ==========================================================================

View File

@@ -75,16 +75,7 @@ wxFORCE_LINK_MODULE(gsockmsw)
#include <stddef.h> #include <stddef.h>
#include <ctype.h> #include <ctype.h>
/* if we use configure for MSW WX_SOCKLEN_T will be already defined */ #include "wx/private/socket.h"
#ifndef WX_SOCKLEN_T
# define WX_SOCKLEN_T int
#endif
#if wxUSE_IPV6
typedef struct sockaddr_storage wxSockAddr;
#else
typedef struct sockaddr wxSockAddr;
#endif
bool GSocket_Init() bool GSocket_Init()
{ {
@@ -117,113 +108,6 @@ void GSocket::Close()
m_fd = INVALID_SOCKET; 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 */ /* Server specific parts */
/* GSocket_SetServer: /* GSocket_SetServer:

View File

@@ -29,6 +29,8 @@
#if wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) #if wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__)
#include "wx/private/socket.h"
#include <assert.h> #include <assert.h>
#include <sys/types.h> #include <sys/types.h>
#ifdef __VISAGECPP__ #ifdef __VISAGECPP__
@@ -443,12 +445,6 @@ struct servent *wxGetservbyname_r(const char *port, const char *protocol,
# define GSocket_Debug(args) # define GSocket_Debug(args)
#endif /* __GSOCKET_DEBUG__ */ #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 /* Table of GUI-related functions. We must call them indirectly because
* of wxBase and GUI separation: */ * of wxBase and GUI separation: */
@@ -512,123 +508,6 @@ void GSocket::Shutdown()
GSocketBase::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 */ /* Server specific parts */
/* GSocket_SetServer: /* GSocket_SetServer: