|
GnuCash 2.4.99
|
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 }
1.7.4