]> git.saurik.com Git - wxWidgets.git/blame - include/wx/sckint.h
wxPython 2.1b1 for wxMSW (wxGTK coming soon)
[wxWidgets.git] / include / wx / sckint.h
CommitLineData
a737331d
GL
1/////////////////////////////////////////////////////////////////////////////
2// Name: sckint.h
3// Purpose: Socket internal classes
4// Author: Guilhem Lavaux
5// Modified by:
6// Created: April 1999
7// RCS-ID: $Id$
8// Copyright: (c) Guilhem Lavaux
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11#ifndef _WX_NETWORK_SOCKET_INT_H
12#define _WX_NETWORK_SOCKET_INT_H
13
14#ifdef __GNUG__
15#pragma interface
16#endif
17
18#if wxUSE_SOCKETS
19
20#include <wx/object.h>
21#include <wx/list.h>
22#include <wx/socket.h>
23#include <wx/thread.h>
24
25// Socket state
26class SocketState
27{
28 public:
29 // TRUE if the background notifyier is on.
30 bool notify_state;
31 // Specifies which events we want to be notified.
32 wxSocketBase::wxRequestNotify evt_notify_state;
33 // Socket flags.
34 wxSocketBase::wxSockFlags socket_flags;
35 // Pointer to the C callback function.
36 wxSocketBase::wxSockCbk c_callback;
37 char *c_callback_data;
38};
39
40// Socket request
41class SockRequest
42{
43 public:
44 // Buffer where to get/put data.
45 char *buffer;
46 // Size of the buffer.
47 size_t size;
48 // Number of bytes really read/written.
49 size_t io_nbytes;
50 // Error.
51 unsigned int error;
52 // Type of the request.
53 wxSocketBase::wxRequestNotify type;
54 // Timeout (in milliseconds).
55 unsigned int timeout;
56 // TRUE if the buffer has been processed.
57 bool done;
58 // TRUE if we must wait for the request completion, in the other case an
59 // event will be sent to the main thread when the request is finished.
60 bool wait;
61};
62
63class wxSocketInternal;
a50fb9c0
JS
64
65#if wxUSE_THREADS
a737331d
GL
66class SocketWaiter: public wxThread {
67 public:
68 SocketWaiter(wxSocketBase *socket, wxSocketInternal *internal);
69 ~SocketWaiter();
70
71 // Thread Entry point
72 // ---
73 virtual void *Entry();
74
75 protected:
76 void ProcessReadEvent();
77 void ProcessWriteEvent();
78
79 public:
80 wxSocketBase *m_socket;
81 wxSocketInternal *m_internal;
82 int m_fd;
83};
84
062c4861
GL
85class SocketRequester
86#if wxUSE_THREADS
87 : public wxThread
88#endif
89 {
a737331d
GL
90 public:
91 SocketRequester(wxSocketBase *socket, wxSocketInternal *internal);
92 ~SocketRequester();
93
94 void ProcessWaitEvent(SockRequest *req);
95 void ProcessReadEvent(SockRequest *req);
96 void ProcessWriteEvent(SockRequest *req);
97
98 bool WaitFor(wxSocketBase::wxRequestNotify req, int millisec);
99
100 // Thread Entry point
101 // ---
102 virtual void *Entry();
103
104 public:
105 wxSocketBase *m_socket;
106 wxSocketInternal *m_internal;
107 int m_fd;
108};
a50fb9c0
JS
109#endif
110 // wxUSE_THREADS
a737331d
GL
111
112class wxSocketInternal {
113 public:
114 wxSocketInternal(wxSocketBase *socket);
115 ~wxSocketInternal();
116
117 // wxSocket thread manager
118 // -----------------------
119 void AcquireData();
120 void ReleaseData();
121 void AcquireFD();
122 void ReleaseFD();
123
124 int GetFD() { return m_fd; }
9111db68 125 void SetFD(int fd) { m_fd = fd; }
a737331d 126
2a4f27f2
GL
127 void ResumeWaiter();
128 void StopWaiter();
129 void ResumeRequester();
130 void StopRequester();
a737331d
GL
131
132 void QueueRequest(SockRequest *request, bool async);
133 void WaitForEnd(SockRequest *request);
134
135 SockRequest *WaitForReq();
136 void EndRequest(SockRequest *req);
137 public:
a50fb9c0
JS
138 wxSocketBase *m_socket;
139#if wxUSE_THREADS
63496c98 140 wxMutex m_socket_locker, m_fd_locker, m_request_locker, m_end_requester;
a737331d 141 wxCondition m_socket_cond;
a737331d 142 SocketWaiter *m_thread_waiter;
a50fb9c0 143#endif
062c4861 144 SocketRequester *m_thread_requester;
a737331d
GL
145 wxList m_requests;
146 int m_fd;
63496c98 147 bool m_invalid_requester;
a737331d
GL
148};
149
150#endif
151 // wxUSE_SOCKETS
152
153#endif
154 // _WX_NETWORK_SOCKET_INT_H