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:
authorNickolay V. Shmyrev <nshmyrev@src.gnome.org>2006-04-02 23:24:26 (GMT)
committer Nickolay V. Shmyrev <nshmyrev@src.gnome.org>2006-04-02 23:24:26 (GMT)
commita4a3a2301361cb6a71e1b127e8e43589f2749105 (patch)
treef70db318215d8b3517999c0ad58407ff366536ef /shell/ev-jobs.c
parentf0d4f37e3b6a3433c15e1e35236c1ccffeca4bee (diff)
Cleanup mime type detection on document load. Fix for the bug #336448.
* backend/ev-document-factory.c: (get_document_from_uri), (ev_document_factory_get_document): * backend/ev-document-factory.h: * properties/ev-properties-main.c: (ev_properties_get_pages): * shell/Makefile.am: * 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-job-queue.h: * shell/ev-job-xfer.c: * shell/ev-job-xfer.h: * shell/ev-jobs.c: (ev_job_fonts_init), (ev_job_fonts_class_init), (ev_job_fonts_new), (ev_job_fonts_run), (ev_job_xfer_init), (ev_job_xfer_dispose), (ev_job_xfer_class_init), (ev_job_xfer_new), (ev_job_xfer_run): * shell/ev-jobs.h: * shell/ev-window.c: (ev_window_is_empty), (password_dialog_response), (ev_window_clear_xfer_job), (ev_window_xfer_job_cb), (ev_window_open_uri), (ev_window_cmd_focus_page_selector), (ev_window_cmd_scroll_forward), (ev_window_cmd_scroll_backward), (ev_window_cmd_continuous), (ev_window_cmd_dual), (ev_window_cmd_view_best_fit), (ev_window_cmd_view_page_width), (ev_window_dispose): * thumbnailer/evince-thumbnailer.c: (evince_thumbnail_pngenc_get): * Cleanup mime type detection on document load. Fix for the bug #336448.
Diffstat (limited to 'shell/ev-jobs.c')
-rw-r--r--shell/ev-jobs.c158
1 files changed, 95 insertions, 63 deletions
diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c
index 0f9bf73..7a37b2b 100644
--- a/shell/ev-jobs.c
+++ b/shell/ev-jobs.c
@@ -2,10 +2,17 @@
#include "ev-job-queue.h"
#include "ev-document-thumbnails.h"
#include "ev-document-links.h"
+#include "ev-document-factory.h"
+#include "ev-file-helpers.h"
#include "ev-document-fonts.h"
#include "ev-selection.h"
#include "ev-async-renderer.h"
+#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);
static void ev_job_links_init (EvJobLinks *job);
@@ -14,8 +21,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_load_init (EvJobLoad *job);
-static void ev_job_load_class_init (EvJobLoadClass *class);
+static void ev_job_xfer_init (EvJobXfer *job);
+static void ev_job_xfer_class_init (EvJobXferClass *class);
enum
{
@@ -29,8 +36,8 @@ G_DEFINE_TYPE (EvJob, ev_job, G_TYPE_OBJECT)
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 (EvJobLoad, ev_job_load, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobFonts, ev_job_fonts, EV_TYPE_JOB)
+G_DEFINE_TYPE (EvJobXfer, ev_job_xfer, EV_TYPE_JOB)
static void ev_job_init (EvJob *job) { /* Do Nothing */ }
@@ -166,38 +173,6 @@ ev_job_thumbnail_class_init (EvJobThumbnailClass *class)
oclass->dispose = ev_job_thumbnail_dispose;
}
-static void ev_job_load_init (EvJobLoad *job) { /* Do Nothing */ }
-
-static void
-ev_job_load_dispose (GObject *object)
-{
- EvJobLoad *job;
-
- job = EV_JOB_LOAD (object);
-
- if (job->uri) {
- g_free (job->uri);
- job->uri = NULL;
- }
-
- if (job->error) {
- g_error_free (job->error);
- job->error = NULL;
- }
-
- (* G_OBJECT_CLASS (ev_job_load_parent_class)->dispose) (object);
-}
-
-static void
-ev_job_load_class_init (EvJobLoadClass *class)
-{
- GObjectClass *oclass;
-
- oclass = G_OBJECT_CLASS (class);
-
- oclass->dispose = ev_job_load_dispose;
-}
-
/* Public functions */
void
ev_job_finished (EvJob *job)
@@ -355,68 +330,125 @@ ev_job_thumbnail_run (EvJobThumbnail *job)
ev_document_doc_mutex_unlock ();
}
+static void ev_job_fonts_init (EvJobFonts *job) { /* Do Nothing */ }
+
+static void ev_job_fonts_class_init (EvJobFontsClass *class) { /* Do Nothing */ }
+
EvJob *
-ev_job_load_new (EvDocument *document,
- const gchar *uri)
+ev_job_fonts_new (EvDocument *document)
{
- EvJobLoad *job;
+ EvJobFonts *job;
- job = g_object_new (EV_TYPE_JOB_LOAD, NULL);
+ job = g_object_new (EV_TYPE_JOB_FONTS, NULL);
EV_JOB (job)->document = g_object_ref (document);
- job->uri = g_strdup (uri);
return EV_JOB (job);
}
void
-ev_job_load_run (EvJobLoad *job)
+ev_job_fonts_run (EvJobFonts *job)
{
- g_return_if_fail (EV_IS_JOB_LOAD (job));
+ EvDocumentFonts *fonts;
+
+ g_return_if_fail (EV_IS_JOB_FONTS (job));
ev_document_doc_mutex_lock ();
- if (job->error) {
- g_error_free (job->error);
- job->error = NULL;
- }
-
- ev_document_load (EV_JOB(job)->document, job->uri, &job->error);
+ fonts = EV_DOCUMENT_FONTS (EV_JOB (job)->document);
+ job->scan_completed = !ev_document_fonts_scan (fonts, 20);
EV_JOB (job)->finished = TRUE;
ev_document_doc_mutex_unlock ();
}
-static void ev_job_fonts_init (EvJobFonts *job) { /* Do Nothing */ }
+static void ev_job_xfer_init (EvJobXfer *job) { /* Do Nothing */ }
+
+static void
+ev_job_xfer_dispose (GObject *object)
+{
+ EvJobXfer *job = EV_JOB_XFER (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;
+ }
+
+ (* G_OBJECT_CLASS (ev_job_xfer_parent_class)->dispose) (object);
+}
+
+static void
+ev_job_xfer_class_init (EvJobXferClass *class)
+{
+ GObjectClass *oclass;
+
+ oclass = G_OBJECT_CLASS (class);
+
+ oclass->dispose = ev_job_xfer_dispose;
+}
-static void ev_job_fonts_class_init (EvJobFontsClass *class) { /* Do Nothing */ }
EvJob *
-ev_job_fonts_new (EvDocument *document)
+ev_job_xfer_new (const gchar *uri)
{
- EvJobFonts *job;
+ EvJobXfer *job;
- job = g_object_new (EV_TYPE_JOB_FONTS, NULL);
+ job = g_object_new (EV_TYPE_JOB_XFER, NULL);
- EV_JOB (job)->document = g_object_ref (document);
+ job->uri = g_strdup (uri);
return EV_JOB (job);
}
void
-ev_job_fonts_run (EvJobFonts *job)
+ev_job_xfer_run (EvJobXfer *job)
{
- EvDocumentFonts *fonts;
-
- g_return_if_fail (EV_IS_JOB_FONTS (job));
+ GnomeVFSURI *source_uri;
+ GnomeVFSURI *target_uri;
- ev_document_doc_mutex_lock ();
-
- fonts = EV_DOCUMENT_FONTS (EV_JOB (job)->document);
- job->scan_completed = !ev_document_fonts_scan (fonts, 20);
+ g_return_if_fail (EV_IS_JOB_XFER (job));
+ if (job->error) {
+ g_error_free (job->error);
+ job->error = NULL;
+ }
+
+ 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;
+
+ tmp_name = ev_tmp_filename ();
+ base_name = g_path_get_basename (job->uri);
+ job->local_uri = g_strconcat ("file:", tmp_name, base_name, NULL);
+ 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);
+ }
+ gnome_vfs_uri_unref (source_uri);
+
+ EV_JOB(job)->document = ev_document_factory_get_document (job->local_uri ? job->local_uri : job->uri, &job->error);
EV_JOB (job)->finished = TRUE;
- ev_document_doc_mutex_unlock ();
+ return;
}
+