libpurple/win32/giowin32.c

Wed, 13 May 2009 20:29:03 +0000

author
Marcus Lundblad <malu@pidgin.im>
date
Wed, 13 May 2009 20:29:03 +0000
changeset 27110
05ca719b901b
parent 24231
6907b62f25fe
child 31294
73607ab89c6f
permissions
-rw-r--r--

Support custom smileys in MUCs (when all participants support BoB and a maximum
of 10 participants are in the chat).
Always announce support for BoB, since disable custom smileys will still turn
off fetching them, and BoB can be used for other purposes further on.

14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
1 /* GLIB - Library of useful routines for C programming
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
3 *
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
4 * giowin32.c: IO Channels for Win32.
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
5 * Copyright 1998 Owen Taylor and Tor Lillqvist
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
6 * Copyright 1999-2000 Tor Lillqvist and Craig Setera
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
7 * Copyright 2001-2003 Andrew Lanoix
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
8 *
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
9 * This library is free software; you can redistribute it and/or
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
10 * modify it under the terms of the GNU Lesser General Public
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
11 * License as published by the Free Software Foundation; either
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
12 * version 2 of the License, or (at your option) any later version.
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
13 *
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
14 * This library is distributed in the hope that it will be useful,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
17 * Lesser General Public License for more details.
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
18 *
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
19 * You should have received a copy of the GNU Lesser General Public
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
20 * License along with this library; if not, write to the
19859
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 16413
diff changeset
21 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 16413
diff changeset
22 * Boston, MA 02111-1301, USA.
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
23 */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
24
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
25 /*
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
26 * Modified by the GLib Team and others 1997-2000. See the AUTHORS
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
27 * file for a list of people on the GLib Team. See the ChangeLog
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
28 * files for a list of changes. These files are distributed with
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
29 * GLib at ftp://ftp.gtk.org/pub/gtk/.
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
30 */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
31
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
32 /* Define this to get (very) verbose logging of all channels */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
33 /* #define G_IO_WIN32_DEBUG */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
34
16413
7fae6f309bd7 Death to // comments.
Richard Laager <rlaager@pidgin.im>
parents: 16042
diff changeset
35 /* #include "config.h" */
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
36
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
37 #include <glib.h>
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
38
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
39 #include <stdlib.h>
22869
3fc7a5fc49eb Include winsock2.h before windows.h is included to avoid winsock.h being
Daniel Atallah <datallah@pidgin.im>
parents: 19859
diff changeset
40 #include <winsock2.h>
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
41 #include <windows.h>
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
42 #include <fcntl.h>
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
43 #include <io.h>
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
44 #include <process.h>
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
45 #include <errno.h>
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
46 #include <sys/stat.h>
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
47
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
48 #include <glib/gstdio.h>
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
49
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
50 typedef struct _GIOWin32Channel GIOWin32Channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
51 typedef struct _GIOWin32Watch GIOWin32Watch;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
52
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
53 #define BUFFER_SIZE 4096
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
54
24231
6907b62f25fe Warnings cleanup from Lee Roach. Fixes #6242.
Daniel Atallah <datallah@pidgin.im>
parents: 22869
diff changeset
55 GIOChannel *wpurple_g_io_channel_win32_new_socket (int socket);
6907b62f25fe Warnings cleanup from Lee Roach. Fixes #6242.
Daniel Atallah <datallah@pidgin.im>
parents: 22869
diff changeset
56
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
57 typedef enum {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
58 G_IO_WIN32_WINDOWS_MESSAGES, /* Windows messages */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
59 G_IO_WIN32_FILE_DESC, /* Unix-like file descriptors from
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
60 * _open() or _pipe(). Read with read().
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
61 * Have to create separate thread to read.
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
62 */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
63 G_IO_WIN32_SOCKET /* Sockets. A separate thread is blocked
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
64 * in select() most of the time.
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
65 */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
66 } GIOWin32ChannelType;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
67
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
68 struct _GIOWin32Channel {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
69 GIOChannel channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
70 gint fd; /* Either a Unix-like file handle as provided
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
71 * by the Microsoft C runtime, or a SOCKET
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
72 * as provided by WinSock.
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
73 */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
74 GIOWin32ChannelType type;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
75
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
76 gboolean debug;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
77
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
78 CRITICAL_SECTION mutex;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
79
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
80 /* This is used by G_IO_WIN32_WINDOWS_MESSAGES channels */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
81 HWND hwnd; /* handle of window, or NULL */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
82
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
83 /* Following fields are used by both fd and socket channels. */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
84 gboolean running; /* Is reader thread running. FALSE if
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
85 * EOF has been reached.
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
86 */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
87 gboolean needs_close; /* If the channel has been closed while
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
88 * the reader thread was still running.
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
89 */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
90 guint thread_id; /* If non-NULL has a reader thread, or has
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
91 * had.*/
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
92 HANDLE data_avail_event;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
93
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
94 gushort revents;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
95
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
96 /* Following fields used by fd channels for input */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
97
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
98 /* Data is kept in a circular buffer. To be able to distinguish between
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
99 * empty and full buffer, we cannot fill it completely, but have to
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
100 * leave a one character gap.
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
101 *
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
102 * Data available is between indexes rdp and wrp-1 (modulo BUFFER_SIZE).
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
103 *
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
104 * Empty: wrp == rdp
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
105 * Full: (wrp + 1) % BUFFER_SIZE == rdp
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
106 * Partial: otherwise
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
107 */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
108 guchar *buffer; /* (Circular) buffer */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
109 gint wrp, rdp; /* Buffer indices for writing and reading */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
110 HANDLE space_avail_event;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
111
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
112 /* Following fields used by socket channels */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
113 GSList *watches;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
114 HANDLE data_avail_noticed_event;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
115 gint reset_send; /* socket used to send data so select_thread() can reset/re-loop */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
116 gint reset_recv; /* socket used to recv data so select_thread() can reset/re-loop */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
117 };
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
118
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
119 #define LOCK(mutex) EnterCriticalSection (&mutex)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
120 #define UNLOCK(mutex) LeaveCriticalSection (&mutex)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
121
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
122 struct _GIOWin32Watch {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
123 GSource source;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
124 GPollFD pollfd;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
125 GIOChannel *channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
126 GIOCondition condition;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
127 };
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
128
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
129 static void
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
130 g_win32_print_gioflags (GIOFlags flags)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
131 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
132 char *bar = "";
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
133
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
134 if (flags & G_IO_FLAG_APPEND)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
135 bar = "|", g_print ("APPEND");
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
136 if (flags & G_IO_FLAG_NONBLOCK)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
137 g_print ("%sNONBLOCK", bar), bar = "|";
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
138 if (flags & G_IO_FLAG_IS_READABLE)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
139 g_print ("%sREADABLE", bar), bar = "|";
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
140 if (flags & G_IO_FLAG_IS_WRITEABLE)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
141 g_print ("%sWRITEABLE", bar), bar = "|";
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
142 if (flags & G_IO_FLAG_IS_SEEKABLE)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
143 g_print ("%sSEEKABLE", bar), bar = "|";
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
144 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
145
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
146 static gboolean
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
147 g_io_win32_get_debug_flag (void)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
148 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
149 #ifdef G_IO_WIN32_DEBUG
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
150 return TRUE;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
151 #else
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
152 if (getenv ("G_IO_WIN32_DEBUG") != NULL)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
153 return TRUE;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
154 else
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
155 return FALSE;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
156 #endif
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
157 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
158
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
159 static void
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
160 g_io_channel_win32_init (GIOWin32Channel *channel)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
161 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
162 channel->debug = g_io_win32_get_debug_flag ();
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
163 channel->buffer = NULL;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
164 channel->running = FALSE;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
165 channel->needs_close = FALSE;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
166 channel->thread_id = 0;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
167 channel->data_avail_event = NULL;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
168 channel->revents = 0;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
169 channel->space_avail_event = NULL;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
170 channel->reset_send = INVALID_SOCKET;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
171 channel->reset_recv = INVALID_SOCKET;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
172 channel->data_avail_noticed_event = NULL;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
173 channel->watches = NULL;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
174 InitializeCriticalSection (&channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
175 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
176
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
177 static void
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
178 create_events (GIOWin32Channel *channel)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
179 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
180 SECURITY_ATTRIBUTES sec_attrs;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
181
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
182 sec_attrs.nLength = sizeof (SECURITY_ATTRIBUTES);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
183 sec_attrs.lpSecurityDescriptor = NULL;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
184 sec_attrs.bInheritHandle = FALSE;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
185
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
186 /* The data available event is manual reset, the space available event
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
187 * is automatic reset.
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
188 */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
189 if (!(channel->data_avail_event = CreateEvent (&sec_attrs, TRUE, FALSE, NULL))
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
190 || !(channel->space_avail_event = CreateEvent (&sec_attrs, FALSE, FALSE, NULL))
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
191 || !(channel->data_avail_noticed_event = CreateEvent (&sec_attrs, FALSE, FALSE, NULL)))
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
192 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
193 gchar *emsg = g_win32_error_message (GetLastError ());
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
194 g_error ("Error creating event: %s", emsg);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
195 g_free (emsg);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
196 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
197 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
198
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
199 static void
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
200 create_thread (GIOWin32Channel *channel,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
201 GIOCondition condition,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
202 unsigned (__stdcall *thread) (void *parameter))
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
203 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
204 HANDLE thread_handle;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
205
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
206 thread_handle = (HANDLE) _beginthreadex (NULL, 0, thread, channel, 0,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
207 &channel->thread_id);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
208 if (thread_handle == 0)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
209 g_warning (G_STRLOC ": Error creating reader thread: %s",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
210 g_strerror (errno));
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
211 else if (!CloseHandle (thread_handle))
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
212 g_warning (G_STRLOC ": Error closing thread handle: %s\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
213 g_win32_error_message (GetLastError ()));
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
214
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
215 WaitForSingleObject (channel->space_avail_event, INFINITE);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
216 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
217
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
218 static void
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
219 init_reset_sockets (GIOWin32Channel *channel)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
220 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
221 struct sockaddr_in local, local2, server;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
222 int len;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
223
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
224 channel->reset_send = (gint) socket (AF_INET, SOCK_DGRAM, 0);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
225 if (channel->reset_send == INVALID_SOCKET)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
226 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
227 g_warning (G_STRLOC ": Error creating reset_send socket: %s\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
228 g_win32_error_message (WSAGetLastError ()));
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
229 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
230
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
231 local.sin_family = AF_INET;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
232 local.sin_port = 0;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
233 local.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
234
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
235 if (bind (channel->reset_send, (struct sockaddr *)&local, sizeof (local)) == SOCKET_ERROR)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
236 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
237 g_warning (G_STRLOC ": Error binding to reset_send socket: %s\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
238 g_win32_error_message (WSAGetLastError ()));
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
239 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
240
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
241 local2.sin_family = AF_INET;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
242 local2.sin_port = 0;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
243 local2.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
244
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
245 channel->reset_recv = (gint) socket (AF_INET, SOCK_DGRAM, 0);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
246 if (channel->reset_recv == INVALID_SOCKET)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
247 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
248 g_warning (G_STRLOC ": Error creating reset_recv socket: %s\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
249 g_win32_error_message (WSAGetLastError ()));
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
250 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
251
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
252 if (bind (channel->reset_recv, (struct sockaddr *)&local2, sizeof (local)) == SOCKET_ERROR)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
253 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
254 g_warning (G_STRLOC ": Error binding to reset_recv socket: %s\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
255 g_win32_error_message (WSAGetLastError ()));
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
256 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
257
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
258 len = sizeof (local2);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
259 if (getsockname (channel->reset_recv, (struct sockaddr *)&local2, &len) == SOCKET_ERROR)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
260 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
261 g_warning (G_STRLOC ": Error getsockname with reset_recv socket: %s\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
262 g_win32_error_message (WSAGetLastError ()));
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
263 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
264
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
265 memset (&server, 0, sizeof (server));
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
266 server.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
267 server.sin_family = AF_INET;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
268 server.sin_port = local2.sin_port;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
269
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
270 if (connect (channel->reset_send, (struct sockaddr *)&server, sizeof (server)) == SOCKET_ERROR)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
271 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
272 g_warning (G_STRLOC ": connect to reset_recv socket: %s\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
273 g_win32_error_message (WSAGetLastError ()));
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
274 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
275
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
276 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
277
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
278 static unsigned __stdcall
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
279 select_thread (void *parameter)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
280 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
281 GIOWin32Channel *channel = parameter;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
282 fd_set read_fds, write_fds, except_fds;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
283 GSList *tmp;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
284 int n;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
285 char buffer[8];
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
286
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
287 g_io_channel_ref ((GIOChannel *)channel);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
288
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
289 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
290 g_print ("select_thread %#x: start fd:%d data_avail:%#x data_avail_noticed:%#x\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
291 channel->thread_id,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
292 channel->fd,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
293 (guint) channel->data_avail_event,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
294 (guint) channel->data_avail_noticed_event);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
295
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
296 channel->rdp = channel->wrp = 0;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
297 channel->running = TRUE;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
298
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
299 SetEvent (channel->space_avail_event);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
300
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
301 while (channel->running)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
302 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
303 FD_ZERO (&read_fds);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
304 FD_ZERO (&write_fds);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
305 FD_ZERO (&except_fds);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
306 FD_SET (channel->reset_recv, &read_fds);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
307
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
308 LOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
309 tmp = channel->watches;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
310 while (tmp)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
311 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
312 GIOWin32Watch *watch = (GIOWin32Watch *)tmp->data;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
313
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
314 if (watch->condition & (G_IO_IN | G_IO_HUP))
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
315 FD_SET (channel->fd, &read_fds);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
316 if (watch->condition & G_IO_OUT)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
317 FD_SET (channel->fd, &write_fds);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
318 if (watch->condition & G_IO_ERR)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
319 FD_SET (channel->fd, &except_fds);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
320
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
321 tmp = tmp->next;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
322 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
323 UNLOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
324
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
325 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
326 g_print ("select_thread %#x: calling select() for%s%s%s\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
327 channel->thread_id,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
328 (FD_ISSET (channel->fd, &read_fds) ? " IN" : ""),
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
329 (FD_ISSET (channel->fd, &write_fds) ? " OUT" : ""),
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
330 (FD_ISSET (channel->fd, &except_fds) ? " ERR" : ""));
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
331
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
332 n = select (1, &read_fds, &write_fds, &except_fds, NULL);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
333
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
334 LOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
335 if (channel->needs_close)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
336 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
337 UNLOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
338 break;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
339 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
340 UNLOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
341
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
342 if (n == SOCKET_ERROR)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
343 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
344 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
345 g_print ("select_thread %#x: select returned SOCKET_ERROR\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
346 channel->thread_id);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
347 break;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
348 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
349
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
350 if (FD_ISSET (channel->reset_recv, &read_fds))
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
351 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
352 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
353 g_print ("select_thread %#x: re-looping\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
354 channel->thread_id);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
355 recv (channel->reset_recv, (char *)&buffer, (int) sizeof (buffer), 0);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
356 continue;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
357 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
358
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
359 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
360 g_print ("select_thread %#x: got%s%s%s\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
361 channel->thread_id,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
362 (FD_ISSET (channel->fd, &read_fds) ? " IN" : ""),
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
363 (FD_ISSET (channel->fd, &write_fds) ? " OUT" : ""),
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
364 (FD_ISSET (channel->fd, &except_fds) ? " ERR" : ""));
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
365
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
366 if (FD_ISSET (channel->fd, &read_fds))
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
367 channel->revents |= G_IO_IN;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
368 if (FD_ISSET (channel->fd, &write_fds))
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
369 channel->revents |= G_IO_OUT;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
370 if (FD_ISSET (channel->fd, &except_fds))
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
371 channel->revents |= G_IO_ERR;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
372
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
373 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
374 g_print ("select_thread %#x: resetting data_avail_noticed, setting data_avail\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
375 channel->thread_id);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
376
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
377 LOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
378 ResetEvent (channel->data_avail_noticed_event);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
379 SetEvent (channel->data_avail_event);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
380 if (channel->needs_close)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
381 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
382 UNLOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
383 break;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
384 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
385 UNLOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
386
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
387 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
388 g_print ("select_thread %#x: waiting for data_avail_noticed\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
389 channel->thread_id);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
390
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
391 WaitForSingleObject (channel->data_avail_noticed_event, INFINITE);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
392 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
393 g_print ("select_thread %#x: got data_avail_noticed\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
394 channel->thread_id);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
395 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
396
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
397 LOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
398 channel->running = FALSE;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
399 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
400 g_print ("select_thread %#x: got error, setting data_avail\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
401 channel->thread_id);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
402 SetEvent (channel->data_avail_event);
16042
3c83dae9def2 Avoid trying to unlock the mutex after it has been destroyed.
Daniel Atallah <datallah@pidgin.im>
parents: 15884
diff changeset
403 UNLOCK (channel->mutex);
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
404 g_io_channel_unref ((GIOChannel *)channel);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
405
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
406 /* No need to call _endthreadex(), the actual thread starter routine
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
407 * in MSVCRT (see crt/src/threadex.c:_threadstartex) calls
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
408 * _endthreadex() for us.
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
409 */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
410
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
411 return 0;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
412 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
413
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
414 static gboolean
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
415 g_io_win32_prepare (GSource *source,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
416 gint *timeout)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
417 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
418 GIOWin32Watch *watch = (GIOWin32Watch *)source;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
419 GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
420 GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
421
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
422 *timeout = -1;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
423
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
424 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
425 g_print ("g_io_win32_prepare: for thread %#x buffer_condition:%#x\n"
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
426 " watch->pollfd.events:%#x watch->pollfd.revents:%#x channel->revents:%#x\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
427 channel->thread_id, buffer_condition,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
428 watch->pollfd.events, watch->pollfd.revents, channel->revents);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
429
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
430 if (channel->type == G_IO_WIN32_FILE_DESC)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
431 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
432 LOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
433 if (channel->running && channel->wrp == channel->rdp)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
434 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
435 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
436 g_print ("g_io_win32_prepare: for thread %#x, setting channel->revents = 0\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
437 channel->thread_id);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
438 channel->revents = 0;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
439 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
440 UNLOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
441 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
442 else if (channel->type == G_IO_WIN32_SOCKET)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
443 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
444 LOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
445 channel->revents = 0;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
446 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
447 g_print ("g_io_win32_prepare: for thread %#x, setting data_avail_noticed\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
448 channel->thread_id);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
449 SetEvent (channel->data_avail_noticed_event);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
450 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
451 g_print ("g_io_win32_prepare: thread %#x, there.\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
452 channel->thread_id);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
453 UNLOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
454 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
455
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
456 return ((watch->condition & buffer_condition) == watch->condition);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
457 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
458
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
459 static gboolean
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
460 g_io_win32_check (GSource *source)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
461 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
462 MSG msg;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
463 GIOWin32Watch *watch = (GIOWin32Watch *)source;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
464 GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
465 GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
466
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
467 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
468 g_print ("g_io_win32_check: for thread %#x buffer_condition:%#x\n"
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
469 " watch->pollfd.events:%#x watch->pollfd.revents:%#x channel->revents:%#x\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
470 channel->thread_id, buffer_condition,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
471 watch->pollfd.events, watch->pollfd.revents, channel->revents);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
472
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
473 if (channel->type != G_IO_WIN32_WINDOWS_MESSAGES)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
474 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
475 watch->pollfd.revents = (watch->pollfd.events & channel->revents);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
476 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
477 else
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
478 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
479 return (PeekMessage (&msg, channel->hwnd, 0, 0, PM_NOREMOVE));
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
480 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
481
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
482 if (channel->type == G_IO_WIN32_SOCKET)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
483 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
484 LOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
485 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
486 g_print ("g_io_win32_check: thread %#x, resetting data_avail\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
487 channel->thread_id);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
488 ResetEvent (channel->data_avail_event);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
489 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
490 g_print ("g_io_win32_check: thread %#x, there.\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
491 channel->thread_id);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
492 UNLOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
493 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
494
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
495 return ((watch->pollfd.revents | buffer_condition) & watch->condition);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
496 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
497
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
498 static gboolean
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
499 g_io_win32_dispatch (GSource *source,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
500 GSourceFunc callback,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
501 gpointer user_data)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
502 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
503 GIOFunc func = (GIOFunc)callback;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
504 GIOWin32Watch *watch = (GIOWin32Watch *)source;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
505 GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
506
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
507 if (!func)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
508 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
509 g_warning (G_STRLOC ": GIOWin32Watch dispatched without callback\n"
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
510 "You must call g_source_connect().");
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
511 return FALSE;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
512 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
513
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
514 return (*func) (watch->channel,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
515 (watch->pollfd.revents | buffer_condition) & watch->condition,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
516 user_data);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
517 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
518
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
519 static void
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
520 g_io_win32_finalize (GSource *source)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
521 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
522 GIOWin32Watch *watch = (GIOWin32Watch *)source;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
523 GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
524 char send_buffer[] = "f";
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
525
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
526 LOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
527 if (channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
528 g_print ("g_io_win32_finalize: channel with thread %#x\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
529 channel->thread_id);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
530
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
531 channel->watches = g_slist_remove (channel->watches, watch);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
532
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
533 SetEvent (channel->data_avail_noticed_event);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
534 if (channel->type == G_IO_WIN32_SOCKET)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
535 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
536 /* Tell select_thread() to exit */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
537 channel->needs_close = 1;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
538 /* Wake up select_thread() from its blocking select() */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
539 send (channel->reset_send, send_buffer, sizeof (send_buffer), 0);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
540 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
541
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
542 UNLOCK (channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
543 g_io_channel_unref (watch->channel);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
544 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
545
22869
3fc7a5fc49eb Include winsock2.h before windows.h is included to avoid winsock.h being
Daniel Atallah <datallah@pidgin.im>
parents: 19859
diff changeset
546 static GSourceFuncs wp_g_io_watch_funcs = {
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
547 g_io_win32_prepare,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
548 g_io_win32_check,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
549 g_io_win32_dispatch,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
550 g_io_win32_finalize,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
551 NULL, NULL
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
552 };
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
553
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
554 static GSource *
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
555 g_io_win32_create_watch (GIOChannel *channel,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
556 GIOCondition condition,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
557 unsigned (__stdcall *thread) (void *parameter))
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
558 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
559 GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
560 GIOWin32Watch *watch;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
561 GSource *source;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
562 char send_buffer[] = "c";
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
563
22869
3fc7a5fc49eb Include winsock2.h before windows.h is included to avoid winsock.h being
Daniel Atallah <datallah@pidgin.im>
parents: 19859
diff changeset
564 source = g_source_new (&wp_g_io_watch_funcs, sizeof (GIOWin32Watch));
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
565 watch = (GIOWin32Watch *)source;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
566
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
567 watch->channel = channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
568 g_io_channel_ref (channel);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
569
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
570 watch->condition = condition;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
571
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
572 if (win32_channel->data_avail_event == NULL)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
573 create_events (win32_channel);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
574
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
575 watch->pollfd.fd = (gint) win32_channel->data_avail_event;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
576 watch->pollfd.events = condition;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
577
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
578 if (win32_channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
579 g_print ("g_io_win32_create_watch: fd:%d condition:%#x handle:%#x\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
580 win32_channel->fd, condition, watch->pollfd.fd);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
581
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
582 LOCK (win32_channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
583 win32_channel->watches = g_slist_append (win32_channel->watches, watch);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
584
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
585 if (win32_channel->thread_id == 0)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
586 create_thread (win32_channel, condition, thread);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
587 else
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
588 send (win32_channel->reset_send, send_buffer, sizeof (send_buffer), 0);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
589
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
590 g_source_add_poll (source, &watch->pollfd);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
591 UNLOCK (win32_channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
592
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
593 return source;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
594 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
595
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
596 static void
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
597 g_io_win32_free (GIOChannel *channel)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
598 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
599 GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
600
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
601 if (win32_channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
602 g_print ("thread %#x: freeing channel, fd: %d\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
603 win32_channel->thread_id,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
604 win32_channel->fd);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
605
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
606 if (win32_channel->reset_send && win32_channel->reset_send != INVALID_SOCKET)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
607 closesocket (win32_channel->reset_send);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
608 if (win32_channel->reset_recv && win32_channel->reset_recv != INVALID_SOCKET)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
609 closesocket (win32_channel->reset_recv);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
610 if (win32_channel->data_avail_event)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
611 CloseHandle (win32_channel->data_avail_event);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
612 if (win32_channel->space_avail_event)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
613 CloseHandle (win32_channel->space_avail_event);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
614 if (win32_channel->data_avail_noticed_event)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
615 CloseHandle (win32_channel->data_avail_noticed_event);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
616 DeleteCriticalSection (&win32_channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
617
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
618 g_free (win32_channel->buffer);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
619 g_slist_free (win32_channel->watches);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
620 g_free (win32_channel);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
621 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
622
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
623 static GIOStatus
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
624 g_io_win32_sock_read (GIOChannel *channel,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
625 gchar *buf,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
626 gsize count,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
627 gsize *bytes_read,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
628 GError **err)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
629 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
630 GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
631 gint result;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
632 GIOChannelError error = G_IO_STATUS_NORMAL;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
633 GIOStatus internal_status = G_IO_STATUS_NORMAL;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
634 char send_buffer[] = "sr";
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
635
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
636 if (win32_channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
637 g_print ("g_io_win32_sock_read: sockfd:%d count:%d\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
638 win32_channel->fd, count);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
639 #ifdef WE_NEED_TO_HANDLE_WSAEINTR
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
640 repeat:
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
641 #endif
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
642 result = recv (win32_channel->fd, buf, count, 0);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
643
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
644 if (win32_channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
645 g_print ("g_io_win32_sock_read: recv:%d\n", result);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
646
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
647 if (result == SOCKET_ERROR)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
648 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
649 *bytes_read = 0;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
650
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
651 switch (WSAGetLastError ())
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
652 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
653 case WSAEINVAL:
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
654 error = G_IO_CHANNEL_ERROR_INVAL;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
655 break;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
656 case WSAEWOULDBLOCK:
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
657 return G_IO_STATUS_AGAIN;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
658 #ifdef WE_NEED_TO_HANDLE_WSAEINTR /* not anymore with wsock2 ? */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
659 case WSAEINTR:
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
660 goto repeat;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
661 #endif
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
662 default:
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
663 error = G_IO_CHANNEL_ERROR_FAILED;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
664 break;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
665 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
666 g_set_error (err, G_IO_CHANNEL_ERROR, error, "Socket read error");
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
667 internal_status = G_IO_STATUS_ERROR;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
668 /* FIXME get all errors, better error messages */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
669 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
670 else
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
671 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
672 *bytes_read = result;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
673 if (result == 0)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
674 internal_status = G_IO_STATUS_EOF;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
675 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
676
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
677 if ((internal_status == G_IO_STATUS_EOF) ||
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
678 (internal_status == G_IO_STATUS_ERROR))
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
679 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
680 LOCK (win32_channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
681 SetEvent (win32_channel->data_avail_noticed_event);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
682 win32_channel->needs_close = 1;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
683 send (win32_channel->reset_send, send_buffer, sizeof (send_buffer), 0);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
684 UNLOCK (win32_channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
685 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
686 return internal_status;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
687 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
688
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
689 static GIOStatus
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
690 g_io_win32_sock_write (GIOChannel *channel,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
691 const gchar *buf,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
692 gsize count,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
693 gsize *bytes_written,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
694 GError **err)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
695 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
696 GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
697 gint result;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
698 GIOChannelError error = G_IO_STATUS_NORMAL;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
699 char send_buffer[] = "sw";
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
700
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
701 if (win32_channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
702 g_print ("g_io_win32_sock_write: sockfd:%d count:%d\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
703 win32_channel->fd, count);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
704 #ifdef WE_NEED_TO_HANDLE_WSAEINTR
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
705 repeat:
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
706 #endif
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
707 result = send (win32_channel->fd, buf, count, 0);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
708
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
709 if (win32_channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
710 g_print ("g_io_win32_sock_write: send:%d\n", result);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
711
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
712 if (result == SOCKET_ERROR)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
713 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
714 *bytes_written = 0;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
715
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
716 switch (WSAGetLastError ())
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
717 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
718 case WSAEINVAL:
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
719 error = G_IO_CHANNEL_ERROR_INVAL;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
720 break;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
721 case WSAEWOULDBLOCK:
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
722 return G_IO_STATUS_AGAIN;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
723 #ifdef WE_NEED_TO_HANDLE_WSAEINTR /* not anymore with wsock2 ? */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
724 case WSAEINTR:
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
725 goto repeat;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
726 #endif
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
727 default:
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
728 error = G_IO_CHANNEL_ERROR_FAILED;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
729 break;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
730 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
731 g_set_error (err, G_IO_CHANNEL_ERROR, error, "Socket write error");
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
732 LOCK (win32_channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
733 SetEvent (win32_channel->data_avail_noticed_event);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
734 win32_channel->needs_close = 1;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
735 send (win32_channel->reset_send, send_buffer, sizeof (send_buffer), 0);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
736 UNLOCK (win32_channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
737 return G_IO_STATUS_ERROR;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
738 /* FIXME get all errors, better error messages */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
739 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
740 else
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
741 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
742 *bytes_written = result;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
743
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
744 return G_IO_STATUS_NORMAL;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
745 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
746 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
747
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
748 static GIOStatus
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
749 g_io_win32_sock_close (GIOChannel *channel,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
750 GError **err)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
751 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
752 GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
753
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
754 LOCK (win32_channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
755 if (win32_channel->running)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
756 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
757 if (win32_channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
758 g_print ("thread %#x: running, marking for later close\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
759 win32_channel->thread_id);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
760 win32_channel->running = FALSE;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
761 win32_channel->needs_close = TRUE;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
762 SetEvent(win32_channel->data_avail_noticed_event);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
763 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
764 if (win32_channel->fd != -1)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
765 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
766 if (win32_channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
767 g_print ("thread %#x: closing socket %d\n",
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
768 win32_channel->thread_id,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
769 win32_channel->fd);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
770
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
771 closesocket (win32_channel->fd);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
772 win32_channel->fd = -1;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
773 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
774 UNLOCK (win32_channel->mutex);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
775
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
776 /* FIXME error detection? */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
777
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
778 return G_IO_STATUS_NORMAL;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
779 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
780
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
781 static GSource *
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
782 g_io_win32_sock_create_watch (GIOChannel *channel,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
783 GIOCondition condition)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
784 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
785 return g_io_win32_create_watch (channel, condition, select_thread);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
786 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
787
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
788 static GIOStatus
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
789 g_io_win32_set_flags (GIOChannel *channel,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
790 GIOFlags flags,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
791 GError **err)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
792 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
793 GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
794
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
795 if (win32_channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
796 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
797 g_print ("g_io_win32_set_flags: ");
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
798 g_win32_print_gioflags (flags);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
799 g_print ("\n");
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
800 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
801
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
802 g_warning ("g_io_win32_set_flags () not implemented.\n");
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
803
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
804 return G_IO_STATUS_NORMAL;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
805 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
806
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
807 static GIOFlags
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
808 g_io_win32_sock_get_flags (GIOChannel *channel)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
809 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
810 /* XXX Could do something here. */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
811 return 0;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
812 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
813
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
814 static GIOFuncs win32_channel_sock_funcs = {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
815 g_io_win32_sock_read,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
816 g_io_win32_sock_write,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
817 NULL,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
818 g_io_win32_sock_close,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
819 g_io_win32_sock_create_watch,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
820 g_io_win32_free,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
821 g_io_win32_set_flags,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
822 g_io_win32_sock_get_flags,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
823 };
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
824
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
825 GIOChannel *
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
826 wpurple_g_io_channel_win32_new_socket (int socket)
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
827 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
828 GIOWin32Channel *win32_channel = g_new (GIOWin32Channel, 1);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
829 GIOChannel *channel = (GIOChannel *)win32_channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
830
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
831 g_io_channel_init (channel);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
832 g_io_channel_win32_init (win32_channel);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
833 init_reset_sockets (win32_channel);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
834 if (win32_channel->debug)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
835 g_print ("g_io_channel_win32_new_socket: sockfd:%d\n", socket);
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
836 channel->funcs = &win32_channel_sock_funcs;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
837 win32_channel->type = G_IO_WIN32_SOCKET;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
838 win32_channel->fd = socket;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
839
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
840 /* XXX: check this */
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
841 channel->is_readable = TRUE;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
842 channel->is_writeable = TRUE;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
843
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
844 channel->is_seekable = FALSE;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
845
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
846 return channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
847 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
848
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
849 #if 0
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
850 void
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
851 g_io_channel_win32_set_debug (GIOChannel *channel,
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
852 gboolean flag)
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
853 {
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
854 GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
855
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
856 win32_channel->debug = flag;
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
857 }
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
858 #endif
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
859

mercurial