replaced unweildy GAddress functions with wxSockAddressImpl class, similarly to GSocket -> wxSocketImpl transition; share more code between IPv4 and IPv6 branches

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57635 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-12-29 14:35:48 +00:00
parent f045c7f52d
commit c9bccf239c
7 changed files with 1220 additions and 2018 deletions

View File

@@ -176,8 +176,6 @@ wxSocketImpl::wxSocketImpl(wxSocketBase& wxsocket)
: m_wxsocket(&wxsocket)
{
m_fd = INVALID_SOCKET;
m_local = NULL;
m_peer = NULL;
m_error = wxSOCKET_NOERROR;
m_server = false;
m_stream = true;
@@ -194,17 +192,11 @@ wxSocketImpl::wxSocketImpl(wxSocketBase& wxsocket)
wxSocketImpl::~wxSocketImpl()
{
if (m_fd != INVALID_SOCKET)
if ( m_fd != INVALID_SOCKET )
Shutdown();
if (m_local)
GAddress_destroy(m_local);
if (m_peer)
GAddress_destroy(m_peer);
}
bool wxSocketImpl::PreCreateCheck(GAddress *addr)
bool wxSocketImpl::PreCreateCheck(const wxSockAddressImpl& addr)
{
if ( m_fd != INVALID_SOCKET )
{
@@ -212,7 +204,7 @@ bool wxSocketImpl::PreCreateCheck(GAddress *addr)
return false;
}
if ( !addr || !addr->m_addr )
if ( !addr.IsOk() )
{
m_error = wxSOCKET_INVADDR;
return false;
@@ -250,16 +242,14 @@ void wxSocketImpl::PostCreation()
wxSocketError wxSocketImpl::UpdateLocalAddress()
{
WX_SOCKLEN_T lenAddr = sizeof(*m_local->m_addr);
if ( getsockname(m_fd, m_local->m_addr, &lenAddr) != 0 )
WX_SOCKLEN_T lenAddr = m_local.GetLen();
if ( getsockname(m_fd, m_local.GetWritableAddr(), &lenAddr) != 0 )
{
Close();
m_error = wxSOCKET_IOERR;
return m_error;
}
m_local->m_len = lenAddr;
return wxSOCKET_NOERROR;
}
@@ -272,7 +262,7 @@ wxSocketError wxSocketImpl::CreateServer()
m_stream = true;
// do create the socket
m_fd = socket(m_local->m_realfamily, SOCK_STREAM, 0);
m_fd = socket(m_local.GetFamily(), SOCK_STREAM, 0);
if ( m_fd == INVALID_SOCKET )
{
@@ -285,7 +275,7 @@ wxSocketError wxSocketImpl::CreateServer()
// and then bind to and listen on it
//
// FIXME: should we test for m_dobind here?
if ( bind(m_fd, m_local->m_addr, m_local->m_len) != 0 )
if ( bind(m_fd, m_local.GetAddr(), m_local.GetLen()) != 0 )
m_error = wxSOCKET_IOERR;
if ( IsOk() )
@@ -309,7 +299,7 @@ wxSocketError wxSocketImpl::CreateClient(bool wait)
if ( !PreCreateCheck(m_peer) )
return m_error;
m_fd = socket(m_peer->m_realfamily, SOCK_STREAM, 0);
m_fd = socket(m_peer.GetFamily(), SOCK_STREAM, 0);
if ( m_fd == INVALID_SOCKET )
{
@@ -320,9 +310,9 @@ wxSocketError wxSocketImpl::CreateClient(bool wait)
PostCreation();
// If a local address has been set, then bind to it before calling connect
if ( m_local && m_local->m_addr )
if ( m_local.IsOk() )
{
if ( bind(m_fd, m_local->m_addr, m_local->m_len) != 0 )
if ( bind(m_fd, m_local.GetAddr(), m_local.GetLen()) != 0 )
{
Close();
m_error = wxSOCKET_IOERR;
@@ -331,7 +321,7 @@ wxSocketError wxSocketImpl::CreateClient(bool wait)
}
// Do connect now
int rc = connect(m_fd, m_peer->m_addr, m_peer->m_len);
int rc = connect(m_fd, m_peer.GetAddr(), m_peer.GetLen());
if ( rc == SOCKET_ERROR )
{
wxSocketError err = GetLastError();
@@ -369,7 +359,7 @@ wxSocketError wxSocketImpl::CreateUDP()
m_stream = false;
m_server = false;
m_fd = socket(m_local->m_realfamily, SOCK_DGRAM, 0);
m_fd = socket(m_local.GetFamily(), SOCK_DGRAM, 0);
if ( m_fd == INVALID_SOCKET )
{
@@ -381,7 +371,7 @@ wxSocketError wxSocketImpl::CreateUDP()
if ( m_dobind )
{
if ( bind(m_fd, m_local->m_addr, m_local->m_len) != 0 )
if ( bind(m_fd, m_local.GetAddr(), m_local.GetLen()) != 0 )
{
Close();
m_error = wxSOCKET_IOERR;
@@ -396,18 +386,16 @@ wxSocketError wxSocketImpl::CreateUDP()
wxSocketImpl *wxSocketImpl::Accept(wxSocketBase& wxsocket)
{
wxSockAddr from;
wxSockAddressStorage from;
WX_SOCKLEN_T fromlen = sizeof(from);
const SOCKET fd = accept(m_fd, &from, &fromlen);
const SOCKET fd = accept(m_fd, &from.addr, &fromlen);
if ( fd == INVALID_SOCKET )
return NULL;
wxSocketImpl * const sock = Create(wxsocket);
sock->m_fd = fd;
sock->m_peer = GAddress_new();
_GAddress_translate_from(sock->m_peer, &from, fromlen);
sock->m_peer = wxSockAddressImpl(from.addr, fromlen);
sock->UnblockAndRegisterWithEventLoop();
@@ -452,107 +440,45 @@ void wxSocketImpl::NotifyOnStateChange(wxSocketNotify event)
}
/* Address handling */
/*
* Set or get the local or peer address for this socket. The 'set'
* functions return wxSOCKET_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 socket.
*
* Error codes:
* wxSOCKET_INVSOCK - the socket is not valid.
* wxSOCKET_INVADDR - the address is not valid.
*/
wxSocketError wxSocketImpl::SetLocal(GAddress *address)
wxSocketError wxSocketImpl::SetLocal(const wxSockAddressImpl& local)
{
/* the socket must be initialized, or it must be a server */
if (m_fd != INVALID_SOCKET && !m_server)
{
m_error = wxSOCKET_INVSOCK;
return wxSOCKET_INVSOCK;
}
/* the socket must be initialized, or it must be a server */
if (m_fd != INVALID_SOCKET && !m_server)
{
m_error = wxSOCKET_INVSOCK;
return wxSOCKET_INVSOCK;
}
/* check address */
if (address == NULL || address->m_family == wxSOCKET_NOFAMILY)
{
m_error = wxSOCKET_INVADDR;
return wxSOCKET_INVADDR;
}
if ( !local.IsOk() )
{
m_error = wxSOCKET_INVADDR;
return wxSOCKET_INVADDR;
}
if (m_local)
GAddress_destroy(m_local);
m_local = local;
m_local = GAddress_copy(address);
return wxSOCKET_NOERROR;
return wxSOCKET_NOERROR;
}
wxSocketError wxSocketImpl::SetPeer(GAddress *address)
wxSocketError wxSocketImpl::SetPeer(const wxSockAddressImpl& peer)
{
/* check address */
if (address == NULL || address->m_family == wxSOCKET_NOFAMILY)
{
m_error = wxSOCKET_INVADDR;
return wxSOCKET_INVADDR;
}
if ( !peer.IsOk() )
{
m_error = wxSOCKET_INVADDR;
return wxSOCKET_INVADDR;
}
if (m_peer)
GAddress_destroy(m_peer);
m_peer = peer;
m_peer = GAddress_copy(address);
return wxSOCKET_NOERROR;
return wxSOCKET_NOERROR;
}
GAddress *wxSocketImpl::GetLocal()
const wxSockAddressImpl& wxSocketImpl::GetLocal()
{
GAddress *address;
wxSockAddr addr;
WX_SOCKLEN_T size = sizeof(addr);
wxSocketError err;
if ( !m_local.IsOk() )
UpdateLocalAddress();
/* 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 = wxSOCKET_INVSOCK;
return NULL;
}
if (getsockname(m_fd, (sockaddr*)&addr, &size) == SOCKET_ERROR)
{
m_error = wxSOCKET_IOERR;
return NULL;
}
/* got a valid address from getsockname, create a GAddress object */
if ((address = GAddress_new()) == NULL)
{
m_error = wxSOCKET_MEMERR;
return NULL;
}
if ((err = _GAddress_translate_from(address, (sockaddr*)&addr, size)) != wxSOCKET_NOERROR)
{
GAddress_destroy(address);
m_error = err;
return NULL;
}
return address;
}
GAddress *wxSocketImpl::GetPeer()
{
/* try to get it from the m_peer var */
if (m_peer)
return GAddress_copy(m_peer);
return NULL;
return m_local;
}
// ----------------------------------------------------------------------------
@@ -604,50 +530,34 @@ int wxSocketImpl::SendStream(const void *buffer, int size)
int wxSocketImpl::RecvDgram(void *buffer, int size)
{
wxSockAddr from;
wxSockAddressStorage from;
WX_SOCKLEN_T fromlen = sizeof(from);
int ret;
DO_WHILE_EINTR( ret, recvfrom(m_fd, static_cast<char *>(buffer), size,
0, &from, &fromlen) );
0, &from.addr, &fromlen) );
if ( ret == SOCKET_ERROR )
return SOCKET_ERROR;
/* Translate a system address into a wxSocketImpl address */
if ( !m_peer )
m_peer = GAddress_new();
m_error = _GAddress_translate_from(m_peer, &from, fromlen);
if ( m_error != wxSOCKET_NOERROR )
{
GAddress_destroy(m_peer);
m_peer = NULL;
m_peer = wxSockAddressImpl(from.addr, fromlen);
if ( !m_peer.IsOk() )
return -1;
}
return ret;
}
int wxSocketImpl::SendDgram(const void *buffer, int size)
{
if ( !m_peer )
if ( !m_peer.IsOk() )
{
m_error = wxSOCKET_INVADDR;
return -1;
}
struct sockaddr *addr;
int len;
m_error = _GAddress_translate_to(m_peer, &addr, &len);
if ( m_error != wxSOCKET_NOERROR )
return -1;
int ret;
DO_WHILE_EINTR( ret, sendto(m_fd, static_cast<const char *>(buffer), size,
0, addr, len) );
free(addr);
0, m_peer.GetAddr(), m_peer.GetLen()) );
return ret;
}
@@ -1463,36 +1373,28 @@ bool wxSocketBase::WaitForLost(long seconds, long milliseconds)
// Get local or peer address
//
bool wxSocketBase::GetPeer(wxSockAddress& addr_man) const
bool wxSocketBase::GetPeer(wxSockAddress& addr) const
{
GAddress *peer;
wxCHECK_MSG( m_impl, false, "invalid socket" );
if (!m_impl)
const wxSockAddressImpl& peer = m_impl->GetPeer();
if ( !peer.IsOk() )
return false;
peer = m_impl->GetPeer();
// copying a null address would just trigger an assert anyway
if (!peer)
return false;
addr_man.SetAddress(peer);
GAddress_destroy(peer);
addr.SetAddress(peer);
return true;
}
bool wxSocketBase::GetLocal(wxSockAddress& addr_man) const
bool wxSocketBase::GetLocal(wxSockAddress& addr) const
{
GAddress *local;
wxCHECK_MSG( m_impl, false, "invalid socket" );
if (!m_impl)
const wxSockAddressImpl& local = m_impl->GetLocal();
if ( !local.IsOk() )
return false;
local = m_impl->GetLocal();
addr_man.SetAddress(local);
GAddress_destroy(local);
addr.SetAddress(local);
return true;
}
@@ -1700,7 +1602,7 @@ wxUint32 wxSocketBase::GetPushback(void *buffer, wxUint32 size, bool peek)
// Ctor
// --------------------------------------------------------------------------
wxSocketServer::wxSocketServer(const wxSockAddress& addr_man,
wxSocketServer::wxSocketServer(const wxSockAddress& addr,
wxSocketFlags flags)
: wxSocketBase(flags, wxSOCKET_SERVER)
{
@@ -1715,7 +1617,7 @@ wxSocketServer::wxSocketServer(const wxSockAddress& addr_man,
}
// Setup the socket as server
m_impl->SetLocal(addr_man.GetAddress());
m_impl->SetLocal(addr.GetAddress());
if (GetFlags() & wxSOCKET_REUSEADDR) {
m_impl->SetReusable();
@@ -1825,17 +1727,9 @@ wxSocketBase::SetOption(int level, int optname, const void *optval, int optlen)
bool wxSocketBase::SetLocal(const wxIPV4address& local)
{
GAddress* la = local.GetAddress();
m_localAddress = local;
// If the address is valid, save it for use when we call Connect
if (la && la->m_addr)
{
m_localAddress = local;
return true;
}
return false;
return true;
}
// ==========================================================================
@@ -1890,7 +1784,7 @@ bool wxSocketClient::DoConnect(const wxSockAddress& remote,
// Bind to the local IP address and port, when provided or if one had been
// set before
if ( !local && m_localAddress.GetAddress() )
if ( !local && m_localAddress.GetAddress().IsOk() )
local = &m_localAddress;
if ( local )