Gentoo Archives: gentoo-commits

From: "Gilles Dartiguelongue (eva)" <eva@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gentoo-x86 commit in gnome-base/gvfs/files: gvfs-1.0.3-bluez4.patch
Date: Mon, 26 Jan 2009 22:53:56
Message-Id: E1LRaL3-0002dW-VO@stork.gentoo.org
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 /*