diff options
Diffstat (limited to 'client/gdaemonvfs.c')
-rw-r--r-- | client/gdaemonvfs.c | 399 |
1 files changed, 173 insertions, 226 deletions
diff --git a/client/gdaemonvfs.c b/client/gdaemonvfs.c index 6930a284..0bdee720 100644 --- a/client/gdaemonvfs.c +++ b/client/gdaemonvfs.c @@ -25,15 +25,12 @@ #include <signal.h> #include <stdlib.h> #include <errno.h> -#include <dbus/dbus.h> #include "gdaemonvfs.h" #include "gvfsuriutils.h" #include "gdaemonfile.h" #include <gio/gio.h> #include <gvfsdaemonprotocol.h> #include <gmodule.h> -#include "gvfsdaemondbus.h" -#include "gvfsdbusutils.h" #include "gmountspec.h" #include "gvfsurimapper.h" #include "gdaemonvolumemonitor.h" @@ -41,6 +38,7 @@ #include "gvfsiconloadable.h" #include <glib/gi18n-lib.h> #include <glib/gstdio.h> +#include <gvfsdbus.h> typedef struct { char *type; @@ -54,7 +52,7 @@ struct _GDaemonVfs { GVfs parent; - DBusConnection *async_bus; + GDBusConnection *async_bus; GVfs *wrapped_vfs; GList *mount_cache; @@ -101,10 +99,7 @@ g_daemon_vfs_finalize (GObject *object) g_strfreev (vfs->supported_uri_schemes); if (vfs->async_bus) - { - dbus_connection_close (vfs->async_bus); - dbus_connection_unref (vfs->async_bus); - } + g_object_unref (vfs->async_bus); if (vfs->wrapped_vfs) g_object_unref (vfs->wrapped_vfs); @@ -302,9 +297,7 @@ g_daemon_vfs_init (GDaemonVfs *vfs) bindtextdomain (GETTEXT_PACKAGE, GVFS_LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - dbus_threads_init_default (); - - vfs->async_bus = dbus_bus_get_private (DBUS_BUS_SESSION, NULL); + vfs->async_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); if (vfs->async_bus == NULL) return; /* Not supported, return here and return false in vfs_is_active() */ @@ -336,9 +329,7 @@ g_daemon_vfs_init (GDaemonVfs *vfs) vfs->fuse_root = g_vfs_get_file_for_path (vfs->wrapped_vfs, file); g_free (file); - dbus_connection_set_exit_on_disconnect (vfs->async_bus, FALSE); - - _g_dbus_connection_integrate_with_main (vfs->async_bus); + g_dbus_connection_set_exit_on_close (vfs->async_bus, FALSE); modules = g_io_modules_load_all_in_directory (GVFS_MODULE_DIR); @@ -611,107 +602,101 @@ find_string (GPtrArray *array, const char *find_me) return -1; } +static GVfsDBusMountTracker * +create_mount_tracker_proxy () +{ + GVfsDBusMountTracker *proxy; + GError *error; + + error = NULL; + proxy = gvfs_dbus_mount_tracker_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + G_VFS_DBUS_DAEMON_NAME, + G_VFS_DBUS_MOUNTTRACKER_PATH, + NULL, + &error); + if (proxy == NULL) + { + g_printerr ("Error creating proxy: %s (%s, %d)\n", + error->message, g_quark_to_string (error->domain), error->code); + g_error_free (error); + } + + return proxy; +} static void fill_mountable_info (GDaemonVfs *vfs) { - DBusMessage *message, *reply; - DBusError error; - DBusMessageIter iter, array_iter, struct_iter; MountableInfo *info; GPtrArray *infos, *uri_schemes; gint i; - - message = dbus_message_new_method_call (G_VFS_DBUS_DAEMON_NAME, - G_VFS_DBUS_MOUNTTRACKER_PATH, - G_VFS_DBUS_MOUNTTRACKER_INTERFACE, - G_VFS_DBUS_MOUNTTRACKER_OP_LIST_MOUNTABLE_INFO); - - if (message == NULL) - _g_dbus_oom (); - - dbus_message_set_auto_start (message, TRUE); - - dbus_error_init (&error); - reply = dbus_connection_send_with_reply_and_block (vfs->async_bus, - message, - G_VFS_DBUS_TIMEOUT_MSECS, - &error); - dbus_message_unref (message); + GVfsDBusMountTracker *proxy; + GVariant *iter_mountables; + GError *error; + GVariantIter iter; + const gchar *type, *scheme, **scheme_aliases; + guint scheme_aliases_len; + gint32 default_port; + gboolean host_is_inet; - if (dbus_error_is_set (&error)) + proxy = create_mount_tracker_proxy (); + g_return_if_fail (proxy != NULL); + + error = NULL; + if (!gvfs_dbus_mount_tracker_call_list_mountable_info_sync (proxy, + &iter_mountables, + NULL, + &error)) { - dbus_error_free (&error); + g_printerr ("org.gtk.vfs.MountTracker.listMountableInfo call failed: %s (%s, %d)\n", + error->message, g_quark_to_string (error->domain), error->code); + g_error_free (error); return; } - - if (reply == NULL) - _g_dbus_oom (); - - dbus_message_iter_init (reply, &iter); - - dbus_message_iter_recurse (&iter, &array_iter); infos = g_ptr_array_new (); uri_schemes = g_ptr_array_new (); g_ptr_array_add (uri_schemes, g_strdup ("file")); - do - { - char *type, *scheme, **scheme_aliases; - int scheme_aliases_len; - gint32 default_port; - dbus_bool_t host_is_inet; - - if (dbus_message_iter_get_arg_type (&array_iter) != DBUS_TYPE_STRUCT) - break; - - dbus_message_iter_recurse (&array_iter, &struct_iter); - - if (!_g_dbus_message_iter_get_args (&struct_iter, NULL, - DBUS_TYPE_STRING, &type, - DBUS_TYPE_STRING, &scheme, - DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &scheme_aliases, &scheme_aliases_len, - DBUS_TYPE_INT32, &default_port, - DBUS_TYPE_BOOLEAN, &host_is_inet, - 0)) - break; + g_variant_iter_init (&iter, iter_mountables); + while (g_variant_iter_loop (&iter, "(&s&s^a&sib)", &type, &scheme, &scheme_aliases, &default_port, &host_is_inet)) + { info = g_new0 (MountableInfo, 1); info->type = g_strdup (type); if (*scheme != 0) - { - info->scheme = g_strdup (scheme); - if (find_string (uri_schemes, scheme) == -1) - g_ptr_array_add (uri_schemes, g_strdup (scheme)); - } + { + info->scheme = g_strdup (scheme); + if (find_string (uri_schemes, scheme) == -1) + g_ptr_array_add (uri_schemes, g_strdup (scheme)); + } + scheme_aliases_len = g_strv_length ((gchar **) scheme_aliases); if (scheme_aliases_len > 0) - { - info->scheme_aliases = g_new (char *, scheme_aliases_len + 1); - for (i = 0; i < scheme_aliases_len; i++) - { - info->scheme_aliases[i] = g_strdup (scheme_aliases[i]); - if (find_string (uri_schemes, scheme_aliases[i]) == -1) - g_ptr_array_add (uri_schemes, g_strdup (scheme_aliases[i])); - } - info->scheme_aliases[scheme_aliases_len] = NULL; - } - + { + info->scheme_aliases = g_new (char *, scheme_aliases_len + 1); + for (i = 0; i < scheme_aliases_len; i++) + { + info->scheme_aliases[i] = g_strdup (scheme_aliases[i]); + if (find_string (uri_schemes, scheme_aliases[i]) == -1) + g_ptr_array_add (uri_schemes, g_strdup (scheme_aliases[i])); + } + info->scheme_aliases[scheme_aliases_len] = NULL; + } + info->default_port = default_port; info->host_is_inet = host_is_inet; g_ptr_array_add (infos, info); - - g_strfreev (scheme_aliases); } - while (dbus_message_iter_next (&array_iter)); - - dbus_message_unref (reply); g_ptr_array_add (uri_schemes, NULL); g_ptr_array_add (infos, NULL); vfs->mountable_info = (MountableInfo **)g_ptr_array_free (infos, FALSE); vfs->supported_uri_schemes = (char **)g_ptr_array_free (uri_schemes, FALSE); + + g_variant_unref (iter_mountables); + g_object_unref (proxy); } @@ -814,23 +799,14 @@ _g_daemon_vfs_invalidate_dbus_id (const char *dbus_id) static GMountInfo * -handler_lookup_mount_reply (DBusMessage *reply, +handler_lookup_mount_reply (GVariant *iter, GError **error) { - DBusError derror; GMountInfo *info; - DBusMessageIter iter; GList *l; gboolean in_cache; - - if (_g_error_from_message (reply, error)) - return NULL; - - dbus_error_init (&derror); - dbus_message_iter_init (reply, &iter); - - info = g_mount_info_from_dbus (&iter); + info = g_mount_info_from_dbus (iter); if (info == NULL) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, @@ -869,34 +845,57 @@ typedef struct { GMountInfoLookupCallback callback; gpointer user_data; GMountInfo *info; + GMountSpec *spec; + char *path; } GetMountInfoData; static void -async_get_mount_info_response (DBusMessage *reply, - GError *io_error, - void *_data) +free_get_mount_info_data (GetMountInfoData *data) { - GetMountInfoData *data = _data; + if (data->info) + g_mount_info_unref (data->info); + if (data->spec) + g_mount_spec_unref (data->spec); + g_free (data->path); + g_free (data); +} + +static void +async_get_mount_info_response (GVfsDBusMountTracker *proxy, + GAsyncResult *res, + gpointer user_data) +{ + GetMountInfoData *data = user_data; GMountInfo *info; GError *error; - - if (reply == NULL) - data->callback (NULL, data->user_data, io_error); + GVariant *iter_mount; + + error = NULL; + if (! gvfs_dbus_mount_tracker_call_lookup_mount_finish (proxy, + &iter_mount, + res, + &error)) + { + g_warning ("Error from org.gtk.vfs.MountTracker.lookupMount(): %s", error->message); + data->callback (NULL, data->user_data, error); + g_error_free (error); + } else { - error = NULL; - info = handler_lookup_mount_reply (reply, &error); + info = handler_lookup_mount_reply (iter_mount, &error); data->callback (info, data->user_data, error); if (info) - g_mount_info_unref (info); + g_mount_info_unref (info); + g_variant_unref (iter_mount); + if (error) - g_error_free (error); + g_error_free (error); } - g_free (data); + free_get_mount_info_data (data); } static gboolean @@ -904,11 +903,37 @@ async_get_mount_info_cache_hit (gpointer _data) { GetMountInfoData *data = _data; data->callback (data->info, data->user_data, NULL); - g_mount_info_unref (data->info); - g_free (data); + free_get_mount_info_data (data); return FALSE; } +static void +get_mount_info_async_got_proxy_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GetMountInfoData *data = user_data; + GVfsDBusMountTracker *proxy; + GError *error = NULL; + + proxy = gvfs_dbus_mount_tracker_proxy_new_for_bus_finish (res, &error); + if (proxy == NULL) + { + g_warning ("Error creating MountTracker proxy: %s", error->message); + data->callback (NULL, data->user_data, error); + free_get_mount_info_data (data); + g_error_free (error); + return; + } + + gvfs_dbus_mount_tracker_call_lookup_mount (proxy, + g_mount_spec_to_dbus_with_path (data->spec, data->path), + NULL, + (GAsyncReadyCallback) async_get_mount_info_response, + data); + g_object_unref (proxy); +} + void _g_daemon_vfs_get_mount_info_async (GMountSpec *spec, const char *path, @@ -917,12 +942,12 @@ _g_daemon_vfs_get_mount_info_async (GMountSpec *spec, { GMountInfo *info; GetMountInfoData *data; - DBusMessage *message; - DBusMessageIter iter; data = g_new0 (GetMountInfoData, 1); data->callback = callback; data->user_data = user_data; + data->spec = g_mount_spec_ref (spec); + data->path = g_strdup (path); info = lookup_mount_info_in_cache (spec, path); @@ -933,70 +958,44 @@ _g_daemon_vfs_get_mount_info_async (GMountSpec *spec, return; } - message = - dbus_message_new_method_call (G_VFS_DBUS_DAEMON_NAME, - G_VFS_DBUS_MOUNTTRACKER_PATH, - G_VFS_DBUS_MOUNTTRACKER_INTERFACE, - G_VFS_DBUS_MOUNTTRACKER_OP_LOOKUP_MOUNT); - dbus_message_set_auto_start (message, TRUE); - - dbus_message_iter_init_append (message, &iter); - g_mount_spec_to_dbus_with_path (&iter, spec, path); - - - _g_dbus_connection_call_async (the_vfs->async_bus, message, G_VFS_DBUS_TIMEOUT_MSECS, - async_get_mount_info_response, - data); - - dbus_message_unref (message); + gvfs_dbus_mount_tracker_proxy_new_for_bus (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + G_VFS_DBUS_DAEMON_NAME, + G_VFS_DBUS_MOUNTTRACKER_PATH, + NULL, + get_mount_info_async_got_proxy_cb, + data); } - GMountInfo * _g_daemon_vfs_get_mount_info_sync (GMountSpec *spec, const char *path, + GCancellable *cancellable, GError **error) { GMountInfo *info; - DBusConnection *conn; - DBusMessage *message, *reply; - DBusMessageIter iter; - DBusError derror; - + GVfsDBusMountTracker *proxy; + GVariant *iter_mount; + info = lookup_mount_info_in_cache (spec, path); - if (info != NULL) return info; - conn = _g_dbus_connection_get_sync (NULL, error); - if (conn == NULL) - return NULL; - - message = - dbus_message_new_method_call (G_VFS_DBUS_DAEMON_NAME, - G_VFS_DBUS_MOUNTTRACKER_PATH, - G_VFS_DBUS_MOUNTTRACKER_INTERFACE, - G_VFS_DBUS_MOUNTTRACKER_OP_LOOKUP_MOUNT); - dbus_message_set_auto_start (message, TRUE); + proxy = create_mount_tracker_proxy (); + g_return_val_if_fail (proxy != NULL, NULL); - dbus_message_iter_init_append (message, &iter); - g_mount_spec_to_dbus_with_path (&iter, spec, path); - - dbus_error_init (&derror); - reply = dbus_connection_send_with_reply_and_block (conn, message, -1, &derror); - dbus_message_unref (message); - - if (!reply) + if (gvfs_dbus_mount_tracker_call_lookup_mount_sync (proxy, + g_mount_spec_to_dbus_with_path (spec, path), + &iter_mount, + cancellable, + error)) { - _g_error_from_dbus (&derror, error); - dbus_error_free (&derror); - return NULL; + info = handler_lookup_mount_reply (iter_mount, error); + g_variant_unref (iter_mount); } - - info = handler_lookup_mount_reply (reply, error); - - dbus_message_unref (reply); + g_object_unref (proxy); + return info; } @@ -1005,43 +1004,28 @@ _g_daemon_vfs_get_mount_info_by_fuse_sync (const char *fuse_path, char **mount_path) { GMountInfo *info; - DBusConnection *conn; - DBusMessage *message, *reply; - DBusMessageIter iter; - DBusError derror; int len; const char *mount_path_end; - + GVfsDBusMountTracker *proxy; + GVariant *iter_mount; + info = lookup_mount_info_by_fuse_path_in_cache (fuse_path, mount_path); if (info != NULL) return info; - conn = _g_dbus_connection_get_sync (NULL, NULL); - if (conn == NULL) - return NULL; - - message = - dbus_message_new_method_call (G_VFS_DBUS_DAEMON_NAME, - G_VFS_DBUS_MOUNTTRACKER_PATH, - G_VFS_DBUS_MOUNTTRACKER_INTERFACE, - G_VFS_DBUS_MOUNTTRACKER_OP_LOOKUP_MOUNT_BY_FUSE_PATH); - dbus_message_set_auto_start (message, TRUE); + proxy = create_mount_tracker_proxy (); + g_return_val_if_fail (proxy != NULL, NULL); - dbus_message_iter_init_append (message, &iter); - _g_dbus_message_iter_append_cstring (&iter, fuse_path); - - dbus_error_init (&derror); - reply = dbus_connection_send_with_reply_and_block (conn, message, -1, &derror); - dbus_message_unref (message); - if (!reply) + if (gvfs_dbus_mount_tracker_call_lookup_mount_by_fuse_path_sync (proxy, + fuse_path, + &iter_mount, + NULL, + NULL)) { - dbus_error_free (&derror); - return NULL; + info = handler_lookup_mount_reply (iter_mount, NULL); + g_variant_unref (iter_mount); } - - info = handler_lookup_mount_reply (reply, NULL); - dbus_message_unref (reply); if (info) { @@ -1065,7 +1049,8 @@ _g_daemon_vfs_get_mount_info_by_fuse_sync (const char *fuse_path, } } - + g_object_unref (proxy); + return info; } @@ -1173,44 +1158,6 @@ g_daemon_vfs_add_writable_namespaces (GVfs *vfs, G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED); } -/* Sends a message on the session bus and blocks for the reply, - using the thread local connection */ -gboolean -_g_daemon_vfs_send_message_sync (DBusMessage *message, - GCancellable *cancellable, - GError **error) -{ - DBusConnection *connection; - DBusError derror; - DBusMessage *reply; - - connection = _g_dbus_connection_get_sync (NULL, NULL); - if (connection == NULL) - { - g_set_error (error, G_IO_ERROR, - G_IO_ERROR_FAILED, - _("Error setting file metadata: %s"), - _("Can't contact session bus")); - return FALSE; - } - - dbus_error_init (&derror); - /* TODO: Handle cancellable */ - reply = dbus_connection_send_with_reply_and_block (connection, message, - G_VFS_DBUS_TIMEOUT_MSECS, - &derror); - if (!reply) - { - _g_error_from_dbus (&derror, error); - dbus_error_free (&derror); - return FALSE; - } - - dbus_message_unref (reply); - - return TRUE; -} - static gboolean strv_equal (char **a, char **b) { @@ -1529,7 +1476,7 @@ g_daemon_vfs_local_file_moved (GVfs *vfs, meta_lookup_cache_free (cache); } -DBusConnection * +GDBusConnection * _g_daemon_vfs_get_async_bus (void) { return the_vfs->async_bus; |