wxWidgets/include/wx/sckint.h
1999-07-07 17:45:35 +00:00

159 lines
3.4 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
#include "wx/defs.h"
#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;
};
#endif
class SocketRequester
#if wxUSE_THREADS
: public wxThread
#endif
{
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);
#if wxUSE_THREADS
// Thread Entry point
// ---
virtual void *Entry();
#endif
public:
wxSocketBase *m_socket;
wxSocketInternal *m_internal;
int m_fd;
};
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);
// Used by SocketRequester
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;
#endif
SocketRequester *m_thread_requester;
wxList m_requests;
int m_fd;
bool m_invalid_requester;
};
#endif
// wxUSE_SOCKETS
#endif
// _WX_NETWORK_SOCKET_INT_H