1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
3 * Copyright (C) 2005, Red Hat, Inc.
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)
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.
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.
25 #include "ev-document-types.h"
27 /* The various document type backends: */
28 #include "ev-poppler.h"
29 #include "pixbuf-document.h"
30 #include "tiff-document.h"
31 #include "ps-document.h"
33 #include "dvi-document.h"
36 #include "djvu-document.h"
40 #include <glib/gi18n.h>
41 #include <libgnomevfs/gnome-vfs-mime-utils.h>
42 #include <libgnomevfs/gnome-vfs-file-info.h>
43 #include <libgnomevfs/gnome-vfs-ops.h>
44 #include <gtk/gtkfilechooserdialog.h>
46 typedef struct _EvDocumentType EvDocumentType;
47 struct _EvDocumentType
49 const char *mime_type;
50 GType (*document_type_factory_callback)();
53 const EvDocumentType document_types[] = {
55 {"application/pdf", pdf_document_get_type},
58 {"application/postscript", ps_document_get_type},
59 {"application/x-gzpostscript", ps_document_get_type},
60 {"image/x-eps", ps_document_get_type},
64 {"image/tiff", tiff_document_get_type},
69 {"image/vnd.djvu", djvu_document_get_type},
74 {"application/x-dvi", dvi_document_get_type},
78 /* Would be nice to have this in gdk-pixbuf */
80 mime_type_supported_by_gdk_pixbuf (const gchar *mime_type)
82 GSList *formats, *list;
83 gboolean retval = FALSE;
85 formats = gdk_pixbuf_get_formats ();
89 GdkPixbufFormat *format = list->data;
93 if (gdk_pixbuf_format_is_disabled (format))
96 mime_types = gdk_pixbuf_format_get_mime_types (format);
98 for (i = 0; mime_types[i] != NULL; i++) {
99 if (strcmp (mime_types[i], mime_type) == 0) {
111 g_slist_free (formats);
118 ev_document_type_from_from_mime (const char *mime_type)
122 g_return_val_if_fail (mime_type, G_TYPE_INVALID);
124 for (i = 0; i < G_N_ELEMENTS (document_types); i++) {
125 if (strcmp (mime_type, document_types[i].mime_type) == 0) {
126 g_assert (document_types[i].document_type_factory_callback != NULL);
127 return document_types[i].document_type_factory_callback();
131 if (mime_type_supported_by_gdk_pixbuf (mime_type)) {
132 return pixbuf_document_get_type ();
135 return G_TYPE_INVALID;
139 * ev_document_type_get_type:
140 * @uri: String with uri
141 * @slow: Do we need to check slow gnome-vfs mime type
142 * @mime_type: If we've found handled type, the mime_type string is returned here.
143 * @error: Information about error occured
145 * Return value: G_TYPE_INVALID on error, G_TYPE_NONE when we are not sure about
146 * mime type, and type of EvDocument implementation when we've found document.
149 ev_document_type_get_type (const char *uri, gboolean slow, gchar **mime_type, GError **error)
151 GnomeVFSFileInfo *info;
152 GnomeVFSResult result;
154 GType type = G_TYPE_INVALID;
156 info = gnome_vfs_file_info_new ();
157 result = gnome_vfs_get_file_info (uri, info,
158 GNOME_VFS_FILE_INFO_GET_MIME_TYPE |
159 GNOME_VFS_FILE_INFO_FOLLOW_LINKS |
160 (slow ? GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE : 0));
161 if (result != GNOME_VFS_OK) {
165 gnome_vfs_result_to_string (result));
166 gnome_vfs_file_info_unref (info);
167 return G_TYPE_INVALID;
170 if (info->mime_type == NULL) {
174 _("Unknown MIME Type"));
175 gnome_vfs_file_info_unref (info);
176 return slow ? G_TYPE_INVALID : G_TYPE_NONE;
179 type = ev_document_type_from_from_mime (info->mime_type);
181 if (type == G_TYPE_INVALID) {
185 _("Unhandled MIME type: '%s'"), info->mime_type);
186 gnome_vfs_file_info_unref (info);
187 return slow ? G_TYPE_INVALID : G_TYPE_NONE;
190 if (mime_type != NULL) {
191 *mime_type = g_strdup (info->mime_type);
193 gnome_vfs_file_info_unref (info);
199 ev_document_type_lookup (const char *uri, gchar **mime_type, GError **error)
201 GType type = G_TYPE_INVALID;
203 type = ev_document_type_get_type (uri, FALSE, mime_type, error);
205 if (type != G_TYPE_NONE)
209 g_error_free (*error);
213 type = ev_document_type_get_type (uri, TRUE, mime_type, error);
219 ev_document_types_add_filters (GtkWidget *chooser)
221 GtkFileFilter *documents_filter;
222 GtkFileFilter *pdf_filter;
223 GtkFileFilter *ps_filter;
224 GtkFileFilter *pixbuf_filter;
225 GtkFileFilter *all_filter;
227 GtkFileFilter *djvu_filter;
230 GtkFileFilter *dvi_filter;
233 documents_filter = gtk_file_filter_new ();
234 gtk_file_filter_set_name (documents_filter,
236 gtk_file_filter_add_mime_type (documents_filter, "application/postscript");
237 gtk_file_filter_add_mime_type (documents_filter, "application/x-gzpostscript");
238 gtk_file_filter_add_mime_type (documents_filter, "image/x-eps");
239 gtk_file_filter_add_mime_type (documents_filter, "application/pdf");
241 gtk_file_filter_add_mime_type (documents_filter, "application/x-dvi");
243 gtk_file_filter_add_pixbuf_formats (documents_filter);
245 gtk_file_filter_add_mime_type (documents_filter, "image/vnd.djvu");
247 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), documents_filter);
249 ps_filter = gtk_file_filter_new ();
250 gtk_file_filter_set_name (ps_filter, _("PostScript Documents"));
251 gtk_file_filter_add_mime_type (ps_filter, "application/postscript");
252 gtk_file_filter_add_mime_type (ps_filter, "application/x-gzpostscript");
253 gtk_file_filter_add_mime_type (ps_filter, "image/x-eps");
254 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), ps_filter);
256 pdf_filter = gtk_file_filter_new ();
257 gtk_file_filter_set_name (pdf_filter, _("PDF Documents"));
258 gtk_file_filter_add_mime_type (pdf_filter, "application/pdf");
259 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), pdf_filter);
262 dvi_filter = gtk_file_filter_new ();
263 gtk_file_filter_set_name (dvi_filter, _("DVI Documents"));
264 gtk_file_filter_add_mime_type (dvi_filter, "application/x-dvi");
265 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), dvi_filter);
268 pixbuf_filter = gtk_file_filter_new ();
269 gtk_file_filter_set_name (pixbuf_filter, _("Images"));
270 gtk_file_filter_add_pixbuf_formats (pixbuf_filter);
271 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), pixbuf_filter);
274 djvu_filter = gtk_file_filter_new ();
275 gtk_file_filter_set_name (djvu_filter, _("Djvu Documents"));
276 gtk_file_filter_add_mime_type (djvu_filter, "image/vnd.djvu");
277 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), djvu_filter);
280 all_filter = gtk_file_filter_new ();
281 gtk_file_filter_set_name (all_filter, _("All Files"));
282 gtk_file_filter_add_pattern (all_filter, "*");
284 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_filter);
285 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), documents_filter);
289 ev_document_types_add_filters_for_type (GtkWidget *chooser, GType type)
291 GtkFileFilter *documents_filter;
292 GtkFileFilter *pdf_filter;
293 GtkFileFilter *ps_filter;
294 GtkFileFilter *pixbuf_filter;
295 GtkFileFilter *all_filter;
297 GtkFileFilter *djvu_filter;
300 GtkFileFilter *dvi_filter;
302 GtkFileFilter *default_filter;
304 documents_filter = gtk_file_filter_new ();
305 gtk_file_filter_set_name (documents_filter,
307 gtk_file_filter_add_mime_type (documents_filter, "application/postscript");
308 gtk_file_filter_add_mime_type (documents_filter, "application/x-gzpostscript");
309 gtk_file_filter_add_mime_type (documents_filter, "image/x-eps");
310 gtk_file_filter_add_mime_type (documents_filter, "application/pdf");
312 gtk_file_filter_add_mime_type (documents_filter, "application/x-dvi");
314 gtk_file_filter_add_pixbuf_formats (documents_filter);
316 gtk_file_filter_add_mime_type (documents_filter, "image/vnd.djvu");
318 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), documents_filter);
320 if (type == PS_TYPE_DOCUMENT) {
321 ps_filter = gtk_file_filter_new ();
322 gtk_file_filter_set_name (ps_filter, _("PostScript Documents"));
323 gtk_file_filter_add_mime_type (ps_filter, "application/postscript");
324 gtk_file_filter_add_mime_type (ps_filter, "application/x-gzpostscript");
325 gtk_file_filter_add_mime_type (ps_filter, "image/x-eps");
326 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), ps_filter);
327 default_filter = ps_filter;
328 } else if (type == PDF_TYPE_DOCUMENT) {
329 pdf_filter = gtk_file_filter_new ();
330 gtk_file_filter_set_name (pdf_filter, _("PDF Documents"));
331 gtk_file_filter_add_mime_type (pdf_filter, "application/pdf");
332 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), pdf_filter);
333 default_filter = pdf_filter;
335 } else if (type == DVI_TYPE_DOCUMENT) {
336 dvi_filter = gtk_file_filter_new ();
337 gtk_file_filter_set_name (dvi_filter, _("DVI Documents"));
338 gtk_file_filter_add_mime_type (dvi_filter, "application/x-dvi");
339 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), dvi_filter);
340 default_filter = dvi_filter;
342 } else if (type == PIXBUF_TYPE_DOCUMENT) {
343 pixbuf_filter = gtk_file_filter_new ();
344 gtk_file_filter_set_name (pixbuf_filter, _("Images"));
345 gtk_file_filter_add_pixbuf_formats (pixbuf_filter);
346 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), pixbuf_filter);
347 default_filter = pixbuf_filter;
349 } else if (type == DJVU_TYPE_DOCUMENT) {
350 djvu_filter = gtk_file_filter_new ();
351 gtk_file_filter_set_name (djvu_filter, _("Djvu Documents"));
352 gtk_file_filter_add_mime_type (djvu_filter, "image/vnd.djvu");
353 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), djvu_filter);
354 default_filter = djvu_filter;
357 default_filter = documents_filter;
360 all_filter = gtk_file_filter_new ();
361 gtk_file_filter_set_name (all_filter, _("All Files"));
362 gtk_file_filter_add_pattern (all_filter, "*");
364 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_filter);
365 gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), default_filter);