[gvfs] afp: use GSimpleAsyncResult in the create_file utility function
- From: Christian Kellner <gicmo src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gvfs] afp: use GSimpleAsyncResult in the create_file utility function
- Date: Thu, 25 Aug 2011 19:25:34 +0000 (UTC)
commit 3341e05cb9d01347aacdc4e9400bf8e47f72a584
Author: Carl-Anton Ingmarsson <ca ingmarsson gmail com>
Date: Thu Jul 14 20:39:17 2011 +0200
afp: use GSimpleAsyncResult in the create_file utility function
daemon/gvfsbackendafp.c | 104 ++++++++++++++++++++++++++++++++---------------
1 files changed, 71 insertions(+), 33 deletions(-)
---
diff --git a/daemon/gvfsbackendafp.c b/daemon/gvfsbackendafp.c
index 95abb39..dac9260 100644
--- a/daemon/gvfsbackendafp.c
+++ b/daemon/gvfsbackendafp.c
@@ -548,22 +548,20 @@ get_fork_parms_finish (GVfsBackendAfp *afp_backend,
return g_object_ref (g_simple_async_result_get_op_res_gpointer (simple));
}
-typedef void (*CreateFileCallback) (GVfsJob *job);
-
static void
create_file_cb (GVfsAfpConnection *afp_connection,
GVfsAfpReply *reply,
GError *error,
gpointer user_data)
{
- GVfsJob *job = G_VFS_JOB (user_data);
+ GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data);
AfpResultCode res_code;
- CreateFileCallback cb;
if (!reply)
{
- g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
+ g_simple_async_result_set_from_error (simple, error);
+ g_simple_async_result_complete (simple);
return;
}
@@ -575,49 +573,49 @@ create_file_cb (GVfsAfpConnection *afp_connection,
switch (res_code)
{
case AFP_RESULT_ACCESS_DENIED:
- g_vfs_job_failed_literal (job, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
+ g_simple_async_result_set_error (simple, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
_("Access denied"));
break;
case AFP_RESULT_DISK_FULL:
- g_vfs_job_failed_literal (job, G_IO_ERROR, G_IO_ERROR_NO_SPACE,
+ g_simple_async_result_set_error (simple, G_IO_ERROR, G_IO_ERROR_NO_SPACE,
_("Not enough space on volume"));
break;
case AFP_RESULT_FILE_BUSY:
- g_vfs_job_failed_literal (job, G_IO_ERROR, G_IO_ERROR_EXISTS,
+ g_simple_async_result_set_error (simple, G_IO_ERROR, G_IO_ERROR_EXISTS,
_("Target file is open"));
break;
case AFP_RESULT_OBJECT_EXISTS:
- g_vfs_job_failed_literal (job, G_IO_ERROR, G_IO_ERROR_EXISTS,
+ g_simple_async_result_set_error (simple, G_IO_ERROR, G_IO_ERROR_EXISTS,
_("Target file already exists"));
break;
case AFP_RESULT_OBJECT_NOT_FOUND:
- g_vfs_job_failed_literal (job, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
+ g_simple_async_result_set_error (simple, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
_("Ancestor directory doesn't exist"));
break;
case AFP_RESULT_VOL_LOCKED:
- g_vfs_job_failed_literal (job, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
+ g_simple_async_result_set_error (simple, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
_("Volume is read-only"));
break;
default:
- g_vfs_job_failed (job, G_IO_ERROR, G_IO_ERROR_FAILED,
- _("Got error code: %d from server"), res_code);
+ g_simple_async_result_set_error (simple, G_IO_ERROR, G_IO_ERROR_FAILED,
+ _("Got error code: %d from server"), res_code);
break;
}
- return;
}
- cb = g_object_get_data (G_OBJECT (job), "CreateFileCallback");
- cb (job);
+ g_simple_async_result_complete (simple);
}
static void
create_file (GVfsBackendAfp *afp_backend,
- GVfsJob *job,
const char *filename,
- gboolean hard_create,
- CreateFileCallback cb)
+ gboolean hard_create,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
{
GVfsAfpCommand *comm;
+ GSimpleAsyncResult *simple;
comm = g_vfs_afp_command_new (AFP_COMMAND_CREATE_FILE);
/* soft/hard create */
@@ -630,13 +628,34 @@ create_file (GVfsBackendAfp *afp_backend,
/* Pathname */
put_pathname (comm, filename);
- g_object_set_data (G_OBJECT (job), "CreateFileCallback", cb);
+ simple = g_simple_async_result_new (G_OBJECT (afp_backend), callback, user_data,
+ create_file);
g_vfs_afp_connection_queue_command (afp_backend->server->conn, comm, create_file_cb,
- job->cancellable, job);
+ cancellable, simple);
g_object_unref (comm);
}
+static gboolean
+create_file_finish (GVfsBackendAfp *afp_backend,
+ GAsyncResult *result,
+ GError **error)
+{
+ GSimpleAsyncResult *simple;
+
+ g_return_val_if_fail (g_simple_async_result_is_valid (result,
+ G_OBJECT (afp_backend),
+ create_file),
+ FALSE);
+
+ simple = (GSimpleAsyncResult *)result;
+
+ if (g_simple_async_result_propagate_error (simple, error))
+ return FALSE;
+
+ return TRUE;
+}
+
static void
rename_cb (GVfsAfpConnection *afp_connection,
GVfsAfpReply *reply,
@@ -1047,7 +1066,7 @@ seek_on_write_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
static gboolean
try_seek_on_write (GVfsBackend *backend,
- GVfsJobSeekRead *job,
+ GVfsJobSeekWrite *job,
GVfsBackendHandle handle,
goffset offset,
GSeekType type)
@@ -1354,17 +1373,26 @@ replace_open_fork_cb (GVfsJob *job,
}
static void
-replace_cb (GVfsJob *job)
+replace_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
{
- GVfsJobOpenForWrite *owjob = G_VFS_JOB_OPEN_FOR_WRITE (job);
- GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (owjob->backend);
+ GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (source_object);
+ GVfsJobOpenForWrite *job = G_VFS_JOB_OPEN_FOR_WRITE (user_data);
+ GError *err = NULL;
guint16 access_mode;
char *tmp_filename;
+ if (!create_file_finish (afp_backend, res, &err))
+ {
+ g_vfs_job_failed (G_VFS_JOB (job), err->domain, err->code,
+ _("Couldn't create temporary file (%s)"), err->message);
+ g_error_free (err);
+ return;
+ }
+
access_mode = AFP_ACCESS_MODE_WRITE_BIT;
tmp_filename = g_object_get_data (G_OBJECT (job), "TempFilename");
- open_fork (afp_backend, job, tmp_filename, access_mode,
+ open_fork (afp_backend, G_VFS_JOB (job), tmp_filename, access_mode,
replace_open_fork_cb);
}
@@ -1391,14 +1419,15 @@ try_replace (GVfsBackend *backend,
tmp_filename = g_strdup_printf ("%s.tmp", filename);
g_object_set_data_full (G_OBJECT (job), "TempFilename", tmp_filename, g_free);
- create_file (afp_backend, G_VFS_JOB (job), tmp_filename, TRUE, replace_cb);
+ create_file (afp_backend, tmp_filename, TRUE, G_VFS_JOB (job)->cancellable,
+ replace_cb, job);
return TRUE;
}
static void
create_open_fork_cb (GVfsJob *job,
- AfpHandle *afp_handle)
+ AfpHandle *afp_handle)
{
GVfsJobOpenForWrite *write_job = G_VFS_JOB_OPEN_FOR_WRITE (job);
@@ -1412,15 +1441,23 @@ create_open_fork_cb (GVfsJob *job,
}
static void
-create_cb (GVfsJob *job)
+create_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
{
- GVfsJobOpenForWrite *owjob = G_VFS_JOB_OPEN_FOR_WRITE (job);
- GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (owjob->backend);
+ GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (source_object);
+ GVfsJobOpenForWrite *job = G_VFS_JOB_OPEN_FOR_WRITE (user_data);
+ GError *err = NULL;
guint16 access_mode;
+ if (!create_file_finish (afp_backend, res, &err))
+ {
+ g_vfs_job_failed_from_error (G_VFS_JOB (job), err);
+ g_error_free (err);
+ return;
+ }
+
access_mode = AFP_ACCESS_MODE_WRITE_BIT;
- open_fork (afp_backend, job, owjob->filename, access_mode,
+ open_fork (afp_backend, G_VFS_JOB (job), job->filename, access_mode,
create_open_fork_cb);
}
@@ -1432,7 +1469,8 @@ try_create (GVfsBackend *backend,
{
GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (backend);
- create_file (afp_backend, G_VFS_JOB (job), filename, FALSE, create_cb);
+ create_file (afp_backend, filename, FALSE, G_VFS_JOB (job)->cancellable,
+ create_cb, job);
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]