]> www.fi.muni.cz Git - evince.git/blob - shell/ev-jobs.c
PageCache and EvJobs are moved from backend to shell. Two new jobs to
[evince.git] / shell / ev-jobs.c
1 #include "ev-jobs.h"
2 #include "ev-job-queue.h"
3 #include "ev-document-thumbnails.h"
4 #include "ev-document-links.h"
5 #include "ev-async-renderer.h"
6
7 static void ev_job_init                 (EvJob               *job);
8 static void ev_job_class_init           (EvJobClass          *class);
9 static void ev_job_links_init           (EvJobLinks          *job);
10 static void ev_job_links_class_init     (EvJobLinksClass     *class);
11 static void ev_job_render_init          (EvJobRender         *job);
12 static void ev_job_render_class_init    (EvJobRenderClass    *class);
13 static void ev_job_thumbnail_init       (EvJobThumbnail      *job);
14 static void ev_job_thumbnail_class_init (EvJobThumbnailClass *class);
15 static void ev_job_load_init            (EvJobLoad           *job);
16 static void ev_job_load_class_init      (EvJobLoadClass      *class);
17
18 enum
19 {
20         FINISHED,
21         LAST_SIGNAL
22 };
23
24 static guint job_signals[LAST_SIGNAL] = { 0 };
25
26 G_DEFINE_TYPE (EvJob, ev_job, G_TYPE_OBJECT)
27 G_DEFINE_TYPE (EvJobLinks, ev_job_links, EV_TYPE_JOB)
28 G_DEFINE_TYPE (EvJobRender, ev_job_render, EV_TYPE_JOB)
29 G_DEFINE_TYPE (EvJobThumbnail, ev_job_thumbnail, EV_TYPE_JOB)
30 G_DEFINE_TYPE (EvJobLoad, ev_job_load, EV_TYPE_JOB)
31
32 static void ev_job_init (EvJob *job) { /* Do Nothing */ }
33
34 static void
35 ev_job_dispose (GObject *object)
36 {
37         EvJob *job;
38
39         job = EV_JOB (object);
40
41         if (job->document) {
42                 g_object_unref (job->document);
43                 job->document = NULL;
44         }
45
46         (* G_OBJECT_CLASS (ev_job_parent_class)->dispose) (object);
47 }
48
49 static void
50 ev_job_class_init (EvJobClass *class)
51 {
52         GObjectClass *oclass;
53
54         oclass = G_OBJECT_CLASS (class);
55
56         oclass->dispose = ev_job_dispose;
57
58         job_signals [FINISHED] =
59                 g_signal_new ("finished",
60                               EV_TYPE_JOB,
61                               G_SIGNAL_RUN_LAST,
62                               G_STRUCT_OFFSET (EvJobClass, finished),
63                               NULL, NULL,
64                               g_cclosure_marshal_VOID__VOID,
65                               G_TYPE_NONE, 0);
66 }
67
68
69 static void ev_job_links_init (EvJobLinks *job) { /* Do Nothing */ }
70
71 static void
72 ev_job_links_dispose (GObject *object)
73 {
74         EvJobLinks *job;
75
76         job = EV_JOB_LINKS (object);
77
78         if (job->model) {
79                 g_object_unref (job->model);
80                 job->model = NULL;
81         }
82
83         (* G_OBJECT_CLASS (ev_job_links_parent_class)->dispose) (object);
84 }
85
86 static void
87 ev_job_links_class_init (EvJobLinksClass *class)
88 {
89         GObjectClass *oclass;
90
91         oclass = G_OBJECT_CLASS (class);
92
93         oclass->dispose = ev_job_links_dispose;
94 }
95
96
97 static void ev_job_render_init (EvJobRender *job) { /* Do Nothing */ }
98
99 static void
100 ev_job_render_dispose (GObject *object)
101 {
102         EvJobRender *job;
103
104         job = EV_JOB_RENDER (object);
105
106         if (job->pixbuf) {
107                 g_object_unref (job->pixbuf);
108                 job->pixbuf = NULL;
109         }
110
111         (* G_OBJECT_CLASS (ev_job_render_parent_class)->dispose) (object);
112 }
113
114 static void
115 ev_job_render_class_init (EvJobRenderClass *class)
116 {
117         GObjectClass *oclass;
118
119         oclass = G_OBJECT_CLASS (class);
120
121         oclass->dispose = ev_job_render_dispose;
122 }
123
124 static void ev_job_thumbnail_init (EvJobThumbnail *job) { /* Do Nothing */ }
125
126 static void
127 ev_job_thumbnail_dispose (GObject *object)
128 {
129         EvJobThumbnail *job;
130
131         job = EV_JOB_THUMBNAIL (object);
132
133         if (job->thumbnail) {
134                 g_object_unref (job->thumbnail);
135                 job->thumbnail = NULL;
136         }
137
138         (* G_OBJECT_CLASS (ev_job_thumbnail_parent_class)->dispose) (object);
139 }
140
141 static void
142 ev_job_thumbnail_class_init (EvJobThumbnailClass *class)
143 {
144         GObjectClass *oclass;
145
146         oclass = G_OBJECT_CLASS (class);
147
148         oclass->dispose = ev_job_thumbnail_dispose;
149 }
150
151 static void ev_job_load_init (EvJobLoad *job) { /* Do Nothing */ }
152
153 static void
154 ev_job_load_dispose (GObject *object)
155 {
156         EvJobLoad *job;
157
158         job = EV_JOB_LOAD (object);
159
160         if (job->uri) {
161                 g_free (job->uri);
162                 job->uri = NULL;
163         }
164
165         if (job->error) {
166                 g_error_free (job->error);
167                 job->error = NULL;
168         }
169
170         (* G_OBJECT_CLASS (ev_job_load_parent_class)->dispose) (object);
171 }
172
173 static void
174 ev_job_load_class_init (EvJobLoadClass *class)
175 {
176         GObjectClass *oclass;
177
178         oclass = G_OBJECT_CLASS (class);
179
180         oclass->dispose = ev_job_load_dispose;
181 }
182
183 /* Public functions */
184 void
185 ev_job_finished (EvJob *job)
186 {
187         g_return_if_fail (EV_IS_JOB (job));
188
189         g_signal_emit (job, job_signals[FINISHED], 0);
190 }
191
192 EvJob *
193 ev_job_links_new (EvDocument *document)
194 {
195         EvJob *job;
196
197         job = g_object_new (EV_TYPE_JOB_LINKS, NULL);
198         job->document = g_object_ref (document);
199
200         return job;
201 }
202
203 void
204 ev_job_links_run (EvJobLinks *job)
205 {
206         g_return_if_fail (EV_IS_JOB_LINKS (job));
207
208         ev_document_doc_mutex_lock ();
209         job->model = ev_document_links_get_links_model (EV_DOCUMENT_LINKS (EV_JOB (job)->document));
210         EV_JOB (job)->finished = TRUE;
211         ev_document_doc_mutex_unlock ();
212 }
213
214
215 EvJob *
216 ev_job_render_new (EvDocument *document,
217                    gint        page,
218                    double      scale,
219                    gint        width,
220                    gint        height,
221                    gboolean    include_links)
222 {
223         EvJobRender *job;
224
225         job = g_object_new (EV_TYPE_JOB_RENDER, NULL);
226
227         EV_JOB (job)->document = g_object_ref (document);
228         job->page = page;
229         job->scale = scale;
230         job->target_width = width;
231         job->target_height = height;
232         job->include_links = include_links;
233
234         if (EV_IS_ASYNC_RENDERER (document)) {  
235                 EV_JOB (job)->async = TRUE;
236         }
237
238         return EV_JOB (job);
239 }
240
241 static void
242 render_finished_cb (EvDocument *document, GdkPixbuf *pixbuf, EvJobRender *job)
243 {
244         g_signal_handlers_disconnect_by_func (EV_JOB (job)->document,
245                                               render_finished_cb, job);
246
247         EV_JOB (job)->finished = TRUE;
248         job->pixbuf = g_object_ref (pixbuf);
249         ev_job_finished (EV_JOB (job));
250 }
251
252 void
253 ev_job_render_run (EvJobRender *job)
254 {
255         g_return_if_fail (EV_IS_JOB_RENDER (job));
256
257         ev_document_doc_mutex_lock ();
258
259         if (EV_JOB (job)->async) {
260                 EvAsyncRenderer *renderer = EV_ASYNC_RENDERER (EV_JOB (job)->document);
261                 ev_async_renderer_render_pixbuf (renderer, job->page, job->scale);
262                 g_signal_connect (EV_JOB (job)->document, "render_finished",
263                                   G_CALLBACK (render_finished_cb), job);
264         } else {
265                 job->pixbuf = ev_document_render_pixbuf (EV_JOB (job)->document,
266                                                          job->page,
267                                                          job->scale);
268                 if (job->include_links)
269                         job->link_mapping = ev_document_get_links (EV_JOB (job)->document, job->page);
270
271                 EV_JOB (job)->finished = TRUE;
272         }
273
274         ev_document_doc_mutex_unlock ();
275 }
276
277 EvJob *
278 ev_job_thumbnail_new (EvDocument *document,
279                       gint        page,
280                       gint        requested_width)
281 {
282         EvJobThumbnail *job;
283
284         job = g_object_new (EV_TYPE_JOB_THUMBNAIL, NULL);
285
286         EV_JOB (job)->document = g_object_ref (document);
287         job->page = page;
288         job->requested_width = requested_width;
289
290         return EV_JOB (job);
291 }
292
293 void
294 ev_job_thumbnail_run (EvJobThumbnail *job)
295 {
296         g_return_if_fail (EV_IS_JOB_THUMBNAIL (job));
297
298         ev_document_doc_mutex_lock ();
299
300         job->thumbnail =
301                 ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB (job)->document),
302                                                       job->page,
303                                                       job->requested_width,
304                                                       TRUE);
305         EV_JOB (job)->finished = TRUE;
306
307         ev_document_doc_mutex_unlock ();
308 }
309
310 EvJob *
311 ev_job_load_new (EvDocument *document,
312                  const gchar *uri)
313 {
314         EvJobLoad *job;
315
316         job = g_object_new (EV_TYPE_JOB_LOAD, NULL);
317
318         EV_JOB (job)->document = g_object_ref (document);
319         job->uri = g_strdup (uri);
320
321         return EV_JOB (job);
322 }
323
324 void
325 ev_job_load_run (EvJobLoad *job)
326 {
327         g_return_if_fail (EV_IS_JOB_LOAD (job));
328
329         ev_document_doc_mutex_lock ();
330         
331         if (job->error) {
332                 g_error_free (job->error);
333                 job->error = NULL;
334         }
335             
336         ev_document_load (EV_JOB(job)->document, job->uri, &job->error);
337         
338         EV_JOB (job)->finished = TRUE;
339
340         ev_document_doc_mutex_unlock ();
341 }
342
343