]> git.saurik.com Git - wxWidgets.git/blob - include/wx/sckint.h
my wxMotif fixes (merged with Robert's changes), wxMotif compiles, links
[wxWidgets.git] / include / wx / sckint.h
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 #include "wx/defs.h"
19
20 #if wxUSE_SOCKETS
21
22 #include "wx/object.h"
23 #include "wx/list.h"
24 #include "wx/socket.h"
25 #include "wx/thread.h"
26
27 // Socket state
28 class SocketState
29 {
30 public:
31 // TRUE if the background notifyier is on.
32 bool notify_state;
33 // Specifies which events we want to be notified.
34 wxSocketBase::wxRequestNotify evt_notify_state;
35 // Socket flags.
36 wxSocketBase::wxSockFlags socket_flags;
37 // Pointer to the C callback function.
38 wxSocketBase::wxSockCbk c_callback;
39 char *c_callback_data;
40 };
41
42 // Socket request
43 class SockRequest
44 {
45 public:
46 // Buffer where to get/put data.
47 char *buffer;
48 // Size of the buffer.
49 size_t size;
50 // Number of bytes really read/written.
51 size_t io_nbytes;
52 // Error.
53 unsigned int error;
54 // Type of the request.
55 wxSocketBase::wxRequestNotify type;
56 // Timeout (in milliseconds).
57 unsigned int timeout;
58 // TRUE if the buffer has been processed.
59 bool done;
60 // TRUE if we must wait for the request completion, in the other case an
61 // event will be sent to the main thread when the request is finished.
62 bool wait;
63 };
64
65 class wxSocketInternal;
66
67 #if wxUSE_THREADS
68 class SocketWaiter: public wxThread {
69 public:
70 SocketWaiter(wxSocketBase *socket, wxSocketInternal *internal);
71 ~SocketWaiter();
72
73 // Thread Entry point
74 // ---
75 virtual void *Entry();
76
77 protected:
78 void ProcessReadEvent();
79 void ProcessWriteEvent();
80
81 public:
82 wxSocketBase *m_socket;
83 wxSocketInternal *m_internal;
84 int m_fd;
85 };
86
87 class SocketRequester
88 #if wxUSE_THREADS
89 : public wxThread
90 #endif
91 {
92 public:
93 SocketRequester(wxSocketBase *socket, wxSocketInternal *internal);
94 ~SocketRequester();
95
96 void ProcessWaitEvent(SockRequest *req);
97 void ProcessReadEvent(SockRequest *req);
98 void ProcessWriteEvent(SockRequest *req);
99
100 bool WaitFor(wxSocketBase::wxRequestNotify req, int millisec);
101
102 // Thread Entry point
103 // ---
104 virtual void *Entry();
105
106 public:
107 wxSocketBase *m_socket;
108 wxSocketInternal *m_internal;
109 int m_fd;
110 };
111 #endif
112 // wxUSE_THREADS
113
114 class wxSocketInternal {
115 public:
116 wxSocketInternal(wxSocketBase *socket);
117 ~wxSocketInternal();
118
119 // wxSocket thread manager
120 // -----------------------
121 void AcquireData();
122 void ReleaseData();
123 void AcquireFD();
124 void ReleaseFD();
125
126 int GetFD() { return m_fd; }
127 void SetFD(int fd) { m_fd = fd; }
128
129 void ResumeWaiter();
130 void StopWaiter();
131 void ResumeRequester();
132 void StopRequester();
133
134 void QueueRequest(SockRequest *request, bool async);
135 void WaitForEnd(SockRequest *request);
136
137 SockRequest *WaitForReq();
138 void EndRequest(SockRequest *req);
139 public:
140 wxSocketBase *m_socket;
141 #if wxUSE_THREADS
142 wxMutex m_socket_locker, m_fd_locker, m_request_locker, m_end_requester;
143 wxCondition m_socket_cond;
144 SocketWaiter *m_thread_waiter;
145 #endif
146 SocketRequester *m_thread_requester;
147 wxList m_requests;
148 int m_fd;
149 bool m_invalid_requester;
150 };
151
152 #endif
153 // wxUSE_SOCKETS
154
155 #endif
156 // _WX_NETWORK_SOCKET_INT_H