]> www.fi.muni.cz Git - evince.git/blob - backend/ev-document.c
Initial support for document info. Based on jrb patch.
[evince.git] / backend / ev-document.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
2 /*
3  *  Copyright (C) 2004 Marco Pesenti Gritti
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  *
19  */
20
21 #include "config.h"
22
23 #include "ev-document.h"
24
25 #include "ev-backend-marshalers.h"
26 #include "ev-job-queue.h"
27
28 static void ev_document_class_init (gpointer g_class);
29
30
31 GMutex *ev_doc_mutex = NULL;
32
33 #define LOG(x) 
34 GType
35 ev_document_get_type (void)
36 {
37         static GType type = 0;
38
39         if (G_UNLIKELY (type == 0))
40         {
41                 static const GTypeInfo our_info =
42                 {
43                         sizeof (EvDocumentIface),
44                         NULL,
45                         NULL,
46                         (GClassInitFunc)ev_document_class_init
47                 };
48
49                 type = g_type_register_static (G_TYPE_INTERFACE,
50                                                "EvDocument",
51                                                &our_info, (GTypeFlags)0);
52         }
53
54         return type;
55 }
56
57 GQuark
58 ev_document_error_quark (void)
59 {
60   static GQuark q = 0;
61   if (q == 0)
62     q = g_quark_from_static_string ("ev-document-error-quark");
63
64   return q;
65 }
66
67 static void
68 ev_document_class_init (gpointer g_class)
69 {
70         g_object_interface_install_property (g_class,
71                                 g_param_spec_string ("title",
72                                                      "Document Title",
73                                                      "The title of the document",
74                                                      NULL,
75                                                      G_PARAM_READABLE));
76 }
77
78 #define PAGE_CACHE_STRING "ev-page-cache"
79
80 EvPageCache *
81 ev_document_get_page_cache (EvDocument *document)
82 {
83         EvPageCache *page_cache;
84
85         g_return_val_if_fail (EV_IS_DOCUMENT (document), NULL);
86
87         page_cache = g_object_get_data (G_OBJECT (document), PAGE_CACHE_STRING);
88         if (page_cache == NULL) {
89                 page_cache = _ev_page_cache_new (document);
90                 g_object_set_data_full (G_OBJECT (document), PAGE_CACHE_STRING, page_cache, g_object_unref);
91         }
92
93         return page_cache;
94 }
95
96 GMutex *
97 ev_document_get_doc_mutex (void)
98 {
99         if (ev_doc_mutex == NULL) {
100                 ev_doc_mutex = g_mutex_new ();
101         }
102         return ev_doc_mutex;
103 }
104
105
106 gboolean
107 ev_document_load (EvDocument  *document,
108                   const char  *uri,
109                   GError     **error)
110 {
111         EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
112         gboolean retval;
113         LOG ("ev_document_load");
114         retval = iface->load (document, uri, error);
115
116         /* Call this to make the initial cached copy */
117         if (retval)
118                 ev_document_get_page_cache (document);
119
120         return retval;
121 }
122
123 gboolean
124 ev_document_save (EvDocument  *document,
125                   const char  *uri,
126                   GError     **error)
127 {
128         EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
129         gboolean retval;
130
131         LOG ("ev_document_save");
132         retval = iface->save (document, uri, error);
133
134         return retval;
135 }
136
137 char *
138 ev_document_get_title (EvDocument  *document)
139 {
140         char *title;
141
142         LOG ("ev_document_get_title");
143         g_object_get (document, "title", &title, NULL);
144
145         return title;
146 }
147
148 int
149 ev_document_get_n_pages (EvDocument  *document)
150 {
151         EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
152         gint retval;
153
154         LOG ("ev_document_get_n_pages");
155         retval = iface->get_n_pages (document);
156
157         return retval;
158 }
159
160 void
161 ev_document_get_page_size   (EvDocument   *document,
162                              int           page,
163                              double       *width,
164                              double       *height)
165 {
166         EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
167
168         LOG ("ev_document_get_page_size");
169         iface->get_page_size (document, page, width, height);
170 }
171
172 char *
173 ev_document_get_page_label(EvDocument    *document,
174                            int             page)
175 {
176         EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
177
178         LOG ("ev_document_get_page_label");
179         if (iface->get_page_label == NULL)
180                 return NULL;
181
182         return iface->get_page_label (document, page);
183 }
184
185 gboolean
186 ev_document_can_get_text (EvDocument  *document)
187 {
188         EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
189
190         return iface->can_get_text (document);
191 }
192
193 char *
194 ev_document_get_text (EvDocument  *document,
195                       int          page,
196                       EvRectangle *rect)
197 {
198         EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
199         char *retval;
200
201         LOG ("ev_document_get_text");
202         retval = iface->get_text (document, page, rect);
203
204         return retval;
205 }
206
207 GList *
208 ev_document_get_links (EvDocument *document,
209                        int         page)
210 {
211         EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
212         GList *retval;
213
214         LOG ("ev_document_get_link");
215         if (iface->get_links == NULL)
216                 return NULL;
217         retval = iface->get_links (document, page);
218
219         return retval;
220 }
221
222
223
224 GdkPixbuf *
225 ev_document_render_pixbuf (EvDocument *document,
226                            int         page,
227                            double      scale)
228 {
229         EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
230         GdkPixbuf *retval;
231
232         LOG ("ev_document_render_pixbuf");
233         g_assert (iface->render_pixbuf);
234
235         retval = iface->render_pixbuf (document, page, scale);
236
237         return retval;
238 }
239
240
241 EvDocumentInfo *
242 ev_document_render_get_info (EvDocument *document)
243 {
244         EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
245         EvDocumentInfo *retval = NULL;
246
247         LOG ("ev_document_render_pixbuf");
248
249         if (iface->get_info != NULL)
250                 retval = iface->get_info (document);
251
252         if (retval == NULL)
253                 retval = g_new0 (EvDocumentInfo, 1);
254
255         return retval;
256
257 }