1 |
eva 09/01/26 22:53:53 |
2 |
|
3 |
Added: gvfs-1.0.3-bluez4.patch |
4 |
Log: |
5 |
Add patch for bluez-4, bug #250615. |
6 |
(Portage version: 2.2_rc22/cvs/Linux 2.6.24-gentoo-r8-mactel x86_64) |
7 |
|
8 |
Revision Changes Path |
9 |
1.1 gnome-base/gvfs/files/gvfs-1.0.3-bluez4.patch |
10 |
|
11 |
file : http://sources.gentoo.org/viewcvs.py/gentoo-x86/gnome-base/gvfs/files/gvfs-1.0.3-bluez4.patch?rev=1.1&view=markup |
12 |
plain: http://sources.gentoo.org/viewcvs.py/gentoo-x86/gnome-base/gvfs/files/gvfs-1.0.3-bluez4.patch?rev=1.1&content-type=text/plain |
13 |
|
14 |
Index: gvfs-1.0.3-bluez4.patch |
15 |
=================================================================== |
16 |
--- |
17 |
daemon-main.c | 6 + |
18 |
gvfsbackendobexftp.c | 292 ++++++++++++++++++++++----------------------------- |
19 |
obexftp-marshal.list | 2 |
20 |
3 files changed, 138 insertions(+), 162 deletions(-) |
21 |
Index: b/daemon/obexftp-marshal.list |
22 |
=================================================================== |
23 |
--- a/daemon/obexftp-marshal.list (revision 2022) |
24 |
+++ b/daemon/obexftp-marshal.list (working copy) |
25 |
@@ -1,2 +1,4 @@ |
26 |
+VOID:STRING |
27 |
VOID:STRING,STRING |
28 |
+VOID:STRING,STRING,STRING |
29 |
VOID:STRING,STRING,UINT64 |
30 |
Index: b/daemon/daemon-main.c |
31 |
=================================================================== |
32 |
--- a/daemon/daemon-main.c (revision 2022) |
33 |
+++ b/daemon/daemon-main.c (working copy) |
34 |
@@ -65,6 +65,12 @@ |
35 |
dbus_error_free (&derror); |
36 |
exit (1); |
37 |
} |
38 |
+ |
39 |
+ GLogLevelFlags fatal_mask; |
40 |
+ |
41 |
+ fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK); |
42 |
+ fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL; |
43 |
+ g_log_set_always_fatal (fatal_mask); |
44 |
} |
45 |
|
46 |
void |
47 |
Index: b/daemon/gvfsbackendobexftp.c |
48 |
=================================================================== |
49 |
--- a/daemon/gvfsbackendobexftp.c (revision 2022) |
50 |
+++ b/daemon/gvfsbackendobexftp.c (working copy) |
51 |
@@ -69,7 +69,7 @@ |
52 |
|
53 |
char *display_name; |
54 |
char *bdaddr; |
55 |
- guint type; |
56 |
+ char *icon_name; |
57 |
|
58 |
DBusGConnection *connection; |
59 |
DBusGProxy *manager_proxy; |
60 |
@@ -96,177 +96,106 @@ |
61 |
|
62 |
G_DEFINE_TYPE (GVfsBackendObexftp, g_vfs_backend_obexftp, G_VFS_TYPE_BACKEND); |
63 |
|
64 |
-/* This should all live in bluez-gnome, and we |
65 |
- * should depend on it */ |
66 |
-enum { |
67 |
- BLUETOOTH_TYPE_ANY = 1, |
68 |
- BLUETOOTH_TYPE_PHONE = 1 << 1, |
69 |
- BLUETOOTH_TYPE_MODEM = 1 << 2, |
70 |
- BLUETOOTH_TYPE_COMPUTER = 1 << 3, |
71 |
- BLUETOOTH_TYPE_NETWORK = 1 << 4, |
72 |
- BLUETOOTH_TYPE_HEADSET = 1 << 5, |
73 |
- BLUETOOTH_TYPE_KEYBOARD = 1 << 6, |
74 |
- BLUETOOTH_TYPE_MOUSE = 1 << 7, |
75 |
- BLUETOOTH_TYPE_CAMERA = 1 << 8, |
76 |
- BLUETOOTH_TYPE_PRINTER = 1 << 9 |
77 |
-}; |
78 |
+static void session_connect_error_cb (DBusGProxy *proxy, |
79 |
+ const char *session_object, |
80 |
+ const gchar *error_name, |
81 |
+ const gchar *error_message, |
82 |
+ gpointer user_data); |
83 |
+static void session_connected_cb (DBusGProxy *proxy, |
84 |
+ const char *session_object, |
85 |
+ gpointer user_data); |
86 |
|
87 |
-static const char * |
88 |
-_get_icon_from_type (guint type) |
89 |
+/* Used to detect broken listings from |
90 |
+ * old Nokia 3650s */ |
91 |
+static gboolean |
92 |
+_is_nokia_3650 (const char *bdaddr) |
93 |
{ |
94 |
- switch (type) |
95 |
- { |
96 |
- case BLUETOOTH_TYPE_PHONE: |
97 |
- return "phone"; |
98 |
- break; |
99 |
- case BLUETOOTH_TYPE_MODEM: |
100 |
- return "modem"; |
101 |
- break; |
102 |
- case BLUETOOTH_TYPE_COMPUTER: |
103 |
- return "network-server"; |
104 |
- break; |
105 |
- case BLUETOOTH_TYPE_NETWORK: |
106 |
- return "network-wireless"; |
107 |
- break; |
108 |
- case BLUETOOTH_TYPE_HEADSET: |
109 |
- return "stock_headphones"; |
110 |
- break; |
111 |
- case BLUETOOTH_TYPE_KEYBOARD: |
112 |
- return "input-keyboard"; |
113 |
- break; |
114 |
- case BLUETOOTH_TYPE_MOUSE: |
115 |
- return "input-mouse"; |
116 |
- break; |
117 |
- case BLUETOOTH_TYPE_CAMERA: |
118 |
- return "camera-photo"; |
119 |
- break; |
120 |
- case BLUETOOTH_TYPE_PRINTER: |
121 |
- return "printer"; |
122 |
- break; |
123 |
- default: |
124 |
- return "bluetooth"; |
125 |
- break; |
126 |
- } |
127 |
+ /* Don't ask, Nokia seem to use a Bluetooth |
128 |
+ * HCI from Murata */ |
129 |
+ return g_str_has_prefix(bdaddr, "00:60:57"); |
130 |
} |
131 |
|
132 |
-static int |
133 |
-_get_type_from_class (guint class) |
134 |
+static char * |
135 |
+get_name_and_icon (DBusGProxy *device, char **icon_name) |
136 |
{ |
137 |
- switch ((class & 0x1f00) >> 8) |
138 |
+ GHashTable *hash; |
139 |
+ |
140 |
+ if (dbus_g_proxy_call (device, "GetProperties", NULL, |
141 |
+ G_TYPE_INVALID, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), |
142 |
+ &hash, G_TYPE_INVALID) != FALSE) |
143 |
{ |
144 |
- case 0x01: |
145 |
- return BLUETOOTH_TYPE_COMPUTER; |
146 |
- case 0x02: |
147 |
- switch ((class & 0xfc) >> 2) |
148 |
+ GValue *value; |
149 |
+ char *name; |
150 |
+ |
151 |
+ value = g_hash_table_lookup (hash, "Name"); |
152 |
+ name = value ? g_value_dup_string(value) : NULL; |
153 |
+ |
154 |
+ value = g_hash_table_lookup (hash, "Icon"); |
155 |
+ if (value) |
156 |
{ |
157 |
- case 0x01: |
158 |
- case 0x02: |
159 |
- case 0x03: |
160 |
- case 0x05: |
161 |
- return BLUETOOTH_TYPE_PHONE; |
162 |
- case 0x04: |
163 |
- return BLUETOOTH_TYPE_MODEM; |
164 |
+ *icon_name = g_value_dup_string (value); |
165 |
} |
166 |
- break; |
167 |
- case 0x03: |
168 |
- return BLUETOOTH_TYPE_NETWORK; |
169 |
- case 0x04: |
170 |
- switch ((class & 0xfc) >> 2) |
171 |
+ else |
172 |
{ |
173 |
- case 0x01: |
174 |
- return BLUETOOTH_TYPE_HEADSET; |
175 |
+ *icon_name = g_strdup ("bluetooth"); |
176 |
} |
177 |
- break; |
178 |
- case 0x05: |
179 |
- switch ((class & 0xc0) >> 6) |
180 |
- { |
181 |
- case 0x01: |
182 |
- return BLUETOOTH_TYPE_KEYBOARD; |
183 |
- case 0x02: |
184 |
- return BLUETOOTH_TYPE_MOUSE; |
185 |
- } |
186 |
- break; |
187 |
- case 0x06: |
188 |
- if (class & 0x80) |
189 |
- return BLUETOOTH_TYPE_PRINTER; |
190 |
- if (class & 0x20) |
191 |
- return BLUETOOTH_TYPE_CAMERA; |
192 |
- break; |
193 |
+ g_hash_table_destroy (hash); |
194 |
+ return name; |
195 |
} |
196 |
|
197 |
- return BLUETOOTH_TYPE_ANY; |
198 |
+ return NULL; |
199 |
} |
200 |
|
201 |
-/* Used to detect broken listings from |
202 |
- * old Nokia 3650s */ |
203 |
-static gboolean |
204 |
-_is_nokia_3650 (const char *bdaddr) |
205 |
-{ |
206 |
- /* Don't ask, Nokia seem to use a Bluetooth |
207 |
- * HCI from Murata */ |
208 |
- return g_str_has_prefix(bdaddr, "00:60:57"); |
209 |
-} |
210 |
- |
211 |
static gchar * |
212 |
-_get_device_properties (const char *bdaddr, guint32 *type) |
213 |
+_get_device_properties (const char *bdaddr, char **icon_name) |
214 |
{ |
215 |
DBusGConnection *connection; |
216 |
DBusGProxy *manager; |
217 |
- gchar *name, **adapters; |
218 |
+ GPtrArray *adapters; |
219 |
+ gchar *name; |
220 |
guint i; |
221 |
|
222 |
name = NULL; |
223 |
|
224 |
connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL); |
225 |
if (connection == NULL) |
226 |
- return NULL; |
227 |
+ return name; |
228 |
|
229 |
manager = dbus_g_proxy_new_for_name (connection, "org.bluez", |
230 |
- "/org/bluez", "org.bluez.Manager"); |
231 |
+ "/", "org.bluez.Manager"); |
232 |
if (manager == NULL) |
233 |
{ |
234 |
dbus_g_connection_unref (connection); |
235 |
- return NULL; |
236 |
+ return name; |
237 |
} |
238 |
|
239 |
- if (dbus_g_proxy_call (manager, "ListAdapters", NULL, G_TYPE_INVALID, G_TYPE_STRV, &adapters, G_TYPE_INVALID) == FALSE) |
240 |
+ if (dbus_g_proxy_call (manager, "ListAdapters", NULL, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &adapters, G_TYPE_INVALID) == FALSE) |
241 |
{ |
242 |
g_object_unref (manager); |
243 |
dbus_g_connection_unref (connection); |
244 |
- return NULL; |
245 |
+ return name; |
246 |
} |
247 |
|
248 |
- for (i = 0; adapters[i] != NULL; i++) |
249 |
+ for (i = 0; i < adapters->len && name == NULL; i++) |
250 |
{ |
251 |
DBusGProxy *adapter; |
252 |
+ char *device_path; |
253 |
|
254 |
adapter = dbus_g_proxy_new_for_name (connection, "org.bluez", |
255 |
- adapters[i], "org.bluez.Adapter"); |
256 |
- if (dbus_g_proxy_call (adapter, "GetRemoteName", NULL, |
257 |
+ g_ptr_array_index (adapters, i), "org.bluez.Adapter"); |
258 |
+ if (dbus_g_proxy_call (adapter, "FindDevice", NULL, |
259 |
G_TYPE_STRING, bdaddr, G_TYPE_INVALID, |
260 |
- G_TYPE_STRING, &name, G_TYPE_INVALID) != FALSE) |
261 |
+ DBUS_TYPE_G_OBJECT_PATH, &device_path, G_TYPE_INVALID) != FALSE) |
262 |
{ |
263 |
- if (name != NULL && name[0] != '\0') |
264 |
- { |
265 |
- guint32 class; |
266 |
- |
267 |
- if (dbus_g_proxy_call(adapter, "GetRemoteClass", NULL, |
268 |
- G_TYPE_STRING, bdaddr, G_TYPE_INVALID, |
269 |
- G_TYPE_UINT, &class, G_TYPE_INVALID) != FALSE) |
270 |
- { |
271 |
- *type = _get_type_from_class (class); |
272 |
- } |
273 |
- else |
274 |
- { |
275 |
- *type = BLUETOOTH_TYPE_ANY; |
276 |
- } |
277 |
- g_object_unref (adapter); |
278 |
- break; |
279 |
- } |
280 |
+ DBusGProxy *device; |
281 |
+ device = dbus_g_proxy_new_for_name (connection, "org.bluez", device_path, "org.bluez.Device"); |
282 |
+ name = get_name_and_icon (device, icon_name); |
283 |
+ g_object_unref (device); |
284 |
} |
285 |
g_object_unref (adapter); |
286 |
} |
287 |
|
288 |
+ g_ptr_array_free (adapters, TRUE); |
289 |
g_object_unref (manager); |
290 |
dbus_g_connection_unref (connection); |
291 |
|
292 |
@@ -282,6 +211,7 @@ |
293 |
|
294 |
g_free (backend->display_name); |
295 |
g_free (backend->bdaddr); |
296 |
+ g_free (backend->icon_name); |
297 |
g_free (backend->files_listing); |
298 |
g_free (backend->directory); |
299 |
|
300 |
@@ -312,6 +242,15 @@ |
301 |
"org.openobex", |
302 |
"/org/openobex", |
303 |
"org.openobex.Manager"); |
304 |
+ |
305 |
+ dbus_g_proxy_add_signal(backend->manager_proxy, "SessionConnectError", |
306 |
+ DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); |
307 |
+ dbus_g_proxy_connect_signal(backend->manager_proxy, "SessionConnectError", |
308 |
+ G_CALLBACK(session_connect_error_cb), backend, NULL); |
309 |
+ dbus_g_proxy_add_signal(backend->manager_proxy, "SessionConnected", |
310 |
+ DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID); |
311 |
+ dbus_g_proxy_connect_signal(backend->manager_proxy, "SessionConnected", |
312 |
+ G_CALLBACK(session_connected_cb), backend, NULL); |
313 |
} |
314 |
|
315 |
static gboolean |
316 |
@@ -437,8 +376,7 @@ |
317 |
g_file_info_set_file_type (info, G_FILE_TYPE_DIRECTORY); |
318 |
g_file_info_set_content_type (info, "inode/directory"); |
319 |
g_file_info_set_name (info, "/"); |
320 |
- g_vfs_backend_set_icon_name (backend, |
321 |
- _get_icon_from_type (op_backend->type)); |
322 |
+ g_vfs_backend_set_icon_name (backend, op_backend->icon_name); |
323 |
display = g_strdup_printf (_("%s on %s"), "/", op_backend->display_name); |
324 |
g_file_info_set_display_name (info, display); |
325 |
g_free (display); |
326 |
@@ -531,6 +469,37 @@ |
327 |
} |
328 |
|
329 |
static void |
330 |
+session_connect_error_cb (DBusGProxy *proxy, |
331 |
+ const char *session_object, |
332 |
+ const gchar *error_name, |
333 |
+ const gchar *error_message, |
334 |
+ gpointer user_data) |
335 |
+{ |
336 |
+ GVfsBackendObexftp *op_backend = G_VFS_BACKEND_OBEXFTP (user_data); |
337 |
+ |
338 |
+ g_mutex_lock (op_backend->mutex); |
339 |
+ op_backend->status = ASYNC_ERROR; |
340 |
+ op_backend->error = g_error_new_literal (DBUS_GERROR, |
341 |
+ DBUS_GERROR_REMOTE_EXCEPTION, |
342 |
+ error_message); |
343 |
+ g_cond_signal (op_backend->cond); |
344 |
+ g_mutex_unlock (op_backend->mutex); |
345 |
+} |
346 |
+ |
347 |
+static void |
348 |
+session_connected_cb (DBusGProxy *proxy, |
349 |
+ const char *session_object, |
350 |
+ gpointer user_data) |
351 |
+{ |
352 |
+ GVfsBackendObexftp *op_backend = G_VFS_BACKEND_OBEXFTP (user_data); |
353 |
+ |
354 |
+ g_mutex_lock (op_backend->mutex); |
355 |
+ op_backend->status = ASYNC_SUCCESS; |
356 |
+ g_cond_signal (op_backend->cond); |
357 |
+ g_mutex_unlock (op_backend->mutex); |
358 |
+} |
359 |
+ |
360 |
+static void |
361 |
cancelled_cb (DBusGProxy *proxy, gpointer user_data) |
362 |
{ |
363 |
GVfsBackendObexftp *op_backend = G_VFS_BACKEND_OBEXFTP (user_data); |
364 |
@@ -559,24 +528,6 @@ |
365 |
_exit (1); |
366 |
} |
367 |
|
368 |
-static int |
369 |
-is_connected (DBusGProxy *session_proxy, GVfsJob *job) |
370 |
-{ |
371 |
- GError *error = NULL; |
372 |
- gboolean connected; |
373 |
- |
374 |
- if (dbus_g_proxy_call (session_proxy, "IsConnected", &error, |
375 |
- G_TYPE_INVALID, |
376 |
- G_TYPE_BOOLEAN, &connected, G_TYPE_INVALID) == FALSE) |
377 |
- { |
378 |
- g_vfs_job_failed_from_error (job, error); |
379 |
- g_error_free (error); |
380 |
- return -1; |
381 |
- } |
382 |
- |
383 |
- return connected; |
384 |
-} |
385 |
- |
386 |
static void |
387 |
do_mount (GVfsBackend *backend, |
388 |
GVfsJobMount *job, |
389 |
@@ -590,7 +541,7 @@ |
390 |
const gchar *path = NULL; |
391 |
char *server; |
392 |
GMountSpec *obexftp_mount_spec; |
393 |
- gboolean connected; |
394 |
+ guint count; |
395 |
|
396 |
g_print ("+ do_mount\n"); |
397 |
|
398 |
@@ -616,10 +567,11 @@ |
399 |
} |
400 |
|
401 |
/* FIXME, Have a way for the mount to be cancelled, see: |
402 |
- * http://bugs.muiline.com/view.php?id=51 */ |
403 |
+ * Use CancelSessionConnect */ |
404 |
+ op_backend->status = ASYNC_PENDING; |
405 |
|
406 |
if (dbus_g_proxy_call (op_backend->manager_proxy, "CreateBluetoothSession", &error, |
407 |
- G_TYPE_STRING, op_backend->bdaddr, G_TYPE_STRING, "ftp", G_TYPE_INVALID, |
408 |
+ G_TYPE_STRING, op_backend->bdaddr, G_TYPE_STRING, "00:00:00:00:00:00", G_TYPE_STRING, "ftp", G_TYPE_INVALID, |
409 |
DBUS_TYPE_G_OBJECT_PATH, &path, G_TYPE_INVALID) == FALSE) |
410 |
{ |
411 |
g_free (op_backend->bdaddr); |
412 |
@@ -636,14 +588,13 @@ |
413 |
path, |
414 |
"org.openobex.Session"); |
415 |
|
416 |
- op_backend->display_name = _get_device_properties (op_backend->bdaddr, &op_backend->type); |
417 |
+ op_backend->display_name = _get_device_properties (op_backend->bdaddr, &op_backend->icon_name); |
418 |
if (!op_backend->display_name) |
419 |
op_backend->display_name = g_strdup (op_backend->bdaddr); |
420 |
|
421 |
g_vfs_backend_set_display_name (G_VFS_BACKEND (op_backend), |
422 |
op_backend->display_name); |
423 |
- g_vfs_backend_set_icon_name (G_VFS_BACKEND (op_backend), |
424 |
- _get_icon_from_type (op_backend->type)); |
425 |
+ g_vfs_backend_set_icon_name (G_VFS_BACKEND (op_backend), op_backend->icon_name); |
426 |
|
427 |
obexftp_mount_spec = g_mount_spec_new ("obex"); |
428 |
server = g_strdup_printf ("[%s]", op_backend->bdaddr); |
429 |
@@ -676,14 +627,20 @@ |
430 |
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT64, G_TYPE_INVALID); |
431 |
|
432 |
/* Now wait until the device is connected */ |
433 |
- connected = is_connected (op_backend->session_proxy, G_VFS_JOB (job)); |
434 |
- while (connected == FALSE) |
435 |
- { |
436 |
- g_usleep (G_USEC_PER_SEC / 100); |
437 |
- connected = is_connected (op_backend->session_proxy, G_VFS_JOB (job)); |
438 |
- } |
439 |
+ count = 0; |
440 |
+ g_mutex_lock (op_backend->mutex); |
441 |
|
442 |
- if (connected < 0) |
443 |
+ while (op_backend->status == ASYNC_PENDING && count < 100) { |
444 |
+ GTimeVal val; |
445 |
+ g_get_current_time (&val); |
446 |
+ g_time_val_add (&val, 100000); |
447 |
+ count++; |
448 |
+ if (g_cond_timed_wait (op_backend->cond, op_backend->mutex, &val) != FALSE) |
449 |
+ break; |
450 |
+ } |
451 |
+ g_mutex_unlock (op_backend->mutex); |
452 |
+ |
453 |
+ if (op_backend->status == ASYNC_ERROR || op_backend->status == ASYNC_PENDING) |
454 |
{ |
455 |
g_message ("mount failed, didn't connect"); |
456 |
|
457 |
@@ -694,12 +651,17 @@ |
458 |
g_object_unref (op_backend->session_proxy); |
459 |
op_backend->session_proxy = NULL; |
460 |
|
461 |
- g_vfs_job_failed (G_VFS_JOB (job), |
462 |
- G_IO_ERROR, G_IO_ERROR_BUSY, |
463 |
- _("Connection to the device lost")); |
464 |
+ if (op_backend->status != ASYNC_PENDING) |
465 |
+ g_vfs_job_failed_from_error (G_VFS_JOB (job), op_backend->error); |
466 |
+ else |
467 |
+ g_vfs_job_failed (G_VFS_JOB (job), |
468 |
+ G_IO_ERROR, G_IO_ERROR_BUSY, |
469 |
+ _("Connection to the device lost")); |
470 |
return; |
471 |
} |
472 |
|
473 |
+ op_backend->status = ASYNC_PENDING; |
474 |
+ |
475 |
g_vfs_job_succeeded (G_VFS_JOB (job)); |
476 |
|
477 |
g_print ("- do_mount\n"); |
478 |
@@ -1482,6 +1444,12 @@ |
479 |
/* TransferStarted */ |
480 |
dbus_g_object_register_marshaller(obexftp_marshal_VOID__STRING_STRING_UINT64, |
481 |
G_TYPE_NONE, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT64, G_TYPE_INVALID); |
482 |
+ /* SessionConnected */ |
483 |
+ dbus_g_object_register_marshaller(obexftp_marshal_VOID__STRING, |
484 |
+ G_TYPE_NONE, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID); |
485 |
+ /* SessionConnectError */ |
486 |
+ dbus_g_object_register_marshaller (obexftp_marshal_VOID__STRING_STRING_STRING, |
487 |
+ G_TYPE_NONE, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); |
488 |
} |
489 |
|
490 |
/* |