summaryrefslogtreecommitdiff
path: root/client/gdaemonfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'client/gdaemonfile.c')
-rw-r--r--client/gdaemonfile.c2805
1 files changed, 0 insertions, 2805 deletions
diff --git a/client/gdaemonfile.c b/client/gdaemonfile.c
deleted file mode 100644
index 9e8eb637..00000000
--- a/client/gdaemonfile.c
+++ /dev/null
@@ -1,2805 +0,0 @@
-/* GIO - GLib Input, Output and Streaming Library
- *
- * Copyright (C) 2006-2007 Red Hat, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Author: Alexander Larsson <alexl@redhat.com>
- */
-
-#include <config.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include "gdaemonfile.h"
-#include "gvfsdaemondbus.h"
-#include "gdaemonmount.h"
-#include <gvfsdaemonprotocol.h>
-#include <gdaemonfileinputstream.h>
-#include <gdaemonfileoutputstream.h>
-#include <gdaemonfilemonitor.h>
-#include <gdaemonfileenumerator.h>
-#include <glib/gi18n-lib.h>
-#include "gdbusutils.h"
-#include "gmountoperationdbus.h"
-#include <gio/gio.h>
-
-static void g_daemon_file_file_iface_init (GFileIface *iface);
-
-struct _GDaemonFile
-{
- GObject parent_instance;
-
- GMountSpec *mount_spec;
- char *path;
-};
-
-static void g_daemon_file_read_async (GFile *file,
- int io_priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer callback_data);
-
-G_DEFINE_TYPE_WITH_CODE (GDaemonFile, g_daemon_file, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (G_TYPE_FILE,
- g_daemon_file_file_iface_init))
-
-static void
-g_daemon_file_finalize (GObject *object)
-{
- GDaemonFile *daemon_file;
-
- daemon_file = G_DAEMON_FILE (object);
-
- g_mount_spec_unref (daemon_file->mount_spec);
- g_free (daemon_file->path);
-
- if (G_OBJECT_CLASS (g_daemon_file_parent_class)->finalize)
- (*G_OBJECT_CLASS (g_daemon_file_parent_class)->finalize) (object);
-}
-
-static void
-g_daemon_file_class_init (GDaemonFileClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->finalize = g_daemon_file_finalize;
-}
-
-static void
-g_daemon_file_init (GDaemonFile *daemon_file)
-{
-}
-
-GFile *
-g_daemon_file_new (GMountSpec *mount_spec,
- const char *path)
-{
- GDaemonFile *daemon_file;
-
- daemon_file = g_object_new (G_TYPE_DAEMON_FILE, NULL);
- daemon_file->mount_spec = g_mount_spec_get_unique_for (mount_spec);
- daemon_file->path = g_mount_spec_canonicalize_path (path);
-
- return G_FILE (daemon_file);
-}
-
-static gboolean
-g_daemon_file_is_native (GFile *file)
-{
- return FALSE;
-}
-
-static gboolean
-g_daemon_file_has_uri_scheme (GFile *file,
- const char *uri_scheme)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
- const char *scheme;
-
- scheme = _g_daemon_vfs_mountspec_get_uri_scheme (daemon_file->mount_spec);
- return g_ascii_strcasecmp (scheme, uri_scheme) == 0;
-}
-
-static char *
-g_daemon_file_get_uri_scheme (GFile *file)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
- const char *scheme;
-
- scheme = _g_daemon_vfs_mountspec_get_uri_scheme (daemon_file->mount_spec);
-
- return g_strdup (scheme);
-}
-
-static char *
-g_daemon_file_get_basename (GFile *file)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
- char *last_slash;
-
- /* This code relies on the path being canonicalized */
-
- last_slash = strrchr (daemon_file->path, '/');
- /* If no slash, or only "/" fallback to full path */
- if (last_slash == NULL ||
- last_slash[1] == '\0')
- return g_strdup (daemon_file->path);
-
- return g_strdup (last_slash + 1);
-}
-
-static char *
-g_daemon_file_get_path (GFile *file)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
- GMountInfo *mount_info;
- const char *rel_path;
- char *path;
-
- /* This is a sync i/o call, which is a bit unfortunate, as
- * this is supposed to be a fast call. However, in almost all
- * cases this will be cached.
- */
-
- mount_info = _g_daemon_vfs_get_mount_info_sync (daemon_file->mount_spec,
- daemon_file->path,
- NULL);
-
- if (mount_info == NULL)
- return NULL;
-
- path = NULL;
-
- if (mount_info->fuse_mountpoint)
- {
- rel_path = daemon_file->path +
- strlen (mount_info->mount_spec->mount_prefix);
-
- path = g_build_filename (mount_info->fuse_mountpoint, rel_path, NULL);
- }
-
- g_mount_info_unref (mount_info);
-
- return path;
-}
-
-static char *
-g_daemon_file_get_uri (GFile *file)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
-
- return _g_daemon_vfs_get_uri_for_mountspec (daemon_file->mount_spec,
- daemon_file->path,
- FALSE);
-}
-
-static char *
-g_daemon_file_get_parse_name (GFile *file)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
-
- return _g_daemon_vfs_get_uri_for_mountspec (daemon_file->mount_spec,
- daemon_file->path,
- TRUE);
-}
-
-static GFile *
-new_file_for_new_path (GDaemonFile *daemon_file,
- const char *new_path)
-{
- GFile *new_file;
- GMountSpec *new_spec;
-
- new_spec = _g_daemon_vfs_get_mount_spec_for_path (daemon_file->mount_spec,
- daemon_file->path,
- new_path);
-
- new_file = g_daemon_file_new (new_spec, new_path);
- g_mount_spec_unref (new_spec);
-
- return new_file;
-}
-
-static GFile *
-g_daemon_file_get_parent (GFile *file)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
- const char *path;
- GFile *parent;
- const char *base;
- char *parent_path;
- gsize len;
-
- path = daemon_file->path;
- base = strrchr (path, '/');
- if (base == NULL ||
- *(base+1) == 0)
- return NULL;
-
- while (base > path && *base == '/')
- base--;
-
- len = (guint) 1 + base - path;
-
- parent_path = g_new (gchar, len + 1);
- g_memmove (parent_path, path, len);
- parent_path[len] = 0;
-
- parent = new_file_for_new_path (daemon_file, parent_path);
- g_free (parent_path);
-
- return parent;
-}
-
-static GFile *
-g_daemon_file_dup (GFile *file)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
-
- return g_daemon_file_new (daemon_file->mount_spec,
- daemon_file->path);
-}
-
-static guint
-g_daemon_file_hash (GFile *file)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
-
- return
- g_str_hash (daemon_file->path) ^
- GPOINTER_TO_UINT (daemon_file->mount_spec); /* We have unique mount_spec objects so hash directly on it */
-}
-
-static gboolean
-g_daemon_file_equal (GFile *file1,
- GFile *file2)
-{
- GDaemonFile *daemon_file1 = G_DAEMON_FILE (file1);
- GDaemonFile *daemon_file2 = G_DAEMON_FILE (file2);
-
- return daemon_file1->mount_spec == daemon_file2->mount_spec &&
- g_str_equal (daemon_file1->path, daemon_file2->path);
-}
-
-
-static const char *
-match_prefix (const char *path, const char *prefix)
-{
- int prefix_len;
-
- prefix_len = strlen (prefix);
- if (strncmp (path, prefix, prefix_len) != 0)
- return NULL;
-
- /* Handle the case where prefix is the root, so that
- * the IS_DIR_SEPRARATOR check below works */
- if (prefix_len > 0 &&
- prefix[prefix_len-1] == '/')
- prefix_len--;
-
-
- return path + prefix_len;
-}
-
-static gboolean
-g_daemon_file_prefix_matches (GFile *parent,
- GFile *descendant)
-{
- GDaemonFile *parent_daemon = G_DAEMON_FILE (parent);
- GDaemonFile *descendant_daemon = G_DAEMON_FILE (descendant);
- const char *remainder;
-
- if (descendant_daemon->mount_spec != parent_daemon->mount_spec)
- return FALSE;
-
- remainder = match_prefix (descendant_daemon->path, parent_daemon->path);
- if (remainder != NULL && *remainder == '/')
- return TRUE;
- return FALSE;
-}
-
-static char *
-g_daemon_file_get_relative_path (GFile *parent,
- GFile *descendant)
-{
- GDaemonFile *parent_daemon = G_DAEMON_FILE (parent);
- GDaemonFile *descendant_daemon = G_DAEMON_FILE (descendant);
- const char *remainder;
-
- if (descendant_daemon->mount_spec != parent_daemon->mount_spec)
- return NULL;
-
- remainder = match_prefix (descendant_daemon->path, parent_daemon->path);
-
- if (remainder != NULL && *remainder == '/')
- return g_strdup (remainder + 1);
- return NULL;
-}
-
-static GFile *
-g_daemon_file_resolve_relative_path (GFile *file,
- const char *relative_path)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
- char *path;
- GFile *child;
-
- if (*relative_path == '/')
- return new_file_for_new_path (daemon_file, relative_path);
-
- path = g_build_path ("/", daemon_file->path, relative_path, NULL);
- child = new_file_for_new_path (daemon_file, path);
- g_free (path);
-
- return child;
-}
-
-static DBusMessage *
-create_empty_message (GFile *file,
- const char *op,
- GMountInfo **mount_info_out,
- GError **error)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
- DBusMessage *message;
- GMountInfo *mount_info;
- const char *path;
-
- mount_info = _g_daemon_vfs_get_mount_info_sync (daemon_file->mount_spec,
- daemon_file->path,
- error);
- if (mount_info == NULL)
- return NULL;
-
- if (mount_info_out)
- *mount_info_out = g_mount_info_ref (mount_info);
-
- message =
- dbus_message_new_method_call (mount_info->dbus_id,
- mount_info->object_path,
- G_VFS_DBUS_MOUNT_INTERFACE,
- op);
-
- path = g_mount_info_resolve_path (mount_info,
- daemon_file->path);
- _g_dbus_message_append_args (message, G_DBUS_TYPE_CSTRING, &path, 0);
-
- g_mount_info_unref (mount_info);
- return message;
-}
-
-static DBusMessage *
-do_sync_path_call (GFile *file,
- const char *op,
- GMountInfo **mount_info_out,
- DBusConnection **connection_out,
- GCancellable *cancellable,
- GError **error,
- int first_arg_type,
- ...)
-{
- DBusMessage *message, *reply;
- va_list var_args;
- GError *my_error;
-
- retry:
-
- message = create_empty_message (file, op, mount_info_out, error);
- if (!message)
- return NULL;
-
- va_start (var_args, first_arg_type);
- _g_dbus_message_append_args_valist (message,
- first_arg_type,
- var_args);
- va_end (var_args);
-
-
- my_error = NULL;
- reply = _g_vfs_daemon_call_sync (message,
- connection_out,
- NULL, NULL, NULL,
- cancellable, &my_error);
- dbus_message_unref (message);
-
- if (reply == NULL)
- {
- if (g_error_matches (my_error, G_VFS_ERROR, G_VFS_ERROR_RETRY))
- {
- g_error_free (my_error);
- goto retry;
- }
- g_propagate_error (error, my_error);
- }
-
- return reply;
-}
-
-static DBusMessage *
-do_sync_2_path_call (GFile *file1,
- GFile *file2,
- const char *op,
- const char *callback_obj_path,
- DBusObjectPathMessageFunction callback,
- gpointer callback_user_data,
- DBusConnection **connection_out,
- GCancellable *cancellable,
- GError **error,
- int first_arg_type,
- ...)
-{
- GDaemonFile *daemon_file1 = G_DAEMON_FILE (file1);
- GDaemonFile *daemon_file2 = G_DAEMON_FILE (file2);
- DBusMessage *message, *reply;
- GMountInfo *mount_info1, *mount_info2;
- const char *path1, *path2;
- va_list var_args;
- GError *my_error;
-
- retry:
-
- mount_info1 = _g_daemon_vfs_get_mount_info_sync (daemon_file1->mount_spec,
- daemon_file1->path,
- error);
- if (mount_info1 == NULL)
- return NULL;
-
- mount_info2 = NULL;
- if (daemon_file2)
- {
- mount_info2 = _g_daemon_vfs_get_mount_info_sync (daemon_file2->mount_spec,
- daemon_file2->path,
- error);
- if (mount_info2 == NULL)
- {
- g_mount_info_unref (mount_info1);
- return NULL;
- }
-
- if (mount_info1 != mount_info2)
- {
- g_mount_info_unref (mount_info1);
- /* For copy this will cause the fallback code to be involved */
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
- _("Operation not supported, files on different mounts"));
- return NULL;
- }
- }
-
- message =
- dbus_message_new_method_call (mount_info1->dbus_id,
- mount_info1->object_path,
- G_VFS_DBUS_MOUNT_INTERFACE,
- op);
-
- path1 = g_mount_info_resolve_path (mount_info1,
- daemon_file1->path);
- _g_dbus_message_append_args (message, G_DBUS_TYPE_CSTRING, &path1, 0);
-
- if (daemon_file2)
- {
- path2 = g_mount_info_resolve_path (mount_info2,
- daemon_file2->path);
- _g_dbus_message_append_args (message, G_DBUS_TYPE_CSTRING, &path2, 0);
- }
-
- va_start (var_args, first_arg_type);
- _g_dbus_message_append_args_valist (message,
- first_arg_type,
- var_args);
- va_end (var_args);
-
- my_error = NULL;
- reply = _g_vfs_daemon_call_sync (message,
- connection_out,
- callback_obj_path,
- callback,
- callback_user_data,
- cancellable, &my_error);
- dbus_message_unref (message);
-
- g_mount_info_unref (mount_info1);
- if (mount_info2)
- g_mount_info_unref (mount_info2);
-
- if (reply == NULL)
- {
- if (g_error_matches (my_error, G_VFS_ERROR, G_VFS_ERROR_RETRY))
- {
- g_error_free (my_error);
- goto retry;
- }
- g_propagate_error (error, my_error);
- }
-
- return reply;
-}
-
-typedef void (*AsyncPathCallCallback) (DBusMessage *reply,
- DBusConnection *connection,
- GSimpleAsyncResult *result,
- GCancellable *cancellable,
- gpointer callback_data);
-
-
-typedef struct {
- GSimpleAsyncResult *result;
- GFile *file;
- char *op;
- GCancellable *cancellable;
- DBusMessage *args;
- AsyncPathCallCallback callback;
- gpointer callback_data;
- GDestroyNotify notify;
-} AsyncPathCall;
-
-static void
-async_path_call_free (AsyncPathCall *data)
-{
- if (data->notify)
- data->notify (data->callback_data);
-
- if (data->result)
- g_object_unref (data->result);
- g_object_unref (data->file);
- g_free (data->op);
- if (data->cancellable)
- g_object_unref (data->cancellable);
- if (data->args)
- dbus_message_unref (data->args);
- g_free (data);
-}
-
-static void
-async_path_call_done (DBusMessage *reply,
- DBusConnection *connection,
- GError *io_error,
- gpointer _data)
-{
- AsyncPathCall *data = _data;
- GSimpleAsyncResult *result;
-
- if (io_error != NULL)
- {
- g_simple_async_result_set_from_error (data->result, io_error);
- g_simple_async_result_complete (data->result);
- async_path_call_free (data);
- }
- else
- {
- result = data->result;
- g_object_weak_ref (G_OBJECT (result), (GWeakNotify)async_path_call_free, data);
- data->result = NULL;
-
- data->callback (reply, connection,
- result,
- data->cancellable,
- data->callback_data);
-
- /* Free data here, or later if callback ref:ed the result */
- g_object_unref (result);
- }
-}
-
-static void
-do_async_path_call_callback (GMountInfo *mount_info,
- gpointer _data,
- GError *error)
-{
- AsyncPathCall *data = _data;
- GDaemonFile *daemon_file = G_DAEMON_FILE (data->file);
- const char *path;
- DBusMessage *message;
- DBusMessageIter arg_source, arg_dest;
-
- if (error != NULL)
- {
- g_simple_async_result_set_from_error (data->result, error);
- g_simple_async_result_complete (data->result);
- async_path_call_free (data);
- return;
- }
-
- message =
- dbus_message_new_method_call (mount_info->dbus_id,
- mount_info->object_path,
- G_VFS_DBUS_MOUNT_INTERFACE,
- data->op);
-
- path = g_mount_info_resolve_path (mount_info, daemon_file->path);
- _g_dbus_message_append_args (message, G_DBUS_TYPE_CSTRING, &path, 0);
-
- /* Append more args from data->args */
-
- if (data->args)
- {
- dbus_message_iter_init (data->args, &arg_source);
- dbus_message_iter_init_append (message, &arg_dest);
-
- _g_dbus_message_iter_copy (&arg_dest, &arg_source);
- }
-
- _g_vfs_daemon_call_async (message,
- async_path_call_done, data,
- data->cancellable);
-
- dbus_message_unref (message);
-}
-
-static void
-do_async_path_call (GFile *file,
- const char *op,
- GCancellable *cancellable,
- GAsyncReadyCallback op_callback,
- gpointer op_callback_data,
- AsyncPathCallCallback callback,
- gpointer callback_data,
- GDestroyNotify notify,
- int first_arg_type,
- ...)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
- va_list var_args;
- AsyncPathCall *data;
-
- data = g_new0 (AsyncPathCall, 1);
-
- data->result = g_simple_async_result_new (G_OBJECT (file),
- op_callback, op_callback_data,
- NULL);
-
- data->file = g_object_ref (file);
- data->op = g_strdup (op);
- if (cancellable)
- data->cancellable = g_object_ref (cancellable);
- data->callback = callback;
- data->callback_data = callback_data;
- data->notify = notify;
-
- if (first_arg_type != 0)
- {
- data->args = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
- if (data->args == NULL)
- _g_dbus_oom ();
-
- va_start (var_args, first_arg_type);
- _g_dbus_message_append_args_valist (data->args,
- first_arg_type,
- var_args);
- va_end (var_args);
- }
-
-
- _g_daemon_vfs_get_mount_info_async (daemon_file->mount_spec,
- daemon_file->path,
- do_async_path_call_callback,
- data);
-}
-
-
-static GFileEnumerator *
-g_daemon_file_enumerate_children (GFile *file,
- const char *attributes,
- GFileQueryInfoFlags flags,
- GCancellable *cancellable,
- GError **error)
-{
- DBusMessage *reply;
- dbus_uint32_t flags_dbus;
- char *obj_path;
- GDaemonFileEnumerator *enumerator;
- DBusConnection *connection;
- char *uri;
-
- enumerator = g_daemon_file_enumerator_new (file);
- obj_path = g_daemon_file_enumerator_get_object_path (enumerator);
-
-
- uri = g_file_get_uri (file);
-
- if (attributes == NULL)
- attributes = "";
- flags_dbus = flags;
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_ENUMERATE,
- NULL, &connection,
- cancellable, error,
- DBUS_TYPE_STRING, &obj_path,
- DBUS_TYPE_STRING, &attributes,
- DBUS_TYPE_UINT32, &flags_dbus,
- DBUS_TYPE_STRING, &uri,
- 0);
- g_free (uri);
- g_free (obj_path);
-
- if (reply == NULL)
- goto error;
-
- dbus_message_unref (reply);
-
- g_daemon_file_enumerator_set_sync_connection (enumerator, connection);
-
- return G_FILE_ENUMERATOR (enumerator);
-
- error:
- if (reply)
- dbus_message_unref (reply);
- g_object_unref (enumerator);
- return NULL;
-}
-
-static GFileInfo *
-g_daemon_file_query_info (GFile *file,
- const char *attributes,
- GFileQueryInfoFlags flags,
- GCancellable *cancellable,
- GError **error)
-{
- DBusMessage *reply;
- dbus_uint32_t flags_dbus;
- DBusMessageIter iter;
- GFileInfo *info;
- char *uri;
-
- uri = g_file_get_uri (file);
-
- if (attributes == NULL)
- attributes = "";
- flags_dbus = flags;
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_QUERY_INFO,
- NULL, NULL,
- cancellable, error,
- DBUS_TYPE_STRING, &attributes,
- DBUS_TYPE_UINT32, &flags_dbus,
- DBUS_TYPE_STRING, &uri,
- 0);
-
- g_free (uri);
-
- if (reply == NULL)
- return NULL;
-
- info = NULL;
-
- if (!dbus_message_iter_init (reply, &iter) ||
- (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_STRUCT))
- {
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Invalid return value from get_info"));
- goto out;
- }
-
- info = _g_dbus_get_file_info (&iter, error);
-
- out:
- dbus_message_unref (reply);
- return info;
-}
-
-static void
-query_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_info_async (GFile *file,
- const char *attributes,
- GFileQueryInfoFlags flags,
- int io_priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- guint32 dbus_flags;
- char *uri;
-
- uri = g_file_get_uri (file);
-
- dbus_flags = flags;
- do_async_path_call (file,
- G_VFS_DBUS_MOUNT_OP_QUERY_INFO,
- cancellable,
- callback, user_data,
- query_info_async_cb, NULL, NULL,
- DBUS_TYPE_STRING, &attributes,
- DBUS_TYPE_UINT32, &dbus_flags,
- DBUS_TYPE_STRING, &uri,
- 0);
-
- g_free (uri);
-}
-
-static GFileInfo *
-g_daemon_file_query_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;
-}
-
-typedef struct {
- GSimpleAsyncResult *result;
- gboolean can_seek;
-} GetFDData;
-
-static void
-read_async_get_fd_cb (int fd,
- gpointer callback_data)
-{
- GetFDData *data = callback_data;
- GFileInputStream *stream;
-
- if (fd == -1)
- {
- g_simple_async_result_set_error (data->result,
- G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Couldn't get stream file descriptor"));
- }
- else
- {
- stream = g_daemon_file_input_stream_new (fd, data->can_seek);
- g_simple_async_result_set_op_res_gpointer (data->result, stream, g_object_unref);
- }
-
- g_simple_async_result_complete (data->result);
-
- g_object_unref (data->result);
- g_free (data);
-}
-
-static void
-read_async_cb (DBusMessage *reply,
- DBusConnection *connection,
- GSimpleAsyncResult *result,
- GCancellable *cancellable,
- gpointer callback_data)
-{
- guint32 fd_id;
- dbus_bool_t can_seek;
- GetFDData *get_fd_data;
-
- if (!dbus_message_get_args (reply, NULL,
- DBUS_TYPE_UINT32, &fd_id,
- DBUS_TYPE_BOOLEAN, &can_seek,
- DBUS_TYPE_INVALID))
- {
- g_simple_async_result_set_error (result,
- G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Invalid return value from open"));
- g_simple_async_result_complete (result);
- return;
- }
-
- get_fd_data = g_new0 (GetFDData, 1);
- get_fd_data->result = g_object_ref (result);
- get_fd_data->can_seek = can_seek;
-
- _g_dbus_connection_get_fd_async (connection, fd_id,
- read_async_get_fd_cb, get_fd_data);
-}
-
-static void
-g_daemon_file_read_async (GFile *file,
- int io_priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer callback_data)
-{
- do_async_path_call (file,
- G_VFS_DBUS_MOUNT_OP_OPEN_FOR_READ,
- cancellable,
- callback, callback_data,
- read_async_cb, NULL, NULL,
- 0);
-}
-
-static GFileInputStream *
-g_daemon_file_read_finish (GFile *file,
- GAsyncResult *res,
- GError **error)
-{
- GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
- gpointer op;
-
- op = g_simple_async_result_get_op_res_gpointer (simple);
- if (op)
- return g_object_ref (op);
-
- return NULL;
-}
-
-
-static GFileInputStream *
-g_daemon_file_read (GFile *file,
- GCancellable *cancellable,
- GError **error)
-{
- DBusConnection *connection;
- int fd;
- DBusMessage *reply;
- guint32 fd_id;
- dbus_bool_t can_seek;
-
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_OPEN_FOR_READ,
- NULL, &connection,
- cancellable, error,
- 0);
- if (reply == NULL)
- return NULL;
-
- if (!dbus_message_get_args (reply, NULL,
- DBUS_TYPE_UINT32, &fd_id,
- DBUS_TYPE_BOOLEAN, &can_seek,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (reply);
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Invalid return value from open"));
- return NULL;
- }
-
- dbus_message_unref (reply);
-
- fd = _g_dbus_connection_get_fd_sync (connection, fd_id);
- if (fd == -1)
- {
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Didn't get stream file descriptor"));
- return NULL;
- }
-
- return g_daemon_file_input_stream_new (fd, can_seek);
-}
-
-static GFileOutputStream *
-g_daemon_file_append_to (GFile *file,
- GFileCreateFlags flags,
- GCancellable *cancellable,
- GError **error)
-{
- DBusConnection *connection;
- int fd;
- DBusMessage *reply;
- guint32 fd_id;
- dbus_bool_t can_seek;
- guint16 mode;
- guint64 initial_offset;
- dbus_bool_t make_backup;
- guint32 dbus_flags;
- char *etag;
-
- mode = 1;
- etag = "";
- make_backup = FALSE;
- dbus_flags = flags;
-
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_OPEN_FOR_WRITE,
- NULL, &connection,
- cancellable, error,
- DBUS_TYPE_UINT16, &mode,
- DBUS_TYPE_STRING, &etag,
- DBUS_TYPE_BOOLEAN, &make_backup,
- DBUS_TYPE_UINT32, &dbus_flags,
- 0);
- if (reply == NULL)
- return NULL;
-
- if (!dbus_message_get_args (reply, NULL,
- DBUS_TYPE_UINT32, &fd_id,
- DBUS_TYPE_BOOLEAN, &can_seek,
- DBUS_TYPE_UINT64, &initial_offset,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (reply);
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Invalid return value from open"));
- return NULL;
- }
-
- dbus_message_unref (reply);
-
- fd = _g_dbus_connection_get_fd_sync (connection, fd_id);
- if (fd == -1)
- {
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Didn't get stream file descriptor"));
- return NULL;
- }
-
- return g_daemon_file_output_stream_new (fd, can_seek, initial_offset);
-}
-
-static GFileOutputStream *
-g_daemon_file_create (GFile *file,
- GFileCreateFlags flags,
- GCancellable *cancellable,
- GError **error)
-{
- DBusConnection *connection;
- int fd;
- DBusMessage *reply;
- guint32 fd_id;
- dbus_bool_t can_seek;
- guint16 mode;
- guint64 initial_offset;
- dbus_bool_t make_backup;
- char *etag;
- guint32 dbus_flags;
-
- mode = 0;
- etag = "";
- make_backup = FALSE;
- dbus_flags = flags;
-
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_OPEN_FOR_WRITE,
- NULL, &connection,
- cancellable, error,
- DBUS_TYPE_UINT16, &mode,
- DBUS_TYPE_STRING, &etag,
- DBUS_TYPE_BOOLEAN, &make_backup,
- DBUS_TYPE_UINT32, &dbus_flags,
- 0);
- if (reply == NULL)
- return NULL;
-
- if (!dbus_message_get_args (reply, NULL,
- DBUS_TYPE_UINT32, &fd_id,
- DBUS_TYPE_BOOLEAN, &can_seek,
- DBUS_TYPE_UINT64, &initial_offset,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (reply);
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Invalid return value from open"));
- return NULL;
- }
-
- dbus_message_unref (reply);
-
- fd = _g_dbus_connection_get_fd_sync (connection, fd_id);
- if (fd == -1)
- {
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Didn't get stream file descriptor"));
- return NULL;
- }
-
- return g_daemon_file_output_stream_new (fd, can_seek, initial_offset);
-}
-
-static GFileOutputStream *
-g_daemon_file_replace (GFile *file,
- const char *etag,
- gboolean make_backup,
- GFileCreateFlags flags,
- GCancellable *cancellable,
- GError **error)
-{
- DBusConnection *connection;
- int fd;
- DBusMessage *reply;
- guint32 fd_id;
- dbus_bool_t can_seek;
- guint16 mode;
- guint64 initial_offset;
- dbus_bool_t dbus_make_backup;
- guint32 dbus_flags;
-
- mode = 2;
- dbus_make_backup = make_backup;
- dbus_flags = flags;
-
- if (etag == NULL)
- etag = "";
-
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_OPEN_FOR_WRITE,
- NULL, &connection,
- cancellable, error,
- DBUS_TYPE_UINT16, &mode,
- DBUS_TYPE_STRING, &etag,
- DBUS_TYPE_BOOLEAN, &dbus_make_backup,
- DBUS_TYPE_UINT32, &dbus_flags,
- 0);
- if (reply == NULL)
- return NULL;
-
- if (!dbus_message_get_args (reply, NULL,
- DBUS_TYPE_UINT32, &fd_id,
- DBUS_TYPE_BOOLEAN, &can_seek,
- DBUS_TYPE_UINT64, &initial_offset,
- DBUS_TYPE_INVALID))
- {
- dbus_message_unref (reply);
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Invalid return value from open"));
- return NULL;
- }
-
- dbus_message_unref (reply);
-
- fd = _g_dbus_connection_get_fd_sync (connection, fd_id);
- if (fd == -1)
- {
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Didn't get stream file descriptor"));
- return NULL;
- }
-
- return g_daemon_file_output_stream_new (fd, can_seek, initial_offset);
-}
-
-static void
-mount_mountable_location_mounted_cb (GObject *source_object,
- GAsyncResult *res,
- gpointer user_data)
-{
- GSimpleAsyncResult *result = user_data;
- GError *error = NULL;
-
- if (!g_file_mount_enclosing_volume_finish (G_FILE (source_object), res, &error))
- {
- g_simple_async_result_set_from_error (result, error);
- g_error_free (error);
- }
-
- g_simple_async_result_complete (result);
- g_object_unref (result);
-
-}
-
-static void
-mount_mountable_async_cb (DBusMessage *reply,
- DBusConnection *connection,
- GSimpleAsyncResult *result,
- GCancellable *cancellable,
- gpointer callback_data)
-{
- GMountOperation *mount_operation = callback_data;
- GMountSpec *mount_spec;
- char *path;
- DBusMessageIter iter;
- GFile *file;
- dbus_bool_t must_mount_location, is_uri;
-
- path = NULL;
-
- dbus_message_iter_init (reply, &iter);
-
- if (!_g_dbus_message_iter_get_args (&iter, NULL,
- DBUS_TYPE_BOOLEAN, &is_uri,
- G_DBUS_TYPE_CSTRING, &path,
- DBUS_TYPE_BOOLEAN, &must_mount_location,
- 0))
- {
- g_simple_async_result_set_error (result,
- G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Invalid return value from call"));
- g_simple_async_result_complete (result);
-
- return;
- }
-
- if (is_uri)
- {
- file = g_file_new_for_uri (path);
- }
- else
- {
- mount_spec = g_mount_spec_from_dbus (&iter);
- if (mount_spec == NULL)
- {
- g_simple_async_result_set_error (result,
- G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Invalid return value from call"));
- g_simple_async_result_complete (result);
- return;
- }
-
- file = g_daemon_file_new (mount_spec, path);
- g_mount_spec_unref (mount_spec);
- }
-
- g_free (path);
- g_simple_async_result_set_op_res_gpointer (result, file, g_object_unref);
-
- if (must_mount_location)
- {
- g_file_mount_enclosing_volume (file,
- 0,
- mount_operation,
- cancellable,
- mount_mountable_location_mounted_cb,
- g_object_ref (result));
-
- }
- else
- g_simple_async_result_complete (result);
-}
-
-static void
-g_daemon_file_mount_mountable (GFile *file,
- GMountMountFlags flags,
- GMountOperation *mount_operation,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GMountSource *mount_source;
- const char *dbus_id, *obj_path;
-
- mount_source = g_mount_operation_dbus_wrap (mount_operation, _g_daemon_vfs_get_async_bus ());
-
- dbus_id = g_mount_source_get_dbus_id (mount_source);
- obj_path = g_mount_source_get_obj_path (mount_source);
-
- if (mount_operation)
- g_object_ref (mount_operation);
-
- do_async_path_call (file,
- G_VFS_DBUS_MOUNT_OP_MOUNT_MOUNTABLE,
- cancellable,
- callback, user_data,
- mount_mountable_async_cb,
- mount_operation, mount_operation ? g_object_unref : NULL,
- DBUS_TYPE_STRING, &dbus_id,
- DBUS_TYPE_OBJECT_PATH, &obj_path,
- 0);
-
- g_object_unref (mount_source);
-}
-
-static GFile *
-g_daemon_file_mount_mountable_finish (GFile *file,
- GAsyncResult *result,
- GError **error)
-{
- GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result);
- GFile *result_file;
-
- result_file = g_simple_async_result_get_op_res_gpointer (simple);
- if (result_file)
- return g_object_ref (result_file);
-
- return NULL;
-}
-
-static void
-eject_mountable_async_cb (DBusMessage *reply,
- DBusConnection *connection,
- GSimpleAsyncResult *result,
- GCancellable *cancellable,
- gpointer callback_data)
-{
- g_simple_async_result_complete (result);
-}
-
-static void
-g_daemon_file_eject_mountable (GFile *file,
- GMountUnmountFlags flags,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- guint32 dbus_flags;
-
- dbus_flags = flags;
- do_async_path_call (file,
- G_VFS_DBUS_MOUNT_OP_EJECT_MOUNTABLE,
- cancellable,
- callback, user_data,
- eject_mountable_async_cb,
- NULL, NULL,
- DBUS_TYPE_UINT32, &dbus_flags,
- 0);
-}
-
-static gboolean
-g_daemon_file_eject_mountable_finish (GFile *file,
- GAsyncResult *result,
- GError **error)
-{
- return TRUE;
-}
-
-static void
-unmount_mountable_async_cb (DBusMessage *reply,
- DBusConnection *connection,
- GSimpleAsyncResult *result,
- GCancellable *cancellable,
- gpointer callback_data)
-{
- g_simple_async_result_complete (result);
-}
-
-static void
-g_daemon_file_unmount_mountable (GFile *file,
- GMountUnmountFlags flags,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- guint32 dbus_flags;
-
- dbus_flags = flags;
- do_async_path_call (file,
- G_VFS_DBUS_MOUNT_OP_UNMOUNT_MOUNTABLE,
- cancellable,
- callback, user_data,
- unmount_mountable_async_cb,
- NULL, NULL,
- DBUS_TYPE_UINT32, &dbus_flags,
- 0);
-}
-
-static gboolean
-g_daemon_file_unmount_mountable_finish (GFile *file,
- GAsyncResult *result,
- GError **error)
-{
- return TRUE;
-}
-
-
-typedef struct {
- GFile *file;
- GMountOperation *mount_operation;
- GAsyncReadyCallback callback;
- gpointer user_data;
-} MountData;
-
-static void g_daemon_file_mount_enclosing_volume (GFile *location,
- GMountMountFlags flags,
- GMountOperation *mount_operation,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-
-static void
-mount_reply (DBusMessage *reply,
- GError *error,
- gpointer user_data)
-{
- MountData *data = user_data;
- GSimpleAsyncResult *res;
-
- if (reply == NULL)
- {
- res = g_simple_async_result_new_from_error (G_OBJECT (data->file),
- data->callback,
- data->user_data,
- error);
- }
- else
- {
- res = g_simple_async_result_new (G_OBJECT (data->file),
- data->callback,
- data->user_data,
- g_daemon_file_mount_enclosing_volume);
- }
-
- g_simple_async_result_complete (res);
-
- g_object_unref (data->file);
- if (data->mount_operation)
- g_object_unref (data->mount_operation);
- g_free (data);
-}
-
-static void
-g_daemon_file_mount_enclosing_volume (GFile *location,
- GMountMountFlags flags,
- GMountOperation *mount_operation,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GDaemonFile *daemon_file;
- DBusMessage *message;
- GMountSpec *spec;
- GMountSource *mount_source;
- DBusMessageIter iter;
- MountData *data;
-
- daemon_file = G_DAEMON_FILE (location);
-
- 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_MOUNT_LOCATION);
-
- spec = g_mount_spec_copy (daemon_file->mount_spec);
- g_mount_spec_set_mount_prefix (spec, daemon_file->path);
- dbus_message_iter_init_append (message, &iter);
- g_mount_spec_to_dbus (&iter, spec);
- g_mount_spec_unref (spec);
-
- mount_source = g_mount_operation_dbus_wrap (mount_operation, _g_daemon_vfs_get_async_bus ());
- g_mount_source_to_dbus (mount_source, message);
- g_object_unref (mount_source);
-
- data = g_new0 (MountData, 1);
- data->callback = callback;
- data->user_data = user_data;
- data->file = g_object_ref (location);
- if (mount_operation)
- data->mount_operation = g_object_ref (mount_operation);
-
- /* TODO: Ignoring cancellable here */
- _g_dbus_connection_call_async (_g_daemon_vfs_get_async_bus (),
- message,
- G_VFS_DBUS_MOUNT_TIMEOUT_MSECS,
- mount_reply, data);
-
- dbus_message_unref (message);
-}
-
-static gboolean
-g_daemon_file_mount_enclosing_volume_finish (GFile *location,
- GAsyncResult *result,
- GError **error)
-{
- /* Errors handled in generic code */
- return TRUE;
-}
-
-static GFileInfo *
-g_daemon_file_query_filesystem_info (GFile *file,
- const char *attributes,
- GCancellable *cancellable,
- GError **error)
-{
- DBusMessage *reply;
- DBusMessageIter iter;
- GFileInfo *info;
-
- if (attributes == NULL)
- attributes = "";
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_QUERY_FILESYSTEM_INFO,
- NULL, NULL,
- cancellable, error,
- DBUS_TYPE_STRING, &attributes,
- 0);
- if (reply == NULL)
- return NULL;
-
- info = NULL;
-
- if (!dbus_message_iter_init (reply, &iter) ||
- (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_STRUCT))
- {
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Invalid return value from get_filesystem_info"));
- goto out;
- }
-
- info = _g_dbus_get_file_info (&iter, error);
-
- out:
- dbus_message_unref (reply);
- 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,
- GError **error)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
- GMountInfo *mount_info;
- GDaemonMount *mount;
-
- mount_info = _g_daemon_vfs_get_mount_info_sync (daemon_file->mount_spec,
- daemon_file->path,
- error);
- if (mount_info == NULL)
- return NULL;
-
- if (mount_info->user_visible)
- {
- /* if we have a daemon volume monitor then return one of it's mounts */
- mount = g_daemon_volume_monitor_find_mount_by_mount_info (mount_info);
- if (mount == NULL)
- {
- mount = g_daemon_mount_new (mount_info, NULL);
- }
- g_mount_info_unref (mount_info);
-
- if (mount)
- return G_MOUNT (mount);
- }
-
- g_set_error_literal (error, G_IO_ERROR,
- G_IO_ERROR_NOT_FOUND,
- /* translators: this is an error message when there is no user visible "mount" object
- corresponding to a particular path/uri */
- _("Could not find enclosing mount"));
- return NULL;
-}
-
-static GFile *
-g_daemon_file_get_child_for_display_name (GFile *file,
- const char *display_name,
- GError **error)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
- GMountInfo *mount_info;
- char *basename;
- GFile *child;
-
- mount_info = _g_daemon_vfs_get_mount_info_sync (daemon_file->mount_spec,
- daemon_file->path,
- NULL);
-
-
- if (mount_info && mount_info->prefered_filename_encoding)
- {
- basename = g_convert (display_name, -1,
- mount_info->prefered_filename_encoding,
- "UTF-8",
- NULL, NULL,
- NULL);
- if (basename == NULL)
- {
- g_set_error (error, G_IO_ERROR,
- G_IO_ERROR_INVALID_FILENAME,
- _("Invalid filename %s"), display_name);
- return NULL;
- }
-
- child = g_file_get_child (file, basename);
- g_free (basename);
- }
- else
- child = g_file_get_child (file, display_name);
-
- return child;
-}
-
-static GFile *
-g_daemon_file_set_display_name (GFile *file,
- const char *display_name,
- GCancellable *cancellable,
- GError **error)
-{
- GDaemonFile *daemon_file;
- DBusMessage *reply;
- DBusMessageIter iter;
- char *new_path;
-
- daemon_file = G_DAEMON_FILE (file);
-
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_SET_DISPLAY_NAME,
- NULL, NULL,
- cancellable, error,
- DBUS_TYPE_STRING, &display_name,
- 0);
- if (reply == NULL)
- return NULL;
-
-
- if (!dbus_message_iter_init (reply, &iter) ||
- !_g_dbus_message_iter_get_args (&iter, NULL,
- G_DBUS_TYPE_CSTRING, &new_path,
- 0))
- {
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Invalid return value from query_filesystem_info"));
- goto out;
- }
-
- file = new_file_for_new_path (daemon_file, new_path);
- g_free (new_path);
-
- out:
- dbus_message_unref (reply);
- return file;
-}
-
-static gboolean
-g_daemon_file_delete (GFile *file,
- GCancellable *cancellable,
- GError **error)
-{
- DBusMessage *reply;
-
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_DELETE,
- NULL, NULL,
- cancellable, error,
- 0);
- if (reply == NULL)
- return FALSE;
-
- dbus_message_unref (reply);
- return TRUE;
-}
-
-static gboolean
-g_daemon_file_trash (GFile *file,
- GCancellable *cancellable,
- GError **error)
-{
- DBusMessage *reply;
-
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_TRASH,
- NULL, NULL,
- cancellable, error,
- 0);
- if (reply == NULL)
- return FALSE;
-
- dbus_message_unref (reply);
- return TRUE;
-}
-
-static gboolean
-g_daemon_file_make_directory (GFile *file,
- GCancellable *cancellable,
- GError **error)
-{
- DBusMessage *reply;
-
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_MAKE_DIRECTORY,
- NULL, NULL,
- cancellable, error,
- 0);
- if (reply == NULL)
- return FALSE;
-
- dbus_message_unref (reply);
- return TRUE;
-}
-
-static gboolean
-g_daemon_file_make_symbolic_link (GFile *file,
- const char *symlink_value,
- GCancellable *cancellable,
- GError **error)
-{
- DBusMessage *reply;
-
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_MAKE_SYMBOLIC_LINK,
- NULL, NULL,
- cancellable, error,
- G_DBUS_TYPE_CSTRING, &symlink_value,
- 0);
- if (reply == NULL)
- return FALSE;
-
- dbus_message_unref (reply);
- return TRUE;
-}
-
-static GFileAttributeInfoList *
-g_daemon_file_query_settable_attributes (GFile *file,
- GCancellable *cancellable,
- GError **error)
-{
- DBusMessage *reply;
- GFileAttributeInfoList *list;
- DBusMessageIter iter;
-
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_QUERY_SETTABLE_ATTRIBUTES,
- NULL, NULL,
- cancellable, error,
- 0);
- if (reply == NULL)
- return NULL;
-
- dbus_message_iter_init (reply, &iter);
- list = _g_dbus_get_attribute_info_list (&iter, error);
-
- dbus_message_unref (reply);
-
- return list;
-}
-
-static GFileAttributeInfoList *
-g_daemon_file_query_writable_namespaces (GFile *file,
- GCancellable *cancellable,
- GError **error)
-{
- DBusMessage *reply;
- GFileAttributeInfoList *list;
- DBusMessageIter iter;
-
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_QUERY_WRITABLE_NAMESPACES,
- NULL, NULL,
- cancellable, error,
- 0);
- if (reply == NULL)
- return NULL;
-
- dbus_message_iter_init (reply, &iter);
- list = _g_dbus_get_attribute_info_list (&iter, error);
-
- dbus_message_unref (reply);
-
- return list;
-
-}
-
-static gboolean
-g_daemon_file_set_attribute (GFile *file,
- const char *attribute,
- GFileAttributeType type,
- gpointer value_p,
- GFileQueryInfoFlags flags,
- GCancellable *cancellable,
- GError **error)
-{
- DBusMessage *message, *reply;
- DBusMessageIter iter;
- dbus_uint32_t flags_dbus;
- GError *my_error;
-
- retry:
-
- message = create_empty_message (file, G_VFS_DBUS_MOUNT_OP_SET_ATTRIBUTE, NULL, error);
- if (!message)
- return FALSE;
-
- dbus_message_iter_init_append (message, &iter);
-
- flags_dbus = flags;
- dbus_message_iter_append_basic (&iter,
- DBUS_TYPE_UINT32,
- &flags_dbus);
-
- _g_dbus_append_file_attribute (&iter, attribute, type, value_p);
-
- my_error = NULL;
- reply = _g_vfs_daemon_call_sync (message,
- NULL,
- NULL, NULL, NULL,
- cancellable, &my_error);
-
- dbus_message_unref (message);
-
- if (reply == NULL)
- {
- if (g_error_matches (my_error, G_VFS_ERROR, G_VFS_ERROR_RETRY))
- {
- g_error_free (my_error);
- goto retry;
- }
- g_propagate_error (error, my_error);
- return FALSE;
- }
-
- dbus_message_unref (reply);
- return TRUE;
-}
-
-struct ProgressCallbackData {
- GFileProgressCallback progress_callback;
- gpointer progress_callback_data;
-};
-
-static DBusHandlerResult
-progress_callback_message (DBusConnection *connection,
- DBusMessage *message,
- void *user_data)
-{
- struct ProgressCallbackData *data = user_data;
- dbus_uint64_t current_dbus, total_dbus;
-
- if (dbus_message_is_method_call (message,
- G_VFS_DBUS_PROGRESS_INTERFACE,
- G_VFS_DBUS_PROGRESS_OP_PROGRESS))
- {
- if (dbus_message_get_args (message, NULL,
- DBUS_TYPE_UINT64, &current_dbus,
- DBUS_TYPE_UINT64, &total_dbus,
- 0))
- data->progress_callback (current_dbus, total_dbus, data->progress_callback_data);
- }
- else
- g_warning ("Unknown progress callback message type\n");
-
- /* TODO: demarshal args and call reall callback */
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static gboolean
-file_transfer (GFile *source,
- GFile *destination,
- GFileCopyFlags flags,
- gboolean remove_source,
- GCancellable *cancellable,
- GFileProgressCallback progress_callback,
- gpointer progress_callback_data,
- GError **error)
-{
- DBusMessage *reply;
- char *obj_path, *dbus_obj_path;
- dbus_uint32_t flags_dbus;
- dbus_bool_t dbus_remove_source;
- struct ProgressCallbackData data;
- char *local_path = NULL;
- gboolean source_is_daemon;
- gboolean dest_is_daemon;
- gboolean native_transfer;
-
- native_transfer = FALSE;
- source_is_daemon = G_IS_DAEMON_FILE (source);
- dest_is_daemon = G_IS_DAEMON_FILE (destination);
-
- if (source_is_daemon && dest_is_daemon)
- native_transfer = TRUE;
- else if (dest_is_daemon && !source_is_daemon)
- local_path = g_file_get_path (source);
- else if (source_is_daemon && !dest_is_daemon)
- local_path = g_file_get_path (destination);
- else
- {
- /* Fall back to default copy/move */
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
- "Operation not supported");
- return FALSE;
- }
-
- if (!native_transfer && local_path == NULL)
- {
- /* This will cause the fallback code to be involved */
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
- _("Operation not supported, files on different mounts"));
- return FALSE;
-
- }
-
- if (progress_callback)
- {
- obj_path = g_strdup_printf ("/org/gtk/vfs/callback/%p", &obj_path);
- dbus_obj_path = obj_path;
- }
- else
- {
- obj_path = NULL;
- /* Can't pass NULL obj path as arg */
- dbus_obj_path = "/org/gtk/vfs/void";
- }
-
- data.progress_callback = progress_callback;
- data.progress_callback_data = progress_callback_data;
-
- flags_dbus = flags;
- dbus_remove_source = remove_source;
-
- if (native_transfer == TRUE)
- {
- const char *method_string;
-
- if (remove_source == FALSE)
- method_string = G_VFS_DBUS_MOUNT_OP_COPY;
- else
- method_string = G_VFS_DBUS_MOUNT_OP_MOVE;
-
- reply = do_sync_2_path_call (source, destination,
- method_string,
- obj_path, progress_callback_message, &data,
- NULL, cancellable, error,
- DBUS_TYPE_UINT32, &flags_dbus,
- DBUS_TYPE_OBJECT_PATH, &dbus_obj_path,
- 0);
- }
- else if (dest_is_daemon == TRUE)
- {
- reply = do_sync_2_path_call (destination, NULL,
- G_VFS_DBUS_MOUNT_OP_PUSH,
- obj_path, progress_callback_message, &data,
- NULL, cancellable, error,
- G_DBUS_TYPE_CSTRING, &local_path,
- DBUS_TYPE_UINT32, &flags_dbus,
- DBUS_TYPE_OBJECT_PATH, &dbus_obj_path,
- DBUS_TYPE_BOOLEAN, &dbus_remove_source,
- 0);
- }
- else
- {
- reply = do_sync_2_path_call (source, NULL,
- G_VFS_DBUS_MOUNT_OP_PULL,
- obj_path, progress_callback_message, &data,
- NULL, cancellable, error,
- G_DBUS_TYPE_CSTRING, &local_path,
- DBUS_TYPE_UINT32, &flags_dbus,
- DBUS_TYPE_OBJECT_PATH, &dbus_obj_path,
- DBUS_TYPE_BOOLEAN, &dbus_remove_source,
- 0);
-
- }
-
- g_free (local_path);
- g_free (obj_path);
-
- if (reply == NULL)
- return FALSE;
-
- dbus_message_unref (reply);
- return TRUE;
-}
-
-static gboolean
-g_daemon_file_copy (GFile *source,
- GFile *destination,
- GFileCopyFlags flags,
- GCancellable *cancellable,
- GFileProgressCallback progress_callback,
- gpointer progress_callback_data,
- GError **error)
-{
- gboolean result;
-
- result = file_transfer (source,
- destination,
- flags,
- FALSE,
- cancellable,
- progress_callback,
- progress_callback_data,
- error);
-
- return result;
-}
-
-static gboolean
-g_daemon_file_move (GFile *source,
- GFile *destination,
- GFileCopyFlags flags,
- GCancellable *cancellable,
- GFileProgressCallback progress_callback,
- gpointer progress_callback_data,
- GError **error)
-{
- gboolean result;
-
- result = file_transfer (source,
- destination,
- flags,
- TRUE,
- cancellable,
- progress_callback,
- progress_callback_data,
- error);
-
- return result;
-}
-
-static GFileMonitor*
-g_daemon_file_monitor_dir (GFile* file,
- GFileMonitorFlags flags,
- GCancellable *cancellable,
- GError **error)
-{
- GFileMonitor *monitor;
- char *obj_path;
- dbus_uint32_t flags_dbus;
- GMountInfo *mount_info;
- DBusMessage *reply;
-
- flags_dbus = flags;
-
- mount_info = NULL;
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_CREATE_DIR_MONITOR,
- &mount_info, NULL,
- cancellable, error,
- DBUS_TYPE_UINT32, &flags_dbus,
- 0);
-
- if (reply == NULL)
- {
- if (mount_info)
- g_mount_info_unref (mount_info);
- return NULL;
- }
-
- if (!dbus_message_get_args (reply, NULL,
- DBUS_TYPE_OBJECT_PATH, &obj_path,
- DBUS_TYPE_INVALID))
- {
- g_mount_info_unref (mount_info);
- dbus_message_unref (reply);
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Invalid return value from monitor_dir"));
- return NULL;
- }
-
- monitor = g_daemon_file_monitor_new (mount_info->dbus_id,
- obj_path);
-
- g_mount_info_unref (mount_info);
- dbus_message_unref (reply);
-
- return monitor;
-}
-
-static GFileMonitor*
-g_daemon_file_monitor_file (GFile* file,
- GFileMonitorFlags flags,
- GCancellable *cancellable,
- GError **error)
-{
- GFileMonitor *monitor;
- char *obj_path;
- dbus_uint32_t flags_dbus;
- GMountInfo *mount_info;
- DBusMessage *reply;
-
- flags_dbus = flags;
-
- mount_info = NULL;
- reply = do_sync_path_call (file,
- G_VFS_DBUS_MOUNT_OP_CREATE_FILE_MONITOR,
- &mount_info, NULL,
- cancellable, error,
- DBUS_TYPE_UINT32, &flags_dbus,
- 0);
-
- if (reply == NULL)
- {
- if (mount_info)
- g_mount_info_unref (mount_info);
- return NULL;
- }
-
- if (!dbus_message_get_args (reply, NULL,
- DBUS_TYPE_OBJECT_PATH, &obj_path,
- DBUS_TYPE_INVALID))
- {
- g_mount_info_unref (mount_info);
- dbus_message_unref (reply);
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Invalid return value from monitor_file"));
- return NULL;
- }
-
- monitor = g_daemon_file_monitor_new (mount_info->dbus_id,
- obj_path);
-
- g_mount_info_unref (mount_info);
- dbus_message_unref (reply);
-
- return monitor;
-}
-
-typedef struct
-{
- GSimpleAsyncResult *result;
- dbus_bool_t can_seek;
- guint64 initial_offset;
-}
-StreamOpenParams;
-
-static void
-stream_open_cb (gint fd, StreamOpenParams *params)
-{
- GFileOutputStream *output_stream;
-
- if (fd == -1)
- {
- g_simple_async_result_set_error (params->result, G_IO_ERROR, G_IO_ERROR_FAILED,
- "%s", _("Didn't get stream file descriptor"));
- goto out;
- }
-
- output_stream = g_daemon_file_output_stream_new (fd, params->can_seek, params->initial_offset);
- g_simple_async_result_set_op_res_gpointer (params->result, output_stream, g_object_unref);
-
-out:
- g_simple_async_result_complete (params->result);
- g_object_unref (params->result);
- g_slice_free (StreamOpenParams, params);
-}
-
-static void
-append_to_async_cb (DBusMessage *reply,
- DBusConnection *connection,
- GSimpleAsyncResult *result,
- GCancellable *cancellable,
- gpointer callback_data)
-{
- guint32 fd_id;
- StreamOpenParams *open_params;
-
- open_params = g_slice_new0 (StreamOpenParams);
-
- if (!dbus_message_get_args (reply, NULL,
- DBUS_TYPE_UINT32, &fd_id,
- DBUS_TYPE_BOOLEAN, &open_params->can_seek,
- DBUS_TYPE_UINT64, &open_params->initial_offset,
- DBUS_TYPE_INVALID))
- {
- g_simple_async_result_set_error (result, G_IO_ERROR, G_IO_ERROR_FAILED,
- "%s", _("Invalid return value from open"));
- goto failure;
- }
-
- open_params->result = g_object_ref (result);
- _g_dbus_connection_get_fd_async (connection, fd_id,
- (GetFdAsyncCallback) stream_open_cb, open_params);
- return;
-
-failure:
- g_slice_free (StreamOpenParams, open_params);
- g_simple_async_result_complete (result);
-}
-
-static void
-g_daemon_file_append_to_async (GFile *file,
- GFileCreateFlags flags,
- int io_priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- guint16 mode;
- dbus_bool_t make_backup;
- guint32 dbus_flags;
- char *etag;
-
- mode = 1;
- etag = "";
- make_backup = FALSE;
- dbus_flags = flags;
-
- do_async_path_call (file,
- G_VFS_DBUS_MOUNT_OP_OPEN_FOR_WRITE,
- cancellable,
- callback, user_data,
- append_to_async_cb, NULL, NULL,
- DBUS_TYPE_UINT16, &mode,
- DBUS_TYPE_STRING, &etag,
- DBUS_TYPE_BOOLEAN, &make_backup,
- DBUS_TYPE_UINT32, &dbus_flags,
- 0);
-}
-
-static GFileOutputStream *
-g_daemon_file_append_to_finish (GFile *file,
- GAsyncResult *res,
- GError **error)
-{
- GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
- GFileOutputStream *output_stream;
-
- output_stream = g_simple_async_result_get_op_res_gpointer (simple);
- if (output_stream)
- return g_object_ref (output_stream);
-
- return NULL;
-}
-
-static void
-create_async_cb (DBusMessage *reply,
- DBusConnection *connection,
- GSimpleAsyncResult *result,
- GCancellable *cancellable,
- gpointer callback_data)
-{
- guint32 fd_id;
- StreamOpenParams *open_params;
-
- open_params = g_slice_new0 (StreamOpenParams);
-
- if (!dbus_message_get_args (reply, NULL,
- DBUS_TYPE_UINT32, &fd_id,
- DBUS_TYPE_BOOLEAN, &open_params->can_seek,
- DBUS_TYPE_UINT64, &open_params->initial_offset,
- DBUS_TYPE_INVALID))
- {
- g_simple_async_result_set_error (result, G_IO_ERROR, G_IO_ERROR_FAILED,
- "%s", _("Invalid return value from open"));
- goto failure;
- }
-
- open_params->result = g_object_ref (result);
- _g_dbus_connection_get_fd_async (connection, fd_id,
- (GetFdAsyncCallback) stream_open_cb, open_params);
- return;
-
-failure:
- g_slice_free (StreamOpenParams, open_params);
- g_simple_async_result_complete (result);
-}
-
-static void
-g_daemon_file_create_async (GFile *file,
- GFileCreateFlags flags,
- int io_priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- guint16 mode;
- dbus_bool_t make_backup;
- char *etag;
- guint32 dbus_flags;
-
- mode = 0;
- etag = "";
- make_backup = FALSE;
- dbus_flags = flags;
-
- do_async_path_call (file,
- G_VFS_DBUS_MOUNT_OP_OPEN_FOR_WRITE,
- cancellable,
- callback, user_data,
- create_async_cb, NULL, NULL,
- DBUS_TYPE_UINT16, &mode,
- DBUS_TYPE_STRING, &etag,
- DBUS_TYPE_BOOLEAN, &make_backup,
- DBUS_TYPE_UINT32, &dbus_flags,
- 0);
-}
-
-static GFileOutputStream *
-g_daemon_file_create_finish (GFile *file,
- GAsyncResult *res,
- GError **error)
-{
- GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
- GFileOutputStream *output_stream;
-
- output_stream = g_simple_async_result_get_op_res_gpointer (simple);
- if (output_stream)
- return g_object_ref (output_stream);
-
- return NULL;
-}
-
-static void
-enumerate_children_async_cb (DBusMessage *reply,
- DBusConnection *connection,
- GSimpleAsyncResult *result,
- GCancellable *cancellable,
- gpointer callback_data)
-{
- GDaemonFileEnumerator *enumerator = callback_data;
-
- if (reply == NULL || connection == NULL)
- {
- g_simple_async_result_set_error (result, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Invalid return value from enumerate_children");
- goto out;
- }
-
- g_object_ref (enumerator);
-
- g_simple_async_result_set_op_res_gpointer (result, enumerator, g_object_unref);
-
-out:
- g_simple_async_result_complete (result);
-}
-
-static void
-g_daemon_file_enumerate_children_async (GFile *file,
- const char *attributes,
- GFileQueryInfoFlags flags,
- int io_priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- dbus_uint32_t flags_dbus;
- char *obj_path;
- GDaemonFileEnumerator *enumerator;
- char *uri;
-
- enumerator = g_daemon_file_enumerator_new (file);
- obj_path = g_daemon_file_enumerator_get_object_path (enumerator);
-
- uri = g_file_get_uri (file);
-
- if (attributes == NULL)
- attributes = "";
- flags_dbus = flags;
- do_async_path_call (file,
- G_VFS_DBUS_MOUNT_OP_ENUMERATE,
- cancellable,
- callback, user_data,
- enumerate_children_async_cb, enumerator, g_object_unref,
- DBUS_TYPE_STRING, &obj_path,
- DBUS_TYPE_STRING, &attributes,
- DBUS_TYPE_UINT32, &flags_dbus,
- DBUS_TYPE_STRING, &uri,
- 0);
- g_free (uri);
- g_free (obj_path);
-}
-
-static GFileEnumerator *
-g_daemon_file_enumerate_children_finish (GFile *file,
- GAsyncResult *res,
- GError **error)
-{
- GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
- GDaemonFileEnumerator *enumerator;
-
- enumerator = g_simple_async_result_get_op_res_gpointer (simple);
- if (enumerator)
- return g_object_ref (enumerator);
-
- return NULL;
-}
-
-typedef struct
-{
- GFile *file;
- GSimpleAsyncResult *result;
- GCancellable *cancellable;
-}
-FindEnclosingMountData;
-
-static void
-find_enclosing_mount_cb (GMountInfo *mount_info,
- gpointer user_data,
- GError *error)
-{
- FindEnclosingMountData *data = user_data;
- GError *my_error = NULL;
-
- if (data->cancellable && g_cancellable_set_error_if_cancelled (data->cancellable, &my_error))
- {
- g_simple_async_result_set_from_error (data->result, my_error);
- goto out;
- }
-
- if (error)
- {
- g_simple_async_result_set_from_error (data->result, error);
- goto out;
- }
-
- if (!mount_info)
- {
- g_simple_async_result_set_error (data->result, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Internal error: \"%s\"",
- "No error but no mount info from g_daemon_vfs_get_mount_info_async");
- goto out;
- }
-
- if (mount_info->user_visible)
- {
- GDaemonMount *mount;
-
- /* if we have a daemon volume monitor then return one of it's mounts */
- mount = g_daemon_volume_monitor_find_mount_by_mount_info (mount_info);
- if (mount == NULL)
- mount = g_daemon_mount_new (mount_info, NULL);
-
- if (mount)
- g_simple_async_result_set_op_res_gpointer (data->result, mount, g_object_unref);
- else
- g_simple_async_result_set_error (data->result, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Internal error: \"%s\"",
- "Mount info did not yield a mount");
- }
-
-out:
- g_simple_async_result_complete (data->result);
-
- if (my_error)
- g_error_free (my_error);
- if (data->cancellable)
- g_object_unref (data->cancellable);
- g_object_unref (data->file);
- g_object_unref (data->result);
- g_free (data);
-}
-
-static void
-g_daemon_file_find_enclosing_mount_async (GFile *file,
- int io_priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GDaemonFile *daemon_file = G_DAEMON_FILE (file);
- FindEnclosingMountData *data;
-
- data = g_new0 (FindEnclosingMountData, 1);
-
- data->result = g_simple_async_result_new (G_OBJECT (file),
- callback, user_data,
- NULL);
- data->file = g_object_ref (file);
-
- if (cancellable)
- data->cancellable = g_object_ref (cancellable);
-
- _g_daemon_vfs_get_mount_info_async (daemon_file->mount_spec,
- daemon_file->path,
- find_enclosing_mount_cb,
- data);
-}
-
-static GMount *
-g_daemon_file_find_enclosing_mount_finish (GFile *file,
- GAsyncResult *res,
- GError **error)
-{
- GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
- GMount *mount;
-
- mount = g_simple_async_result_get_op_res_gpointer (simple);
- if (mount)
- return g_object_ref (mount);
-
- return NULL;
-}
-
-static void
-replace_async_cb (DBusMessage *reply,
- DBusConnection *connection,
- GSimpleAsyncResult *result,
- GCancellable *cancellable,
- gpointer callback_data)
-{
- guint32 fd_id;
- StreamOpenParams *open_params;
-
- open_params = g_slice_new0 (StreamOpenParams);
-
- if (!dbus_message_get_args (reply, NULL,
- DBUS_TYPE_UINT32, &fd_id,
- DBUS_TYPE_BOOLEAN, &open_params->can_seek,
- DBUS_TYPE_UINT64, &open_params->initial_offset,
- DBUS_TYPE_INVALID))
- {
- g_simple_async_result_set_error (result, G_IO_ERROR, G_IO_ERROR_FAILED,
- "%s", _("Invalid return value from open"));
- goto failure;
- }
-
- open_params->result = g_object_ref (result);
- _g_dbus_connection_get_fd_async (connection, fd_id,
- (GetFdAsyncCallback) stream_open_cb, open_params);
- return;
-
-failure:
- g_slice_free (StreamOpenParams, open_params);
- g_simple_async_result_complete (result);
-}
-
-static void
-g_daemon_file_replace_async (GFile *file,
- const char *etag,
- gboolean make_backup,
- GFileCreateFlags flags,
- int io_priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- dbus_bool_t dbus_make_backup = make_backup;
- guint32 dbus_flags = flags;
- guint16 mode = 2;
-
- if (etag == NULL)
- etag = "";
-
- do_async_path_call (file,
- G_VFS_DBUS_MOUNT_OP_OPEN_FOR_WRITE,
- cancellable,
- callback, user_data,
- replace_async_cb, NULL, NULL,
- DBUS_TYPE_UINT16, &mode,
- DBUS_TYPE_STRING, &etag,
- DBUS_TYPE_BOOLEAN, &dbus_make_backup,
- DBUS_TYPE_UINT32, &dbus_flags,
- 0);
-}
-
-static GFileOutputStream *
-g_daemon_file_replace_finish (GFile *file,
- GAsyncResult *res,
- GError **error)
-{
- GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
- GFileOutputStream *output_stream;
-
- output_stream = g_simple_async_result_get_op_res_gpointer (simple);
- if (output_stream)
- return g_object_ref (output_stream);
-
- return NULL;
-}
-
-static void
-set_display_name_async_cb (DBusMessage *reply,
- DBusConnection *connection,
- GSimpleAsyncResult *result,
- GCancellable *cancellable,
- gpointer callback_data)
-{
- GDaemonFile *daemon_file = callback_data;
- GFile *file;
- DBusMessageIter iter;
- gchar *new_path;
-
- if (!dbus_message_iter_init (reply, &iter) ||
- !_g_dbus_message_iter_get_args (&iter, NULL,
- G_DBUS_TYPE_CSTRING, &new_path,
- 0))
- {
- g_simple_async_result_set_error (result, G_IO_ERROR, G_IO_ERROR_FAILED,
- "%s", "Invalid return value from set_display_name");
- goto out;
- }
-
- file = new_file_for_new_path (daemon_file, new_path);
- g_free (new_path);
-
- g_simple_async_result_set_op_res_gpointer (result, file, g_object_unref);
-
-out:
- g_simple_async_result_complete (result);
-}
-
-static void
-g_daemon_file_set_display_name_async (GFile *file,
- const char *display_name,
- int io_priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- g_object_ref (file);
-
- do_async_path_call (file,
- G_VFS_DBUS_MOUNT_OP_SET_DISPLAY_NAME,
- cancellable,
- callback, user_data,
- set_display_name_async_cb, file, g_object_unref,
- DBUS_TYPE_STRING, &display_name,
- 0);
-}
-
-static GFile *
-g_daemon_file_set_display_name_finish (GFile *file,
- GAsyncResult *res,
- GError **error)
-{
- GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
- GFile *new_file;
-
- new_file = g_simple_async_result_get_op_res_gpointer (simple);
- return new_file;
-}
-
-#if 0
-
-static void
-g_daemon_file_set_attributes_async (GFile *file,
- GFileInfo *info,
- GFileQueryInfoFlags flags,
- int io_priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- /* TODO */
-}
-
-static gboolean
-g_daemon_file_set_attributes_finish (GFile *file,
- GAsyncResult *result,
- GFileInfo **info,
- GError **error)
-{
- /* TODO */
-}
-
-#endif
-
-static void
-g_daemon_file_file_iface_init (GFileIface *iface)
-{
- iface->dup = g_daemon_file_dup;
- iface->hash = g_daemon_file_hash;
- iface->equal = g_daemon_file_equal;
- iface->is_native = g_daemon_file_is_native;
- iface->has_uri_scheme = g_daemon_file_has_uri_scheme;
- iface->get_uri_scheme = g_daemon_file_get_uri_scheme;
- iface->get_basename = g_daemon_file_get_basename;
- iface->get_path = g_daemon_file_get_path;
- iface->get_uri = g_daemon_file_get_uri;
- iface->get_parse_name = g_daemon_file_get_parse_name;
- iface->get_parent = g_daemon_file_get_parent;
- iface->prefix_matches = g_daemon_file_prefix_matches;
- iface->get_relative_path = g_daemon_file_get_relative_path;
- iface->resolve_relative_path = g_daemon_file_resolve_relative_path;
- iface->get_child_for_display_name = g_daemon_file_get_child_for_display_name;
- iface->enumerate_children = g_daemon_file_enumerate_children;
- iface->query_info = g_daemon_file_query_info;
- iface->query_info_async = g_daemon_file_query_info_async;
- iface->query_info_finish = g_daemon_file_query_info_finish;
- iface->find_enclosing_mount = g_daemon_file_find_enclosing_mount;
- iface->read_fn = g_daemon_file_read;
- iface->append_to = g_daemon_file_append_to;
- iface->create = g_daemon_file_create;
- iface->replace = g_daemon_file_replace;
- iface->read_async = g_daemon_file_read_async;
- iface->read_finish = g_daemon_file_read_finish;
- iface->mount_enclosing_volume = g_daemon_file_mount_enclosing_volume;
- iface->mount_enclosing_volume_finish = g_daemon_file_mount_enclosing_volume_finish;
- iface->mount_mountable = g_daemon_file_mount_mountable;
- iface->mount_mountable_finish = g_daemon_file_mount_mountable_finish;
- iface->unmount_mountable = g_daemon_file_unmount_mountable;
- iface->unmount_mountable_finish = g_daemon_file_unmount_mountable_finish;
- 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;
- iface->make_directory = g_daemon_file_make_directory;
- iface->copy = g_daemon_file_copy;
- iface->move = g_daemon_file_move;
- iface->query_settable_attributes = g_daemon_file_query_settable_attributes;
- iface->query_writable_namespaces = g_daemon_file_query_writable_namespaces;
- iface->set_attribute = g_daemon_file_set_attribute;
- iface->make_symbolic_link = g_daemon_file_make_symbolic_link;
- iface->monitor_dir = g_daemon_file_monitor_dir;
- iface->monitor_file = g_daemon_file_monitor_file;
-
- /* Async operations */
-
- iface->append_to_async = g_daemon_file_append_to_async;
- iface->append_to_finish = g_daemon_file_append_to_finish;
- iface->create_async = g_daemon_file_create_async;
- iface->create_finish = g_daemon_file_create_finish;
- iface->enumerate_children_async = g_daemon_file_enumerate_children_async;
- iface->enumerate_children_finish = g_daemon_file_enumerate_children_finish;
- iface->find_enclosing_mount_async = g_daemon_file_find_enclosing_mount_async;
- iface->find_enclosing_mount_finish = g_daemon_file_find_enclosing_mount_finish;
- iface->replace_async = g_daemon_file_replace_async;
- iface->replace_finish = g_daemon_file_replace_finish;
- iface->set_display_name_async = g_daemon_file_set_display_name_async;
- iface->set_display_name_finish = g_daemon_file_set_display_name_finish;
-#if 0
- iface->set_attributes_async = g_daemon_file_set_attributes_async;
- iface->set_attributes_finish = g_daemon_file_set_attributes_finish;
-#endif
-}