diff options
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/gvfsbackend.c | 86 | ||||
-rw-r--r-- | daemon/gvfsbackend.h | 112 | ||||
-rw-r--r-- | daemon/gvfsbackendsmb.c | 214 | ||||
-rw-r--r-- | daemon/gvfsbackendtest.c | 50 | ||||
-rw-r--r-- | daemon/gvfsdaemon.c | 102 | ||||
-rw-r--r-- | daemon/gvfsjob.c | 13 | ||||
-rw-r--r-- | daemon/gvfsjob.h | 6 | ||||
-rw-r--r-- | daemon/gvfsjobcloseread.c | 31 | ||||
-rw-r--r-- | daemon/gvfsjobenumerate.c | 38 | ||||
-rw-r--r-- | daemon/gvfsjobgetinfo.c | 38 | ||||
-rw-r--r-- | daemon/gvfsjobopenforread.c | 30 | ||||
-rw-r--r-- | daemon/gvfsjobread.c | 38 | ||||
-rw-r--r-- | daemon/gvfsjobseekread.c | 37 |
13 files changed, 290 insertions, 505 deletions
diff --git a/daemon/gvfsbackend.c b/daemon/gvfsbackend.c index f2263368..a76e292b 100644 --- a/daemon/gvfsbackend.c +++ b/daemon/gvfsbackend.c @@ -183,92 +183,6 @@ g_vfs_backend_constructor (GType type, return object; } -gboolean -g_vfs_backend_open_for_read (GVfsBackend *backend, - GVfsJobOpenForRead *job, - char *filename) -{ - GVfsBackendClass *class; - - class = G_VFS_BACKEND_GET_CLASS (backend); - - return class->open_for_read (backend, job, filename); -} - -gboolean -g_vfs_backend_close_read (GVfsBackend *backend, - GVfsJobCloseRead *job, - GVfsBackendHandle handle) -{ - GVfsBackendClass *class; - - class = G_VFS_BACKEND_GET_CLASS (backend); - - return class->close_read (backend, job, handle); -} - -gboolean -g_vfs_backend_read (GVfsBackend *backend, - GVfsJobRead *job, - GVfsBackendHandle handle, - char *buffer, - gsize bytes_requested) -{ - GVfsBackendClass *class; - - class = G_VFS_BACKEND_GET_CLASS (backend); - - return class->read (backend, job, handle, - buffer, bytes_requested); -} - -gboolean -g_vfs_backend_seek_on_read (GVfsBackend *backend, - GVfsJobSeekRead *job, - GVfsBackendHandle handle, - goffset offset, - GSeekType type) -{ - GVfsBackendClass *class; - - class = G_VFS_BACKEND_GET_CLASS (backend); - - return class->seek_on_read (backend, job, handle, - offset, type); -} - -gboolean -g_vfs_backend_get_info (GVfsBackend *backend, - GVfsJobGetInfo *job, - char *filename, - GFileInfoRequestFlags requested, - const char *attributes, - gboolean follow_symlinks) -{ - GVfsBackendClass *class; - - class = G_VFS_BACKEND_GET_CLASS (backend); - - return class->get_info (backend, job, filename, requested, - attributes, follow_symlinks); -} - -gboolean -g_vfs_backend_enumerate (GVfsBackend *backend, - GVfsJobEnumerate *job, - char *filename, - GFileInfoRequestFlags requested, - const char *attributes, - gboolean follow_symlinks) -{ - GVfsBackendClass *class; - - class = G_VFS_BACKEND_GET_CLASS (backend); - - return class->enumerate (backend, job, filename, requested, - attributes, follow_symlinks); -} - static DBusHandlerResult backend_dbus_handler (DBusConnection *connection, DBusMessage *message, diff --git a/daemon/gvfsbackend.h b/daemon/gvfsbackend.h index 6631e91b..768598be 100644 --- a/daemon/gvfsbackend.h +++ b/daemon/gvfsbackend.h @@ -49,66 +49,66 @@ struct _GVfsBackendClass * A NULL here means operation not supported */ - gboolean (*open_for_read) (GVfsBackend *backend, - GVfsJobOpenForRead *job, - char *filename); - gboolean (*close_read) (GVfsBackend *backend, - GVfsJobCloseRead *job, - GVfsBackendHandle handle); - gboolean (*read) (GVfsBackend *backend, - GVfsJobRead *job, - GVfsBackendHandle handle, - char *buffer, - gsize bytes_requested); - gboolean (*seek_on_read) (GVfsBackend *backend, - GVfsJobSeekRead *job, - GVfsBackendHandle handle, - goffset offset, - GSeekType type); - gboolean (*get_info) (GVfsBackend *backend, - GVfsJobGetInfo *job, - char *filename, - GFileInfoRequestFlags requested, - const char *attributes, - gboolean follow_symlinks); - gboolean (*enumerate) (GVfsBackend *backend, - GVfsJobEnumerate *job, - char *filename, - GFileInfoRequestFlags requested, - const char *attributes, - gboolean follow_symlinks); + void (*open_for_read) (GVfsBackend *backend, + GVfsJobOpenForRead *job, + char *filename); + gboolean (*try_open_for_read) (GVfsBackend *backend, + GVfsJobOpenForRead *job, + char *filename); + void (*close_read) (GVfsBackend *backend, + GVfsJobCloseRead *job, + GVfsBackendHandle handle); + gboolean (*try_close_read) (GVfsBackend *backend, + GVfsJobCloseRead *job, + GVfsBackendHandle handle); + void (*read) (GVfsBackend *backend, + GVfsJobRead *job, + GVfsBackendHandle handle, + char *buffer, + gsize bytes_requested); + gboolean (*try_read) (GVfsBackend *backend, + GVfsJobRead *job, + GVfsBackendHandle handle, + char *buffer, + gsize bytes_requested); + void (*seek_on_read) (GVfsBackend *backend, + GVfsJobSeekRead *job, + GVfsBackendHandle handle, + goffset offset, + GSeekType type); + gboolean (*try_seek_on_read) (GVfsBackend *backend, + GVfsJobSeekRead *job, + GVfsBackendHandle handle, + goffset offset, + GSeekType type); + void (*get_info) (GVfsBackend *backend, + GVfsJobGetInfo *job, + char *filename, + GFileInfoRequestFlags requested, + const char *attributes, + gboolean follow_symlinks); + gboolean (*try_get_info) (GVfsBackend *backend, + GVfsJobGetInfo *job, + char *filename, + GFileInfoRequestFlags requested, + const char *attributes, + gboolean follow_symlinks); + void (*enumerate) (GVfsBackend *backend, + GVfsJobEnumerate *job, + char *filename, + GFileInfoRequestFlags requested, + const char *attributes, + gboolean follow_symlinks); + gboolean (*try_enumerate) (GVfsBackend *backend, + GVfsJobEnumerate *job, + char *filename, + GFileInfoRequestFlags requested, + const char *attributes, + gboolean follow_symlinks); }; GType g_vfs_backend_get_type (void) G_GNUC_CONST; -gboolean g_vfs_backend_open_for_read (GVfsBackend *backend, - GVfsJobOpenForRead *job, - char *filename); -gboolean g_vfs_backend_close_read (GVfsBackend *backend, - GVfsJobCloseRead *job, - GVfsBackendHandle handle); -gboolean g_vfs_backend_read (GVfsBackend *backend, - GVfsJobRead *job, - GVfsBackendHandle handle, - char *buffer, - gsize bytes_requested); -gboolean g_vfs_backend_seek_on_read (GVfsBackend *backend, - GVfsJobSeekRead *job, - GVfsBackendHandle handle, - goffset offset, - GSeekType type); -gboolean g_vfs_backend_get_info (GVfsBackend *backend, - GVfsJobGetInfo *job, - char *filename, - GFileInfoRequestFlags requested, - const char *attributes, - gboolean follow_symlinks); -gboolean g_vfs_backend_enumerate (GVfsBackend *backend, - GVfsJobEnumerate *job, - char *filename, - GFileInfoRequestFlags requested, - const char *attributes, - gboolean follow_symlinks); void g_vfs_backend_register_with_daemon (GVfsBackend *backend, GVfsDaemon *daemon); diff --git a/daemon/gvfsbackendsmb.c b/daemon/gvfsbackendsmb.c index d284b8b7..475da2de 100644 --- a/daemon/gvfsbackendsmb.c +++ b/daemon/gvfsbackendsmb.c @@ -297,195 +297,39 @@ g_vfs_backend_smb_new (const char *server, return backend; } -static gboolean -open_idle_cb (gpointer data) -{ - GVfsJobOpenForRead *job = data; - int fd; - - if (g_vfs_job_is_cancelled (G_VFS_JOB (job))) - { - g_vfs_job_failed (G_VFS_JOB (job), G_VFS_ERROR, - G_VFS_ERROR_CANCELLED, - _("Operation was cancelled")); - return FALSE; - } - - fd = g_open (job->filename, O_RDONLY); - if (fd == -1) - { - g_vfs_job_failed (G_VFS_JOB (job), G_FILE_ERROR, - g_file_error_from_errno (errno), - "Error opening file %s: %s", - job->filename, g_strerror (errno)); - } - else - { - g_vfs_job_open_for_read_set_can_seek (job, TRUE); - g_vfs_job_open_for_read_set_handle (job, GINT_TO_POINTER (fd)); - g_vfs_job_succeeded (G_VFS_JOB (job)); - } - return FALSE; -} - -static void -open_read_cancelled_cb (GVfsJob *job, gpointer data) -{ - guint tag = GPOINTER_TO_INT (data); - - g_print ("open_read_cancelled_cb\n"); - - if (g_source_remove (tag)) - g_vfs_job_failed (job, G_VFS_ERROR, - G_VFS_ERROR_CANCELLED, - _("Operation was cancelled")); -} - -static gboolean +static void do_open_for_read (GVfsBackend *backend, GVfsJobOpenForRead *job, char *filename) { - GError *error; - - g_print ("open_for_read (%s)\n", filename); - - if (strcmp (filename, "/fail") == 0) - { - error = g_error_new (G_FILE_ERROR, G_FILE_ERROR_IO, "Smb error"); - g_vfs_job_failed_from_error (G_VFS_JOB (job), error); - return TRUE; - } - else - { - guint tag = g_timeout_add (0, open_idle_cb, job); - g_signal_connect (job, "cancelled", (GCallback)open_read_cancelled_cb, GINT_TO_POINTER (tag)); - return TRUE; - } -} - -static gboolean -read_idle_cb (gpointer data) -{ - GVfsJobRead *job = data; - int fd; - ssize_t res; - - fd = GPOINTER_TO_INT (job->handle); - - res = read (fd, job->buffer, job->bytes_requested); - - if (res == -1) - { - g_vfs_job_failed (G_VFS_JOB (job), G_FILE_ERROR, - g_file_error_from_errno (errno), - "Error reading from file: %s", - g_strerror (errno)); - } - else - { - g_vfs_job_read_set_size (job, res); - g_vfs_job_succeeded (G_VFS_JOB (job)); - } - - return FALSE; } static void -read_cancelled_cb (GVfsJob *job, gpointer data) -{ - guint tag = GPOINTER_TO_INT (job->backend_data); - - g_source_remove (tag); - g_vfs_job_failed (job, G_VFS_ERROR, - G_VFS_ERROR_CANCELLED, - _("Operation was cancelled")); -} - -static gboolean do_read (GVfsBackend *backend, GVfsJobRead *job, GVfsBackendHandle handle, char *buffer, gsize bytes_requested) { - guint tag; - - g_print ("read (%d)\n", bytes_requested); - - tag = g_timeout_add (0, read_idle_cb, job); - G_VFS_JOB (job)->backend_data = GINT_TO_POINTER (tag); - g_signal_connect (job, "cancelled", (GCallback)read_cancelled_cb, NULL); - - return TRUE; } -static gboolean +static void do_seek_on_read (GVfsBackend *backend, GVfsJobSeekRead *job, GVfsBackendHandle handle, goffset offset, GSeekType type) { - int whence; - int fd; - off_t final_offset; - - g_print ("seek_on_read (%d, %d)\n", (int)offset, type); - - switch (type) - { - default: - case G_SEEK_SET: - whence = SEEK_SET; - break; - case G_SEEK_CUR: - whence = SEEK_CUR; - break; - case G_SEEK_END: - whence = SEEK_END; - break; - } - - - fd = GPOINTER_TO_INT (handle); - - final_offset = lseek (fd, offset, whence); - - if (final_offset == (off_t)-1) - { - g_vfs_job_failed (G_VFS_JOB (job), G_FILE_ERROR, - g_file_error_from_errno (errno), - "Error seeking in file: %s", - g_strerror (errno)); - } - else - { - g_vfs_job_seek_read_set_offset (job, offset); - g_vfs_job_succeeded (G_VFS_JOB (job)); - } - - return TRUE; } -static gboolean +static void do_close_read (GVfsBackend *backend, GVfsJobCloseRead *job, GVfsBackendHandle handle) { - int fd; - - g_print ("close ()\n"); - - fd = GPOINTER_TO_INT (handle); - close(fd); - - g_vfs_job_succeeded (G_VFS_JOB (job)); - - return TRUE; } -static gboolean +static void do_get_info (GVfsBackend *backend, GVfsJobGetInfo *job, char *filename, @@ -493,31 +337,9 @@ do_get_info (GVfsBackend *backend, const char *attributes, gboolean follow_symlinks) { - GFile *file; - GFileInfo *info; - GError *error; - - file = g_file_local_new (filename); - - error = NULL; - info = g_file_get_info (file, requested, attributes, follow_symlinks, - NULL, &error); - - if (info) - { - g_vfs_job_get_info_set_info (job, requested, info); - g_vfs_job_succeeded (G_VFS_JOB (job)); - } - else - g_vfs_job_failed_from_error (G_VFS_JOB (job), error); - - g_object_unref (info); - g_object_unref (file); - - return TRUE; } -static gboolean +static void do_enumerate (GVfsBackend *backend, GVfsJobEnumerate *job, char *filename, @@ -525,32 +347,6 @@ do_enumerate (GVfsBackend *backend, const char *attributes, gboolean follow_symlinks) { - GFileInfo *info1, *info2;; - GList *l; - - g_vfs_job_enumerate_set_result (job, requested); - g_vfs_job_succeeded (G_VFS_JOB (job)); - - info1 = g_file_info_new (); - info2 = g_file_info_new (); - g_file_info_set_name (info1, "file1"); - g_file_info_set_file_type (info1, G_FILE_TYPE_REGULAR); - g_file_info_set_name (info2, "file2"); - g_file_info_set_file_type (info2, G_FILE_TYPE_REGULAR); - - l = NULL; - l = g_list_append (l, info1); - l = g_list_append (l, info2); - - g_vfs_job_enumerate_add_info (job, l); - - g_list_free (l); - g_object_unref (info1); - g_object_unref (info2); - - g_vfs_job_enumerate_done (job); - - return TRUE; } static void diff --git a/daemon/gvfsbackendtest.c b/daemon/gvfsbackendtest.c index b95d2096..74094009 100644 --- a/daemon/gvfsbackendtest.c +++ b/daemon/gvfsbackendtest.c @@ -95,9 +95,9 @@ open_read_cancelled_cb (GVfsJob *job, gpointer data) } static gboolean -do_open_for_read (GVfsBackend *backend, - GVfsJobOpenForRead *job, - char *filename) +try_open_for_read (GVfsBackend *backend, + GVfsJobOpenForRead *job, + char *filename) { GError *error; @@ -107,14 +107,14 @@ do_open_for_read (GVfsBackend *backend, { error = g_error_new (G_FILE_ERROR, G_FILE_ERROR_IO, "Test error"); g_vfs_job_failed_from_error (G_VFS_JOB (job), error); - return TRUE; } else { guint tag = g_timeout_add (0, open_idle_cb, job); g_signal_connect (job, "cancelled", (GCallback)open_read_cancelled_cb, GINT_TO_POINTER (tag)); - return TRUE; } + + return TRUE; } static gboolean @@ -156,11 +156,11 @@ read_cancelled_cb (GVfsJob *job, gpointer data) } static gboolean -do_read (GVfsBackend *backend, - GVfsJobRead *job, - GVfsBackendHandle handle, - char *buffer, - gsize bytes_requested) +try_read (GVfsBackend *backend, + GVfsJobRead *job, + GVfsBackendHandle handle, + char *buffer, + gsize bytes_requested) { guint tag; @@ -173,7 +173,7 @@ do_read (GVfsBackend *backend, return TRUE; } -static gboolean +static void do_seek_on_read (GVfsBackend *backend, GVfsJobSeekRead *job, GVfsBackendHandle handle, @@ -217,11 +217,9 @@ do_seek_on_read (GVfsBackend *backend, g_vfs_job_seek_read_set_offset (job, offset); g_vfs_job_succeeded (G_VFS_JOB (job)); } - - return TRUE; } -static gboolean +static void do_close_read (GVfsBackend *backend, GVfsJobCloseRead *job, GVfsBackendHandle handle) @@ -234,11 +232,9 @@ do_close_read (GVfsBackend *backend, close(fd); g_vfs_job_succeeded (G_VFS_JOB (job)); - - return TRUE; } -static gboolean +static void do_get_info (GVfsBackend *backend, GVfsJobGetInfo *job, char *filename, @@ -266,17 +262,15 @@ do_get_info (GVfsBackend *backend, g_object_unref (info); g_object_unref (file); - - return TRUE; } static gboolean -do_enumerate (GVfsBackend *backend, - GVfsJobEnumerate *job, - char *filename, - GFileInfoRequestFlags requested, - const char *attributes, - gboolean follow_symlinks) +try_enumerate (GVfsBackend *backend, + GVfsJobEnumerate *job, + char *filename, + GFileInfoRequestFlags requested, + const char *attributes, + gboolean follow_symlinks) { GFileInfo *info1, *info2;; GList *l; @@ -314,10 +308,10 @@ g_vfs_backend_test_class_init (GVfsBackendTestClass *klass) gobject_class->finalize = g_vfs_backend_test_finalize; - backend_class->open_for_read = do_open_for_read; - backend_class->read = do_read; + backend_class->try_open_for_read = try_open_for_read; + backend_class->try_read = try_read; backend_class->seek_on_read = do_seek_on_read; backend_class->close_read = do_close_read; backend_class->get_info = do_get_info; - backend_class->enumerate = do_enumerate; + backend_class->try_enumerate = try_enumerate; } diff --git a/daemon/gvfsdaemon.c b/daemon/gvfsdaemon.c index f3ab7853..a80431a0 100644 --- a/daemon/gvfsdaemon.c +++ b/daemon/gvfsdaemon.c @@ -32,12 +32,10 @@ struct _GVfsDaemonPrivate GMutex *lock; gboolean main_daemon; + GThreadPool *thread_pool; DBusConnection *session_bus; GHashTable *registered_paths; - GQueue *new_pending_jobs; - GQueue *pending_jobs; /* Only accessed from main thread */ - GQueue *jobs; - guint queued_job_start; + GList *jobs; GList *job_sources; }; @@ -82,11 +80,7 @@ g_vfs_daemon_finalize (GObject *object) daemon = G_VFS_DAEMON (object); - g_assert (daemon->priv->jobs->head == NULL); - g_assert (daemon->priv->pending_jobs->head == NULL); - g_queue_free (daemon->priv->jobs); - g_queue_free (daemon->priv->pending_jobs); - g_queue_free (daemon->priv->new_pending_jobs); + g_assert (daemon->priv->jobs == NULL); g_hash_table_destroy (daemon->priv->registered_paths); g_mutex_free (daemon->priv->lock); @@ -108,16 +102,32 @@ g_vfs_daemon_class_init (GVfsDaemonClass *klass) } static void +job_handler_callback (gpointer data, + gpointer user_data) +{ + GVfsJob *job = G_VFS_JOB (data); + + g_vfs_job_run (job); +} + +static void g_vfs_daemon_init (GVfsDaemon *daemon) { + gint max_threads = 1; /* TODO: handle max threads */ + daemon->priv = G_TYPE_INSTANCE_GET_PRIVATE (daemon, G_TYPE_VFS_DAEMON, GVfsDaemonPrivate); daemon->priv->lock = g_mutex_new (); daemon->priv->session_bus = dbus_bus_get (DBUS_BUS_SESSION, NULL); - daemon->priv->jobs = g_queue_new (); - daemon->priv->pending_jobs = g_queue_new (); - daemon->priv->new_pending_jobs = g_queue_new (); + daemon->priv->thread_pool = g_thread_pool_new (job_handler_callback, + daemon, + max_threads, + FALSE, NULL); + /* TODO: verify thread_pool != NULL in a nicer way */ + g_assert (daemon->priv->thread_pool != NULL); + + daemon->priv->jobs = NULL; daemon->priv->registered_paths = g_hash_table_new_full (g_str_hash, g_str_equal, @@ -297,53 +307,6 @@ g_vfs_daemon_register_path (GVfsDaemon *daemon, return TRUE; } -static void -g_queue_move_items (GQueue *to, GQueue *from) -{ - GList *ignore; - if (from->head != NULL) - { - if (to->head == NULL) - to->head = from->head; - else - ignore = g_list_concat (to->tail, from->head); - to->tail = from->tail; - to->length += from->length; - - from->head = NULL; - from->tail = NULL; - from->length = 0; - } -} - -static gboolean -start_jobs_at_idle (gpointer data) -{ - GVfsDaemon *daemon = data; - GList *l, *next; - GVfsJob *job; - - g_mutex_lock (daemon->priv->lock); - daemon->priv->queued_job_start = 0; - g_queue_move_items (daemon->priv->pending_jobs, - daemon->priv->new_pending_jobs); - g_mutex_unlock (daemon->priv->lock); - - l = daemon->priv->pending_jobs->head; - while (l != NULL) - { - job = l->data; - next = l->next; - - if (g_vfs_job_start (job)) - g_queue_delete_link (daemon->priv->pending_jobs, l); - - l = next; - } - - return FALSE; -} - /* NOTE: Might be emitted on a thread */ static void job_new_source_callback (GVfsJob *job, @@ -367,12 +330,7 @@ job_finished_callback (GVfsJob *job, daemon); g_mutex_lock (daemon->priv->lock); - - g_queue_remove (daemon->priv->jobs, job); - - if (daemon->priv->queued_job_start == 0) - daemon->priv->queued_job_start = g_idle_add (start_jobs_at_idle, daemon); - + daemon->priv->jobs = g_list_remove (daemon->priv->jobs, job); g_mutex_unlock (daemon->priv->lock); g_object_unref (job); @@ -389,16 +347,14 @@ g_vfs_daemon_queue_job (GVfsDaemon *daemon, g_signal_connect (job, "new_source", (GCallback)job_new_source_callback, daemon); g_mutex_lock (daemon->priv->lock); - g_queue_push_tail (daemon->priv->jobs, job); + daemon->priv->jobs = g_list_prepend (daemon->priv->jobs, job); g_mutex_unlock (daemon->priv->lock); - /* Can we start the job immediately */ - if (!g_vfs_job_start (job)) + /* Can we start the job immediately / async */ + if (!g_vfs_job_try (job)) { - /* Didn't start, queue as pending */ - g_mutex_lock (daemon->priv->lock); - g_queue_push_tail (daemon->priv->new_pending_jobs, job); - g_mutex_unlock (daemon->priv->lock); + /* Couldn't finish / run async, queue worker thread */ + g_thread_pool_push (daemon->priv->thread_pool, job, NULL); /* TODO: Check error */ } } @@ -822,7 +778,7 @@ daemon_message_func (DBusConnection *conn, DBUS_TYPE_INVALID)) { g_mutex_lock (daemon->priv->lock); - for (l = daemon->priv->jobs->head; l != NULL; l = l->next) + for (l = daemon->priv->jobs; l != NULL; l = l->next) { GVfsJob *job = l->data; diff --git a/daemon/gvfsjob.c b/daemon/gvfsjob.c index cbc1c0a9..a505f748 100644 --- a/daemon/gvfsjob.c +++ b/daemon/gvfsjob.c @@ -138,13 +138,22 @@ g_vfs_job_get_property (GObject *object, } } +void +g_vfs_job_run (GVfsJob *job) +{ + GVfsJobClass *class; + + class = G_VFS_JOB_GET_CLASS (job); + class->run (job); +} + gboolean -g_vfs_job_start (GVfsJob *job) +g_vfs_job_try (GVfsJob *job) { GVfsJobClass *class; class = G_VFS_JOB_GET_CLASS (job); - return class->start (job); + return class->try (job); } void diff --git a/daemon/gvfsjob.h b/daemon/gvfsjob.h index 6eb1fbfc..1862523c 100644 --- a/daemon/gvfsjob.h +++ b/daemon/gvfsjob.h @@ -47,7 +47,8 @@ struct _GVfsJobClass /* vtable */ - gboolean (*start) (GVfsJob *job); + void (*run) (GVfsJob *job); + gboolean (*try) (GVfsJob *job); }; GType g_vfs_job_get_type (void) G_GNUC_CONST; @@ -55,7 +56,8 @@ GType g_vfs_job_get_type (void) G_GNUC_CONST; gboolean g_vfs_job_is_finished (GVfsJob *job); gboolean g_vfs_job_is_cancelled (GVfsJob *job); void g_vfs_job_cancel (GVfsJob *job); -gboolean g_vfs_job_start (GVfsJob *job); +void g_vfs_job_run (GVfsJob *job); +gboolean g_vfs_job_try (GVfsJob *job); void g_vfs_job_emit_finished (GVfsJob *job); void g_vfs_job_failed (GVfsJob *job, GQuark domain, diff --git a/daemon/gvfsjobcloseread.c b/daemon/gvfsjobcloseread.c index 4ea7904a..e39846ae 100644 --- a/daemon/gvfsjobcloseread.c +++ b/daemon/gvfsjobcloseread.c @@ -13,7 +13,8 @@ G_DEFINE_TYPE (GVfsJobCloseRead, g_vfs_job_close_read, G_TYPE_VFS_JOB); -static gboolean start (GVfsJob *job); +static void run (GVfsJob *job); +static gboolean try (GVfsJob *job); static void send_reply (GVfsJob *job); static void @@ -36,7 +37,8 @@ g_vfs_job_close_read_class_init (GVfsJobCloseReadClass *klass) gobject_class->finalize = g_vfs_job_close_read_finalize; - job_class->start = start; + job_class->run = run; + job_class->try = try; job_class->send_reply = send_reply; } @@ -76,12 +78,27 @@ send_reply (GVfsJob *job) g_vfs_read_channel_send_closed (op_job->channel); } -static gboolean -start (GVfsJob *job) +static void +run (GVfsJob *job) { GVfsJobCloseRead *op_job = G_VFS_JOB_CLOSE_READ (job); + GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend); + + class->close_read (op_job->backend, + op_job, + op_job->handle); +} - return g_vfs_backend_close_read (op_job->backend, - op_job, - op_job->handle); +static gboolean +try (GVfsJob *job) +{ + GVfsJobCloseRead *op_job = G_VFS_JOB_CLOSE_READ (job); + GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend); + + if (class->try_close_read == NULL) + return FALSE; + + return class->try_close_read (op_job->backend, + op_job, + op_job->handle); } diff --git a/daemon/gvfsjobenumerate.c b/daemon/gvfsjobenumerate.c index 453920b9..327971e7 100644 --- a/daemon/gvfsjobenumerate.c +++ b/daemon/gvfsjobenumerate.c @@ -14,7 +14,8 @@ G_DEFINE_TYPE (GVfsJobEnumerate, g_vfs_job_enumerate, G_TYPE_VFS_JOB_DBUS); -static gboolean start (GVfsJob *job); +static void run (GVfsJob *job); +static gboolean try (GVfsJob *job); static void send_reply (GVfsJob *job); static DBusMessage *create_reply (GVfsJob *job, DBusConnection *connection, @@ -43,7 +44,8 @@ g_vfs_job_enumerate_class_init (GVfsJobEnumerateClass *klass) GVfsJobDBusClass *job_dbus_class = G_VFS_JOB_DBUS_CLASS (klass); gobject_class->finalize = g_vfs_job_enumerate_finalize; - job_class->start = start; + job_class->run = run; + job_class->try = try; job_class->send_reply = send_reply; job_dbus_class->create_reply = create_reply; } @@ -175,17 +177,35 @@ g_vfs_job_enumerate_done (GVfsJobEnumerate *job) g_vfs_job_emit_finished (G_VFS_JOB (job)); } +static void +run (GVfsJob *job) +{ + GVfsJobEnumerate *op_job = G_VFS_JOB_ENUMERATE (job); + GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend); + + class->enumerate (op_job->backend, + op_job, + op_job->filename, + op_job->requested, + op_job->attributes, + op_job->follow_symlinks); +} + static gboolean -start (GVfsJob *job) +try (GVfsJob *job) { GVfsJobEnumerate *op_job = G_VFS_JOB_ENUMERATE (job); + GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend); + + if (class->try_enumerate == NULL) + return FALSE; - return g_vfs_backend_enumerate (op_job->backend, - op_job, - op_job->filename, - op_job->requested, - op_job->attributes, - op_job->follow_symlinks); + return class->try_enumerate (op_job->backend, + op_job, + op_job->filename, + op_job->requested, + op_job->attributes, + op_job->follow_symlinks); } static void diff --git a/daemon/gvfsjobgetinfo.c b/daemon/gvfsjobgetinfo.c index 1c609522..582a88b0 100644 --- a/daemon/gvfsjobgetinfo.c +++ b/daemon/gvfsjobgetinfo.c @@ -14,7 +14,8 @@ G_DEFINE_TYPE (GVfsJobGetInfo, g_vfs_job_get_info, G_TYPE_VFS_JOB_DBUS); -static gboolean start (GVfsJob *job); +static void run (GVfsJob *job); +static gboolean try (GVfsJob *job); static DBusMessage *create_reply (GVfsJob *job, DBusConnection *connection, DBusMessage *message); @@ -44,7 +45,8 @@ g_vfs_job_get_info_class_init (GVfsJobGetInfoClass *klass) GVfsJobDBusClass *job_dbus_class = G_VFS_JOB_DBUS_CLASS (klass); gobject_class->finalize = g_vfs_job_get_info_finalize; - job_class->start = start; + job_class->run = run; + job_class->try = try; job_dbus_class->create_reply = create_reply; } @@ -99,17 +101,35 @@ g_vfs_job_get_info_new (DBusConnection *connection, return G_VFS_JOB (job); } +static void +run (GVfsJob *job) +{ + GVfsJobGetInfo *op_job = G_VFS_JOB_GET_INFO (job); + GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend); + + class->get_info (op_job->backend, + op_job, + op_job->filename, + op_job->requested, + op_job->attributes, + op_job->follow_symlinks); +} + static gboolean -start (GVfsJob *job) +try (GVfsJob *job) { GVfsJobGetInfo *op_job = G_VFS_JOB_GET_INFO (job); + GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend); + + if (class->try_get_info == NULL) + return FALSE; - return g_vfs_backend_get_info (op_job->backend, - op_job, - op_job->filename, - op_job->requested, - op_job->attributes, - op_job->follow_symlinks); + return class->try_get_info (op_job->backend, + op_job, + op_job->filename, + op_job->requested, + op_job->attributes, + op_job->follow_symlinks); } void diff --git a/daemon/gvfsjobopenforread.c b/daemon/gvfsjobopenforread.c index b6de7fcb..c36b965c 100644 --- a/daemon/gvfsjobopenforread.c +++ b/daemon/gvfsjobopenforread.c @@ -14,7 +14,8 @@ G_DEFINE_TYPE (GVfsJobOpenForRead, g_vfs_job_open_for_read, G_TYPE_VFS_JOB_DBUS); -static gboolean start (GVfsJob *job); +static void run (GVfsJob *job); +static gboolean try (GVfsJob *job); static void finished (GVfsJob *job); static DBusMessage *create_reply (GVfsJob *job, DBusConnection *connection, @@ -46,7 +47,8 @@ g_vfs_job_open_for_read_class_init (GVfsJobOpenForReadClass *klass) GVfsJobDBusClass *job_dbus_class = G_VFS_JOB_DBUS_CLASS (klass); gobject_class->finalize = g_vfs_job_open_for_read_finalize; - job_class->start = start; + job_class->run = run; + job_class->try = try; job_class->finished = finished; job_dbus_class->create_reply = create_reply; } @@ -93,16 +95,32 @@ g_vfs_job_open_for_read_new (DBusConnection *connection, return G_VFS_JOB (job); } +static void +run (GVfsJob *job) +{ + GVfsJobOpenForRead *op_job = G_VFS_JOB_OPEN_FOR_READ (job); + GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend); + + class->open_for_read (op_job->backend, + op_job, + op_job->filename); +} + static gboolean -start (GVfsJob *job) +try (GVfsJob *job) { GVfsJobOpenForRead *op_job = G_VFS_JOB_OPEN_FOR_READ (job); + GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend); - return g_vfs_backend_open_for_read (op_job->backend, - op_job, - op_job->filename); + if (class->try_open_for_read == NULL) + return FALSE; + + return class->try_open_for_read (op_job->backend, + op_job, + op_job->filename); } + void g_vfs_job_open_for_read_set_handle (GVfsJobOpenForRead *job, GVfsBackendHandle handle) diff --git a/daemon/gvfsjobread.c b/daemon/gvfsjobread.c index e8f45df6..1cdb920b 100644 --- a/daemon/gvfsjobread.c +++ b/daemon/gvfsjobread.c @@ -13,8 +13,9 @@ G_DEFINE_TYPE (GVfsJobRead, g_vfs_job_read, G_TYPE_VFS_JOB); -static gboolean start (GVfsJob *job); -static void send_reply (GVfsJob *job); +static void run (GVfsJob *job); +static gboolean try (GVfsJob *job); +static void send_reply (GVfsJob *job); static void g_vfs_job_read_finalize (GObject *object) @@ -38,7 +39,8 @@ g_vfs_job_read_class_init (GVfsJobReadClass *klass) gobject_class->finalize = g_vfs_job_read_finalize; - job_class->start = start; + job_class->run = run; + job_class->try = try; job_class->send_reply = send_reply; } @@ -84,18 +86,36 @@ send_reply (GVfsJob *job) } } +static void +run (GVfsJob *job) +{ + GVfsJobRead *op_job = G_VFS_JOB_READ (job); + GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend); + + class->read (op_job->backend, + op_job, + op_job->handle, + op_job->buffer, + op_job->bytes_requested); +} + static gboolean -start (GVfsJob *job) +try (GVfsJob *job) { GVfsJobRead *op_job = G_VFS_JOB_READ (job); + GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend); - return g_vfs_backend_read (op_job->backend, - op_job, - op_job->handle, - op_job->buffer, - op_job->bytes_requested); + if (class->try_read == NULL) + return FALSE; + + return class->try_read (op_job->backend, + op_job, + op_job->handle, + op_job->buffer, + op_job->bytes_requested); } + /* Takes ownership */ void g_vfs_job_read_set_size (GVfsJobRead *job, diff --git a/daemon/gvfsjobseekread.c b/daemon/gvfsjobseekread.c index 0e898cf1..2314e264 100644 --- a/daemon/gvfsjobseekread.c +++ b/daemon/gvfsjobseekread.c @@ -13,8 +13,9 @@ G_DEFINE_TYPE (GVfsJobSeekRead, g_vfs_job_seek_read, G_TYPE_VFS_JOB); -static gboolean start (GVfsJob *job); -static void send_reply (GVfsJob *job); +static void run (GVfsJob *job); +static gboolean try (GVfsJob *job); +static void send_reply (GVfsJob *job); static void g_vfs_job_seek_read_finalize (GObject *object) @@ -36,7 +37,8 @@ g_vfs_job_seek_read_class_init (GVfsJobSeekReadClass *klass) gobject_class->finalize = g_vfs_job_seek_read_finalize; - job_class->start = start; + job_class->run = run; + job_class->try = try; job_class->send_reply = send_reply; } @@ -83,16 +85,33 @@ send_reply (GVfsJob *job) } } +static void +run (GVfsJob *job) +{ + GVfsJobSeekRead *op_job = G_VFS_JOB_SEEK_READ (job); + GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend); + + class->seek_on_read (op_job->backend, + op_job, + op_job->handle, + op_job->requested_offset, + op_job->seek_type); +} + static gboolean -start (GVfsJob *job) +try (GVfsJob *job) { GVfsJobSeekRead *op_job = G_VFS_JOB_SEEK_READ (job); + GVfsBackendClass *class = G_VFS_BACKEND_GET_CLASS (op_job->backend); - return g_vfs_backend_seek_on_read (op_job->backend, - op_job, - op_job->handle, - op_job->requested_offset, - op_job->seek_type); + if (class->try_seek_on_read == NULL) + return FALSE; + + return class->try_seek_on_read (op_job->backend, + op_job, + op_job->handle, + op_job->requested_offset, + op_job->seek_type); } void |