summaryrefslogtreecommitdiff
path: root/gnome-2-24/daemon/gvfsbackendburn.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnome-2-24/daemon/gvfsbackendburn.c')
-rw-r--r--gnome-2-24/daemon/gvfsbackendburn.c976
1 files changed, 0 insertions, 976 deletions
diff --git a/gnome-2-24/daemon/gvfsbackendburn.c b/gnome-2-24/daemon/gvfsbackendburn.c
deleted file mode 100644
index e9ed3da5..00000000
--- a/gnome-2-24/daemon/gvfsbackendburn.c
+++ /dev/null
@@ -1,976 +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 <sys/types.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <errno.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include <glib/gstdio.h>
-#include <glib/gi18n.h>
-#include <gio/gio.h>
-#include <gio/gunixmounts.h>
-#include <glib/gurifuncs.h>
-
-#include "gvfsbackendburn.h"
-#include "gvfsmonitor.h"
-#include "gvfsjobopenforread.h"
-#include "gvfsjobread.h"
-#include "gvfsjobseekread.h"
-#include "gvfsjobopenforwrite.h"
-#include "gvfsjobwrite.h"
-#include "gvfsjobclosewrite.h"
-#include "gvfsjobseekwrite.h"
-#include "gvfsjobsetdisplayname.h"
-#include "gvfsjobmountmountable.h"
-#include "gvfsjobqueryinfo.h"
-#include "gvfsjobdelete.h"
-#include "gvfsjobqueryfsinfo.h"
-#include "gvfsjobqueryattributes.h"
-#include "gvfsjobenumerate.h"
-#include "gvfsjobcreatemonitor.h"
-#include "gvfsdaemonprotocol.h"
-
-/* TODO:
- * Change notification
- *
- */
-
-typedef enum {
- VIRTUAL_NODE_FILE,
- VIRTUAL_NODE_DIRECTORY
-} VirtualNodeType;
-
-typedef struct {
- char *filename;
- VirtualNodeType type;
-
- /* for files: */
- char *backing_file; /* local filename */
- gboolean owned_file;
-
- GList *subscriptions;
-
- /* for directories: */
- GList *children;
- volatile gint ref_count;
-} VirtualNode;
-
-struct _GVfsBackendBurn
-{
- GVfsBackend parent_instance;
-
- char *tempdir;
-
- VirtualNode *root_node;
-
- GMountSpec *mount_spec;
-};
-
-G_DEFINE_TYPE (GVfsBackendBurn, g_vfs_backend_burn, G_VFS_TYPE_BACKEND)
-
-
-static void virtual_node_unref (VirtualNode *node);
-
-static VirtualNode *
-virtual_node_new (const char *filename,
- VirtualNodeType type)
-{
- VirtualNode *node;
-
- node = g_slice_new0 (VirtualNode);
- node->filename = g_strdup (filename);
- node->type = type;
- node->ref_count = 1;
-
- return node;
-}
-
-static void
-virtual_node_free (VirtualNode *node,
- gboolean deep)
-{
- GList *l;
-
- g_free (node->filename);
-
- switch (node->type)
- {
- case VIRTUAL_NODE_FILE:
- if (node->backing_file != NULL)
- {
- if (node->owned_file)
- g_unlink (node->backing_file);
- g_free (node->backing_file);
- }
- break;
- case VIRTUAL_NODE_DIRECTORY:
- if (deep)
- {
- for (l = node->children; l != NULL; l = l->next)
- virtual_node_unref ((VirtualNode *)l->data);
- }
- break;
- default:
- g_assert_not_reached ();
- break;
- }
-
- /*
- while ((l = g_list_first (node->subscriptions)) != NULL) {
- MappingSubscription *sub = l->data;
- virtual_node_remove_subscription (node, sub);
- }
- */
-
- g_slice_free (VirtualNode, node);
-}
-
-static void
-virtual_node_unref (VirtualNode *node)
-{
- g_return_if_fail (node != NULL);
- g_return_if_fail (node->ref_count > 0);
-
- if (g_atomic_int_dec_and_test (&node->ref_count))
- virtual_node_free (node, TRUE);
-}
-
-static G_GNUC_UNUSED VirtualNode *
-virtual_node_ref (VirtualNode *node)
-{
- g_return_val_if_fail (node != NULL, NULL);
- g_return_val_if_fail (node->ref_count > 0, NULL);
-
- g_atomic_int_inc (&node->ref_count);
- return node;
-}
-
-
-static VirtualNode *
-virtual_dir_lookup (VirtualNode *dir,
- const char *filename)
-{
- GList *l;
- VirtualNode *node;
-
- g_assert (dir->type == VIRTUAL_NODE_DIRECTORY);
-
- for (l = dir->children; l != NULL; l = l->next)
- {
- node = l->data;
-
- if (strcmp (node->filename, filename) == 0)
- return node;
- }
-
- return NULL;
-}
-
-static VirtualNode *
-virtual_node_lookup (VirtualNode *root_dir,
- const char *path,
- VirtualNode **parent)
-{
- char *copy, *next, *copy_orig;
- VirtualNode *node;
-
- copy_orig = g_strdup (path);
- copy = copy_orig;
-
- if (parent != NULL)
- *parent = NULL;
-
- node = root_dir;
-
- while (copy != NULL)
- {
- /* Skip initial/multiple slashes */
- while (G_IS_DIR_SEPARATOR (*copy))
- ++copy;
-
- if (*copy == 0)
- break;
-
- next = strchr (copy, G_DIR_SEPARATOR);
- if (next)
- {
- *next = 0;
- next++;
- }
-
- if (node->type != VIRTUAL_NODE_DIRECTORY)
- {
- /* Found a file in the middle of the path */
- node = NULL;
- break;
- }
-
- if (parent != NULL)
- *parent = node;
-
- node = virtual_dir_lookup (node, copy);
- if (node == NULL)
- break;
-
- copy = next;
- }
-
- g_free (copy_orig);
-
- return node;
-}
-
-static VirtualNode *
-virtual_mkdir (VirtualNode *node,
- const char *name)
-{
- VirtualNode *subdir;
-
- g_assert (node->type == VIRTUAL_NODE_DIRECTORY);
-
- if (virtual_dir_lookup (node, name) != NULL)
- return NULL;
-
- subdir = virtual_node_new (name, VIRTUAL_NODE_DIRECTORY);
-
- /* list takes ownership of ref */
- node->children = g_list_append (node->children, subdir);
-
- return subdir;
-}
-
-static void
-virtual_unlink (VirtualNode *dir,
- VirtualNode *node)
-{
- g_assert (dir->type == VIRTUAL_NODE_DIRECTORY);
-
- dir->children = g_list_remove (dir->children, node);
- virtual_node_unref (node);
-}
-
-static VirtualNode *
-virtual_create (GVfsBackendBurn *backend,
- VirtualNode *dir,
- const char *name,
- const char *backing_file)
-{
- VirtualNode *file;
- char *template;
- int fd;
-
- g_assert (dir->type == VIRTUAL_NODE_DIRECTORY);
-
- if (virtual_dir_lookup (dir, name) != NULL)
- return NULL;
-
- file = virtual_node_new (name, VIRTUAL_NODE_FILE);
-
- if (backing_file != NULL)
- {
- file->backing_file = g_strdup (backing_file);
- file->owned_file = FALSE;
- }
- else
- {
- template = g_build_filename (backend->tempdir, "file.XXXXXX", NULL);
-
- fd = g_mkstemp (template);
- if (fd < 0)
- {
- g_free (template);
- virtual_node_unref (file);
- return NULL;
-
- }
- close (fd);
- g_unlink (template);
-
- file->backing_file = template;
- file->owned_file = TRUE;
- }
-
- /* list takes ownership of ref */
- dir->children = g_list_append (dir->children, file);
-
- return file;
-}
-
-static void
-g_vfs_backend_burn_finalize (GObject *object)
-{
- GVfsBackendBurn *backend;
-
- backend = G_VFS_BACKEND_BURN (object);
-
- g_mount_spec_unref (backend->mount_spec);
-
- if (G_OBJECT_CLASS (g_vfs_backend_burn_parent_class)->finalize)
- (*G_OBJECT_CLASS (g_vfs_backend_burn_parent_class)->finalize) (object);
-}
-
-static void
-g_vfs_backend_burn_init (GVfsBackendBurn *burn_backend)
-{
- GVfsBackend *backend = G_VFS_BACKEND (burn_backend);
- GMountSpec *mount_spec;
-
- /* Translators: This is the name of the backend */
- g_vfs_backend_set_display_name (backend, _("Burn"));
- g_vfs_backend_set_icon_name (backend, "computer");
- g_vfs_backend_set_user_visible (backend, FALSE);
-
- mount_spec = g_mount_spec_new ("burn");
- g_vfs_backend_set_mount_spec (backend, mount_spec);
- burn_backend->mount_spec = mount_spec;
-}
-
-static gboolean
-try_mount (GVfsBackend *backend,
- GVfsJobMount *job,
- GMountSpec *mount_spec,
- GMountSource *mount_source,
- gboolean is_automount)
-{
- GVfsBackendBurn *burn_backend = G_VFS_BACKEND_BURN (backend);
- char *tempdir, *filename;
- char *dir;
-
- filename = g_strdup_printf ("virtual-%s.XXXXXX", g_get_user_name ());
- tempdir = g_build_filename (g_get_tmp_dir (), filename, NULL);
- g_free (filename);
-
- dir = mkdtemp (tempdir);
- if (dir == NULL)
- {
- g_free (tempdir);
- g_vfs_job_failed (G_VFS_JOB (job),
- G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Unable to create temporary directory"));
- return TRUE;
- }
-
- burn_backend->tempdir = dir;
- burn_backend->root_node =
- virtual_node_new (NULL, VIRTUAL_NODE_DIRECTORY);
-
- g_vfs_job_succeeded (G_VFS_JOB (job));
- return TRUE;
-}
-
-static gboolean
-try_delete (GVfsBackend *backend,
- GVfsJobDelete *job,
- const char *filename)
-{
- char *dirname, *basename;
- VirtualNode *file, *dir;
-
- dirname = g_path_get_dirname (filename);
- dir = virtual_node_lookup (G_VFS_BACKEND_BURN (backend)->root_node, dirname, NULL);
- g_free (dirname);
-
- if (dir == NULL ||
- dir->type != VIRTUAL_NODE_DIRECTORY)
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR,
- G_IO_ERROR_NOT_FOUND,
- _("No such file or directory"));
- return TRUE;
- }
-
- basename = g_path_get_basename (filename);
- file = virtual_dir_lookup (dir, basename);
- g_free (basename);
- if (file == NULL)
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR,
- G_IO_ERROR_NOT_FOUND,
- _("No such file or directory"));
- return TRUE;
- }
-
- if (file->type == VIRTUAL_NODE_DIRECTORY &&
- file->children != NULL)
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR,
- G_IO_ERROR_NOT_EMPTY,
- _("Directory not empty"));
- return TRUE;
- }
-
- virtual_unlink (dir, file);
-
- g_vfs_job_succeeded (G_VFS_JOB (job));
- return TRUE;
-}
-
-
-static gboolean
-try_open_for_read (GVfsBackend *backend,
- GVfsJobOpenForRead *job,
- const char *filename)
-{
- VirtualNode *node;
- GFileInputStream *stream;
- GFile *file;
- GError *error;
-
- node = virtual_node_lookup (G_VFS_BACKEND_BURN (backend)->root_node, filename, NULL);
- if (node == NULL)
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR,
- G_IO_ERROR_NOT_FOUND,
- _("No such file or directory"));
- return TRUE;
- }
-
- if (node->type == VIRTUAL_NODE_DIRECTORY)
- {
- g_vfs_job_failed (G_VFS_JOB (job),
- G_IO_ERROR, G_IO_ERROR_IS_DIRECTORY,
- _("Can't copy file over directory"));
- return TRUE;
- }
-
- file = g_file_new_for_path (node->backing_file);
-
- error = NULL;
- stream = g_file_read (file, G_VFS_JOB (job)->cancellable, &error);
- g_object_unref (file);
-
- if (stream)
- {
- g_vfs_job_open_for_read_set_can_seek (job, g_seekable_can_seek (G_SEEKABLE (stream)));
- g_vfs_job_open_for_read_set_handle (job, stream);
- g_vfs_job_succeeded (G_VFS_JOB (job));
- }
- else
- {
- g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
- g_error_free (error);
- }
-
- return TRUE;
-}
-
-
-static void
-do_read (GVfsBackend *backend,
- GVfsJobRead *job,
- GVfsBackendHandle _handle,
- char *buffer,
- gsize bytes_requested)
-{
- GError *error;
- GFileInputStream *stream = _handle;
- gssize s;
-
- error = NULL;
- s = g_input_stream_read (G_INPUT_STREAM(stream),
- buffer, bytes_requested,
- G_VFS_JOB (job)->cancellable, &error);
- if (s >= 0)
- {
- g_vfs_job_read_set_size (job, s);
- g_vfs_job_succeeded (G_VFS_JOB (job));
- }
- else
- {
- g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
- g_error_free (error);
- }
-}
-
-static void
-do_seek_on_read (GVfsBackend *backend,
- GVfsJobSeekRead *job,
- GVfsBackendHandle _handle,
- goffset offset,
- GSeekType type)
-{
- GError *error;
- GFileInputStream *stream = _handle;
-
- error = NULL;
- if (g_seekable_seek (G_SEEKABLE (stream), offset, type,
- G_VFS_JOB (job)->cancellable, &error))
- {
- g_vfs_job_seek_read_set_offset (job, g_seekable_tell (G_SEEKABLE (stream)));
- g_vfs_job_succeeded (G_VFS_JOB (job));
- }
- else
- {
- g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
- g_error_free (error);
- }
-}
-
-
-static void
-do_close_read (GVfsBackend *backend,
- GVfsJobCloseRead *job,
- GVfsBackendHandle _handle)
-{
- GError *error;
- GFileInputStream *stream = _handle;
-
- error = NULL;
- if (g_input_stream_close (G_INPUT_STREAM(stream),
- G_VFS_JOB (job)->cancellable, &error))
- {
- g_vfs_job_succeeded (G_VFS_JOB (job));
- }
- else
- {
- g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
- g_error_free (error);
- }
-
- g_object_unref (stream);
-}
-
-static char *
-make_valid_utf8 (const char *name)
-{
- GString *string;
- const gchar *remainder, *invalid;
- gint remaining_bytes, valid_bytes;
-
- string = NULL;
- remainder = name;
- remaining_bytes = strlen (name);
-
- while (remaining_bytes != 0)
- {
- if (g_utf8_validate (remainder, remaining_bytes, &invalid))
- break;
- valid_bytes = invalid - remainder;
-
- if (string == NULL)
- string = g_string_sized_new (remaining_bytes);
-
- g_string_append_len (string, remainder, valid_bytes);
- /* append U+FFFD REPLACEMENT CHARACTER */
- g_string_append (string, "\357\277\275");
-
- remaining_bytes -= valid_bytes + 1;
- remainder = invalid + 1;
- }
-
- if (string == NULL)
- return g_strdup (name);
-
- g_string_append (string, remainder);
-
- g_warn_if_fail (g_utf8_validate (string->str, -1, NULL));
-
- return g_string_free (string, FALSE);
-}
-
-
-static void
-file_info_from_node (VirtualNode *node,
- GFileInfo *info,
- const char *attributes)
-{
- GIcon *icon;
- GFile *file;
- GFileInfo *file_info;
-
- if (node->type == VIRTUAL_NODE_DIRECTORY)
- {
- g_file_info_set_file_type (info, G_FILE_TYPE_DIRECTORY);
- icon = g_themed_icon_new ("folder");
- g_file_info_set_icon (info, icon);
- g_object_unref (icon);
- g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE, TRUE);
- g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE, TRUE);
- g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH, FALSE);
- g_file_info_set_content_type (info, "inode/directory");
- }
- else
- {
- file = g_file_new_for_path (node->backing_file);
- file_info = g_file_query_info (file,
- attributes,
- 0, /* Always follow symlinks */
- NULL, NULL);
- if (file_info)
- {
- g_file_info_copy_into (file_info, info);
- g_object_unref (file_info);
- }
-
- g_file_info_set_attribute_byte_string (info,
- "burn::backing-file",
- node->backing_file);
- }
-
- if (node->filename != NULL)
- {
- char *utf8;
-
- g_file_info_set_name (info, node->filename);
- /* Ensure display name is utf8 */
- utf8 = make_valid_utf8 (node->filename);
- g_file_info_set_display_name (info, utf8);
- g_free (utf8);
- }
- else
- {
- g_file_info_set_name (info, "/");
- /* Translators: this is the display name of the backend */
- g_file_info_set_display_name (info, _("CD/DVD Creator"));
- }
-}
-
-static gboolean
-try_enumerate (GVfsBackend *backend,
- GVfsJobEnumerate *job,
- const char *filename,
- GFileAttributeMatcher *attribute_matcher,
- GFileQueryInfoFlags flags)
-{
- VirtualNode *node, *child;
- GFileInfo *info;
- GList *l;
-
- node = virtual_node_lookup (G_VFS_BACKEND_BURN (backend)->root_node, filename, NULL);
-
- if (node == NULL)
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR,
- G_IO_ERROR_NOT_FOUND,
- _("No such file or directory"));
- return TRUE;
- }
-
- if (node->type != VIRTUAL_NODE_DIRECTORY)
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR,
- G_IO_ERROR_NOT_DIRECTORY,
- _("The file is not a directory"));
- return TRUE;
- }
-
- g_vfs_job_succeeded (G_VFS_JOB (job));
-
- for (l = node->children; l != NULL; l = l->next)
- {
- child = l->data;
-
- info = g_file_info_new ();
- file_info_from_node (child, info, job->attributes);
- g_vfs_job_enumerate_add_info (job, info);
- g_object_unref (info);
- }
-
- g_vfs_job_enumerate_done (job);
-
- return TRUE;
-}
-
-static gboolean
-try_query_info (GVfsBackend *backend,
- GVfsJobQueryInfo *job,
- const char *filename,
- GFileQueryInfoFlags flags,
- GFileInfo *info,
- GFileAttributeMatcher *matcher)
-{
- VirtualNode *node;
-
- g_print ("q_i: filename: %s\n", filename);
-
- node = virtual_node_lookup (G_VFS_BACKEND_BURN (backend)->root_node, filename, NULL);
-
- if (node == NULL)
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR,
- G_IO_ERROR_NOT_FOUND,
- _("No such file or directory"));
- return TRUE;
- }
-
- file_info_from_node (node, info, job->attributes);
- g_vfs_job_succeeded (G_VFS_JOB (job));
-
- return TRUE;
-}
-
-static gboolean
-try_make_directory (GVfsBackend *backend,
- GVfsJobMakeDirectory *job,
- const char *filename)
-{
- char *dirname, *basename;
- VirtualNode *file, *dir;
-
- dirname = g_path_get_dirname (filename);
- dir = virtual_node_lookup (G_VFS_BACKEND_BURN (backend)->root_node, dirname, NULL);
- g_free (dirname);
-
- if (dir == NULL)
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR,
- G_IO_ERROR_NOT_FOUND,
- _("No such file or directory"));
- return TRUE;
- }
-
- basename = g_path_get_basename (filename);
- file = virtual_dir_lookup (dir, basename);
- if (file != NULL)
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR,
- G_IO_ERROR_EXISTS,
- _("File exists"));
- g_free (basename);
- return TRUE;
- }
-
- file = virtual_mkdir (dir, basename);
- g_free (basename);
-
- g_vfs_job_succeeded (G_VFS_JOB (job));
-
- return TRUE;
-}
-
-static gboolean
-try_set_display_name (GVfsBackend *backend,
- GVfsJobSetDisplayName *job,
- const char *filename,
- const char *display_name)
-{
- VirtualNode *node, *dir;
- char *target_path;
- char *dirname;
-
- node = virtual_node_lookup (G_VFS_BACKEND_BURN (backend)->root_node, filename, &dir);
- if (node == NULL)
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR,
- G_IO_ERROR_NOT_FOUND,
- _("No such file or directory"));
- return TRUE;
- }
-
- if (virtual_dir_lookup (dir, display_name) != NULL)
- {
- g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR,
- G_IO_ERROR_EXISTS,
- _("File exists"));
- return TRUE;
- }
-
- /* We use UTF8 for filenames */
- g_free (node->filename);
- node->filename = g_strdup (display_name);
-
- dirname = g_path_get_dirname (filename);
- target_path = g_build_filename (dirname, display_name, NULL);
- g_vfs_job_set_display_name_set_new_path (job, target_path);
- g_free (dirname);
- g_free (target_path);
-
- g_vfs_job_succeeded (G_VFS_JOB (job));
-
- return TRUE;
-
-}
-
-static gboolean
-try_push (GVfsBackend *backend,
- GVfsJobPush *job,
- const char *destination,
- const char *local_path,
- GFileCopyFlags flags,
- gboolean remove_source,
- GFileProgressCallback progress_callback,
- gpointer progress_callback_data)
-{
- VirtualNode *file, *dir;
- struct stat stat_buf;
- char *dirname, *basename;
-
- if (remove_source)
- {
- /* Fallback to copy & delete for now, fix that up later */
- g_vfs_job_failed_literal (job, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
- _("Operation not supported by backend"));
- return TRUE;
- }
-
- if (g_stat (local_path, &stat_buf) == -1)
- {
- int errsv = errno;
-
- g_vfs_job_failed (G_VFS_JOB (job),
- G_IO_ERROR,
- g_io_error_from_errno (errsv),
- "%s", g_strerror (errsv));
- return TRUE;
- }
-
- dirname = g_path_get_dirname (destination);
- dir = virtual_node_lookup (G_VFS_BACKEND_BURN (backend)->root_node, dirname, NULL);
- g_free (dirname);
- file = NULL;
-
- if (dir == NULL)
- {
- /* Parent of created file doesn't exist */
- g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR,
- G_IO_ERROR_NOT_FOUND,
- _("No such file or directory in target path"));
- return TRUE;
- }
-
- basename = g_path_get_basename (destination);
- file = virtual_dir_lookup (dir, basename);
- g_free (basename);
-
- if (S_ISDIR (stat_buf.st_mode))
- {
- /* The source is a directory, don't fail with WOULD_RECURSE immediately,
- * as that is less useful to the app. Better check for errors on the
- * target instead.
- */
-
- if (file != NULL)
- {
- if (flags & G_FILE_COPY_OVERWRITE)
- {
- if (file->type == VIRTUAL_NODE_DIRECTORY)
- {
- g_vfs_job_failed (G_VFS_JOB (job),
- G_IO_ERROR, G_IO_ERROR_WOULD_MERGE,
- _("Can't copy directory over directory"));
- return TRUE;
- }
- /* continue to would_recurse error */
- }
- else
- {
- g_vfs_job_failed (G_VFS_JOB (job),
- G_IO_ERROR, G_IO_ERROR_EXISTS,
- _("Target file exists"));
- return TRUE;
- }
- }
-
- g_vfs_job_failed (G_VFS_JOB (job),
- G_IO_ERROR, G_IO_ERROR_WOULD_RECURSE,
- _("Can't recursively copy directory"));
- return TRUE;
- }
-
- g_print ("file: %p, overwrite: %u\n", file, flags & G_FILE_COPY_OVERWRITE);
- if (file != NULL)
- {
- if (flags & G_FILE_COPY_OVERWRITE)
- {
- if (file->type == VIRTUAL_NODE_DIRECTORY)
- {
- g_vfs_job_failed (G_VFS_JOB (job),
- G_IO_ERROR, G_IO_ERROR_IS_DIRECTORY,
- _("Can't copy file over directory"));
- return TRUE;
- }
- else
- {
- g_assert (file->type == VIRTUAL_NODE_FILE);
- if (file->owned_file)
- g_unlink (file->backing_file);
- g_free (file->backing_file);
- file->owned_file = FALSE;
- file->backing_file = g_strdup (local_path);
-
- g_vfs_job_succeeded (G_VFS_JOB (job));
- return TRUE;
- }
- }
- else
- {
- g_vfs_job_failed (G_VFS_JOB (job),
- G_IO_ERROR, G_IO_ERROR_EXISTS,
- _("File exists"));
- return TRUE;
- }
- }
- else
- {
- basename = g_path_get_basename (destination);
- file = virtual_create (G_VFS_BACKEND_BURN (backend),
- dir,
- basename,
- local_path);
- g_free (basename);
-
- g_vfs_job_succeeded (G_VFS_JOB (job));
- return TRUE;
- }
-}
-
-static gboolean
-try_create_dir_monitor (GVfsBackend *backend,
- GVfsJobCreateMonitor *job,
- const char *filename,
- GFileMonitorFlags flags)
-{
- g_vfs_job_failed (G_VFS_JOB (job),
- G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
- _("Not supported"));
- return TRUE;
-}
-
-static void
-g_vfs_backend_burn_class_init (GVfsBackendBurnClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GVfsBackendClass *backend_class = G_VFS_BACKEND_CLASS (klass);
-
- gobject_class->finalize = g_vfs_backend_burn_finalize;
-
- backend_class->try_mount = try_mount;
- backend_class->try_open_for_read = try_open_for_read;
- backend_class->try_query_info = try_query_info;
- backend_class->try_enumerate = try_enumerate;
- backend_class->try_create_dir_monitor = try_create_dir_monitor;
- backend_class->try_make_directory = try_make_directory;
- backend_class->try_set_display_name = try_set_display_name;
- backend_class->try_push = try_push;
- backend_class->try_delete = try_delete;
- backend_class->read = do_read;
- backend_class->seek_on_read = do_seek_on_read;
- backend_class->close_read = do_close_read;
-}