Removed bool params and retvalues in GSocket interface to avoid mismatch
between C-compiled bools in gsocket and C++ real bools as passed by wxSocket git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6776 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -20,19 +20,6 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#if !defined(__cplusplus)
|
|
||||||
typedef unsigned int bool;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef TRUE
|
|
||||||
#define TRUE 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef FALSE
|
|
||||||
#define FALSE 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@@ -91,7 +78,7 @@ typedef void (*GSocketCallback)(GSocket *socket, GSocketEvent event,
|
|||||||
/* Global initializers */
|
/* Global initializers */
|
||||||
|
|
||||||
/* GSocket_Init() must be called at the beginning */
|
/* GSocket_Init() must be called at the beginning */
|
||||||
bool GSocket_Init(void);
|
int GSocket_Init(void);
|
||||||
|
|
||||||
/* GSocket_Cleanup() must be called at the end */
|
/* GSocket_Cleanup() must be called at the end */
|
||||||
void GSocket_Cleanup(void);
|
void GSocket_Cleanup(void);
|
||||||
@@ -231,7 +218,7 @@ GSocketEventFlags GSocket_Select(GSocket *socket, GSocketEventFlags flags);
|
|||||||
* Sets the socket to non-blocking mode. All IO calls will return
|
* Sets the socket to non-blocking mode. All IO calls will return
|
||||||
* immediately.
|
* immediately.
|
||||||
*/
|
*/
|
||||||
void GSocket_SetNonBlocking(GSocket *socket, bool non_block);
|
void GSocket_SetNonBlocking(GSocket *socket, int non_block);
|
||||||
|
|
||||||
/* GSocket_SetTimeout:
|
/* GSocket_SetTimeout:
|
||||||
* Sets the timeout for blocking calls. Time is expressed in
|
* Sets the timeout for blocking calls. Time is expressed in
|
||||||
|
@@ -28,6 +28,18 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__cplusplus)
|
||||||
|
typedef int bool;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FALSE
|
||||||
|
#define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Definition of GSocket */
|
/* Definition of GSocket */
|
||||||
struct _GSocket
|
struct _GSocket
|
||||||
{
|
{
|
||||||
|
@@ -58,8 +58,9 @@ typedef GSocketEventFlags wxSocketEventFlags;
|
|||||||
|
|
||||||
enum wxSocketError
|
enum wxSocketError
|
||||||
{
|
{
|
||||||
|
// from GSocket
|
||||||
wxSOCKET_NOERROR = GSOCK_NOERROR,
|
wxSOCKET_NOERROR = GSOCK_NOERROR,
|
||||||
wxSOCKET_INPOP = GSOCK_INVOP,
|
wxSOCKET_INVOP = GSOCK_INVOP,
|
||||||
wxSOCKET_IOERR = GSOCK_IOERR,
|
wxSOCKET_IOERR = GSOCK_IOERR,
|
||||||
wxSOCKET_INVADDR = GSOCK_INVADDR,
|
wxSOCKET_INVADDR = GSOCK_INVADDR,
|
||||||
wxSOCKET_INVSOCK = GSOCK_INVSOCK,
|
wxSOCKET_INVSOCK = GSOCK_INVSOCK,
|
||||||
@@ -67,7 +68,10 @@ enum wxSocketError
|
|||||||
wxSOCKET_INVPORT = GSOCK_INVPORT,
|
wxSOCKET_INVPORT = GSOCK_INVPORT,
|
||||||
wxSOCKET_WOULDBLOCK = GSOCK_WOULDBLOCK,
|
wxSOCKET_WOULDBLOCK = GSOCK_WOULDBLOCK,
|
||||||
wxSOCKET_TIMEDOUT = GSOCK_TIMEDOUT,
|
wxSOCKET_TIMEDOUT = GSOCK_TIMEDOUT,
|
||||||
wxSOCKET_MEMERR = GSOCK_MEMERR
|
wxSOCKET_MEMERR = GSOCK_MEMERR,
|
||||||
|
|
||||||
|
// wxSocket-specific (not yet implemented)
|
||||||
|
wxSOCKET_DUMMY
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@@ -191,7 +195,7 @@ public:
|
|||||||
// Implementation from now on
|
// Implementation from now on
|
||||||
// --------------------------
|
// --------------------------
|
||||||
|
|
||||||
// do not use, should be private
|
// do not use, should be private (called from GSocket)
|
||||||
void OnRequest(wxSocketNotify notify);
|
void OnRequest(wxSocketNotify notify);
|
||||||
|
|
||||||
// do not use, not documented nor supported
|
// do not use, not documented nor supported
|
||||||
@@ -213,6 +217,7 @@ private:
|
|||||||
wxUint32 GetPushback(void *buffer, wxUint32 size, bool peek);
|
wxUint32 GetPushback(void *buffer, wxUint32 size, bool peek);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// socket
|
||||||
GSocket *m_socket; // GSocket
|
GSocket *m_socket; // GSocket
|
||||||
wxSocketType m_type; // wxSocket type
|
wxSocketType m_type; // wxSocket type
|
||||||
|
|
||||||
@@ -223,6 +228,7 @@ private:
|
|||||||
bool m_reading; // busy reading?
|
bool m_reading; // busy reading?
|
||||||
bool m_writing; // busy writing?
|
bool m_writing; // busy writing?
|
||||||
bool m_error; // did last IO call fail?
|
bool m_error; // did last IO call fail?
|
||||||
|
wxSocketError m_lasterror; // last error (not cleared on success)
|
||||||
wxUint32 m_lcount; // last IO transaction size
|
wxUint32 m_lcount; // last IO transaction size
|
||||||
unsigned long m_timeout; // IO timeout value
|
unsigned long m_timeout; // IO timeout value
|
||||||
wxList m_states; // stack of states
|
wxList m_states; // stack of states
|
||||||
@@ -304,6 +310,10 @@ public:
|
|||||||
wxDatagramSocket& SendTo( wxSockAddress& addr,
|
wxDatagramSocket& SendTo( wxSockAddress& addr,
|
||||||
const void* buf,
|
const void* buf,
|
||||||
wxUint32 nBytes );
|
wxUint32 nBytes );
|
||||||
|
|
||||||
|
/* TODO:
|
||||||
|
bool Connect(wxSockAddress& addr);
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -323,8 +333,10 @@ public:
|
|||||||
void *GetClientData() const { return m_clientData; }
|
void *GetClientData() const { return m_clientData; }
|
||||||
|
|
||||||
// backwards compatibility
|
// backwards compatibility
|
||||||
|
#if WXWIN_COMPATIBILITY_2
|
||||||
wxSocketNotify SocketEvent() const { return m_event; }
|
wxSocketNotify SocketEvent() const { return m_event; }
|
||||||
wxSocketBase *Socket() const { return (wxSocketBase *) GetEventObject(); }
|
wxSocketBase *Socket() const { return (wxSocketBase *) GetEventObject(); }
|
||||||
|
#endif // WXWIN_COMPATIBILITY_2
|
||||||
|
|
||||||
void CopyObject(wxObject& object_dest) const;
|
void CopyObject(wxObject& object_dest) const;
|
||||||
|
|
||||||
|
@@ -26,6 +26,18 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#if !defined(__cplusplus)
|
||||||
|
typedef int bool;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FALSE
|
||||||
|
#define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Definition of GSocket */
|
/* Definition of GSocket */
|
||||||
struct _GSocket
|
struct _GSocket
|
||||||
|
@@ -255,23 +255,24 @@ wxUint32 wxSocketBase::_Read(void* buffer, wxUint32 nbytes)
|
|||||||
|
|
||||||
// Possible combinations (they are checked in this order)
|
// Possible combinations (they are checked in this order)
|
||||||
// wxSOCKET_NOWAIT
|
// wxSOCKET_NOWAIT
|
||||||
// wxSOCKET_WAITALL | wxSOCKET_BLOCK
|
// wxSOCKET_WAITALL (with or without wxSOCKET_BLOCK)
|
||||||
// wxSOCKET_WAITALL
|
|
||||||
// wxSOCKET_BLOCK
|
// wxSOCKET_BLOCK
|
||||||
// wxSOCKET_NONE
|
// wxSOCKET_NONE
|
||||||
//
|
//
|
||||||
if (m_flags & wxSOCKET_NOWAIT)
|
if (m_flags & wxSOCKET_NOWAIT)
|
||||||
{
|
{
|
||||||
GSocket_SetNonBlocking(m_socket, TRUE);
|
GSocket_SetNonBlocking(m_socket, 1);
|
||||||
ret = GSocket_Read(m_socket, (char *)buffer, nbytes);
|
ret = GSocket_Read(m_socket, (char *)buffer, nbytes);
|
||||||
GSocket_SetNonBlocking(m_socket, FALSE);
|
GSocket_SetNonBlocking(m_socket, 0);
|
||||||
|
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
total += ret;
|
total += ret;
|
||||||
}
|
}
|
||||||
else if (m_flags & wxSOCKET_WAITALL)
|
else
|
||||||
{
|
{
|
||||||
while (ret > 0 && nbytes > 0)
|
bool more = TRUE;
|
||||||
|
|
||||||
|
while (more)
|
||||||
{
|
{
|
||||||
if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForRead() )
|
if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForRead() )
|
||||||
break;
|
break;
|
||||||
@@ -284,16 +285,12 @@ wxUint32 wxSocketBase::_Read(void* buffer, wxUint32 nbytes)
|
|||||||
nbytes -= ret;
|
nbytes -= ret;
|
||||||
buffer = (char *)buffer + ret;
|
buffer = (char *)buffer + ret;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((m_flags & wxSOCKET_BLOCK) || WaitForRead())
|
|
||||||
{
|
|
||||||
ret = GSocket_Read(m_socket, (char *)buffer, nbytes);
|
|
||||||
|
|
||||||
if (ret > 0)
|
// If we got here and wxSOCKET_WAITALL is not set, we can leave
|
||||||
total += ret;
|
// now. Otherwise, wait until we recv all the data or until there
|
||||||
|
// is an error.
|
||||||
|
//
|
||||||
|
more = (ret > 0 && nbytes > 0 && (m_flags & wxSOCKET_WAITALL));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -443,29 +440,30 @@ wxUint32 wxSocketBase::_Write(const void *buffer, wxUint32 nbytes)
|
|||||||
wxUint32 total = 0;
|
wxUint32 total = 0;
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
|
|
||||||
// If the socket is invalid, return immediately
|
// If the socket is invalid or parameters are ill, return immediately
|
||||||
if (!m_socket)
|
if (!m_socket || !buffer || !nbytes)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// Possible combinations (they are checked in this order)
|
// Possible combinations (they are checked in this order)
|
||||||
// wxSOCKET_NOWAIT
|
// wxSOCKET_NOWAIT
|
||||||
// wxSOCKET_WAITALL | wxSOCKET_BLOCK
|
// wxSOCKET_WAITALL (with or without wxSOCKET_BLOCK)
|
||||||
// wxSOCKET_WAITALL
|
|
||||||
// wxSOCKET_BLOCK
|
// wxSOCKET_BLOCK
|
||||||
// wxSOCKET_NONE
|
// wxSOCKET_NONE
|
||||||
//
|
//
|
||||||
if (m_flags & wxSOCKET_NOWAIT)
|
if (m_flags & wxSOCKET_NOWAIT)
|
||||||
{
|
{
|
||||||
GSocket_SetNonBlocking(m_socket, TRUE);
|
GSocket_SetNonBlocking(m_socket, 1);
|
||||||
ret = GSocket_Write(m_socket, (const char *)buffer, nbytes);
|
ret = GSocket_Write(m_socket, (const char *)buffer, nbytes);
|
||||||
GSocket_SetNonBlocking(m_socket, FALSE);
|
GSocket_SetNonBlocking(m_socket, 0);
|
||||||
|
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
total = ret;
|
total = ret;
|
||||||
}
|
}
|
||||||
else if (m_flags & wxSOCKET_WAITALL)
|
else
|
||||||
{
|
{
|
||||||
while (ret > 0 && nbytes > 0)
|
bool more = TRUE;
|
||||||
|
|
||||||
|
while (more)
|
||||||
{
|
{
|
||||||
if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForWrite() )
|
if ( !(m_flags & wxSOCKET_BLOCK) && !WaitForWrite() )
|
||||||
break;
|
break;
|
||||||
@@ -478,16 +476,24 @@ wxUint32 wxSocketBase::_Write(const void *buffer, wxUint32 nbytes)
|
|||||||
nbytes -= ret;
|
nbytes -= ret;
|
||||||
buffer = (const char *)buffer + ret;
|
buffer = (const char *)buffer + ret;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((m_flags & wxSOCKET_BLOCK) || WaitForWrite())
|
|
||||||
{
|
|
||||||
ret = GSocket_Write(m_socket, (const char *)buffer, nbytes);
|
|
||||||
|
|
||||||
if (ret > 0)
|
// Yes, this can happen even when the socket selects as writable!
|
||||||
total = ret;
|
// (probably due to a buggy kernel; Linux 2.0.36 seems to do this).
|
||||||
|
// Fake it so that we stay in the loop, but do it only for ret < 0,
|
||||||
|
// as ret == 0 means that the socket is closed. I'm not applying
|
||||||
|
// this hack for read calls as it seems unnecessary there.
|
||||||
|
//
|
||||||
|
if ((ret < 0) && (GSocket_GetError(m_socket) == GSOCK_WOULDBLOCK))
|
||||||
|
{
|
||||||
|
wxLogDebug(_("wxSocket: working around select() bug in Write."));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we got here and wxSOCKET_WAITALL is not set, we can leave
|
||||||
|
// now. Otherwise, wait until we send all the data or until there
|
||||||
|
// is an error.
|
||||||
|
//
|
||||||
|
more = (ret > 0 && nbytes > 0 && (m_flags & wxSOCKET_WAITALL));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1047,12 +1053,12 @@ bool wxSocketServer::AcceptWith(wxSocketBase& sock, bool wait)
|
|||||||
// again.
|
// again.
|
||||||
|
|
||||||
if (!wait)
|
if (!wait)
|
||||||
GSocket_SetNonBlocking(m_socket, TRUE);
|
GSocket_SetNonBlocking(m_socket, 1);
|
||||||
|
|
||||||
child_socket = GSocket_WaitConnection(m_socket);
|
child_socket = GSocket_WaitConnection(m_socket);
|
||||||
|
|
||||||
if (!wait)
|
if (!wait)
|
||||||
GSocket_SetNonBlocking(m_socket, FALSE);
|
GSocket_SetNonBlocking(m_socket, 0);
|
||||||
|
|
||||||
if (!child_socket)
|
if (!child_socket)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -1135,13 +1141,13 @@ bool wxSocketClient::Connect(wxSockAddress& addr_man, bool wait)
|
|||||||
// again.
|
// again.
|
||||||
|
|
||||||
if (!wait)
|
if (!wait)
|
||||||
GSocket_SetNonBlocking(m_socket, TRUE);
|
GSocket_SetNonBlocking(m_socket, 1);
|
||||||
|
|
||||||
GSocket_SetPeer(m_socket, addr_man.GetAddress());
|
GSocket_SetPeer(m_socket, addr_man.GetAddress());
|
||||||
err = GSocket_Connect(m_socket, GSOCK_STREAMED);
|
err = GSocket_Connect(m_socket, GSOCK_STREAMED);
|
||||||
|
|
||||||
if (!wait)
|
if (!wait)
|
||||||
GSocket_SetNonBlocking(m_socket, FALSE);
|
GSocket_SetNonBlocking(m_socket, 0);
|
||||||
|
|
||||||
if (err != GSOCK_NOERROR)
|
if (err != GSOCK_NOERROR)
|
||||||
{
|
{
|
||||||
|
@@ -768,7 +768,7 @@ GSocketEventFlags GSocket_Select(GSocket *socket, GSocketEventFlags flags)
|
|||||||
* Sets the socket to non-blocking mode. All IO calls will return
|
* Sets the socket to non-blocking mode. All IO calls will return
|
||||||
* immediately.
|
* immediately.
|
||||||
*/
|
*/
|
||||||
void GSocket_SetNonBlocking(GSocket *socket, bool non_block)
|
void GSocket_SetNonBlocking(GSocket *socket, int non_block)
|
||||||
{
|
{
|
||||||
assert(socket != NULL);
|
assert(socket != NULL);
|
||||||
|
|
||||||
|
@@ -82,7 +82,7 @@ static int firstAvailable;
|
|||||||
|
|
||||||
/* Global initializers */
|
/* Global initializers */
|
||||||
|
|
||||||
bool GSocket_Init(void)
|
int GSocket_Init(void)
|
||||||
{
|
{
|
||||||
WSADATA wsaData;
|
WSADATA wsaData;
|
||||||
WNDCLASS winClass;
|
WNDCLASS winClass;
|
||||||
|
@@ -25,7 +25,8 @@
|
|||||||
|
|
||||||
#ifdef __VMS__
|
#ifdef __VMS__
|
||||||
#include <socket.h>
|
#include <socket.h>
|
||||||
struct sockaddr_un {
|
struct sockaddr_un
|
||||||
|
{
|
||||||
u_char sun_len; /* sockaddr len including null */
|
u_char sun_len; /* sockaddr len including null */
|
||||||
u_char sun_family; /* AF_UNIX */
|
u_char sun_family; /* AF_UNIX */
|
||||||
char sun_path[108]; /* path name (gag) */
|
char sun_path[108]; /* path name (gag) */
|
||||||
@@ -122,9 +123,9 @@ struct sockaddr_un {
|
|||||||
|
|
||||||
/* Global initialisers */
|
/* Global initialisers */
|
||||||
|
|
||||||
bool GSocket_Init(void)
|
int GSocket_Init(void)
|
||||||
{
|
{
|
||||||
return TRUE;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSocket_Cleanup(void)
|
void GSocket_Cleanup(void)
|
||||||
@@ -895,7 +896,7 @@ GSocketEventFlags GSocket_Select(GSocket *socket, GSocketEventFlags flags)
|
|||||||
* Sets the socket to non-blocking mode. All IO calls will return
|
* Sets the socket to non-blocking mode. All IO calls will return
|
||||||
* immediately.
|
* immediately.
|
||||||
*/
|
*/
|
||||||
void GSocket_SetNonBlocking(GSocket *socket, bool non_block)
|
void GSocket_SetNonBlocking(GSocket *socket, int non_block)
|
||||||
{
|
{
|
||||||
assert(socket != NULL);
|
assert(socket != NULL);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user