X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=libdocument%2Fev-backends-manager.c;h=b6d681bc681ed75c5fecf38f5352b9470709ba16;hb=eb80ecd1f7aa6ff57d2a3324c691274745ca4ed0;hp=87f7fea414ae489d1e6222612beb5d32b2fabc3e;hpb=b490fff8a6c6ab7bb23cc0f274e3150e7ab4471d;p=evince.git diff --git a/libdocument/ev-backends-manager.c b/libdocument/ev-backends-manager.c index 87f7fea4..b6d681bc 100644 --- a/libdocument/ev-backends-manager.c +++ b/libdocument/ev-backends-manager.c @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include @@ -30,6 +30,7 @@ typedef struct _EvBackendInfo EvBackendInfo; struct _EvBackendInfo { gchar *module_name; GTypeModule *module; + gboolean resident; GType type_id; @@ -40,6 +41,28 @@ struct _EvBackendInfo { #define EV_BACKENDS_GROUP "Evince Backend" #define EV_BACKENDS_EXTENSION ".evince-backend" +static gchar *backendsdir = NULL; + +static const gchar * +backends_dir (void) +{ + if (!backendsdir) { +#ifdef G_OS_WIN32 + gchar *dir; + + dir = g_win32_get_package_installation_directory_of_module (NULL); + backendsdir = g_build_filename (dir, "lib", "evince", + EV_BACKENDSBINARYVERSION, + "backends", NULL); + g_free (dir); +#else + backendsdir = g_strdup (EV_BACKENDSDIR); +#endif + } + + return backendsdir; +} + static void ev_backend_info_free (EvBackendInfo *info) { @@ -78,6 +101,9 @@ ev_backends_manager_load_backend (const gchar *file) return NULL; } + info->resident = g_key_file_get_boolean (backend_file, EV_BACKENDS_GROUP, + "Resident", NULL); + info->type_desc = g_key_file_get_locale_string (backend_file, EV_BACKENDS_GROUP, "TypeDescription", NULL, NULL); if (!info->type_desc) { @@ -112,9 +138,9 @@ ev_backends_manager_load (void) const gchar *dirent; GError *error = NULL; - dir = g_dir_open (EV_BACKENDSDIR, 0, &error); + dir = g_dir_open (backends_dir(), 0, &error); if (!dir) { - g_warning (error->message); + g_warning ("%s", error->message); g_error_free (error); return FALSE; @@ -127,7 +153,7 @@ ev_backends_manager_load (void) if (!g_str_has_suffix (dirent, EV_BACKENDS_EXTENSION)) continue; - file = g_build_filename (EV_BACKENDSDIR, dirent, NULL); + file = g_build_filename (backends_dir(), dirent, NULL); info = ev_backends_manager_load_backend (file); g_free (file); @@ -139,24 +165,38 @@ ev_backends_manager_load (void) g_dir_close (dir); - return TRUE; + return ev_backends_list != NULL; } +/* + * _ev_backends_manager_init: + * + * Initializes the evince backends manager. + * + * Returns: %TRUE if there were any backends found; %FALSE otherwise + */ gboolean -ev_backends_manager_init (void) +_ev_backends_manager_init (void) { if (ev_backends_list) - return FALSE; + return TRUE; return ev_backends_manager_load (); } +/* + * _ev_backends_manager_shutdown: + * + * Shuts the evince backends manager down. + */ void -ev_backends_manager_shutdown (void) +_ev_backends_manager_shutdown (void) { g_list_foreach (ev_backends_list, (GFunc)ev_backend_info_free, NULL); g_list_free (ev_backends_list); ev_backends_list = NULL; + + g_free (backendsdir); } static EvBackendInfo * @@ -193,8 +233,8 @@ ev_backends_manager_get_document (const gchar *mime_type) if (!info->module) { gchar *path; - path = g_module_build_path (EV_BACKENDSDIR, info->module_name); - info->module = G_TYPE_MODULE (ev_module_new (path)); + path = g_module_build_path (backends_dir(), info->module_name); + info->module = G_TYPE_MODULE (ev_module_new (path, info->resident)); g_free (path); }