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:
Guillermo Rodriguez Garcia
2000-03-16 21:57:20 +00:00
parent 032d558182
commit 5c9eff3055
8 changed files with 100 additions and 70 deletions

View File

@@ -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

View File

@@ -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
{ {

View File

@@ -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;

View File

@@ -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

View File

@@ -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)
{ {

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);