diff options
author | Ross Lagerwall <rosslagerwall@gmail.com> | 2013-10-17 13:24:58 +0200 |
---|---|---|
committer | Ross Lagerwall <rosslagerwall@gmail.com> | 2013-12-05 23:51:31 +0000 |
commit | d8b214af8a28896bcbba2530bebcbbd7d59084f3 (patch) | |
tree | 7043c7b17998f18d2944aa709569a41530e91a79 /daemon | |
parent | 41602b74d507a7945454431e55ad9a0b56c2c903 (diff) | |
download | gvfs-d8b214af8a28896bcbba2530bebcbbd7d59084f3.tar.gz |
afp: Implement truncate support for output streams
https://bugzilla.gnome.org/show_bug.cgi?id=573837
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/gvfsbackendafp.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/daemon/gvfsbackendafp.c b/daemon/gvfsbackendafp.c index c5fab693..6d043e30 100644 --- a/daemon/gvfsbackendafp.c +++ b/daemon/gvfsbackendafp.c @@ -44,6 +44,7 @@ #include "gvfsjobread.h" #include "gvfsjobseekread.h" #include "gvfsjobseekwrite.h" +#include "gvfsjobtruncate.h" #include "gvfsjobopenforwrite.h" #include "gvfsjobwrite.h" #include "gvfsjobclosewrite.h" @@ -778,6 +779,43 @@ try_seek_on_write (GVfsBackend *backend, } static void +truncate_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) +{ + GVfsAfpVolume *volume = G_VFS_AFP_VOLUME (source_object); + GVfsJobTruncate *job = G_VFS_JOB_TRUNCATE (user_data); + AfpHandle *afp_handle = (AfpHandle *)job->handle; + + GError *err = NULL; + + if (g_vfs_afp_volume_set_fork_size_finish (volume, res, &err)) + { + g_vfs_job_succeeded (G_VFS_JOB (job)); + } + else + { + g_vfs_job_failed_from_error (G_VFS_JOB (job), err); + g_error_free (err); + afp_handle_free (afp_handle); + } +} + +static gboolean +try_truncate (GVfsBackend *backend, + GVfsJobTruncate *job, + GVfsBackendHandle handle, + goffset size) +{ + GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (backend); + AfpHandle *afp_handle = (AfpHandle *)handle; + + g_vfs_afp_volume_set_fork_size (afp_backend->volume, afp_handle->fork_refnum, + size, G_VFS_JOB (job)->cancellable, + truncate_cb, job); + + return TRUE; +} + +static void seek_on_read_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { GVfsAfpVolume *volume = G_VFS_AFP_VOLUME (source_object); @@ -1114,6 +1152,7 @@ create_open_fork_cb (GObject *source_object, GAsyncResult *res, gpointer user_da 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_can_truncate (job, TRUE); g_vfs_job_open_for_write_set_initial_offset (job, 0); g_vfs_job_succeeded (G_VFS_JOB (job)); @@ -1186,6 +1225,7 @@ replace_open_fork_cb (GObject *source_object, GAsyncResult *res, gpointer user_d 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_can_truncate (job, TRUE); g_vfs_job_open_for_write_set_initial_offset (job, 0); g_vfs_job_succeeded (G_VFS_JOB (job)); @@ -1374,6 +1414,7 @@ append_to_get_fork_parms_cb (GObject *source_object, GAsyncResult *res, gpointer afp_handle->offset = size; g_vfs_job_open_for_write_set_initial_offset (job, size); g_vfs_job_open_for_write_set_can_seek (job, TRUE); + g_vfs_job_open_for_write_set_can_truncate (job, TRUE); g_vfs_job_succeeded (G_VFS_JOB (job)); } @@ -2174,6 +2215,7 @@ g_vfs_backend_afp_class_init (GVfsBackendAfpClass *klass) backend_class->try_replace = try_replace; backend_class->try_write = try_write; backend_class->try_seek_on_write = try_seek_on_write; + backend_class->try_truncate = try_truncate; backend_class->try_close_write = try_close_write; backend_class->try_delete = try_delete; backend_class->try_make_directory = try_make_directory; |