Mercurial > pidgin
annotate libgaim/win32/giowin32.c @ 14911:9f3be32d0913
[gaim-migrate @ 17683]
I meant to remove this a revision or three ago
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 06 Nov 2006 07:52:17 +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 |