summaryrefslogtreecommitdiff
path: root/daemon/gvfsjobopenforwrite.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@src.gnome.org>2007-09-13 12:04:00 +0000
committerAlexander Larsson <alexl@src.gnome.org>2007-09-13 12:04:00 +0000
commit2f8542e5274fe14e631947643cadc10d1803897c (patch)
tree61047e675d22edc5f1513fe68b1dddb5d2cff968 /daemon/gvfsjobopenforwrite.c
parent0502df143b8442efa0ec92fe407705da607bbe1c (diff)
downloadgvfs-2f8542e5274fe14e631947643cadc10d1803897c.tar.gz
Add backend support for append_to and replace
Original git commit by Alexander Larsson <alex@greebo.(none)> at 1171881679 +0100 svn path=/trunk/; revision=366
Diffstat (limited to 'daemon/gvfsjobopenforwrite.c')
-rw-r--r--daemon/gvfsjobopenforwrite.c66
1 files changed, 57 insertions, 9 deletions
diff --git a/daemon/gvfsjobopenforwrite.c b/daemon/gvfsjobopenforwrite.c
index 37c65804..c5f9ec10 100644
--- a/daemon/gvfsjobopenforwrite.c
+++ b/daemon/gvfsjobopenforwrite.c
@@ -113,9 +113,28 @@ run (GVfsJob *job)
GVfsJobOpenForWrite *op_job = G_VFS_JOB_OPEN_FOR_WRITE (job);
GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
- class->create (op_job->backend,
- op_job,
- op_job->filename);
+ if (op_job->mode == OPEN_FOR_WRITE_CREATE)
+ {
+ class->create (op_job->backend,
+ op_job,
+ op_job->filename);
+ }
+ else if (op_job->mode == OPEN_FOR_WRITE_APPEND)
+ {
+ class->append_to (op_job->backend,
+ op_job,
+ op_job->filename);
+ }
+ else if (op_job->mode == OPEN_FOR_WRITE_REPLACE)
+ {
+ class->replace (op_job->backend,
+ op_job,
+ op_job->filename,
+ op_job->mtime,
+ op_job->make_backup);
+ }
+ else
+ g_assert_not_reached (); /* Handled in try */
}
static gboolean
@@ -124,12 +143,41 @@ try (GVfsJob *job)
GVfsJobOpenForWrite *op_job = G_VFS_JOB_OPEN_FOR_WRITE (job);
GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend);
- if (class->try_create == NULL)
- return FALSE;
-
- return class->try_create (op_job->backend,
- op_job,
- op_job->filename);
+ if (op_job->mode == OPEN_FOR_WRITE_CREATE)
+ {
+ if (class->try_create == NULL)
+ return FALSE;
+ return class->try_create (op_job->backend,
+ op_job,
+ op_job->filename);
+ }
+ else if (op_job->mode == OPEN_FOR_WRITE_APPEND)
+ {
+ if (class->try_append_to == NULL)
+ return FALSE;
+ return class->try_append_to (op_job->backend,
+ op_job,
+ op_job->filename);
+ }
+ else if (op_job->mode == OPEN_FOR_WRITE_REPLACE)
+ {
+ if (class->try_replace == NULL)
+ return FALSE;
+ return class->try_replace (op_job->backend,
+ op_job,
+ op_job->filename,
+ op_job->mtime,
+ op_job->make_backup);
+ }
+ else
+ {
+ GError *error = NULL;
+ g_set_error (&error, G_FILE_ERROR, G_FILE_ERROR_INVAL,
+ "Wrong open for write type");
+ g_vfs_job_failed_from_error (job, error);
+ g_error_free (error);
+ return TRUE;
+ }
}
void