diff options
author | Alexander Larsson <alexl@src.gnome.org> | 2007-09-13 09:23:06 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2007-09-13 09:23:06 +0000 |
commit | 6bf04c8bba1ae0c423952268cbbbdf7fde04f27f (patch) | |
tree | 74a13d9473d20cd4ed8eec6cf4ca346a9a35d9aa /daemon/gvfsjob.c | |
parent | fc23a9a11cbeb452f3a4d66d848e3e8725333650 (diff) | |
download | gvfs-6bf04c8bba1ae0c423952268cbbbdf7fde04f27f.tar.gz |
More work on daemon scheduling etc
Original git commit by Alexander Larsson <alex@localhost.localdomain> at 1161615951 +0200
svn path=/trunk/; revision=119
Diffstat (limited to 'daemon/gvfsjob.c')
-rw-r--r-- | daemon/gvfsjob.c | 93 |
1 files changed, 85 insertions, 8 deletions
diff --git a/daemon/gvfsjob.c b/daemon/gvfsjob.c index 4e488385..c140e922 100644 --- a/daemon/gvfsjob.c +++ b/daemon/gvfsjob.c @@ -10,10 +10,11 @@ #include <glib/gi18n.h> #include "gvfsjob.h" -G_DEFINE_TYPE (GVfsJob, g_vfs_job, G_TYPE_VFS_JOB); +G_DEFINE_TYPE (GVfsJob, g_vfs_job, G_TYPE_OBJECT); enum { - CANCEL, + CANCELLED, + FINISHED, LAST_SIGNAL }; @@ -40,11 +41,19 @@ g_vfs_job_class_init (GVfsJobClass *klass) gobject_class->finalize = g_vfs_job_finalize; - signals[CANCEL] = - g_signal_new ("done", + signals[CANCELLED] = + g_signal_new ("cancelled", G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GVfsJobClass, cancel), + G_STRUCT_OFFSET (GVfsJobClass, cancelled), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + signals[FINISHED] = + g_signal_new ("finished", + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GVfsJobClass, finished), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); @@ -56,6 +65,15 @@ g_vfs_job_init (GVfsJob *job) { } +gboolean +g_vfs_job_start (GVfsJob *job) +{ + GVfsJobClass *class; + + class = G_VFS_JOB_GET_CLASS (job); + return class->start (job); +} + void g_vfs_job_cancel (GVfsJob *job) { @@ -63,16 +81,75 @@ g_vfs_job_cancel (GVfsJob *job) return; job->cancelled = TRUE; - g_signal_emit (job, signals[CANCEL], 0); + g_signal_emit (job, signals[CANCELLED], 0); +} + +static void +g_vfs_job_send_reply (GVfsJob *job) +{ + GVfsJobClass *class; + + class = G_VFS_JOB_GET_CLASS (job); + class->send_reply (job); +} + +void +g_vfs_job_failed (GVfsJob *job, + GQuark domain, + gint code, + const gchar *format, + ...) +{ + va_list args; + char *message; + + if (job->failed) + return; + + job->failed = TRUE; + + va_start (args, format); + message = g_strdup_vprintf (format, args); + va_end (args); + + job->error = g_error_new (domain, code, message); + g_free (message); + + g_vfs_job_send_reply (job); } void -g_vfs_job_set_failed (GVfsJob *job, - GError *error) +g_vfs_job_failed_from_error (GVfsJob *job, + GError *error) { if (job->failed) return; job->failed = TRUE; job->error = g_error_copy (error); + g_vfs_job_send_reply (job); +} + +void +g_vfs_job_succeeded (GVfsJob *job) +{ + job->failed = FALSE; + g_vfs_job_send_reply (job); +} + + +gboolean +g_vfs_job_is_finished (GVfsJob *job) +{ + return job->finished; +} + +/* Might be called on an i/o thread */ +void +g_vfs_job_emit_finished (GVfsJob *job) +{ + g_assert (!job->finished); + + job->finished = TRUE; + g_signal_emit (job, signals[FINISHED], 0); } |