9111db6802
* wxThread: fixes (all should work fluently now) * wxSocket: it is at last usable on my computer GTK/GLIB problem : reenabling the idle event propagation causes very strange problem (Instruction pointer/memory) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2490 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
151 lines
3.3 KiB
C++
151 lines
3.3 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: sckint.h
|
|
// Purpose: Socket internal classes
|
|
// Author: Guilhem Lavaux
|
|
// Modified by:
|
|
// Created: April 1999
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) Guilhem Lavaux
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
#ifndef _WX_NETWORK_SOCKET_INT_H
|
|
#define _WX_NETWORK_SOCKET_INT_H
|
|
|
|
#ifdef __GNUG__
|
|
#pragma interface
|
|
#endif
|
|
|
|
#if wxUSE_SOCKETS
|
|
|
|
#include <wx/object.h>
|
|
#include <wx/list.h>
|
|
#include <wx/socket.h>
|
|
#include <wx/thread.h>
|
|
|
|
// Socket state
|
|
class SocketState
|
|
{
|
|
public:
|
|
// TRUE if the background notifyier is on.
|
|
bool notify_state;
|
|
// Specifies which events we want to be notified.
|
|
wxSocketBase::wxRequestNotify evt_notify_state;
|
|
// Socket flags.
|
|
wxSocketBase::wxSockFlags socket_flags;
|
|
// Pointer to the C callback function.
|
|
wxSocketBase::wxSockCbk c_callback;
|
|
char *c_callback_data;
|
|
};
|
|
|
|
// Socket request
|
|
class SockRequest
|
|
{
|
|
public:
|
|
// Buffer where to get/put data.
|
|
char *buffer;
|
|
// Size of the buffer.
|
|
size_t size;
|
|
// Number of bytes really read/written.
|
|
size_t io_nbytes;
|
|
// Error.
|
|
unsigned int error;
|
|
// Type of the request.
|
|
wxSocketBase::wxRequestNotify type;
|
|
// Timeout (in milliseconds).
|
|
unsigned int timeout;
|
|
// TRUE if the buffer has been processed.
|
|
bool done;
|
|
// TRUE if we must wait for the request completion, in the other case an
|
|
// event will be sent to the main thread when the request is finished.
|
|
bool wait;
|
|
};
|
|
|
|
class wxSocketInternal;
|
|
|
|
#if wxUSE_THREADS
|
|
class SocketWaiter: public wxThread {
|
|
public:
|
|
SocketWaiter(wxSocketBase *socket, wxSocketInternal *internal);
|
|
~SocketWaiter();
|
|
|
|
// Thread Entry point
|
|
// ---
|
|
virtual void *Entry();
|
|
|
|
protected:
|
|
void ProcessReadEvent();
|
|
void ProcessWriteEvent();
|
|
|
|
public:
|
|
wxSocketBase *m_socket;
|
|
wxSocketInternal *m_internal;
|
|
int m_fd;
|
|
};
|
|
|
|
class SocketRequester: public wxThread {
|
|
public:
|
|
SocketRequester(wxSocketBase *socket, wxSocketInternal *internal);
|
|
~SocketRequester();
|
|
|
|
void ProcessWaitEvent(SockRequest *req);
|
|
void ProcessReadEvent(SockRequest *req);
|
|
void ProcessWriteEvent(SockRequest *req);
|
|
|
|
bool WaitFor(wxSocketBase::wxRequestNotify req, int millisec);
|
|
|
|
// Thread Entry point
|
|
// ---
|
|
virtual void *Entry();
|
|
|
|
public:
|
|
wxSocketBase *m_socket;
|
|
wxSocketInternal *m_internal;
|
|
int m_fd;
|
|
};
|
|
#endif
|
|
// wxUSE_THREADS
|
|
|
|
class wxSocketInternal {
|
|
public:
|
|
wxSocketInternal(wxSocketBase *socket);
|
|
~wxSocketInternal();
|
|
|
|
// wxSocket thread manager
|
|
// -----------------------
|
|
void AcquireData();
|
|
void ReleaseData();
|
|
void AcquireFD();
|
|
void ReleaseFD();
|
|
|
|
int GetFD() { return m_fd; }
|
|
void SetFD(int fd) { m_fd = fd; }
|
|
|
|
void ResumeWaiter();
|
|
void StopWaiter();
|
|
void ResumeRequester();
|
|
void StopRequester();
|
|
|
|
void QueueRequest(SockRequest *request, bool async);
|
|
void WaitForEnd(SockRequest *request);
|
|
|
|
SockRequest *WaitForReq();
|
|
void EndRequest(SockRequest *req);
|
|
public:
|
|
wxSocketBase *m_socket;
|
|
#if wxUSE_THREADS
|
|
wxMutex m_socket_locker, m_fd_locker, m_request_locker, m_end_requester;
|
|
wxCondition m_socket_cond;
|
|
SocketWaiter *m_thread_waiter;
|
|
SocketRequester *m_thread_requester;
|
|
#endif
|
|
wxList m_requests;
|
|
int m_fd;
|
|
bool m_invalid_requester;
|
|
};
|
|
|
|
#endif
|
|
// wxUSE_SOCKETS
|
|
|
|
#endif
|
|
// _WX_NETWORK_SOCKET_INT_H
|