diff options
Diffstat (limited to 'daemon/gvfsbackendafp.c')
-rw-r--r-- | daemon/gvfsbackendafp.c | 176 |
1 files changed, 110 insertions, 66 deletions
diff --git a/daemon/gvfsbackendafp.c b/daemon/gvfsbackendafp.c index 4244bef5..ac593881 100644 --- a/daemon/gvfsbackendafp.c +++ b/daemon/gvfsbackendafp.c @@ -293,27 +293,22 @@ static void fill_info (GVfsBackendAfp *afp_backend, } } -typedef void (*OpenForkCallback) (GVfsJob *job, - AfpHandle *afp_handle); - static void open_fork_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; guint16 file_bitmap; gint16 fork_refnum; - AfpHandle *afp_handle; - - OpenForkCallback cb; if (!reply) { - g_vfs_job_failed_from_error (job, error); + g_simple_async_result_set_from_error (simple, error); + g_simple_async_result_complete (simple); return; } @@ -325,26 +320,27 @@ open_fork_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, - _("Access denied")); + g_simple_async_result_set_error (simple, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED, + _("Access denied")); break; case AFP_RESULT_OBJECT_NOT_FOUND: - g_vfs_job_failed_literal (job, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, - _("File doesn't exist")); + g_simple_async_result_set_error (simple, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, + _("File doesn't exist")); break; case AFP_RESULT_OBJECT_TYPE_ERR: - g_vfs_job_failed_literal (job, G_IO_ERROR, G_IO_ERROR_NOT_REGULAR_FILE, - _("File is a directory")); + g_simple_async_result_set_error (simple, G_IO_ERROR, G_IO_ERROR_NOT_REGULAR_FILE, + _("File is a directory")); break; case AFP_RESULT_TOO_MANY_FILES_OPEN: - g_vfs_job_failed_literal (job, G_IO_ERROR, G_IO_ERROR_TOO_MANY_OPEN_FILES, - _("Too many files open")); + g_simple_async_result_set_error (simple, G_IO_ERROR, G_IO_ERROR_TOO_MANY_OPEN_FILES, + _("Too many files open")); break; default: - g_vfs_job_failed (G_VFS_JOB (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; } + g_simple_async_result_complete (simple); return; } @@ -352,27 +348,28 @@ open_fork_cb (GVfsAfpConnection *afp_connection, g_vfs_afp_reply_read_int16 (reply, &fork_refnum); g_object_unref (reply); - - afp_handle = afp_handle_new (fork_refnum); - cb = g_object_get_data (G_OBJECT (job), "OpenForkCallback"); - cb (job, afp_handle); + g_simple_async_result_set_op_res_gpointer (simple, GINT_TO_POINTER (fork_refnum), + NULL); + g_simple_async_result_complete (simple); } static void -open_fork (GVfsBackendAfp *afp_backend, - GVfsJob *job, - const char *filename, - guint16 access_mode, - OpenForkCallback cb) +open_fork (GVfsBackendAfp *afp_backend, + const char *filename, + guint16 access_mode, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) { GVfsAfpCommand *comm; + GSimpleAsyncResult *simple; if (is_root (filename)) { - g_vfs_job_failed_literal (job, G_IO_ERROR, - G_IO_ERROR_NOT_REGULAR_FILE, - _("File is a directory")); + g_simple_async_report_error_in_idle (G_OBJECT (afp_backend), callback, + user_data, G_IO_ERROR, G_IO_ERROR_NOT_REGULAR_FILE, + _("File is a directory")); return; } @@ -394,14 +391,34 @@ open_fork (GVfsBackendAfp *afp_backend, /* Pathname */ put_pathname (comm, filename); - g_object_set_data (G_OBJECT (job), "OpenForkCallback", cb); + simple = g_simple_async_result_new (G_OBJECT (afp_backend), callback, + user_data, open_fork); g_vfs_afp_connection_queue_command (afp_backend->server->conn, comm, - open_fork_cb, - G_VFS_JOB (job)->cancellable, job); + open_fork_cb, cancellable, simple); g_object_unref (comm); +} - return; +static AfpHandle * +open_fork_finish (GVfsBackendAfp *afp_backend, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple; + gint16 fork_refnum; + + g_return_val_if_fail (g_simple_async_result_is_valid (res, + G_OBJECT (afp_backend), + open_fork), + FALSE); + + simple = (GSimpleAsyncResult *)res; + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + + fork_refnum = GPOINTER_TO_INT (g_simple_async_result_get_op_res_gpointer (simple)); + return afp_handle_new (fork_refnum); } static void @@ -1420,18 +1437,29 @@ try_close_read (GVfsBackend *backend, } static void -replace_open_fork_cb (GVfsJob *job, - AfpHandle *afp_handle) +replace_open_fork_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { - GVfsJobOpenForWrite *write_job = G_VFS_JOB_OPEN_FOR_WRITE (job); + 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_REPLACE_FILE; - afp_handle->filename = g_strdup (write_job->filename); + afp_handle->filename = g_strdup (job->filename); afp_handle->tmp_filename = g_strdup (g_object_get_data (G_OBJECT (job), "TempFilename")); - g_vfs_job_open_for_write_set_handle (write_job, (GVfsBackendHandle) afp_handle); - g_vfs_job_open_for_write_set_can_seek (write_job, TRUE); - g_vfs_job_open_for_write_set_initial_offset (write_job, 0); + 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)); } @@ -1445,7 +1473,6 @@ replace_create_tmp_file_cb (GObject *source_object, GAsyncResult *res, gpointer 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)) @@ -1462,10 +1489,9 @@ replace_create_tmp_file_cb (GObject *source_object, GAsyncResult *res, gpointer return; } - access_mode = AFP_ACCESS_MODE_WRITE_BIT; tmp_filename = g_object_get_data (G_OBJECT (job), "TempFilename"); - open_fork (afp_backend, G_VFS_JOB (job), tmp_filename, access_mode, - replace_open_fork_cb); + open_fork (afp_backend, tmp_filename, AFP_ACCESS_MODE_WRITE_BIT, + G_VFS_JOB (job)->cancellable, replace_open_fork_cb, job); } static void @@ -1520,16 +1546,27 @@ try_replace (GVfsBackend *backend, } static void -create_open_fork_cb (GVfsJob *job, - AfpHandle *afp_handle) +create_open_fork_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { - GVfsJobOpenForWrite *write_job = G_VFS_JOB_OPEN_FOR_WRITE (job); + 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 (write_job, (GVfsBackendHandle) afp_handle); - g_vfs_job_open_for_write_set_can_seek (write_job, TRUE); - g_vfs_job_open_for_write_set_initial_offset (write_job, 0); + 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)); } @@ -1541,7 +1578,6 @@ create_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) GVfsJobOpenForWrite *job = G_VFS_JOB_OPEN_FOR_WRITE (user_data); GError *err = NULL; - guint16 access_mode; if (!create_file_finish (afp_backend, res, &err)) { @@ -1550,9 +1586,8 @@ create_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) return; } - access_mode = AFP_ACCESS_MODE_WRITE_BIT; - open_fork (afp_backend, G_VFS_JOB (job), job->filename, access_mode, - create_open_fork_cb); + open_fork (afp_backend, job->filename, AFP_ACCESS_MODE_WRITE_BIT, + G_VFS_JOB (job)->cancellable, create_open_fork_cb, job); } static gboolean @@ -1570,17 +1605,28 @@ try_create (GVfsBackend *backend, } static void -read_open_fork_cb (GVfsJob *job, - AfpHandle *afp_handle) +read_open_fork_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) { - GVfsJobOpenForRead *read_job = G_VFS_JOB_OPEN_FOR_READ (job); + GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (source_object); + GVfsJobOpenForRead *job = G_VFS_JOB_OPEN_FOR_READ (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_READ_FILE; - g_vfs_job_open_for_read_set_handle (read_job, (GVfsBackendHandle) afp_handle); - g_vfs_job_open_for_read_set_can_seek (read_job, TRUE); - - g_vfs_job_succeeded (job); + g_vfs_job_open_for_read_set_handle (job, (GVfsBackendHandle) afp_handle); + g_vfs_job_open_for_read_set_can_seek (job, TRUE); + + g_vfs_job_succeeded (G_VFS_JOB (job)); } static gboolean @@ -1589,11 +1635,9 @@ try_open_for_read (GVfsBackend *backend, const char *filename) { GVfsBackendAfp *afp_backend = G_VFS_BACKEND_AFP (backend); - guint16 access_mode; - access_mode = AFP_ACCESS_MODE_READ_BIT; - - open_fork (afp_backend, G_VFS_JOB (job), filename, access_mode, read_open_fork_cb); + open_fork (afp_backend, filename, AFP_ACCESS_MODE_READ_BIT, + G_VFS_JOB (job)->cancellable, read_open_fork_cb, job); return TRUE; } |