Mercurial > pidgin.yaz
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 |
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 |