diff options
author | Alexander Larsson <alexl@redhat.com> | 2008-03-26 15:21:57 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2008-03-26 15:21:57 +0000 |
commit | 4a44c5740f71314430dbbe0163743a3909be6dc2 (patch) | |
tree | 81cafd6a404475b63945362bded5e642416fe0e8 /client/gdaemonfile.c | |
parent | 7389e23bbb91673712c2d929140748c027bb107d (diff) | |
download | gvfs-4a44c5740f71314430dbbe0163743a3909be6dc2.tar.gz |
Implement true async query_filesystem_info
2008-03-26 Alexander Larsson <alexl@redhat.com>
* client/gdaemonfile.c:
Implement true async query_filesystem_info
svn path=/trunk/; revision=1683
Diffstat (limited to 'client/gdaemonfile.c')
-rw-r--r-- | client/gdaemonfile.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/client/gdaemonfile.c b/client/gdaemonfile.c index 43d2d4cd..43e09e38 100644 --- a/client/gdaemonfile.c +++ b/client/gdaemonfile.c @@ -1513,6 +1513,75 @@ g_daemon_file_query_filesystem_info (GFile *file, return info; } +static void +query_fs_info_async_cb (DBusMessage *reply, + DBusConnection *connection, + GSimpleAsyncResult *result, + GCancellable *cancellable, + gpointer callback_data) +{ + DBusMessageIter iter; + GFileInfo *info; + GError *error; + + info = NULL; + + if (!dbus_message_iter_init (reply, &iter) || + (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_STRUCT)) + { + g_simple_async_result_set_error (result, + G_IO_ERROR, G_IO_ERROR_FAILED, + _("Invalid return value from query_info")); + g_simple_async_result_complete (result); + return; + } + + error = NULL; + info = _g_dbus_get_file_info (&iter, &error); + if (info == NULL) + { + g_simple_async_result_set_from_error (result, error); + g_error_free (error); + g_simple_async_result_complete (result); + return; + } + + g_simple_async_result_set_op_res_gpointer (result, info, g_object_unref); + g_simple_async_result_complete (result); +} + +static void +g_daemon_file_query_filesystem_info_async (GFile *file, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + do_async_path_call (file, + G_VFS_DBUS_MOUNT_OP_QUERY_FILESYSTEM_INFO, + cancellable, + callback, user_data, + query_fs_info_async_cb, NULL, NULL, + DBUS_TYPE_STRING, &attributes, + 0); +} + +static GFileInfo * +g_daemon_file_query_filesystem_info_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + GFileInfo *info; + + info = g_simple_async_result_get_op_res_gpointer (simple); + if (info) + return g_object_ref (info); + + return NULL; +} + static GMount * g_daemon_file_find_enclosing_mount (GFile *file, GCancellable *cancellable, @@ -2666,6 +2735,8 @@ g_daemon_file_file_iface_init (GFileIface *iface) iface->eject_mountable = g_daemon_file_eject_mountable; iface->eject_mountable_finish = g_daemon_file_eject_mountable_finish; iface->query_filesystem_info = g_daemon_file_query_filesystem_info; + iface->query_filesystem_info_async = g_daemon_file_query_filesystem_info_async; + iface->query_filesystem_info_finish = g_daemon_file_query_filesystem_info_finish; iface->set_display_name = g_daemon_file_set_display_name; iface->delete_file = g_daemon_file_delete; iface->trash = g_daemon_file_trash; |