[gvfs] afp: create file if it doesn't exist when doing replace



commit 3f53bd86ec7e7f7d0ed5e7eb62781fb011111dff
Author: Carl-Anton Ingmarsson <ca ingmarsson gmail com>
Date:   Mon Aug 22 20:51:51 2011 +0200

    afp: create file if it doesn't exist when doing replace

 daemon/gvfsbackendafp.c |  148 ++++++++++++++++++++++++-----------------------
 1 files changed, 75 insertions(+), 73 deletions(-)
---
diff --git a/daemon/gvfsbackendafp.c b/daemon/gvfsbackendafp.c
index 51b0b96..a60f8f5 100644
--- a/daemon/gvfsbackendafp.c
+++ b/daemon/gvfsbackendafp.c
@@ -2943,6 +2943,65 @@ try_close_read (GVfsBackend *backend,
 }
 
 static void
+create_open_fork_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
+{
+  GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (source_object);
+  GVfsJobOpenForWrite *job = G_VFS_JOB_OPEN_FOR_WRITE (user_data);
+
+  AfpHandle *afp_handle;
+  GError *err = NULL;
+
+  afp_handle = open_fork_finish (afp_backend, res, &err);
+  if (!afp_handle)
+  {
+    g_vfs_job_failed_from_error (G_VFS_JOB (job), err);
+    g_error_free (err);
+    return;
+  }
+
+  afp_handle->type = AFP_HANDLE_TYPE_CREATE_FILE;
+  
+  g_vfs_job_open_for_write_set_handle (job, (GVfsBackendHandle) afp_handle);
+  g_vfs_job_open_for_write_set_can_seek (job, TRUE);
+  g_vfs_job_open_for_write_set_initial_offset (job, 0);
+
+  g_vfs_job_succeeded (G_VFS_JOB (job));
+}
+
+static void
+create_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
+{
+  GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (source_object);
+  GVfsJobOpenForWrite *job = G_VFS_JOB_OPEN_FOR_WRITE (user_data);
+
+  GError *err = NULL;
+
+  if (!create_file_finish (afp_backend, res, &err))
+  {
+    g_vfs_job_failed_from_error (G_VFS_JOB (job), err);
+    g_error_free (err);
+    return;
+  }
+
+  open_fork (afp_backend, job->filename, AFP_ACCESS_MODE_WRITE_BIT,
+             G_VFS_JOB (job)->cancellable, create_open_fork_cb, job);
+}
+
+static gboolean
+try_create (GVfsBackend *backend,
+            GVfsJobOpenForWrite *job,
+            const char *filename,
+            GFileCreateFlags flags)
+{
+  GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (backend);
+
+  create_file (afp_backend, filename, FALSE, G_VFS_JOB (job)->cancellable,
+               create_cb, job);
+
+  return TRUE;
+}
+
+static void
 replace_open_fork_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
 {
   GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (source_object);
@@ -3046,18 +3105,6 @@ replace_create_tmp_file (GVfsBackendAfp *afp_backend, GVfsJobOpenForWrite *job)
 }
 
 static void
-replace_cont (GVfsBackendAfp *afp_backend, GVfsJobOpenForWrite *job)
-{
-  if (afp_backend->vol_attrs_bitmap & AFP_VOLUME_ATTRIBUTES_BITMAP_NO_EXCHANGE_FILES)
-  {
-    open_fork (afp_backend, job->filename, AFP_ACCESS_MODE_WRITE_BIT,
-               G_VFS_JOB (job)->cancellable, replace_open_fork_cb, job);
-  }
-  else
-    replace_create_tmp_file (afp_backend, job);
-}
-
-static void
 replace_get_filedir_parms_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
 {
   GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (source_object);
@@ -3069,7 +3116,13 @@ replace_get_filedir_parms_cb (GObject *source_object, GAsyncResult *res, gpointe
   info = get_filedir_parms_finish (afp_backend, res, &err);
   if (!info)
   {
-    g_vfs_job_failed_from_error (G_VFS_JOB (job), err);
+    /* Create file if it doesn't exist */
+    if (g_error_matches (err, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
+      try_create (G_VFS_BACKEND (afp_backend), job, job->filename, job->flags);
+
+    else
+      g_vfs_job_failed_from_error (G_VFS_JOB (job), err);
+
     g_error_free (err);
     return;
   }
@@ -3087,7 +3140,15 @@ replace_get_filedir_parms_cb (GObject *source_object, GAsyncResult *res, gpointe
                               _("The file was externally modified"));
   }
   else
-    replace_cont (afp_backend, job);
+  {
+    if (afp_backend->vol_attrs_bitmap & AFP_VOLUME_ATTRIBUTES_BITMAP_NO_EXCHANGE_FILES)
+    {
+      open_fork (afp_backend, job->filename, AFP_ACCESS_MODE_WRITE_BIT,
+                 G_VFS_JOB (job)->cancellable, replace_open_fork_cb, job);
+    }
+    else
+      replace_create_tmp_file (afp_backend, job);
+  }
 
   g_object_unref (info);
 }
@@ -3118,65 +3179,6 @@ try_replace (GVfsBackend *backend,
 }
 
 static void
-create_open_fork_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
-{
-  GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (source_object);
-  GVfsJobOpenForWrite *job = G_VFS_JOB_OPEN_FOR_WRITE (user_data);
-
-  AfpHandle *afp_handle;
-  GError *err = NULL;
-
-  afp_handle = open_fork_finish (afp_backend, res, &err);
-  if (!afp_handle)
-  {
-    g_vfs_job_failed_from_error (G_VFS_JOB (job), err);
-    g_error_free (err);
-    return;
-  }
-
-  afp_handle->type = AFP_HANDLE_TYPE_CREATE_FILE;
-  
-  g_vfs_job_open_for_write_set_handle (job, (GVfsBackendHandle) afp_handle);
-  g_vfs_job_open_for_write_set_can_seek (job, TRUE);
-  g_vfs_job_open_for_write_set_initial_offset (job, 0);
-
-  g_vfs_job_succeeded (G_VFS_JOB (job));
-}
-
-static void
-create_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
-{
-  GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (source_object);
-  GVfsJobOpenForWrite *job = G_VFS_JOB_OPEN_FOR_WRITE (user_data);
-
-  GError *err = NULL;
-
-  if (!create_file_finish (afp_backend, res, &err))
-  {
-    g_vfs_job_failed_from_error (G_VFS_JOB (job), err);
-    g_error_free (err);
-    return;
-  }
-
-  open_fork (afp_backend, job->filename, AFP_ACCESS_MODE_WRITE_BIT,
-             G_VFS_JOB (job)->cancellable, create_open_fork_cb, job);
-}
-
-static gboolean
-try_create (GVfsBackend *backend,
-            GVfsJobOpenForWrite *job,
-            const char *filename,
-            GFileCreateFlags flags)
-{
-  GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (backend);
-
-  create_file (afp_backend, filename, FALSE, G_VFS_JOB (job)->cancellable,
-               create_cb, job);
-
-  return TRUE;
-}
-
-static void
 append_to_get_fork_parms_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
 {
   GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (source_object);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]