]> www.fi.muni.cz Git - evince.git/blob - backend/ev-document.c
aa61fc694b94f062fac9a55d6a3ce3488ffa972e
[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 char *
186 ev_document_get_text (EvDocument  *document,
187                       int          page,
188                       EvRectangle *rect)
189 {
190         EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
191         char *retval;
192
193         LOG ("ev_document_get_text");
194         retval = iface->get_text (document, page, rect);
195
196         return retval;
197 }
198
199 GList *
200 ev_document_get_links (EvDocument *document,
201                        int         page)
202 {
203         EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
204         GList *retval;
205
206         LOG ("ev_document_get_link");
207         if (iface->get_links == NULL)
208                 return NULL;
209         retval = iface->get_links (document, page);
210
211         return retval;
212 }
213
214
215
216 GdkPixbuf *
217 ev_document_render_pixbuf (EvDocument *document,
218                            int         page,
219                            double      scale)
220 {
221         EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document);
222         GdkPixbuf *retval;
223
224         LOG ("ev_document_render_pixbuf");
225         g_assert (iface->render_pixbuf);
226
227         retval = iface->render_pixbuf (document, page, scale);
228
229         return retval;
230 }
231