]> git.saurik.com Git - wxWidgets.git/blame - src/x11/gsockx11.cpp
fix for always terminating intermediate UniChar String for 4 bytes wchar_t
[wxWidgets.git] / src / x11 / gsockx11.cpp
CommitLineData
bf703528
DE
1/* -------------------------------------------------------------------------
2 * Project: GSocket (Generic Socket) for WX
3 * Name: gsockmot.c
4 * Purpose: GSocket: X11 part
5 * Licence: The wxWindows licence
6 * CVSID: $Id$
7 * ------------------------------------------------------------------------- */
8
9#include "wx/setup.h"
10
11#if wxUSE_SOCKETS
12
13#include <stdlib.h>
14#include "wx/gsocket.h"
15#include "wx/unix/gsockunx.h"
16
17/*
18 * FIXME: have these in a common header instead of being repeated
19 * in evtloop.cpp and gsockx11.c
20 */
21
22typedef void (*wxSocketCallback) (int fd, void* data);
23
24typedef enum
25{ wxSocketTableInput, wxSocketTableOutput } wxSocketTableType ;
26
27void wxRegisterSocketCallback(int fd, wxSocketTableType socketType, wxSocketCallback cback, void* data);
28void wxUnregisterSocketCallback(int fd, wxSocketTableType socketType);
29
30
31static void _GSocket_X11_Input(int *fid, void* data)
32{
33 GSocket *socket = (GSocket *)data;
34
35 socket->m_functions->Detected_Read(socket);
36}
37
38static void _GSocket_X11_Output(int *fid, void* data)
39{
40 GSocket *socket = (GSocket *)data;
41
42 socket->m_functions->Detected_Write(socket);
43}
44
45int _GSocket_GUI_Init(void)
46{
47 return 1;
48}
49
50void _GSocket_GUI_Cleanup(void)
51{
52}
53
54int _GSocket_GUI_Init_Socket(GSocket *socket)
55{
56 int *m_id;
57
58 socket->m_gui_dependent = (char *)malloc(sizeof(int)*2);
59 m_id = (int *)(socket->m_gui_dependent);
60
61 m_id[0] = -1;
62 m_id[1] = -1;
63
64 return TRUE;
65}
66
67void _GSocket_GUI_Destroy_Socket(GSocket *socket)
68{
69 free(socket->m_gui_dependent);
70}
71
72void _GSocket_Install_Callback(GSocket *socket, GSocketEvent event)
73{
74 int *m_id = (int *)(socket->m_gui_dependent);
75 int c;
76
77 if (socket->m_fd == -1)
78 return;
79
80 switch (event)
81 {
82 case GSOCK_LOST: /* fall-through */
83 case GSOCK_INPUT: c = 0; break;
84 case GSOCK_OUTPUT: c = 1; break;
85 case GSOCK_CONNECTION: c = ((socket->m_server) ? 0 : 1); break;
86 default: return;
87 }
88
89#if 0
90 if (m_id[c] != -1)
91 XtRemoveInput(m_id[c]);
92#endif /* 0 */
93
94 if (c == 0)
95 {
96 m_id[0] = socket->m_fd;
97
98 wxRegisterSocketCallback(socket->m_fd, wxSocketTableInput,
99 (wxSocketCallback) _GSocket_X11_Input, (void*) socket);
100 }
101 else
102 {
103 m_id[1] = socket->m_fd;
104
105 wxRegisterSocketCallback(socket->m_fd, wxSocketTableOutput,
106 (wxSocketCallback) _GSocket_X11_Output, (void*) socket);
107 }
108}
109
110void _GSocket_Uninstall_Callback(GSocket *socket, GSocketEvent event)
111{
112 int *m_id = (int *)(socket->m_gui_dependent);
113 int c;
114
115 switch (event)
116 {
117 case GSOCK_LOST: /* fall-through */
118 case GSOCK_INPUT: c = 0; break;
119 case GSOCK_OUTPUT: c = 1; break;
120 case GSOCK_CONNECTION: c = ((socket->m_server) ? 0 : 1); break;
121 default: return;
122 }
123
124 if (m_id[c] != -1)
125 {
126 if (c == 0)
127 wxUnregisterSocketCallback(m_id[c], wxSocketTableInput);
128 else
129 wxUnregisterSocketCallback(m_id[c], wxSocketTableOutput);
130 }
131
132 m_id[c] = -1;
133}
134
135void _GSocket_Enable_Events(GSocket *socket)
136{
137 _GSocket_Install_Callback(socket, GSOCK_INPUT);
138 _GSocket_Install_Callback(socket, GSOCK_OUTPUT);
139}
140
141void _GSocket_Disable_Events(GSocket *socket)
142{
143 _GSocket_Uninstall_Callback(socket, GSOCK_INPUT);
144 _GSocket_Uninstall_Callback(socket, GSOCK_OUTPUT);
145}
146
147#else /* !wxUSE_SOCKETS */
148
149/* some compilers don't like having empty source files */
150static int wxDummyGsockVar = 0;
151
152#endif /* wxUSE_SOCKETS/!wxUSE_SOCKETS */