GnuCash 2.4.99
gnc-plugin-manager.c
00001 /*
00002  * gnc-plugin-manager.c --
00003  *
00004  * Copyright (C) 2003 Jan Arne Petersen
00005  * Author: Jan Arne Petersen <jpetersen@uni-bonn.de>
00006  *
00007  * This program is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU General Public License as
00009  * published by the Free Software Foundation; either version 2 of
00010  * the License, or (at your option) any later version.
00011  *
00012  * This program is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  * GNU General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU General Public License
00018  * along with this program; if not, contact:
00019  *
00020  * Free Software Foundation           Voice:  +1-617-542-5942
00021  * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652
00022  * Boston, MA  02110-1301,  USA       gnu@gnu.org
00023  */
00024 
00025 #include "config.h"
00026 
00027 #include <gtk/gtk.h>
00028 
00029 #include "gnc-plugin-manager.h"
00030 #include "gnc-engine.h"
00031 #include "gnc-hooks.h"
00032 
00033 static QofLogModule log_module = GNC_MOD_GUI;
00034 
00035 static void gnc_plugin_manager_class_init (GncPluginManagerClass *klass);
00036 static void gnc_plugin_manager_init (GncPluginManager *plugin);
00037 static void gnc_plugin_manager_dispose (GObject *object);
00038 static void gnc_plugin_manager_finalize (GObject *object);
00039 static void gnc_plugin_manager_shutdown (gpointer dummy, gpointer dummy2);
00040 
00041 typedef struct GncPluginManagerPrivate
00042 {
00043     GList *plugins;
00044     GHashTable *plugins_table;
00045 }  GncPluginManagerPrivate;
00046 
00047 #define GNC_PLUGIN_MANAGER_GET_PRIVATE(o)  \
00048    (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_PLUGIN_MANAGER, GncPluginManagerPrivate))
00049 
00050 enum
00051 {
00052     PLUGIN_ADDED,
00053     PLUGIN_REMOVED,
00054     LAST_SIGNAL
00055 };
00056 
00057 static guint signals[LAST_SIGNAL] = { 0 };
00058 static GncPluginManager *singleton = NULL;
00059 
00060 static GObjectClass *parent_class = NULL;
00061 
00062 GType
00063 gnc_plugin_manager_get_type (void)
00064 {
00065     static GType gnc_plugin_manager_type = 0;
00066 
00067     if (gnc_plugin_manager_type == 0)
00068     {
00069         static const GTypeInfo our_info =
00070         {
00071             sizeof (GncPluginManagerClass),
00072             NULL,
00073             NULL,
00074             (GClassInitFunc) gnc_plugin_manager_class_init,
00075             NULL,
00076             NULL,
00077             sizeof (GncPluginManager),
00078             0,
00079             (GInstanceInitFunc) gnc_plugin_manager_init
00080         };
00081 
00082         gnc_plugin_manager_type = g_type_register_static (G_TYPE_OBJECT,
00083                                   "GncPluginManager",
00084                                   &our_info, 0);
00085     }
00086 
00087     return gnc_plugin_manager_type;
00088 }
00089 
00090 GncPluginManager *
00091 gnc_plugin_manager_get (void)
00092 {
00093     if (singleton == NULL)
00094     {
00095         singleton = g_object_new (GNC_TYPE_PLUGIN_MANAGER,
00096                                   NULL);
00097         gnc_hook_add_dangler (HOOK_UI_SHUTDOWN,
00098                               gnc_plugin_manager_shutdown, NULL);
00099     }
00100 
00101     return singleton;
00102 }
00103 
00104 void
00105 gnc_plugin_manager_add_plugin (GncPluginManager *manager,
00106                                GncPlugin *plugin)
00107 {
00108     GncPluginManagerPrivate *priv;
00109     gint index;
00110 
00111     ENTER (" ");
00112     g_return_if_fail (GNC_IS_PLUGIN_MANAGER (manager));
00113     g_return_if_fail (GNC_IS_PLUGIN (plugin));
00114 
00115     priv = GNC_PLUGIN_MANAGER_GET_PRIVATE(manager);
00116     index = g_list_index (priv->plugins, plugin);
00117 
00118     if (index >= 0)
00119         return;
00120 
00121     priv->plugins = g_list_append (priv->plugins, plugin);
00122     g_hash_table_insert (priv->plugins_table,
00123                          g_strdup( GNC_PLUGIN_GET_CLASS(plugin)->plugin_name ),
00124                          plugin);
00125 
00126     g_signal_emit (G_OBJECT (manager), signals[PLUGIN_ADDED], 0, plugin);
00127     LEAVE ("added %s to GncPluginManager", gnc_plugin_get_name(plugin));
00128 }
00129 
00130 void
00131 gnc_plugin_manager_remove_plugin (GncPluginManager *manager,
00132                                   GncPlugin *plugin)
00133 {
00134     GncPluginManagerPrivate *priv;
00135     gint index;
00136 
00137     ENTER (" ");
00138     g_return_if_fail (GNC_IS_PLUGIN_MANAGER (manager));
00139     g_return_if_fail (GNC_IS_PLUGIN (plugin));
00140 
00141     priv = GNC_PLUGIN_MANAGER_GET_PRIVATE(manager);
00142     index = g_list_index (priv->plugins, plugin);
00143 
00144     if (index < 0)
00145         return;
00146 
00147     priv->plugins = g_list_remove (priv->plugins, plugin);
00148     g_hash_table_remove (priv->plugins_table,
00149                          GNC_PLUGIN_GET_CLASS(plugin)->plugin_name);
00150 
00151     g_signal_emit (G_OBJECT (manager), signals[PLUGIN_REMOVED], 0, plugin);
00152 
00153     LEAVE ("removed %s from GncPluginManager",
00154            gnc_plugin_get_name(plugin));
00155     g_object_unref (plugin);
00156 }
00157 
00158 GList *
00159 gnc_plugin_manager_get_plugins (GncPluginManager *manager)
00160 {
00161     GncPluginManagerPrivate *priv;
00162 
00163     g_return_val_if_fail (GNC_IS_PLUGIN_MANAGER (manager), NULL);
00164 
00165     priv = GNC_PLUGIN_MANAGER_GET_PRIVATE(manager);
00166     return g_list_copy (priv->plugins);
00167 }
00168 
00169 GncPlugin *
00170 gnc_plugin_manager_get_plugin (GncPluginManager *manager,
00171                                const gchar *name)
00172 {
00173     GncPluginManagerPrivate *priv;
00174 
00175     g_return_val_if_fail (GNC_IS_PLUGIN_MANAGER (manager), NULL);
00176     g_return_val_if_fail (name != NULL, NULL);
00177 
00178     priv = GNC_PLUGIN_MANAGER_GET_PRIVATE(manager);
00179     return GNC_PLUGIN (g_hash_table_lookup (priv->plugins_table, name));
00180 }
00181 
00182 
00183 static void
00184 gnc_plugin_manager_class_init (GncPluginManagerClass *klass)
00185 {
00186     GObjectClass *object_class = G_OBJECT_CLASS (klass);
00187 
00188     parent_class = g_type_class_peek_parent (klass);
00189 
00190     object_class->dispose = gnc_plugin_manager_dispose;
00191     object_class->finalize = gnc_plugin_manager_finalize;
00192 
00193     g_type_class_add_private(klass, sizeof(GncPluginManagerPrivate));
00194 
00195     signals[PLUGIN_ADDED] = g_signal_new ("plugin-added",
00196                                           G_OBJECT_CLASS_TYPE (klass),
00197                                           G_SIGNAL_RUN_FIRST,
00198                                           G_STRUCT_OFFSET (GncPluginManagerClass, plugin_added),
00199                                           NULL, NULL,
00200                                           g_cclosure_marshal_VOID__OBJECT,
00201                                           G_TYPE_NONE,
00202                                           1,
00203                                           GNC_TYPE_PLUGIN);
00204     signals[PLUGIN_REMOVED] = g_signal_new ("plugin-removed",
00205                                             G_OBJECT_CLASS_TYPE (klass),
00206                                             G_SIGNAL_RUN_FIRST,
00207                                             G_STRUCT_OFFSET (GncPluginManagerClass, plugin_removed),
00208                                             NULL, NULL,
00209                                             g_cclosure_marshal_VOID__OBJECT,
00210                                             G_TYPE_NONE,
00211                                             1,
00212                                             GNC_TYPE_PLUGIN);
00213 }
00214 
00215 static void
00216 gnc_plugin_manager_init (GncPluginManager *manager)
00217 {
00218     GncPluginManagerPrivate *priv;
00219 
00220     priv = GNC_PLUGIN_MANAGER_GET_PRIVATE(manager);
00221     priv->plugins_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
00222 }
00223 
00224 static void
00225 gnc_plugin_manager_dispose (GObject *object)
00226 {
00227     GncPluginManager *manager = GNC_PLUGIN_MANAGER (object);
00228     GncPluginManagerPrivate *priv;
00229 
00230     g_return_if_fail (GNC_IS_PLUGIN_MANAGER (manager));
00231 
00232     priv = GNC_PLUGIN_MANAGER_GET_PRIVATE(manager);
00233     if (priv->plugins_table)
00234     {
00235         g_hash_table_destroy (priv->plugins_table);
00236         priv->plugins_table = NULL;
00237 
00238         g_list_foreach (priv->plugins, (GFunc)g_object_unref, NULL);
00239         g_list_free (priv->plugins);
00240         priv->plugins = NULL;
00241     }
00242 
00243     G_OBJECT_CLASS (parent_class)->dispose (object);
00244 }
00245 
00246 static void
00247 gnc_plugin_manager_finalize (GObject *object)
00248 {
00249     GncPluginManager *manager;
00250     GncPluginManagerPrivate *priv;
00251 
00252     g_return_if_fail (GNC_IS_PLUGIN_MANAGER (object));
00253 
00254     manager = GNC_PLUGIN_MANAGER (object);
00255     priv = GNC_PLUGIN_MANAGER_GET_PRIVATE (manager);
00256 
00257     G_OBJECT_CLASS (parent_class)->finalize (object);
00258 }
00259 
00260 static void
00261 gnc_plugin_manager_shutdown (gpointer dummy, gpointer dummy2)
00262 {
00263     if (singleton != NULL)
00264     {
00265         g_object_unref(singleton);
00266         singleton = NULL;
00267     }
00268 }
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines