annotate libgaim/win32/giowin32.c @ 15204:f814b2df9cce

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