Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/ev-jobs.c
diff options
context:
space:
mode:
authorCarlos Garcia Campos <carlosgc@gnome.org>2007-01-24 18:14:06 (GMT)
committer Carlos Garcia Campos <carlosgc@src.gnome.org>2007-01-24 18:14:06 (GMT)
commitca679febd93eef2a4a6afd99cbd7aee8ab537443 (patch)
tree1c570e90bc3097486f6986e5e524ca15965ebb13 /shell/ev-jobs.c
parent269bc85e3bab5cae0db919d922b75d56c49965c5 (diff)
Do file transfer asynchronously in the main thread instead of
2007-01-24 Carlos Garcia Campos <carlosgc@gnome.org> * shell/ev-job-queue.c: (handle_job), (search_for_jobs_unlocked), (no_jobs_available_unlocked), (ev_job_queue_init), (find_queue), (ev_job_queue_remove_job): * shell/ev-jobs.[ch]: (ev_job_load_init), (ev_job_load_class_init), (ev_job_load_dispose), (ev_job_load_new), (ev_job_load_set_uri), (ev_job_load_run): * shell/ev-window.c: (ev_window_is_empty), (password_dialog_response), (ev_window_popup_password_dialog), (ev_window_clear_load_job), (ev_window_load_job_cb), (xfer_update_progress_callback), (ev_window_open_uri), (ev_window_dispose): * shell/main.c: (main): Do file transfer asynchronously in the main thread instead of synchronously in the load thread. Fixes bugs #399694, #398307 and #343542. svn path=/trunk/; revision=2248
Diffstat (limited to 'shell/ev-jobs.c')
-rw-r--r--shell/ev-jobs.c85
1 files changed, 28 insertions, 57 deletions
diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c
index 8c26ca8..9fb242a 100644
--- a/shell/ev-jobs.c
+++ b/shell/ev-jobs.c
@@ -16,7 +16,6 @@
#include <libgnomevfs/gnome-vfs-uri.h>
#include <libgnomevfs/gnome-vfs-utils.h>
#include <libgnomevfs/gnome-vfs-ops.h>
-#include <libgnomevfs/gnome-vfs-xfer.h>
static void ev_job_init (EvJob *job);
static void ev_job_class_init (EvJobClass *class);
@@ -26,8 +25,8 @@ static void ev_job_render_init (EvJobRender *job);
static void ev_job_render_class_init (EvJobRenderClass *class);
static void ev_job_thumbnail_init (EvJobThumbnail *job);
static void ev_job_thumbnail_class_init (EvJobThumbnailClass *class);
-static void ev_job_xfer_init (EvJobXfer *job);
-static void ev_job_xfer_class_init (EvJobXferClass *class);
+static void ev_job_load_init (EvJobLoad *job);
+static void ev_job_load_class_init (EvJobLoadClass *class);
static void ev_job_print_init (EvJobPrint *job);
static void ev_job_print_class_init (EvJobPrintClass *class);
@@ -44,7 +43,7 @@ G_DEFINE_TYPE (EvJobLinks, ev_job_links, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobRender, ev_job_render, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobThumbnail, ev_job_thumbnail, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobFonts, ev_job_fonts, EV_TYPE_JOB)
-G_DEFINE_TYPE (EvJobXfer, ev_job_xfer, EV_TYPE_JOB)
+G_DEFINE_TYPE (EvJobLoad, ev_job_load, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobPrint, ev_job_print, EV_TYPE_JOB)
static void ev_job_init (EvJob *job) { /* Do Nothing */ }
@@ -425,23 +424,18 @@ ev_job_fonts_run (EvJobFonts *job)
ev_document_doc_mutex_unlock ();
}
-static void ev_job_xfer_init (EvJobXfer *job) { /* Do Nothing */ }
+static void ev_job_load_init (EvJobLoad *job) { /* Do Nothing */ }
static void
-ev_job_xfer_dispose (GObject *object)
+ev_job_load_dispose (GObject *object)
{
- EvJobXfer *job = EV_JOB_XFER (object);
+ EvJobLoad *job = EV_JOB_LOAD (object);
if (job->uri) {
g_free (job->uri);
job->uri = NULL;
}
- if (job->local_uri) {
- g_free (job->local_uri);
- job->local_uri = NULL;
- }
-
if (job->error) {
g_error_free (job->error);
job->error = NULL;
@@ -452,26 +446,26 @@ ev_job_xfer_dispose (GObject *object)
job->dest = NULL;
}
- (* G_OBJECT_CLASS (ev_job_xfer_parent_class)->dispose) (object);
+ (* G_OBJECT_CLASS (ev_job_load_parent_class)->dispose) (object);
}
static void
-ev_job_xfer_class_init (EvJobXferClass *class)
+ev_job_load_class_init (EvJobLoadClass *class)
{
GObjectClass *oclass;
oclass = G_OBJECT_CLASS (class);
- oclass->dispose = ev_job_xfer_dispose;
+ oclass->dispose = ev_job_load_dispose;
}
EvJob *
-ev_job_xfer_new (const gchar *uri, EvLinkDest *dest, EvWindowRunMode mode)
+ev_job_load_new (const gchar *uri, EvLinkDest *dest, EvWindowRunMode mode)
{
- EvJobXfer *job;
+ EvJobLoad *job;
- job = g_object_new (EV_TYPE_JOB_XFER, NULL);
+ job = g_object_new (EV_TYPE_JOB_LOAD, NULL);
job->uri = g_strdup (uri);
if (dest)
@@ -483,63 +477,40 @@ ev_job_xfer_new (const gchar *uri, EvLinkDest *dest, EvWindowRunMode mode)
}
void
-ev_job_xfer_run (EvJobXfer *job)
+ev_job_load_set_uri (EvJobLoad *job, const gchar *uri)
{
- GnomeVFSURI *source_uri;
- GnomeVFSURI *target_uri;
+ if (job->uri)
+ g_free (job->uri);
+ job->uri = g_strdup (uri);
+}
- g_return_if_fail (EV_IS_JOB_XFER (job));
+void
+ev_job_load_run (EvJobLoad *job)
+{
+ g_return_if_fail (EV_IS_JOB_LOAD (job));
if (job->error) {
g_error_free (job->error);
job->error = NULL;
}
+
+ ev_document_fc_mutex_lock ();
/* This job may already have a document even if the job didn't complete
because, e.g., a password is required - if so, just reload rather than
creating a new instance */
if (EV_JOB (job)->document) {
- ev_document_fc_mutex_lock ();
ev_document_load (EV_JOB (job)->document,
- job->local_uri ? job->local_uri : job->uri,
+ job->uri,
&job->error);
- ev_document_fc_mutex_unlock ();
- EV_JOB (job)->finished = TRUE;
- return;
- }
-
- source_uri = gnome_vfs_uri_new (job->uri);
- if (!gnome_vfs_uri_is_local (source_uri) && !job->local_uri) {
- char *tmp_name;
- char *base_name;
-
- /* We'd like to keep extension of source uri since
- * it helps to resolve some mime types, say cbz */
-
- tmp_name = ev_tmp_filename (NULL);
- base_name = gnome_vfs_uri_extract_short_name (source_uri);
- job->local_uri = g_strconcat ("file:", tmp_name, "-", base_name, NULL);
- g_free (base_name);
- g_free (tmp_name);
-
- target_uri = gnome_vfs_uri_new (job->local_uri);
-
- gnome_vfs_xfer_uri (source_uri, target_uri,
- GNOME_VFS_XFER_DEFAULT | GNOME_VFS_XFER_FOLLOW_LINKS,
- GNOME_VFS_XFER_ERROR_MODE_ABORT,
- GNOME_VFS_XFER_OVERWRITE_MODE_REPLACE,
- NULL,
- job);
- gnome_vfs_uri_unref (target_uri);
+ } else {
+ EV_JOB(job)->document =
+ ev_document_factory_get_document (job->uri,
+ &job->error);
}
- gnome_vfs_uri_unref (source_uri);
- ev_document_fc_mutex_lock ();
- EV_JOB(job)->document = ev_document_factory_get_document (job->local_uri ? job->local_uri : job->uri, &job->error);
ev_document_fc_mutex_unlock ();
EV_JOB (job)->finished = TRUE;
-
- return;
}
EvJob *