diff options
author | Perberos <[email protected]> | 2011-11-07 16:46:58 -0300 |
---|---|---|
committer | Perberos <[email protected]> | 2011-11-07 16:46:58 -0300 |
commit | 528c1e5ff51e213936e800fc5a9a25da99c0bdf2 (patch) | |
tree | 77f8aa456b09367ba81f04d4562fc935f898a951 /gedit/gedit-plugin-info.c | |
download | pluma-528c1e5ff51e213936e800fc5a9a25da99c0bdf2.tar.bz2 pluma-528c1e5ff51e213936e800fc5a9a25da99c0bdf2.tar.xz |
initial
Diffstat (limited to 'gedit/gedit-plugin-info.c')
-rwxr-xr-x | gedit/gedit-plugin-info.c | 394 |
1 files changed, 394 insertions, 0 deletions
diff --git a/gedit/gedit-plugin-info.c b/gedit/gedit-plugin-info.c new file mode 100755 index 00000000..31411c42 --- /dev/null +++ b/gedit/gedit-plugin-info.c @@ -0,0 +1,394 @@ +/* + * gedit-plugin-info.c + * This file is part of gedit + * + * Copyright (C) 2002-2005 - Paolo Maggi + * Copyright (C) 2007 - Paolo Maggi, Steve Frécinaux + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * 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. + */ + +/* + * Modified by the gedit Team, 2002-2007. See the AUTHORS file for a + * list of people on the gedit Team. + * See the ChangeLog files for a list of changes. + * + * $Id$ + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string.h> +#include <glib/gi18n.h> +#include <glib.h> + +#include "gedit-plugin-info.h" +#include "gedit-plugin-info-priv.h" +#include "gedit-debug.h" +#include "gedit-plugin.h" + +void +_gedit_plugin_info_ref (GeditPluginInfo *info) +{ + g_atomic_int_inc (&info->refcount); +} + +static GeditPluginInfo * +gedit_plugin_info_copy (GeditPluginInfo *info) +{ + _gedit_plugin_info_ref (info); + return info; +} + +void +_gedit_plugin_info_unref (GeditPluginInfo *info) +{ + if (!g_atomic_int_dec_and_test (&info->refcount)) + return; + + if (info->plugin != NULL) + { + gedit_debug_message (DEBUG_PLUGINS, "Unref plugin %s", info->name); + + g_object_unref (info->plugin); + } + + g_free (info->file); + g_free (info->module_name); + g_strfreev (info->dependencies); + g_free (info->name); + g_free (info->desc); + g_free (info->icon_name); + g_free (info->website); + g_free (info->copyright); + g_free (info->loader); + g_free (info->version); + g_strfreev (info->authors); + + g_free (info); +} + +/** + * gedit_plugin_info_get_type: + * + * Retrieves the #GType object which is associated with the #GeditPluginInfo + * class. + * + * Return value: the GType associated with #GeditPluginInfo. + **/ +GType +gedit_plugin_info_get_type (void) +{ + static GType the_type = 0; + + if (G_UNLIKELY (!the_type)) + the_type = g_boxed_type_register_static ( + "GeditPluginInfo", + (GBoxedCopyFunc) gedit_plugin_info_copy, + (GBoxedFreeFunc) _gedit_plugin_info_unref); + + return the_type; +} + +/** + * gedit_plugin_info_new: + * @filename: the filename where to read the plugin information + * + * Creates a new #GeditPluginInfo from a file on the disk. + * + * Return value: a newly created #GeditPluginInfo. + */ +GeditPluginInfo * +_gedit_plugin_info_new (const gchar *file) +{ + GeditPluginInfo *info; + GKeyFile *plugin_file = NULL; + gchar *str; + + g_return_val_if_fail (file != NULL, NULL); + + gedit_debug_message (DEBUG_PLUGINS, "Loading plugin: %s", file); + + info = g_new0 (GeditPluginInfo, 1); + info->refcount = 1; + info->file = g_strdup (file); + + plugin_file = g_key_file_new (); + if (!g_key_file_load_from_file (plugin_file, file, G_KEY_FILE_NONE, NULL)) + { + g_warning ("Bad plugin file: %s", file); + goto error; + } + + if (!g_key_file_has_key (plugin_file, + "Gedit Plugin", + "IAge", + NULL)) + { + gedit_debug_message (DEBUG_PLUGINS, + "IAge key does not exist in file: %s", file); + goto error; + } + + /* Check IAge=2 */ + if (g_key_file_get_integer (plugin_file, + "Gedit Plugin", + "IAge", + NULL) != 2) + { + gedit_debug_message (DEBUG_PLUGINS, + "Wrong IAge in file: %s", file); + goto error; + } + + /* Get module name */ + str = g_key_file_get_string (plugin_file, + "Gedit Plugin", + "Module", + NULL); + + if ((str != NULL) && (*str != '\0')) + { + info->module_name = str; + } + else + { + g_warning ("Could not find 'Module' in %s", file); + goto error; + } + + /* Get the dependency list */ + info->dependencies = g_key_file_get_string_list (plugin_file, + "Gedit Plugin", + "Depends", + NULL, + NULL); + if (info->dependencies == NULL) + { + gedit_debug_message (DEBUG_PLUGINS, "Could not find 'Depends' in %s", file); + info->dependencies = g_new0 (gchar *, 1); + } + + /* Get the loader for this plugin */ + str = g_key_file_get_string (plugin_file, + "Gedit Plugin", + "Loader", + NULL); + + if ((str != NULL) && (*str != '\0')) + { + info->loader = str; + } + else + { + /* default to the C loader */ + info->loader = g_strdup("c"); + } + + /* Get Name */ + str = g_key_file_get_locale_string (plugin_file, + "Gedit Plugin", + "Name", + NULL, NULL); + if (str) + info->name = str; + else + { + g_warning ("Could not find 'Name' in %s", file); + goto error; + } + + /* Get Description */ + str = g_key_file_get_locale_string (plugin_file, + "Gedit Plugin", + "Description", + NULL, NULL); + if (str) + info->desc = str; + else + gedit_debug_message (DEBUG_PLUGINS, "Could not find 'Description' in %s", file); + + /* Get Icon */ + str = g_key_file_get_locale_string (plugin_file, + "Gedit Plugin", + "Icon", + NULL, NULL); + if (str) + info->icon_name = str; + else + gedit_debug_message (DEBUG_PLUGINS, "Could not find 'Icon' in %s, using 'gedit-plugin'", file); + + + /* Get Authors */ + info->authors = g_key_file_get_string_list (plugin_file, + "Gedit Plugin", + "Authors", + NULL, + NULL); + if (info->authors == NULL) + gedit_debug_message (DEBUG_PLUGINS, "Could not find 'Authors' in %s", file); + + + /* Get Copyright */ + str = g_key_file_get_string (plugin_file, + "Gedit Plugin", + "Copyright", + NULL); + if (str) + info->copyright = str; + else + gedit_debug_message (DEBUG_PLUGINS, "Could not find 'Copyright' in %s", file); + + /* Get Website */ + str = g_key_file_get_string (plugin_file, + "Gedit Plugin", + "Website", + NULL); + if (str) + info->website = str; + else + gedit_debug_message (DEBUG_PLUGINS, "Could not find 'Website' in %s", file); + + /* Get Version */ + str = g_key_file_get_string (plugin_file, + "Gedit Plugin", + "Version", + NULL); + if (str) + info->version = str; + else + gedit_debug_message (DEBUG_PLUGINS, "Could not find 'Version' in %s", file); + + g_key_file_free (plugin_file); + + /* If we know nothing about the availability of the plugin, + set it as available */ + info->available = TRUE; + + return info; + +error: + g_free (info->file); + g_free (info->module_name); + g_free (info->name); + g_free (info->loader); + g_free (info); + g_key_file_free (plugin_file); + + return NULL; +} + +gboolean +gedit_plugin_info_is_active (GeditPluginInfo *info) +{ + g_return_val_if_fail (info != NULL, FALSE); + + return info->available && info->plugin != NULL; +} + +gboolean +gedit_plugin_info_is_available (GeditPluginInfo *info) +{ + g_return_val_if_fail (info != NULL, FALSE); + + return info->available != FALSE; +} + +gboolean +gedit_plugin_info_is_configurable (GeditPluginInfo *info) +{ + gedit_debug_message (DEBUG_PLUGINS, "Is '%s' configurable?", info->name); + + g_return_val_if_fail (info != NULL, FALSE); + + if (info->plugin == NULL || !info->available) + return FALSE; + + return gedit_plugin_is_configurable (info->plugin); +} + +const gchar * +gedit_plugin_info_get_module_name (GeditPluginInfo *info) +{ + g_return_val_if_fail (info != NULL, NULL); + + return info->module_name; +} + +const gchar * +gedit_plugin_info_get_name (GeditPluginInfo *info) +{ + g_return_val_if_fail (info != NULL, NULL); + + return info->name; +} + +const gchar * +gedit_plugin_info_get_description (GeditPluginInfo *info) +{ + g_return_val_if_fail (info != NULL, NULL); + + return info->desc; +} + +const gchar * +gedit_plugin_info_get_icon_name (GeditPluginInfo *info) +{ + g_return_val_if_fail (info != NULL, NULL); + + /* use the gedit-plugin icon as a default if the plugin does not + have its own */ + if (info->icon_name != NULL && + gtk_icon_theme_has_icon (gtk_icon_theme_get_default (), + info->icon_name)) + return info->icon_name; + else + return "gedit-plugin"; +} + +const gchar ** +gedit_plugin_info_get_authors (GeditPluginInfo *info) +{ + g_return_val_if_fail (info != NULL, (const gchar **)NULL); + + return (const gchar **) info->authors; +} + +const gchar * +gedit_plugin_info_get_website (GeditPluginInfo *info) +{ + g_return_val_if_fail (info != NULL, NULL); + + return info->website; +} + +const gchar * +gedit_plugin_info_get_copyright (GeditPluginInfo *info) +{ + g_return_val_if_fail (info != NULL, NULL); + + return info->copyright; +} + +const gchar * +gedit_plugin_info_get_version (GeditPluginInfo *info) +{ + g_return_val_if_fail (info != NULL, NULL); + + return info->version; +} |