1 /* this file is part of evince, a gnome document viewer
3 * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
5 * Evince is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * Evince is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * 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.
22 #include <glib/gstdio.h>
24 #include "ev-module.h"
25 #include "ev-backends-manager.h"
27 static GList *ev_backends_list = NULL;
29 typedef struct _EvBackendInfo EvBackendInfo;
30 struct _EvBackendInfo {
41 #define EV_BACKENDS_GROUP "Evince Backend"
42 #define EV_BACKENDS_EXTENSION ".evince-backend"
45 ev_backend_info_free (EvBackendInfo *info)
47 g_free (info->module_name);
48 g_free (info->type_desc);
49 g_strfreev (info->mime_types);
53 static EvBackendInfo *
54 ev_backends_manager_load_backend (const gchar *file)
57 GKeyFile *backend_file = NULL;
60 backend_file = g_key_file_new ();
61 if (!g_key_file_load_from_file (backend_file, file, G_KEY_FILE_NONE, &error)) {
62 g_warning ("Error opening backend file %s: %s",
63 file, error->message);
65 g_key_file_free (backend_file);
70 info = g_new0 (EvBackendInfo, 1);
71 info->module_name = g_key_file_get_string (backend_file, EV_BACKENDS_GROUP,
73 if (!info->module_name) {
74 g_warning ("Bad evince backend file %s: Could not find 'Module'",
76 ev_backend_info_free (info);
77 g_key_file_free (backend_file);
82 info->resident = g_key_file_get_boolean (backend_file, EV_BACKENDS_GROUP,
85 info->type_desc = g_key_file_get_locale_string (backend_file, EV_BACKENDS_GROUP,
86 "TypeDescription", NULL, NULL);
87 if (!info->type_desc) {
88 g_warning ("Bad evince backend file %s: Could not find 'TypeDescription'",
90 ev_backend_info_free (info);
91 g_key_file_free (backend_file);
96 info->mime_types = g_key_file_get_string_list (backend_file, EV_BACKENDS_GROUP,
97 "MimeType", NULL, NULL);
98 if (!info->mime_types) {
99 g_warning ("Bad evince backend file %s: Could not find 'MimeType'",
101 ev_backend_info_free (info);
102 g_key_file_free (backend_file);
107 g_key_file_free (backend_file);
113 ev_backends_manager_load (void)
117 GError *error = NULL;
119 dir = g_dir_open (EV_BACKENDSDIR, 0, &error);
121 g_warning (error->message);
122 g_error_free (error);
127 while ((dirent = g_dir_read_name (dir))) {
131 if (!g_str_has_suffix (dirent, EV_BACKENDS_EXTENSION))
134 file = g_build_filename (EV_BACKENDSDIR, dirent, NULL);
135 info = ev_backends_manager_load_backend (file);
141 ev_backends_list = g_list_prepend (ev_backends_list, info);
150 ev_backends_manager_init (void)
152 if (ev_backends_list)
155 return ev_backends_manager_load ();
159 ev_backends_manager_shutdown (void)
161 g_list_foreach (ev_backends_list, (GFunc)ev_backend_info_free, NULL);
162 g_list_free (ev_backends_list);
163 ev_backends_list = NULL;
166 static EvBackendInfo *
167 ev_backends_manager_get_backend_info (const gchar *mime_type)
171 for (l = ev_backends_list; l; l = g_list_next (l)) {
176 info = (EvBackendInfo *)l->data;
178 while ((mime = info->mime_types[i++])) {
179 if (g_ascii_strcasecmp (mime, mime_type) == 0)
188 ev_backends_manager_get_document (const gchar *mime_type)
190 EvDocument *document;
193 info = ev_backends_manager_get_backend_info (mime_type);
200 path = g_module_build_path (EV_BACKENDSDIR, info->module_name);
201 info->module = G_TYPE_MODULE (ev_module_new (path, info->resident));
205 if (!g_type_module_use (info->module)) {
206 g_warning ("Cannot load backend '%s' since file '%s' cannot be read.",
208 ev_module_get_path (EV_MODULE (info->module)));
209 g_object_unref (G_OBJECT (info->module));
215 document = EV_DOCUMENT (ev_module_new_object (EV_MODULE (info->module)));
216 g_type_module_unuse (info->module);
221 static EvBackendInfo *
222 get_document_backend_info (EvDocument *document)
226 for (l = ev_backends_list; l; l = g_list_next (l)) {
230 info = (EvBackendInfo *)l->data;
235 type_id = ev_module_get_object_type (EV_MODULE (info->module));
237 if (G_TYPE_CHECK_INSTANCE_TYPE (document, type_id)) {
246 ev_backends_manager_get_document_module_name (EvDocument *document)
250 info = get_document_backend_info (document);
251 return info ? info->module_name : NULL;
255 ev_type_info_new (const gchar *desc, const gchar **mime_types)
259 info = g_new (EvTypeInfo, 1);
262 info->mime_types = mime_types;
268 ev_backends_manager_get_document_type_info (EvDocument *document)
272 info = get_document_backend_info (document);
274 ev_type_info_new (info->type_desc,
275 (const gchar **)info->mime_types)
280 ev_backends_manager_get_all_types_info (void)
283 GList *retval = NULL;
285 for (l = ev_backends_list; l; l = g_list_next (l)) {
287 EvTypeInfo *type_info;
289 info = (EvBackendInfo *)l->data;
291 type_info = ev_type_info_new (info->type_desc,
292 (const gchar **)info->mime_types);
293 retval = g_list_prepend (retval, type_info);