xed/gedit/gedit-plugin-info.c

395 lines
8.5 KiB
C
Executable File

/*
* 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;
}