]> git.saurik.com Git - wxWidgets.git/blame - src/common/gsocketiohandler.cpp
fix bug with not updating the last line correctly when a group was deleted and recrea...
[wxWidgets.git] / src / common / gsocketiohandler.cpp
CommitLineData
30c45bdd
VZ
1///////////////////////////////////////////////////////////////////////////////
2// Name: src/common/gsocketiohandler.cpp
3// Purpose: implementation of wxFDIOHandler for GSocket
4// Author: Angel Vidal, Lukasz Michalski
5// Modified by:
6// Created: 08.24.06
7// RCS-ID: $Id$
8// Copyright: (c) 2006 Angel vidal
9// License: wxWindows licence
10///////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20// for compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#if wxUSE_SOCKETS
24
25#include "wx/private/gsocketiohandler.h"
26#include "wx/unix/private.h"
27#include "wx/gsocket.h"
28#include "wx/unix/gsockunx.h"
29
30// ============================================================================
31// implementation
32// ============================================================================
33
34// ----------------------------------------------------------------------------
35// wxGSocketIOHandler
36// ----------------------------------------------------------------------------
37
38wxGSocketIOHandler::wxGSocketIOHandler(GSocket* socket)
39 : m_socket(socket),
40 m_flags(0)
41{
42
43};
44
45void wxGSocketIOHandler::OnReadWaiting(int fd)
46{
47 m_socket->Detected_Read();
48};
49
50void wxGSocketIOHandler::OnWriteWaiting(int fd)
51{
52 m_socket->Detected_Write();
53};
54
55void wxGSocketIOHandler::OnExceptionWaiting(int fd)
56{
57 m_socket->Detected_Read();
58};
59
60int wxGSocketIOHandler::GetFlags() const
61{
62 return m_flags;
63};
64
65
66void wxGSocketIOHandler::RemoveFlag(wxSelectDispatcherEntryFlags flag)
67{
68 m_flags &= ~flag;
69};
70
71void wxGSocketIOHandler::AddFlag(wxSelectDispatcherEntryFlags flag)
72{
73 m_flags |= flag;
74};
75
76// ----------------------------------------------------------------------------
77// GSocket interface
78// ----------------------------------------------------------------------------
79
80bool GSocketGUIFunctionsTableConcrete::CanUseEventLoop()
81{
82 return true;
83}
84
85bool GSocketGUIFunctionsTableConcrete::OnInit()
86{
87 return true;
88}
89
90void GSocketGUIFunctionsTableConcrete::OnExit()
91{
92}
93
94bool GSocketGUIFunctionsTableConcrete::Init_Socket(GSocket *socket)
95{
96 int *m_id;
97
98 socket->m_gui_dependent = (char *)malloc(sizeof(int)*2);
99 m_id = (int *)(socket->m_gui_dependent);
100
101 m_id[0] = -1;
102 m_id[1] = -1;
103
104 return true;
105}
106
107void GSocketGUIFunctionsTableConcrete::Destroy_Socket(GSocket *socket)
108{
109 free(socket->m_gui_dependent);
110}
111
112void GSocketGUIFunctionsTableConcrete::Install_Callback(GSocket *socket,
113 GSocketEvent event)
114{
115 int *m_id = (int *)(socket->m_gui_dependent);
116 int c;
117
118 if (socket->m_fd == -1)
119 return;
120
121 switch (event)
122 {
123 case GSOCK_LOST: /* fall-through */
124 case GSOCK_INPUT: c = 0; break;
125 case GSOCK_OUTPUT: c = 1; break;
126 case GSOCK_CONNECTION: c = ((socket->m_server) ? 0 : 1); break;
127 default: return;
128 }
129
130 wxGSocketIOHandler* handler = (wxGSocketIOHandler*)(wxSelectDispatcher::Get().FindHandler(socket->m_fd));
131 if (handler == NULL)
132 {
133 handler = new wxGSocketIOHandler(socket);
134 };
135
136 if (c == 0)
137 {
138 m_id[0] = socket->m_fd;
139 handler->AddFlag(wxSelectInput);
140 }
141 else
142 {
143 m_id[1] = socket->m_fd;
144 handler->AddFlag(wxSelectOutput);
145 }
146
147 wxSelectDispatcher::Get().RegisterFD(socket->m_fd,handler,handler->GetFlags());
148}
149
150void GSocketGUIFunctionsTableConcrete::Uninstall_Callback(GSocket *socket,
151 GSocketEvent event)
152{
153 int *m_id = (int *)(socket->m_gui_dependent);
154 int c;
155
156 switch (event)
157 {
158 case GSOCK_LOST: /* fall-through */
159 case GSOCK_INPUT: c = 0; break;
160 case GSOCK_OUTPUT: c = 1; break;
161 case GSOCK_CONNECTION: c = ((socket->m_server) ? 0 : 1); break;
162 default: return;
163 }
164
165 wxGSocketIOHandler* handler = NULL;
166 if ( m_id[c] != -1 )
167 {
168 if ( c == 0 )
169 {
170 handler = (wxGSocketIOHandler*)wxSelectDispatcher::Get().UnregisterFD(m_id[c], wxSelectInput);
171 if (handler != NULL)
172 handler->RemoveFlag(wxSelectInput);
173 }
174 else
175 {
176 handler = (wxGSocketIOHandler*)wxSelectDispatcher::Get().UnregisterFD(m_id[c], wxSelectOutput);
177 if (handler != NULL)
178 handler->RemoveFlag(wxSelectOutput);
179 }
180 if (handler && handler->GetFlags() == 0)
181 delete handler;
182 }
183
184 m_id[c] = -1;
185}
186
187void GSocketGUIFunctionsTableConcrete::Enable_Events(GSocket *socket)
188{
189 Install_Callback(socket, GSOCK_INPUT);
190 Install_Callback(socket, GSOCK_OUTPUT);
191}
192
193void GSocketGUIFunctionsTableConcrete::Disable_Events(GSocket *socket)
194{
195 Uninstall_Callback(socket, GSOCK_INPUT);
196 Uninstall_Callback(socket, GSOCK_OUTPUT);
197}
198
199#endif // wxUSE_SOCKETS