/* This file is part of GEGL * * GEGL is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * GEGL is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with GEGL; if not, see . * * Copyright 2006 Øyvind Kolås */ #include "config.h" #include #include "gegl-extension-handler.h" static GHashTable *load_handlers = NULL; static GHashTable *save_handlers = NULL; static void gegl_extension_handler_register_util (GHashTable **handlers, const gchar *extension, const gchar *handler) { /* Case fold so we get case insensitive extension comparisions */ gchar *ext = g_utf8_casefold (extension, -1); if (!*handlers) *handlers = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); g_hash_table_insert (*handlers, ext, g_strdup (handler)); } void gegl_extension_handler_register (const gchar *extension, const gchar *handler) { gegl_extension_handler_register_util (&load_handlers, extension, handler); } void gegl_extension_handler_register_saver (const gchar *extension, const gchar *handler) { gegl_extension_handler_register_util (&save_handlers, extension, handler); } static const gchar * gegl_extension_handler_get_util (GHashTable *handlers, const gchar *extension, const gchar *handler_name, const gchar *def) { const gchar *handler = NULL; gchar *ext = NULL; if (!handlers) return NULL; /* Case fold so we get case insensitive extension comparisions */ ext = g_utf8_casefold (extension, -1); handler = g_hash_table_lookup (handlers, ext); g_free (ext); if (handler) return handler; g_warning ("No %s for extension \"%s\", falling back to \"%s\"", handler_name, extension, def); return def; } const gchar * gegl_extension_handler_get (const gchar *extension) { return gegl_extension_handler_get_util (load_handlers, extension, "loader", "gegl:magick-load"); } const gchar * gegl_extension_handler_get_saver (const gchar *extension) { return gegl_extension_handler_get_util (save_handlers, extension, "saver", "gegl:png-save"); } void gegl_extension_handler_cleanup (void) { if (load_handlers) { g_hash_table_destroy (load_handlers); load_handlers = NULL; } if (save_handlers) { g_hash_table_destroy (save_handlers); save_handlers = NULL; } }