]> www.fi.muni.cz Git - evince.git/blob - shell/ev-document-types.c
New CBR/CBZ backend for comic books.
[evince.git] / shell / ev-document-types.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */
2 /*
3  *  Copyright (C) 2005, Red Hat, Inc. 
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 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include "ev-document-types.h"
26 #include "ev-document-factory.h"
27
28 #include <string.h>
29 #include <glib/gi18n.h>
30 #include <libgnomevfs/gnome-vfs-mime-utils.h>
31 #include <libgnomevfs/gnome-vfs-file-info.h>
32 #include <libgnomevfs/gnome-vfs-ops.h>
33 #include <gtk/gtkfilechooserdialog.h>
34
35 static EvDocument *
36 get_document_from_uri (const char *uri, gboolean slow, gchar **mime_type, GError **error)
37 {
38         EvDocument *document;
39         GnomeVFSFileInfo *info;
40         GnomeVFSResult result;
41
42         info = gnome_vfs_file_info_new ();
43         result = gnome_vfs_get_file_info (uri, info,
44                                           GNOME_VFS_FILE_INFO_GET_MIME_TYPE |
45                                           GNOME_VFS_FILE_INFO_FOLLOW_LINKS | 
46                                           (slow ? GNOME_VFS_FILE_INFO_FORCE_SLOW_MIME_TYPE : 0));
47         if (result != GNOME_VFS_OK) {
48                 g_set_error (error,
49                              EV_DOCUMENT_ERROR,
50                              0,
51                              gnome_vfs_result_to_string (result));                      
52                 gnome_vfs_file_info_unref (info);
53                 return NULL;
54         } 
55         
56         if (info->mime_type == NULL) {
57                 g_set_error (error,
58                              EV_DOCUMENT_ERROR, 
59                              0,
60                              _("Unknown MIME Type"));
61                 gnome_vfs_file_info_unref (info);
62                 return NULL;
63         }
64         
65         document = ev_document_factory_get_document (info->mime_type);
66         
67         if (document == NULL) {
68                 g_set_error (error,
69                              EV_DOCUMENT_ERROR, 
70                              0,
71                              _("Unhandled MIME type: '%s'"), info->mime_type);
72                 gnome_vfs_file_info_unref (info);
73                 return NULL;
74         }                       
75
76         if (mime_type != NULL) {
77                     *mime_type = g_strdup (info->mime_type);
78         }
79
80         gnome_vfs_file_info_unref (info);
81         
82         return document;
83 }
84
85 EvDocument *
86 ev_document_types_get_document (const char *uri, gchar **mime_type, GError **error)
87 {
88         EvDocument *document;
89         
90         document = get_document_from_uri (uri, FALSE, mime_type, error);
91
92         if (document != NULL) {
93                 return document;
94         }
95                 
96         if (error) {
97                 g_error_free (*error);
98                 *error = NULL;
99         }
100
101         document = get_document_from_uri (uri, TRUE, mime_type, error);
102
103         return document;
104 }
105
106 static void
107 file_filter_add_mime_list_and_free (GtkFileFilter *filter, GList *mime_types)
108 {
109         GList *l;
110
111         for (l = mime_types; l != NULL; l = l->next) {
112                 gtk_file_filter_add_mime_type (filter, l->data);
113         }
114
115         g_list_foreach (mime_types, (GFunc)g_free, NULL);
116         g_list_free (mime_types);
117 }
118
119 void 
120 ev_document_types_add_filters (GtkWidget *chooser, EvDocument *document)
121 {
122         EvBackend backend = 0;
123         GList *mime_types;
124         GtkFileFilter *filter;
125         GtkFileFilter *default_filter;
126         GtkFileFilter *document_filter;
127
128         if (document != NULL) {
129                 backend = ev_document_factory_get_backend (document);
130         }
131
132         default_filter = document_filter = filter = gtk_file_filter_new ();
133         gtk_file_filter_set_name (filter, _("All Documents"));
134         mime_types = ev_document_factory_get_all_mime_types ();
135         file_filter_add_mime_list_and_free (filter, mime_types);
136         gtk_file_filter_add_pixbuf_formats (filter);
137         gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
138
139         if (document == NULL || backend == EV_BACKEND_PS) {
140                 default_filter = filter = gtk_file_filter_new ();
141                 gtk_file_filter_set_name (filter, _("PostScript Documents"));
142                 mime_types = ev_document_factory_get_mime_types (EV_BACKEND_PS);
143                 file_filter_add_mime_list_and_free (filter, mime_types);
144                 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
145         }
146
147         if (document == NULL || backend == EV_BACKEND_PDF) {
148                 default_filter = filter = gtk_file_filter_new ();
149                 gtk_file_filter_set_name (filter, _("PDF Documents"));
150                 mime_types = ev_document_factory_get_mime_types (EV_BACKEND_PDF);
151                 file_filter_add_mime_list_and_free (filter, mime_types);
152                 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
153         }
154
155 #ifdef ENABLE_PIXBUF
156         if (document == NULL || backend == EV_BACKEND_PIXBUF) {
157                 default_filter = filter = gtk_file_filter_new ();
158                 gtk_file_filter_set_name (filter, _("Images"));
159                 gtk_file_filter_add_pixbuf_formats (filter);
160                 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
161         }
162 #endif
163
164 #ifdef ENABLE_DVI
165         if (document == NULL || backend == EV_BACKEND_DVI) {
166                 default_filter = filter = gtk_file_filter_new ();
167                 gtk_file_filter_set_name (filter, _("DVI Documents"));
168                 mime_types = ev_document_factory_get_mime_types (EV_BACKEND_DVI);
169                 file_filter_add_mime_list_and_free (filter, mime_types);
170                 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
171         }
172 #endif
173
174 #ifdef ENABLE_DJVU
175         if (document == NULL || backend == EV_BACKEND_DJVU) {
176                 default_filter = filter = gtk_file_filter_new ();
177                 gtk_file_filter_set_name (filter, _("Djvu Documents"));
178                 mime_types = ev_document_factory_get_mime_types (EV_BACKEND_DJVU);
179                 file_filter_add_mime_list_and_free (filter, mime_types);
180                 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
181         }
182 #endif  
183
184 #ifdef ENABLE_COMICS
185         if (document == NULL || backend == EV_BACKEND_COMICS) {
186                 default_filter = filter = gtk_file_filter_new ();
187                 gtk_file_filter_set_name (filter, _("Comics Books"));
188                 mime_types = ev_document_factory_get_mime_types (EV_BACKEND_COMICS);
189                 file_filter_add_mime_list_and_free (filter, mime_types);
190                 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
191         }
192 #endif  
193
194         filter = gtk_file_filter_new ();
195         gtk_file_filter_set_name (filter, _("All Files"));
196         gtk_file_filter_add_pattern (filter, "*");
197         gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), filter);
198
199         gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser),
200                                      document == NULL ? document_filter : default_filter);
201 }