libpurple/win32/giowin32.c

Sat, 17 Aug 2013 23:27:20 +0530

author
Ankit Vani <a@nevitus.org>
date
Sat, 17 Aug 2013 23:27:20 +0530
branch
soc.2013.gobjectification.plugins
changeset 36543
a8c3fecee2d3
parent 31294
73607ab89c6f
child 35854
ed4fd1030878
permissions
-rw-r--r--

Renamed prpl.[ch] to protocol.[ch]

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;
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
75
14792
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 */
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
82
14792
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 */
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
97
14792
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
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
157 }
14792
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;
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
181
14792
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 }
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
257
14792
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);
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
295
14792
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);
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
300
14792
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);
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
320
14792
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" : ""));
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
331
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
332 n = select (1, &read_fds, &write_fds, &except_fds, NULL);
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
333
14792
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" : ""));
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
365
14792
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;
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
421
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
422 *timeout = -1;
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
423
14792
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 }
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
481
14792
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);
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
506
14792
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 }
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
513
14792
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";
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
525
14792
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;
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
566
14792
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);
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
569
14792
02a5df4343f7 [gaim-migrate @ 17486]
Daniel Atallah <datallah@pidgin.im>
parents:
diff changeset
570 watch->condition = condition;
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
571
14792
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;
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
577
14792
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;
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
600
14792
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);
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
646
14792
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
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
677 if ((internal_status == G_IO_STATUS_EOF) ||
14792
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";
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
700
14792
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);
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
708
14792
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);
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
711
14792
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);
31294
73607ab89c6f Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents: 24231
diff changeset
770
14792
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