Renamed GSocket_SetBlocking to GSocket_SetNonBlocking and *Fallback to *Callback
Added GSocket_SetTimeout Added timeout support in wxSocket (as it was in previous releases) Updated documentation git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3215 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -183,6 +183,7 @@
|
|||||||
\input slider.tex
|
\input slider.tex
|
||||||
\input sckaddr.tex
|
\input sckaddr.tex
|
||||||
\input socket.tex
|
\input socket.tex
|
||||||
|
%\input gsocket.tex
|
||||||
\input splitevt.tex
|
\input splitevt.tex
|
||||||
\input strmsock.tex
|
\input strmsock.tex
|
||||||
\input spinbutt.tex
|
\input spinbutt.tex
|
||||||
|
@@ -23,10 +23,18 @@
|
|||||||
|
|
||||||
Creates a new input stream on the the specified path. You can use all except the seek
|
Creates a new input stream on the the specified path. You can use all except the seek
|
||||||
functionality of wxStream. Seek isn't available on all streams. For example,
|
functionality of wxStream. Seek isn't available on all streams. For example,
|
||||||
http or ftp streams doesn't deal with it. Other functions like StreamSize and
|
http or ftp streams doesn't deal with it. Other functions like Tell and SeekI
|
||||||
Tell aren't available for the moment for this sort of stream.
|
for this sort of stream.
|
||||||
You will be notified when the EOF is reached by an error.
|
You will be notified when the EOF is reached by an error.
|
||||||
|
|
||||||
|
\wxheading{Note}
|
||||||
|
|
||||||
|
You can know the size of the file you are getting using \helpref{wxStreamBase::GetSize()}{wxstreambasegetsize}.
|
||||||
|
But there is a limitation: as HTTP servers aren't obliged to pass the size ofi
|
||||||
|
the file, in some case, you will be returned 0xfffffff by GetSize(). In these
|
||||||
|
cases, you should use the value returned by \helpref{wxInputStream::LastRead()}{wxinputstreamlastread}:
|
||||||
|
this value will be 0 when the stream is finished.
|
||||||
|
|
||||||
\wxheading{Return value}
|
\wxheading{Return value}
|
||||||
|
|
||||||
Returns the initialized stream. You will have to delete it yourself once you
|
Returns the initialized stream. You will have to delete it yourself once you
|
||||||
@@ -48,10 +56,14 @@ It sets data of a field to be sent during the next request to the HTTP server. T
|
|||||||
name is specified by \it{header} and the content by \it{h\_data}.
|
name is specified by \it{header} and the content by \it{h\_data}.
|
||||||
This is a low level function and it assumes that you know what you are doing.
|
This is a low level function and it assumes that you know what you are doing.
|
||||||
|
|
||||||
\membersection{wxHTTP::SetHeader}
|
\membersection{wxHTTP::GetHeader}
|
||||||
|
|
||||||
\func{wxString}{GetHeader}{\param{const wxString\&}{ header}}
|
\func{wxString}{GetHeader}{\param{const wxString\&}{ header}}
|
||||||
|
|
||||||
Returns the data attached with a field whose name is specified by \it{header}.
|
Returns the data attached with a field whose name is specified by \it{header}.
|
||||||
If the field doesn't exist, it will return an empty string and not a NULL string.
|
If the field doesn't exist, it will return an empty string and not a NULL string.
|
||||||
|
|
||||||
|
\wxheading{Note}
|
||||||
|
|
||||||
|
The header is not case-sensitive: I mean that "CONTENT-TYPE" and "content-type"
|
||||||
|
represent the same header.
|
||||||
|
@@ -32,7 +32,7 @@ Destructor.
|
|||||||
|
|
||||||
Returns the first character in the input queue and removes it.
|
Returns the first character in the input queue and removes it.
|
||||||
|
|
||||||
\membersection{wxInputStream::LastRead}
|
\membersection{wxInputStream::LastRead}\label{wxinputstreamlastread}
|
||||||
|
|
||||||
\constfunc{size\_t}{LastRead}{\void}
|
\constfunc{size\_t}{LastRead}{\void}
|
||||||
|
|
||||||
|
@@ -76,7 +76,7 @@ real position in the stream.
|
|||||||
|
|
||||||
See \helpref{OnSysRead}{wxstreambaseonsysread}.
|
See \helpref{OnSysRead}{wxstreambaseonsysread}.
|
||||||
|
|
||||||
\membersection{wxStreamBase::GetSize}
|
\membersection{wxStreamBase::GetSize}\label{wxstreambasegetsize}
|
||||||
|
|
||||||
\constfunc{size\_t}{GetSize}{\void}
|
\constfunc{size\_t}{GetSize}{\void}
|
||||||
|
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
This class is input stream from ZIP archive. The archive
|
This class is input stream from ZIP archive. The archive
|
||||||
must be local file (accessible via FILE*).
|
must be local file (accessible via FILE*).
|
||||||
It has all features including StreamSize and seeking.
|
It has all features including GetSize and seeking.
|
||||||
|
|
||||||
\wxheading{Derived from}
|
\wxheading{Derived from}
|
||||||
|
|
||||||
|
@@ -66,7 +66,7 @@ enum {
|
|||||||
|
|
||||||
typedef int GSocketEventFlags;
|
typedef int GSocketEventFlags;
|
||||||
|
|
||||||
typedef void (*GSocketFallback)(GSocket *socket, GSocketEvent event,
|
typedef void (*GSocketCallback)(GSocket *socket, GSocketEvent event,
|
||||||
char *cdata);
|
char *cdata);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@@ -134,13 +134,19 @@ int GSocket_Write(GSocket *socket, const char *buffer,
|
|||||||
int size);
|
int size);
|
||||||
bool GSocket_DataAvailable(GSocket *socket);
|
bool GSocket_DataAvailable(GSocket *socket);
|
||||||
|
|
||||||
/* Flags */
|
/* Flags/Parameters */
|
||||||
|
|
||||||
|
/*
|
||||||
|
GSocket_SetTimeout() sets the timeout for reading and writing IO call. Time
|
||||||
|
is expressed in milliseconds.
|
||||||
|
*/
|
||||||
|
void GSocket_SetTimeout(GSocket *socket, unsigned long millisec);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
GSocket_SetBlocking() puts the socket in non-blocking mode. This is useful
|
GSocket_SetBlocking() puts the socket in non-blocking mode. This is useful
|
||||||
if we don't want to wait.
|
if we don't want to wait.
|
||||||
*/
|
*/
|
||||||
void GSocket_SetBlocking(GSocket *socket, bool block);
|
void GSocket_SetNonBlocking(GSocket *socket, bool non_block);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
GSocket_GetError() returns the last error occured on the socket stream.
|
GSocket_GetError() returns the last error occured on the socket stream.
|
||||||
@@ -161,7 +167,7 @@ GSocketError GSocket_GetError(GSocket *socket);
|
|||||||
Server socket -> a client request a connection
|
Server socket -> a client request a connection
|
||||||
LOST: the connection is lost
|
LOST: the connection is lost
|
||||||
|
|
||||||
SetFallback accepts a combination of these flags so a same callback can
|
SetCallback accepts a combination of these flags so a same callback can
|
||||||
receive different events.
|
receive different events.
|
||||||
|
|
||||||
An event is generated only once and its state is reseted when the relative
|
An event is generated only once and its state is reseted when the relative
|
||||||
@@ -169,14 +175,14 @@ GSocketError GSocket_GetError(GSocket *socket);
|
|||||||
For example: INPUT -> GSocket_Read()
|
For example: INPUT -> GSocket_Read()
|
||||||
CONNECTION -> GSocket_Accept()
|
CONNECTION -> GSocket_Accept()
|
||||||
*/
|
*/
|
||||||
void GSocket_SetFallback(GSocket *socket, GSocketEventFlags event,
|
void GSocket_SetCallback(GSocket *socket, GSocketEventFlags event,
|
||||||
GSocketFallback fallback, char *cdata);
|
GSocketCallback fallback, char *cdata);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
UnsetFallback will disables all fallbacks specified by "event".
|
UnsetCallback will disables all fallbacks specified by "event".
|
||||||
NOTE: event may be a combination of flags
|
NOTE: event may be a combination of flags
|
||||||
*/
|
*/
|
||||||
void GSocket_UnsetFallback(GSocket *socket, GSocketEventFlags event);
|
void GSocket_UnsetCallback(GSocket *socket, GSocketEventFlags event);
|
||||||
|
|
||||||
/* GAddress */
|
/* GAddress */
|
||||||
|
|
||||||
|
@@ -24,15 +24,16 @@
|
|||||||
// wxSocket headers (generic)
|
// wxSocket headers (generic)
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
#ifdef WXPREC
|
#ifdef WXPREC
|
||||||
#include "wx/wxprec.h"
|
# include <wx/wxprec.h>
|
||||||
#else
|
#else
|
||||||
#include "wx/event.h"
|
# include <wx/event.h>
|
||||||
#include "wx/string.h"
|
# include <wx/string.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "wx/sckaddr.h"
|
#include <wx/sckaddr.h>
|
||||||
#include "wx/gsocket.h"
|
#include "wx/gsocket.h"
|
||||||
|
|
||||||
|
class WXDLLEXPORT wxTimer;
|
||||||
class WXDLLEXPORT wxSocketEvent;
|
class WXDLLEXPORT wxSocketEvent;
|
||||||
class WXDLLEXPORT wxSocketBase : public wxEvtHandler
|
class WXDLLEXPORT wxSocketBase : public wxEvtHandler
|
||||||
{
|
{
|
||||||
@@ -65,11 +66,13 @@ protected:
|
|||||||
bool m_notify_state; // Notify state
|
bool m_notify_state; // Notify state
|
||||||
int m_id; // Socket id (for event handler)
|
int m_id; // Socket id (for event handler)
|
||||||
|
|
||||||
|
// Defering variables
|
||||||
enum {
|
enum {
|
||||||
DEFER_READ, DEFER_WRITE, NO_DEFER
|
DEFER_READ, DEFER_WRITE, NO_DEFER
|
||||||
} m_defering; // Defering state
|
} m_defering; // Defering state
|
||||||
char *m_defer_buffer; // Defering target buffer
|
char *m_defer_buffer; // Defering target buffer
|
||||||
size_t m_defer_nbytes; // Defering buffer size
|
size_t m_defer_nbytes; // Defering buffer size
|
||||||
|
wxTimer *m_defer_timer; // Timer for defering mode
|
||||||
|
|
||||||
wxList m_states; // Stack of states
|
wxList m_states; // Stack of states
|
||||||
|
|
||||||
|
@@ -128,32 +128,62 @@ bool wxSocketBase::Close()
|
|||||||
// --------------------------------------------------------------
|
// --------------------------------------------------------------
|
||||||
// wxSocketBase base IO function
|
// wxSocketBase base IO function
|
||||||
// --------------------------------------------------------------
|
// --------------------------------------------------------------
|
||||||
|
class _wxSocketInternalTimer: public wxTimer {
|
||||||
|
public:
|
||||||
|
int *m_state;
|
||||||
|
int m_new_val;
|
||||||
|
|
||||||
|
void Notify()
|
||||||
|
{
|
||||||
|
*m_state = m_new_val; // Change the value
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
int wxSocketBase::DeferRead(char *buffer, size_t nbytes)
|
int wxSocketBase::DeferRead(char *buffer, size_t nbytes)
|
||||||
{
|
{
|
||||||
GSocketEventFlags old_event_flags;
|
GSocketEventFlags old_event_flags;
|
||||||
bool old_notify_state;
|
bool old_notify_state;
|
||||||
|
// Timer for timeout
|
||||||
|
_wxSocketInternalTimer timer;
|
||||||
|
|
||||||
wxASSERT(m_defering == NO_DEFER);
|
wxASSERT(m_defering == NO_DEFER);
|
||||||
|
|
||||||
|
// Set the defering mode to READ.
|
||||||
m_defering = DEFER_READ;
|
m_defering = DEFER_READ;
|
||||||
|
|
||||||
|
// Save the old state.
|
||||||
old_event_flags = NeededReq();
|
old_event_flags = NeededReq();
|
||||||
old_notify_state = m_notify_state;
|
old_notify_state = m_notify_state;
|
||||||
|
|
||||||
|
// Set the new async flag.
|
||||||
SetNotify(GSOCK_INPUT_FLAG | GSOCK_LOST_FLAG);
|
SetNotify(GSOCK_INPUT_FLAG | GSOCK_LOST_FLAG);
|
||||||
Notify(TRUE);
|
Notify(TRUE);
|
||||||
|
|
||||||
|
// Set the current buffer.
|
||||||
m_defer_buffer = buffer;
|
m_defer_buffer = buffer;
|
||||||
m_defer_nbytes = nbytes;
|
m_defer_nbytes = nbytes;
|
||||||
|
m_defer_timer = &timer;
|
||||||
|
|
||||||
|
timer.m_state = (int *)&m_defer_buffer;
|
||||||
|
timer.m_new_val = (int)NULL;
|
||||||
|
|
||||||
|
timer.Start(m_timeout * 1000, FALSE);
|
||||||
|
|
||||||
|
// Wait for buffer completion.
|
||||||
while (m_defer_buffer != NULL)
|
while (m_defer_buffer != NULL)
|
||||||
wxYield();
|
wxYield();
|
||||||
|
|
||||||
|
timer.Stop();
|
||||||
|
|
||||||
|
// Restore the old state.
|
||||||
Notify(old_notify_state);
|
Notify(old_notify_state);
|
||||||
SetNotify(old_event_flags);
|
SetNotify(old_event_flags);
|
||||||
|
|
||||||
|
// Disable defering mode.
|
||||||
m_defering = NO_DEFER;
|
m_defering = NO_DEFER;
|
||||||
|
m_defer_timer = NULL;
|
||||||
|
|
||||||
|
// Return the number of bytes read from the socket.
|
||||||
return nbytes-m_defer_nbytes;
|
return nbytes-m_defer_nbytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,22 +302,39 @@ int wxSocketBase::DeferWrite(const char *buffer, size_t nbytes)
|
|||||||
{
|
{
|
||||||
GSocketEventFlags old_event_flags;
|
GSocketEventFlags old_event_flags;
|
||||||
bool old_notify_state;
|
bool old_notify_state;
|
||||||
|
// Timer for timeout
|
||||||
|
_wxSocketInternalTimer timer;
|
||||||
|
|
||||||
wxASSERT(m_defering == NO_DEFER);
|
wxASSERT(m_defering == NO_DEFER);
|
||||||
|
|
||||||
m_defering = DEFER_WRITE;
|
m_defering = DEFER_WRITE;
|
||||||
|
|
||||||
|
// Save the old state
|
||||||
old_event_flags = NeededReq();
|
old_event_flags = NeededReq();
|
||||||
old_notify_state = m_notify_state;
|
old_notify_state = m_notify_state;
|
||||||
|
|
||||||
SetNotify(GSOCK_OUTPUT_FLAG | GSOCK_LOST_FLAG);
|
SetNotify(GSOCK_OUTPUT_FLAG | GSOCK_LOST_FLAG);
|
||||||
Notify(TRUE);
|
Notify(TRUE);
|
||||||
|
|
||||||
|
// Set the current buffer
|
||||||
m_defer_buffer = (char *)buffer;
|
m_defer_buffer = (char *)buffer;
|
||||||
m_defer_nbytes = nbytes;
|
m_defer_nbytes = nbytes;
|
||||||
|
|
||||||
|
// Start timer
|
||||||
|
timer.m_state = (int *)&m_defer_buffer;
|
||||||
|
timer.m_new_val = (int)NULL;
|
||||||
|
|
||||||
|
m_defer_timer = &timer;
|
||||||
|
timer.Start(m_timeout * 1000, FALSE);
|
||||||
|
|
||||||
while (m_defer_buffer != NULL)
|
while (m_defer_buffer != NULL)
|
||||||
wxYield();
|
wxYield();
|
||||||
|
|
||||||
|
// Stop timer
|
||||||
|
m_defer_timer = NULL;
|
||||||
|
timer.Stop();
|
||||||
|
|
||||||
|
// Restore the old state
|
||||||
Notify(old_notify_state);
|
Notify(old_notify_state);
|
||||||
SetNotify(old_event_flags);
|
SetNotify(old_event_flags);
|
||||||
|
|
||||||
@@ -396,11 +443,15 @@ void wxSocketBase::DoDefer(GSocketEvent req_evt)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
m_defer_nbytes++;
|
m_defer_nbytes++;
|
||||||
|
|
||||||
|
// If we are waiting for all bytes to be acquired, keep the defering modei
|
||||||
|
// enabled.
|
||||||
if ((m_flags & WAITALL) == 0 || m_defer_nbytes == 0 || ret < 0) {
|
if ((m_flags & WAITALL) == 0 || m_defer_nbytes == 0 || ret < 0) {
|
||||||
m_defer_buffer = NULL;
|
m_defer_buffer = NULL;
|
||||||
Notify(FALSE);
|
Notify(FALSE);
|
||||||
} else
|
} else {
|
||||||
m_defer_buffer += ret;
|
m_defer_buffer += ret;
|
||||||
|
m_defer_timer->Start(m_timeout * 1000, FALSE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
@@ -522,16 +573,6 @@ char *wxSocketBase::CallbackData(char *data)
|
|||||||
// --------- wxSocketBase wait functions ------------------------
|
// --------- wxSocketBase wait functions ------------------------
|
||||||
// --------------------------------------------------------------
|
// --------------------------------------------------------------
|
||||||
|
|
||||||
class _wxSocketInternalTimer: public wxTimer {
|
|
||||||
public:
|
|
||||||
int *m_state;
|
|
||||||
|
|
||||||
void Notify()
|
|
||||||
{
|
|
||||||
*m_state = GSOCK_MAX_EVENT; // Just to say it's a timeout.
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static void wx_socket_wait(GSocket *socket, GSocketEvent event, char *cdata)
|
static void wx_socket_wait(GSocket *socket, GSocketEvent event, char *cdata)
|
||||||
{
|
{
|
||||||
int *state = (int *)cdata;
|
int *state = (int *)cdata;
|
||||||
@@ -542,25 +583,30 @@ static void wx_socket_wait(GSocket *socket, GSocketEvent event, char *cdata)
|
|||||||
bool wxSocketBase::_Wait(long seconds, long milliseconds, int type)
|
bool wxSocketBase::_Wait(long seconds, long milliseconds, int type)
|
||||||
{
|
{
|
||||||
bool old_notify_state = m_notify_state;
|
bool old_notify_state = m_notify_state;
|
||||||
int state = 0;
|
int state = -1;
|
||||||
_wxSocketInternalTimer timer;
|
_wxSocketInternalTimer timer;
|
||||||
|
|
||||||
if (!m_connected || !m_socket)
|
if (!m_connected || !m_socket)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
// Set the variable to change
|
||||||
timer.m_state = &state;
|
timer.m_state = &state;
|
||||||
|
timer.m_new_val = GSOCK_MAX_EVENT;
|
||||||
|
|
||||||
|
// Disable the previous handler
|
||||||
Notify(FALSE);
|
Notify(FALSE);
|
||||||
|
|
||||||
|
// Set the timeout
|
||||||
timer.Start(seconds * 1000 + milliseconds, TRUE);
|
timer.Start(seconds * 1000 + milliseconds, TRUE);
|
||||||
GSocket_SetFallback(m_socket, type, wx_socket_wait, (char *)&state);
|
GSocket_SetCallback(m_socket, type, wx_socket_wait, (char *)&state);
|
||||||
|
|
||||||
while (state == 0)
|
while (state == -1)
|
||||||
wxYield();
|
wxYield();
|
||||||
|
|
||||||
GSocket_UnsetFallback(m_socket, type);
|
GSocket_UnsetCallback(m_socket, type);
|
||||||
timer.Stop();
|
timer.Stop();
|
||||||
|
|
||||||
|
// Notify will restore automatically the old GSocket flags
|
||||||
Notify(old_notify_state);
|
Notify(old_notify_state);
|
||||||
|
|
||||||
return (state != GSOCK_MAX_EVENT);
|
return (state != GSOCK_MAX_EVENT);
|
||||||
@@ -649,12 +695,12 @@ void wxSocketBase::Notify(bool notify)
|
|||||||
if (!m_socket)
|
if (!m_socket)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
GSocket_UnsetFallback(m_socket, GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG |
|
GSocket_UnsetCallback(m_socket, GSOCK_INPUT_FLAG | GSOCK_OUTPUT_FLAG |
|
||||||
GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG);
|
GSOCK_LOST_FLAG | GSOCK_CONNECTION_FLAG);
|
||||||
if (!notify)
|
if (!notify)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
GSocket_SetFallback(m_socket, m_neededreq, wx_socket_fallback, (char *)this);
|
GSocket_SetCallback(m_socket, m_neededreq, wx_socket_fallback, (char *)this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxSocketBase::OnRequest(GSocketEvent req_evt)
|
void wxSocketBase::OnRequest(GSocketEvent req_evt)
|
||||||
|
@@ -53,7 +53,7 @@ void _GSocket_GUI_Destroy(GSocket *socket)
|
|||||||
free(socket->m_gui_dependent);
|
free(socket->m_gui_dependent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _GSocket_Install_Fallback(GSocket *socket, GSocketEvent event)
|
void _GSocket_Install_Callback(GSocket *socket, GSocketEvent event)
|
||||||
{
|
{
|
||||||
GdkInputCondition flag;
|
GdkInputCondition flag;
|
||||||
int c;
|
int c;
|
||||||
@@ -76,7 +76,7 @@ void _GSocket_Install_Fallback(GSocket *socket, GSocketEvent event)
|
|||||||
_GSocket_GDK_Input, (gpointer)socket);
|
_GSocket_GDK_Input, (gpointer)socket);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _GSocket_Uninstall_Fallback(GSocket *socket, GSocketEvent event)
|
void _GSocket_Uninstall_Callback(GSocket *socket, GSocketEvent event)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
gint *m_id;
|
gint *m_id;
|
||||||
|
@@ -53,7 +53,7 @@ void _GSocket_GUI_Destroy(GSocket *socket)
|
|||||||
free(socket->m_gui_dependent);
|
free(socket->m_gui_dependent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _GSocket_Install_Fallback(GSocket *socket, GSocketEvent event)
|
void _GSocket_Install_Callback(GSocket *socket, GSocketEvent event)
|
||||||
{
|
{
|
||||||
GdkInputCondition flag;
|
GdkInputCondition flag;
|
||||||
int c;
|
int c;
|
||||||
@@ -76,7 +76,7 @@ void _GSocket_Install_Fallback(GSocket *socket, GSocketEvent event)
|
|||||||
_GSocket_GDK_Input, (gpointer)socket);
|
_GSocket_GDK_Input, (gpointer)socket);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _GSocket_Uninstall_Fallback(GSocket *socket, GSocketEvent event)
|
void _GSocket_Uninstall_Callback(GSocket *socket, GSocketEvent event)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
gint *m_id;
|
gint *m_id;
|
||||||
|
@@ -59,7 +59,7 @@ void _GSocket_GUI_Destroy(GSocket *socket)
|
|||||||
free(socket->m_gui_dependent);
|
free(socket->m_gui_dependent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _GSocket_Install_Fallback(GSocket *socket, GSocketEvent event)
|
void _GSocket_Install_Callback(GSocket *socket, GSocketEvent event)
|
||||||
{
|
{
|
||||||
int *m_id;
|
int *m_id;
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ void _GSocket_Install_Fallback(GSocket *socket, GSocketEvent event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _GSocket_Uninstall_Fallback(GSocket *socket, GSocketEvent event)
|
void _GSocket_Uninstall_Callback(GSocket *socket, GSocketEvent event)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
int *m_id;
|
int *m_id;
|
||||||
|
@@ -16,11 +16,11 @@ void _GSocket_GUI_Destroy(GSocket *socket)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void _GSocket_Install_Fallback(GSocket *socket, GSocketEvent event)
|
void _GSocket_Install_Callback(GSocket *socket, GSocketEvent event)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void _GSocket_Uninstall_Fallback(GSocket *socket, GSocketEvent event)
|
void _GSocket_Uninstall_Callback(GSocket *socket, GSocketEvent event)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -88,6 +88,8 @@ GSocket *GSocket_new()
|
|||||||
socket->m_stream = TRUE;
|
socket->m_stream = TRUE;
|
||||||
socket->m_gui_dependent = NULL;
|
socket->m_gui_dependent = NULL;
|
||||||
socket->m_blocking = FALSE;
|
socket->m_blocking = FALSE;
|
||||||
|
socket->m_timeout = 10*60*1000;
|
||||||
|
// 10 minutes * 60 sec * 1000 millisec
|
||||||
|
|
||||||
/* We initialize the GUI specific entries here */
|
/* We initialize the GUI specific entries here */
|
||||||
_GSocket_GUI_Init(socket);
|
_GSocket_GUI_Init(socket);
|
||||||
@@ -132,7 +134,7 @@ void GSocket_Shutdown(GSocket *socket)
|
|||||||
|
|
||||||
/* We also disable GUI callbacks */
|
/* We also disable GUI callbacks */
|
||||||
for (evt=0;evt<GSOCK_MAX_EVENT;evt++)
|
for (evt=0;evt<GSOCK_MAX_EVENT;evt++)
|
||||||
_GSocket_Uninstall_Fallback(socket, evt);
|
_GSocket_Uninstall_Callback(socket, evt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Address handling */
|
/* Address handling */
|
||||||
@@ -267,6 +269,9 @@ GSocketError GSocket_SetServer(GSocket *sck)
|
|||||||
return GSOCK_IOERR;
|
return GSOCK_IOERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GSocket_SetNonBlocking(sck, sck->m_blocking);
|
||||||
|
GSocket_SetTimeout(sck, sck->m_timeout);
|
||||||
|
|
||||||
return GSOCK_NOERROR;
|
return GSOCK_NOERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -338,6 +343,9 @@ GSocketError GSocket_SetNonOriented(GSocket *sck)
|
|||||||
return GSOCK_IOERR;
|
return GSOCK_IOERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GSocket_SetBlocking(sck, sck->m_blocking);
|
||||||
|
GSocket_SetTimeout(sck, sck->m_timeout);
|
||||||
|
|
||||||
return GSOCK_NOERROR;
|
return GSOCK_NOERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -393,6 +401,9 @@ GSocketError GSocket_Connect(GSocket *sck, GSocketStream stream)
|
|||||||
/* It is not a server */
|
/* It is not a server */
|
||||||
sck->m_server = FALSE;
|
sck->m_server = FALSE;
|
||||||
|
|
||||||
|
GSocket_SetBlocking(sck, sck->m_blocking);
|
||||||
|
GSocket_SetTimeout(sck, sck->m_timeout);
|
||||||
|
|
||||||
return GSOCK_NOERROR;
|
return GSOCK_NOERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -461,10 +472,10 @@ bool GSocket_DataAvailable(GSocket *socket)
|
|||||||
/* Flags */
|
/* Flags */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
GSocket_SetBlocking() puts the socket in non-blocking mode. This is useful
|
GSocket_SetNonBlocking() puts the socket in non-blocking mode. This is useful
|
||||||
if we don't want to wait.
|
if we don't want to wait.
|
||||||
*/
|
*/
|
||||||
void GSocket_SetBlocking(GSocket *socket, bool block)
|
void GSocket_SetNonBlocking(GSocket *socket, bool block)
|
||||||
{
|
{
|
||||||
assert(socket != NULL);
|
assert(socket != NULL);
|
||||||
|
|
||||||
@@ -474,6 +485,24 @@ void GSocket_SetBlocking(GSocket *socket, bool block)
|
|||||||
ioctl(socket->m_fd, FIONBIO, &block);
|
ioctl(socket->m_fd, FIONBIO, &block);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GSocket_SetTimeout()
|
||||||
|
*/
|
||||||
|
void GSocket_SetTimeout(GSocket *socket, unsigned long millisec)
|
||||||
|
{
|
||||||
|
assert(socket != NULL);
|
||||||
|
|
||||||
|
socket->m_timeout = millisec;
|
||||||
|
if (socket->m_fd != -1) {
|
||||||
|
struct timeval tval;
|
||||||
|
|
||||||
|
tval.tv_sec = millisec / 1000;
|
||||||
|
tval.tv_usec = (millisec % 1000) * 1000;
|
||||||
|
setsockopt(socket->m_fd, SOL_SOCKET, SO_SNDTIMEO, &tval, sizeof(tval));
|
||||||
|
setsockopt(socket->m_fd, SOL_SOCKET, SO_RCVTIMEO, &tval, sizeof(tval));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
GSocket_GetError() returns the last error occured on the socket stream.
|
GSocket_GetError() returns the last error occured on the socket stream.
|
||||||
*/
|
*/
|
||||||
@@ -498,7 +527,7 @@ GSocketError GSocket_GetError(GSocket *socket)
|
|||||||
Server socket -> a client request a connection
|
Server socket -> a client request a connection
|
||||||
LOST: the connection is lost
|
LOST: the connection is lost
|
||||||
|
|
||||||
SetFallback accepts a combination of these flags so a same callback can
|
SetCallback accepts a combination of these flags so a same callback can
|
||||||
receive different events.
|
receive different events.
|
||||||
|
|
||||||
An event is generated only once and its state is reseted when the relative
|
An event is generated only once and its state is reseted when the relative
|
||||||
@@ -506,8 +535,8 @@ GSocketError GSocket_GetError(GSocket *socket)
|
|||||||
For example: INPUT -> GSocket_Read()
|
For example: INPUT -> GSocket_Read()
|
||||||
CONNECTION -> GSocket_Accept()
|
CONNECTION -> GSocket_Accept()
|
||||||
*/
|
*/
|
||||||
void GSocket_SetFallback(GSocket *socket, GSocketEventFlags event,
|
void GSocket_SetCallback(GSocket *socket, GSocketEventFlags event,
|
||||||
GSocketFallback fallback, char *cdata)
|
GSocketCallback fallback, char *cdata)
|
||||||
{
|
{
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
@@ -520,17 +549,17 @@ void GSocket_SetFallback(GSocket *socket, GSocketEventFlags event,
|
|||||||
socket->m_fbacks[count] = fallback;
|
socket->m_fbacks[count] = fallback;
|
||||||
socket->m_data[count] = cdata;
|
socket->m_data[count] = cdata;
|
||||||
|
|
||||||
_GSocket_Install_Fallback(socket, count);
|
_GSocket_Install_Callback(socket, count);
|
||||||
_GSocket_Enable(socket, count);
|
_GSocket_Enable(socket, count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
UnsetFallback will disables all fallbacks specified by "event".
|
UnsetCallback will disables all fallbacks specified by "event".
|
||||||
NOTE: event may be a combination of flags
|
NOTE: event may be a combination of flags
|
||||||
*/
|
*/
|
||||||
void GSocket_UnsetFallback(GSocket *socket, GSocketEventFlags event)
|
void GSocket_UnsetCallback(GSocket *socket, GSocketEventFlags event)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
@@ -540,7 +569,7 @@ void GSocket_UnsetFallback(GSocket *socket, GSocketEventFlags event)
|
|||||||
if ((event & (1 << count)) != 0) {
|
if ((event & (1 << count)) != 0) {
|
||||||
_GSocket_Disable(socket, count);
|
_GSocket_Disable(socket, count);
|
||||||
socket->m_fbacks[count] = NULL;
|
socket->m_fbacks[count] = NULL;
|
||||||
_GSocket_Uninstall_Fallback(socket, count);
|
_GSocket_Uninstall_Callback(socket, count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -567,14 +596,14 @@ void _GSocket_Enable(GSocket *socket, GSocketEvent event)
|
|||||||
{
|
{
|
||||||
socket->m_iocalls[event] = TRUE;
|
socket->m_iocalls[event] = TRUE;
|
||||||
if (socket->m_fbacks[event])
|
if (socket->m_fbacks[event])
|
||||||
_GSocket_Install_Fallback(socket, event);
|
_GSocket_Install_Callback(socket, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _GSocket_Disable(GSocket *socket, GSocketEvent event)
|
void _GSocket_Disable(GSocket *socket, GSocketEvent event)
|
||||||
{
|
{
|
||||||
socket->m_iocalls[event] = FALSE;
|
socket->m_iocalls[event] = FALSE;
|
||||||
if (socket->m_fbacks[event])
|
if (socket->m_fbacks[event])
|
||||||
_GSocket_Uninstall_Fallback(socket, event);
|
_GSocket_Uninstall_Callback(socket, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
int _GSocket_Recv_Stream(GSocket *socket, char *buffer, int size)
|
int _GSocket_Recv_Stream(GSocket *socket, char *buffer, int size)
|
||||||
|
@@ -17,9 +17,10 @@ struct _GSocket {
|
|||||||
GSocketError m_error;
|
GSocketError m_error;
|
||||||
|
|
||||||
bool m_blocking, m_server, m_stream, m_oriented;
|
bool m_blocking, m_server, m_stream, m_oriented;
|
||||||
|
unsigned long m_timeout;
|
||||||
|
|
||||||
/* Fallbacks */
|
/* Callbacks */
|
||||||
GSocketFallback m_fbacks[GSOCK_MAX_EVENT];
|
GSocketCallback m_fbacks[GSOCK_MAX_EVENT];
|
||||||
char *m_data[GSOCK_MAX_EVENT];
|
char *m_data[GSOCK_MAX_EVENT];
|
||||||
|
|
||||||
/* IO calls associated */
|
/* IO calls associated */
|
||||||
@@ -45,8 +46,8 @@ int _GSocket_Recv_Stream(GSocket *socket, char *buffer, int size);
|
|||||||
int _GSocket_Recv_Dgram(GSocket *socket, char *buffer, int size);
|
int _GSocket_Recv_Dgram(GSocket *socket, char *buffer, int size);
|
||||||
int _GSocket_Send_Stream(GSocket *socket, const char *buffer, int size);
|
int _GSocket_Send_Stream(GSocket *socket, const char *buffer, int size);
|
||||||
int _GSocket_Send_Dgram(GSocket *socket, const char *buffer, int size);
|
int _GSocket_Send_Dgram(GSocket *socket, const char *buffer, int size);
|
||||||
void _GSocket_Install_Fallback(GSocket *socket, GSocketEvent count);
|
void _GSocket_Install_Callback(GSocket *socket, GSocketEvent count);
|
||||||
void _GSocket_Uninstall_Fallback(GSocket *socket, GSocketEvent count);
|
void _GSocket_Uninstall_Callback(GSocket *socket, GSocketEvent count);
|
||||||
void _GSocket_Detected_Read(GSocket *socket);
|
void _GSocket_Detected_Read(GSocket *socket);
|
||||||
void _GSocket_Detected_Write(GSocket *socket);
|
void _GSocket_Detected_Write(GSocket *socket);
|
||||||
void _GSocket_GUI_Init(GSocket *socket);
|
void _GSocket_GUI_Init(GSocket *socket);
|
||||||
|
Reference in New Issue
Block a user