Advertisement
Guest User

biloky

a guest
Feb 15th, 2009
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.62 KB | None | 0 0
  1. --- daemon/gvfsbackendobexftp.c (revision 2008)
  2. +++ daemon/gvfsbackendobexftp.c (working copy)
  3. @@ -96,6 +96,15 @@
  4.  
  5. G_DEFINE_TYPE (GVfsBackendObexftp, g_vfs_backend_obexftp, G_VFS_TYPE_BACKEND);
  6.  
  7. +static void session_connect_error_cb (DBusGProxy *proxy,
  8. + const char *session_object,
  9. + const gchar *error_name,
  10. + const gchar *error_message,
  11. + gpointer user_data);
  12. +static void session_connected_cb (DBusGProxy *proxy,
  13. + const char *session_object,
  14. + gpointer user_data);
  15. +
  16. /* This should all live in bluez-gnome, and we
  17. * should depend on it */
  18. enum {
  19. @@ -207,66 +216,86 @@
  20. return g_str_has_prefix(bdaddr, "00:60:57");
  21. }
  22.  
  23. +static char *
  24. +get_name_and_class (DBusGProxy *device, guint32 *type)
  25. +{
  26. + GHashTable *hash;
  27. +
  28. + if (dbus_g_proxy_call (device, "GetProperties", NULL,
  29. + G_TYPE_INVALID, dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE),
  30. + &hash, G_TYPE_INVALID) != FALSE)
  31. + {
  32. + GValue *value;
  33. + char *name;
  34. +
  35. + value = g_hash_table_lookup (hash, "Name");
  36. + name = value ? g_value_dup_string(value) : NULL;
  37. +
  38. + value = g_hash_table_lookup (hash, "Class");
  39. + if (value)
  40. + {
  41. + *type = _get_type_from_class (g_value_get_uint (value));
  42. + }
  43. + else
  44. + {
  45. + *type = BLUETOOTH_TYPE_ANY;
  46. + }
  47. + return name;
  48. + }
  49. +
  50. + return NULL;
  51. +}
  52. +
  53. static gchar *
  54. _get_device_properties (const char *bdaddr, guint32 *type)
  55. {
  56. DBusGConnection *connection;
  57. DBusGProxy *manager;
  58. - gchar *name, **adapters;
  59. + GPtrArray *adapters;
  60. + gchar *name;
  61. guint i;
  62.  
  63. name = NULL;
  64.  
  65. connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL);
  66. if (connection == NULL)
  67. - return NULL;
  68. + return name;
  69.  
  70. manager = dbus_g_proxy_new_for_name (connection, "org.bluez",
  71. - "/org/bluez", "org.bluez.Manager");
  72. + "/", "org.bluez.Manager");
  73. if (manager == NULL)
  74. {
  75. dbus_g_connection_unref (connection);
  76. - return NULL;
  77. + return name;
  78. }
  79.  
  80. - if (dbus_g_proxy_call (manager, "ListAdapters", NULL, G_TYPE_INVALID, G_TYPE_STRV, &adapters, G_TYPE_INVALID) == FALSE)
  81. + 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)
  82. {
  83. g_object_unref (manager);
  84. dbus_g_connection_unref (connection);
  85. - return NULL;
  86. + return name;
  87. }
  88.  
  89. - for (i = 0; adapters[i] != NULL; i++)
  90. + for (i = 0; i < adapters->len && name == NULL; i++)
  91. {
  92. DBusGProxy *adapter;
  93. + char *device_path;
  94.  
  95. adapter = dbus_g_proxy_new_for_name (connection, "org.bluez",
  96. - adapters[i], "org.bluez.Adapter");
  97. - if (dbus_g_proxy_call (adapter, "GetRemoteName", NULL,
  98. + g_ptr_array_index (adapters, i), "org.bluez.Adapter");
  99. + if (dbus_g_proxy_call (adapter, "FindDevice", NULL,
  100. G_TYPE_STRING, bdaddr, G_TYPE_INVALID,
  101. - G_TYPE_STRING, &name, G_TYPE_INVALID) != FALSE)
  102. + DBUS_TYPE_G_OBJECT_PATH, &device_path, G_TYPE_INVALID) != FALSE)
  103. {
  104. - if (name != NULL && name[0] != '\0')
  105. - {
  106. - guint32 class;
  107. -
  108. - if (dbus_g_proxy_call(adapter, "GetRemoteClass", NULL,
  109. - G_TYPE_STRING, bdaddr, G_TYPE_INVALID,
  110. - G_TYPE_UINT, &class, G_TYPE_INVALID) != FALSE)
  111. - {
  112. - *type = _get_type_from_class (class);
  113. - }
  114. - else
  115. - {
  116. - *type = BLUETOOTH_TYPE_ANY;
  117. - }
  118. - g_object_unref (adapter);
  119. - break;
  120. - }
  121. + DBusGProxy *device;
  122. + device = dbus_g_proxy_new_for_name (connection, "org.bluez", device_path, "org.bluez.Device");
  123. + name = get_name_and_class (device, type);
  124. + g_object_unref (device);
  125. }
  126. g_object_unref (adapter);
  127. }
  128.  
  129. + g_ptr_array_free (adapters, TRUE);
  130. g_object_unref (manager);
  131. dbus_g_connection_unref (connection);
  132.  
  133. @@ -312,6 +341,15 @@
  134. "org.openobex",
  135. "/org/openobex",
  136. "org.openobex.Manager");
  137. +
  138. + dbus_g_proxy_add_signal(backend->manager_proxy, "SessionConnectError",
  139. + DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
  140. + dbus_g_proxy_connect_signal(backend->manager_proxy, "SessionConnectError",
  141. + G_CALLBACK(session_connect_error_cb), backend, NULL);
  142. + dbus_g_proxy_add_signal(backend->manager_proxy, "SessionConnected",
  143. + DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID);
  144. + dbus_g_proxy_connect_signal(backend->manager_proxy, "SessionConnected",
  145. + G_CALLBACK(session_connected_cb), backend, NULL);
  146. }
  147.  
  148. static gboolean
  149. @@ -531,6 +569,37 @@
  150. }
  151.  
  152. static void
  153. +session_connect_error_cb (DBusGProxy *proxy,
  154. + const char *session_object,
  155. + const gchar *error_name,
  156. + const gchar *error_message,
  157. + gpointer user_data)
  158. +{
  159. + GVfsBackendObexftp *op_backend = G_VFS_BACKEND_OBEXFTP (user_data);
  160. +
  161. + g_mutex_lock (op_backend->mutex);
  162. + op_backend->status = ASYNC_ERROR;
  163. + op_backend->error = g_error_new_literal (DBUS_GERROR,
  164. + DBUS_GERROR_REMOTE_EXCEPTION,
  165. + error_message);
  166. + g_cond_signal (op_backend->cond);
  167. + g_mutex_unlock (op_backend->mutex);
  168. +}
  169. +
  170. +static void
  171. +session_connected_cb (DBusGProxy *proxy,
  172. + const char *session_object,
  173. + gpointer user_data)
  174. +{
  175. + GVfsBackendObexftp *op_backend = G_VFS_BACKEND_OBEXFTP (user_data);
  176. +
  177. + g_mutex_lock (op_backend->mutex);
  178. + op_backend->status = ASYNC_SUCCESS;
  179. + g_cond_signal (op_backend->cond);
  180. + g_mutex_unlock (op_backend->mutex);
  181. +}
  182. +
  183. +static void
  184. cancelled_cb (DBusGProxy *proxy, gpointer user_data)
  185. {
  186. GVfsBackendObexftp *op_backend = G_VFS_BACKEND_OBEXFTP (user_data);
  187. @@ -559,24 +628,6 @@
  188. _exit (1);
  189. }
  190.  
  191. -static int
  192. -is_connected (DBusGProxy *session_proxy, GVfsJob *job)
  193. -{
  194. - GError *error = NULL;
  195. - gboolean connected;
  196. -
  197. - if (dbus_g_proxy_call (session_proxy, "IsConnected", &error,
  198. - G_TYPE_INVALID,
  199. - G_TYPE_BOOLEAN, &connected, G_TYPE_INVALID) == FALSE)
  200. - {
  201. - g_vfs_job_failed_from_error (job, error);
  202. - g_error_free (error);
  203. - return -1;
  204. - }
  205. -
  206. - return connected;
  207. -}
  208. -
  209. static void
  210. do_mount (GVfsBackend *backend,
  211. GVfsJobMount *job,
  212. @@ -590,7 +641,7 @@
  213. const gchar *path = NULL;
  214. char *server;
  215. GMountSpec *obexftp_mount_spec;
  216. - gboolean connected;
  217. + guint count;
  218.  
  219. g_print ("+ do_mount\n");
  220.  
  221. @@ -616,10 +667,11 @@
  222. }
  223.  
  224. /* FIXME, Have a way for the mount to be cancelled, see:
  225. - * http://bugs.muiline.com/view.php?id=51 */
  226. + * Use CancelSessionConnect */
  227. + op_backend->status = ASYNC_PENDING;
  228.  
  229. if (dbus_g_proxy_call (op_backend->manager_proxy, "CreateBluetoothSession", &error,
  230. - G_TYPE_STRING, op_backend->bdaddr, G_TYPE_STRING, "ftp", G_TYPE_INVALID,
  231. + G_TYPE_STRING, op_backend->bdaddr, G_TYPE_STRING, "00:00:00:00:00:00", G_TYPE_STRING, "ftp", G_TYPE_INVALID,
  232. DBUS_TYPE_G_OBJECT_PATH, &path, G_TYPE_INVALID) == FALSE)
  233. {
  234. g_free (op_backend->bdaddr);
  235. @@ -676,14 +728,20 @@
  236. G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT64, G_TYPE_INVALID);
  237.  
  238. /* Now wait until the device is connected */
  239. - connected = is_connected (op_backend->session_proxy, G_VFS_JOB (job));
  240. - while (connected == FALSE)
  241. - {
  242. - g_usleep (G_USEC_PER_SEC / 100);
  243. - connected = is_connected (op_backend->session_proxy, G_VFS_JOB (job));
  244. - }
  245. + count = 0;
  246. + g_mutex_lock (op_backend->mutex);
  247.  
  248. - if (connected < 0)
  249. + while (op_backend->status == ASYNC_PENDING && count < 100) {
  250. + GTimeVal val;
  251. + g_get_current_time (&val);
  252. + g_time_val_add (&val, 100000);
  253. + count++;
  254. + if (g_cond_timed_wait (op_backend->cond, op_backend->mutex, &val) != FALSE)
  255. + break;
  256. + }
  257. + g_mutex_unlock (op_backend->mutex);
  258. +
  259. + if (op_backend->status == ASYNC_ERROR || op_backend->status == ASYNC_PENDING)
  260. {
  261. g_message ("mount failed, didn't connect");
  262.  
  263. @@ -694,12 +752,17 @@
  264. g_object_unref (op_backend->session_proxy);
  265. op_backend->session_proxy = NULL;
  266.  
  267. - g_vfs_job_failed (G_VFS_JOB (job),
  268. - G_IO_ERROR, G_IO_ERROR_BUSY,
  269. - _("Connection to the device lost"));
  270. + if (op_backend->status != ASYNC_PENDING)
  271. + g_vfs_job_failed_from_error (G_VFS_JOB (job), op_backend->error);
  272. + else
  273. + g_vfs_job_failed (G_VFS_JOB (job),
  274. + G_IO_ERROR, G_IO_ERROR_BUSY,
  275. + _("Connection to the device lost"));
  276. return;
  277. }
  278.  
  279. + op_backend->status = ASYNC_PENDING;
  280. +
  281. g_vfs_job_succeeded (G_VFS_JOB (job));
  282.  
  283. g_print ("- do_mount\n");
  284. @@ -1482,6 +1545,12 @@
  285. /* TransferStarted */
  286. dbus_g_object_register_marshaller(obexftp_marshal_VOID__STRING_STRING_UINT64,
  287. G_TYPE_NONE, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT64, G_TYPE_INVALID);
  288. + /* SessionConnected */
  289. + dbus_g_object_register_marshaller(obexftp_marshal_VOID__STRING,
  290. + G_TYPE_NONE, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID);
  291. + /* SessionConnectError */
  292. + dbus_g_object_register_marshaller (obexftp_marshal_VOID__STRING_STRING_STRING,
  293. + G_TYPE_NONE, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
  294. }
  295.  
  296. /*
  297. --- daemon/obexftp-marshal.list (revision 2008)
  298. +++ daemon/obexftp-marshal.list (working copy)
  299. @@ -1,2 +1,4 @@
  300. +VOID:STRING
  301. VOID:STRING,STRING
  302. +VOID:STRING,STRING,STRING
  303. VOID:STRING,STRING,UINT64
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement