~ubuntu-branches/ubuntu/oneiric/evince/oneiric-updates

« back to all changes in this revision

Viewing changes to libview/ev-jobs.c

  • Committer: Bazaar Package Importer
  • Author(s): Frederic Peters
  • Date: 2011-04-14 16:20:57 UTC
  • mfrom: (1.6.4 upstream)
  • mto: (1.3.5 experimental)
  • mto: This revision was merged to the branch mainline in revision 138.
  • Revision ID: james.westby@ubuntu.com-20110414162057-0ofhbd139zs6ev6y
ImportĀ upstreamĀ versionĀ 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
 *
16
16
 * You should have received a copy of the GNU General Public License
17
17
 * along with this program; if not, write to the Free Software
18
 
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
19
 */
20
20
 
21
21
#include <config.h>
22
22
 
23
23
#include "ev-jobs.h"
24
 
#include "ev-document-thumbnails.h"
25
24
#include "ev-document-links.h"
26
25
#include "ev-document-images.h"
27
26
#include "ev-document-forms.h"
36
35
#include "ev-document-print.h"
37
36
#include "ev-document-annotations.h"
38
37
#include "ev-document-attachments.h"
 
38
#include "ev-document-text.h"
39
39
#include "ev-debug.h"
40
40
 
41
41
#include <errno.h>
49
49
static void ev_job_links_class_init       (EvJobLinksClass       *class);
50
50
static void ev_job_attachments_init       (EvJobAttachments      *job);
51
51
static void ev_job_attachments_class_init (EvJobAttachmentsClass *class);
 
52
static void ev_job_annots_init            (EvJobAnnots           *job);
 
53
static void ev_job_annots_class_init      (EvJobAnnotsClass      *class);
52
54
static void ev_job_render_init            (EvJobRender           *job);
53
55
static void ev_job_render_class_init      (EvJobRenderClass      *class);
54
56
static void ev_job_page_data_init         (EvJobPageData         *job);
91
93
G_DEFINE_ABSTRACT_TYPE (EvJob, ev_job, G_TYPE_OBJECT)
92
94
G_DEFINE_TYPE (EvJobLinks, ev_job_links, EV_TYPE_JOB)
93
95
G_DEFINE_TYPE (EvJobAttachments, ev_job_attachments, EV_TYPE_JOB)
 
96
G_DEFINE_TYPE (EvJobAnnots, ev_job_annots, EV_TYPE_JOB)
94
97
G_DEFINE_TYPE (EvJobRender, ev_job_render, EV_TYPE_JOB)
95
98
G_DEFINE_TYPE (EvJobPageData, ev_job_page_data, EV_TYPE_JOB)
96
99
G_DEFINE_TYPE (EvJobThumbnail, ev_job_thumbnail, EV_TYPE_JOB)
213
216
void
214
217
ev_job_cancel (EvJob *job)
215
218
{
216
 
        if (job->cancelled || (job->finished && job->idle_finished_id == 0))
 
219
        if (job->cancelled)
217
220
                return;
218
221
 
219
222
        ev_debug_message (DEBUG_JOBS, "job %s (%p) cancelled", EV_GET_TYPE_NAME (job), job);
222
225
        /* This should never be called from a thread */
223
226
        job->cancelled = TRUE;
224
227
        g_cancellable_cancel (job->cancellable);
 
228
 
 
229
        if (job->finished && job->idle_finished_id == 0)
 
230
                return;
 
231
 
225
232
        g_signal_emit (job, job_signals[CANCELLED], 0);
226
233
}
227
234
 
329
336
}
330
337
 
331
338
static gboolean
 
339
fill_page_labels (GtkTreeModel   *tree_model,
 
340
                  GtkTreePath    *path,
 
341
                  GtkTreeIter    *iter,
 
342
                  EvJob          *job)
 
343
{
 
344
        EvDocumentLinks *document_links;
 
345
        EvLink          *link;
 
346
        gchar           *page_label;
 
347
 
 
348
        gtk_tree_model_get (tree_model, iter,
 
349
                            EV_DOCUMENT_LINKS_COLUMN_LINK, &link,
 
350
                            -1);
 
351
 
 
352
        if (!link)
 
353
                return FALSE;
 
354
 
 
355
        document_links = EV_DOCUMENT_LINKS (job->document);
 
356
        page_label = ev_document_links_get_link_page_label (document_links, link);
 
357
        if (!page_label)
 
358
                return FALSE;
 
359
 
 
360
        gtk_tree_store_set (GTK_TREE_STORE (tree_model), iter,
 
361
                            EV_DOCUMENT_LINKS_COLUMN_PAGE_LABEL, page_label,
 
362
                            -1);
 
363
 
 
364
        g_free (page_label);
 
365
        g_object_unref (link);
 
366
 
 
367
        return FALSE;
 
368
}
 
369
 
 
370
static gboolean
332
371
ev_job_links_run (EvJob *job)
333
372
{
334
373
        EvJobLinks *job_links = EV_JOB_LINKS (job);
339
378
        ev_document_doc_mutex_lock ();
340
379
        job_links->model = ev_document_links_get_links_model (EV_DOCUMENT_LINKS (job->document));
341
380
        ev_document_doc_mutex_unlock ();
342
 
        
 
381
 
 
382
        gtk_tree_model_foreach (job_links->model, (GtkTreeModelForeachFunc)fill_page_labels, job);
 
383
 
343
384
        ev_job_succeeded (job);
344
385
        
345
386
        return FALSE;
434
475
        return job;
435
476
}
436
477
 
 
478
/* EvJobAnnots */
 
479
static void
 
480
ev_job_annots_init (EvJobAnnots *job)
 
481
{
 
482
        EV_JOB (job)->run_mode = EV_JOB_RUN_THREAD;
 
483
}
 
484
 
 
485
static void
 
486
ev_job_annots_dispose (GObject *object)
 
487
{
 
488
        EvJobAnnots *job;
 
489
 
 
490
        ev_debug_message (DEBUG_JOBS, NULL);
 
491
 
 
492
        job = EV_JOB_ANNOTS (object);
 
493
 
 
494
        if (job->annots) {
 
495
                g_list_foreach (job->annots, (GFunc)ev_mapping_list_unref, NULL);
 
496
                g_list_free (job->annots);
 
497
                job->annots = NULL;
 
498
        }
 
499
 
 
500
        G_OBJECT_CLASS (ev_job_annots_parent_class)->dispose (object);
 
501
}
 
502
 
 
503
static gboolean
 
504
ev_job_annots_run (EvJob *job)
 
505
{
 
506
        EvJobAnnots *job_annots = EV_JOB_ANNOTS (job);
 
507
        gint         i;
 
508
 
 
509
        ev_debug_message (DEBUG_JOBS, NULL);
 
510
        ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
 
511
 
 
512
        ev_document_doc_mutex_lock ();
 
513
        for (i = 0; i < ev_document_get_n_pages (job->document); i++) {
 
514
                EvMappingList *mapping_list;
 
515
                EvPage        *page;
 
516
 
 
517
                page = ev_document_get_page (job->document, i);
 
518
                mapping_list = ev_document_annotations_get_annotations (EV_DOCUMENT_ANNOTATIONS (job->document),
 
519
                                                                        page);
 
520
                g_object_unref (page);
 
521
 
 
522
                if (mapping_list)
 
523
                        job_annots->annots = g_list_prepend (job_annots->annots, mapping_list);
 
524
        }
 
525
        ev_document_doc_mutex_unlock ();
 
526
 
 
527
        job_annots->annots = g_list_reverse (job_annots->annots);
 
528
 
 
529
        ev_job_succeeded (job);
 
530
 
 
531
        return FALSE;
 
532
}
 
533
 
 
534
static void
 
535
ev_job_annots_class_init (EvJobAnnotsClass *class)
 
536
{
 
537
        GObjectClass *oclass = G_OBJECT_CLASS (class);
 
538
        EvJobClass   *job_class = EV_JOB_CLASS (class);
 
539
 
 
540
        oclass->dispose = ev_job_annots_dispose;
 
541
        job_class->run = ev_job_annots_run;
 
542
}
 
543
 
 
544
EvJob *
 
545
ev_job_annots_new (EvDocument *document)
 
546
{
 
547
        EvJob *job;
 
548
 
 
549
        ev_debug_message (DEBUG_JOBS, NULL);
 
550
 
 
551
        job = g_object_new (EV_TYPE_JOB_ANNOTS, NULL);
 
552
        job->document = g_object_ref (document);
 
553
 
 
554
        return job;
 
555
}
 
556
 
437
557
/* EvJobRender */
438
558
static void
439
559
ev_job_render_init (EvJobRender *job)
461
581
        }
462
582
 
463
583
        if (job->selection_region) {
464
 
                gdk_region_destroy (job->selection_region);
 
584
                cairo_region_destroy (job->selection_region);
465
585
                job->selection_region = NULL;
466
586
        }
467
587
 
593
713
        ev_document_doc_mutex_lock ();
594
714
        ev_page = ev_document_get_page (job->document, job_pd->page);
595
715
 
596
 
        if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_TEXT) && EV_IS_SELECTION (job->document))
 
716
        if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_TEXT_MAPPING) && EV_IS_DOCUMENT_TEXT (job->document))
597
717
                job_pd->text_mapping =
598
 
                        ev_selection_get_selection_map (EV_SELECTION (job->document), ev_page);
 
718
                        ev_document_text_get_text_mapping (EV_DOCUMENT_TEXT (job->document), ev_page);
 
719
        if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_TEXT) && EV_IS_DOCUMENT_TEXT (job->document))
 
720
                job_pd->text =
 
721
                        ev_document_text_get_text (EV_DOCUMENT_TEXT (job->document), ev_page);
 
722
        if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_TEXT_LAYOUT) && EV_IS_DOCUMENT_TEXT (job->document))
 
723
                ev_document_text_get_text_layout (EV_DOCUMENT_TEXT (job->document),
 
724
                                                  ev_page,
 
725
                                                  &(job_pd->text_layout),
 
726
                                                  &(job_pd->text_layout_length));
599
727
        if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_LINKS) && EV_IS_DOCUMENT_LINKS (job->document))
600
728
                job_pd->link_mapping =
601
729
                        ev_document_links_get_links (EV_DOCUMENT_LINKS (job->document), ev_page);
674
802
{
675
803
        EvJobThumbnail  *job_thumb = EV_JOB_THUMBNAIL (job);
676
804
        EvRenderContext *rc;
 
805
        GdkPixbuf       *pixbuf;
677
806
        EvPage          *page;
678
807
 
679
808
        ev_debug_message (DEBUG_JOBS, "%d (%p)", job_thumb->page, job);
685
814
        rc = ev_render_context_new (page, job_thumb->rotation, job_thumb->scale);
686
815
        g_object_unref (page);
687
816
 
688
 
        job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (job->document),
689
 
                                                                     rc, TRUE);
 
817
        pixbuf = ev_document_get_thumbnail (job->document, rc);
690
818
        g_object_unref (rc);
691
819
        ev_document_doc_mutex_unlock ();
692
820
 
 
821
        if (pixbuf)
 
822
                job_thumb->thumbnail = ev_document_misc_get_thumbnail_frame (-1, -1, pixbuf);
 
823
        g_object_unref (pixbuf);
 
824
 
693
825
        ev_job_succeeded (job);
694
826
        
695
827
        return FALSE;
840
972
           because, e.g., a password is required - if so, just reload rather than
841
973
           creating a new instance */
842
974
        if (job->document) {
 
975
                const gchar *uncompressed_uri;
 
976
 
843
977
                if (job_load->password) {
844
978
                        ev_document_security_set_password (EV_DOCUMENT_SECURITY (job->document),
845
979
                                                           job_load->password);
848
982
                job->failed = FALSE;
849
983
                job->finished = FALSE;
850
984
                g_clear_error (&job->error);
851
 
                
 
985
 
 
986
                uncompressed_uri = g_object_get_data (G_OBJECT (job->document),
 
987
                                                      "uri-uncompressed");
852
988
                ev_document_load (job->document,
853
 
                                  job_load->uri,
 
989
                                  uncompressed_uri ? uncompressed_uri : job_load->uri,
854
990
                                  &error);
855
991
        } else {
856
992
                job->document = ev_document_factory_get_document (job_load->uri,
1083
1219
                gint i;
1084
1220
 
1085
1221
                for (i = 0; i < job->n_pages; i++) {
1086
 
                        g_list_foreach (job->pages[i], (GFunc)g_free, NULL);
 
1222
                        g_list_foreach (job->pages[i], (GFunc)ev_rectangle_free, NULL);
1087
1223
                        g_list_free (job->pages[i]);
1088
1224
                }
1089
1225
 
1424
1560
 
1425
1561
        ev_document_doc_mutex_unlock ();
1426
1562
 
 
1563
        if (g_cancellable_is_cancelled (job->cancellable))
 
1564
                return FALSE;
 
1565
 
1427
1566
        cr_status = cairo_status (job_print->cr);
1428
1567
        if (cr_status == CAIRO_STATUS_SUCCESS) {
1429
1568
                ev_job_succeeded (job);