GnuCash  2.6.99
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
gnc-plugin-manager.c
1 /*
2  * gnc-plugin-manager.c --
3  *
4  * Copyright (C) 2003 Jan Arne Petersen
5  * Author: Jan Arne Petersen <[email protected]>
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 2 of
10  * the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, contact:
19  *
20  * Free Software Foundation Voice: +1-617-542-5942
21  * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
22  * Boston, MA 02110-1301, USA [email protected]
23  */
24 
25 #include "config.h"
26 
27 #include <gtk/gtk.h>
28 
29 #include "gnc-plugin-manager.h"
30 #include "gnc-engine.h"
31 #include "gnc-hooks.h"
32 
33 static QofLogModule log_module = GNC_MOD_GUI;
34 
35 static void gnc_plugin_manager_class_init (GncPluginManagerClass *klass);
36 static void gnc_plugin_manager_init (GncPluginManager *plugin);
37 static void gnc_plugin_manager_dispose (GObject *object);
38 static void gnc_plugin_manager_finalize (GObject *object);
39 static void gnc_plugin_manager_shutdown (gpointer dummy, gpointer dummy2);
40 
42 {
43  GList *plugins;
44  GHashTable *plugins_table;
46 
47 #define GNC_PLUGIN_MANAGER_GET_PRIVATE(o) \
48  (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_PLUGIN_MANAGER, GncPluginManagerPrivate))
49 
50 enum
51 {
52  PLUGIN_ADDED,
53  PLUGIN_REMOVED,
54  LAST_SIGNAL
55 };
56 
57 static guint signals[LAST_SIGNAL] = { 0 };
58 static GncPluginManager *singleton = NULL;
59 
60 static GObjectClass *parent_class = NULL;
61 
62 GType
64 {
65  static GType gnc_plugin_manager_type = 0;
66 
67  if (gnc_plugin_manager_type == 0)
68  {
69  static const GTypeInfo our_info =
70  {
71  sizeof (GncPluginManagerClass),
72  NULL,
73  NULL,
74  (GClassInitFunc) gnc_plugin_manager_class_init,
75  NULL,
76  NULL,
77  sizeof (GncPluginManager),
78  0,
79  (GInstanceInitFunc) gnc_plugin_manager_init
80  };
81 
82  gnc_plugin_manager_type = g_type_register_static (G_TYPE_OBJECT,
83  "GncPluginManager",
84  &our_info, 0);
85  }
86 
87  return gnc_plugin_manager_type;
88 }
89 
92 {
93  if (singleton == NULL)
94  {
95  singleton = g_object_new (GNC_TYPE_PLUGIN_MANAGER,
96  NULL);
97  gnc_hook_add_dangler (HOOK_UI_SHUTDOWN,
98  gnc_plugin_manager_shutdown, NULL);
99  }
100 
101  return singleton;
102 }
103 
104 void
106  GncPlugin *plugin)
107 {
109  gint index;
110 
111  ENTER (" ");
112  g_return_if_fail (GNC_IS_PLUGIN_MANAGER (manager));
113  g_return_if_fail (GNC_IS_PLUGIN (plugin));
114 
115  priv = GNC_PLUGIN_MANAGER_GET_PRIVATE(manager);
116  index = g_list_index (priv->plugins, plugin);
117 
118  if (index >= 0)
119  return;
120 
121  priv->plugins = g_list_append (priv->plugins, plugin);
122  g_hash_table_insert (priv->plugins_table,
123  g_strdup( GNC_PLUGIN_GET_CLASS(plugin)->plugin_name ),
124  plugin);
125 
126  g_signal_emit (G_OBJECT (manager), signals[PLUGIN_ADDED], 0, plugin);
127  LEAVE ("added %s to GncPluginManager", gnc_plugin_get_name(plugin));
128 }
129 
130 void
132  GncPlugin *plugin)
133 {
135  gint index;
136 
137  ENTER (" ");
138  g_return_if_fail (GNC_IS_PLUGIN_MANAGER (manager));
139  g_return_if_fail (GNC_IS_PLUGIN (plugin));
140 
141  priv = GNC_PLUGIN_MANAGER_GET_PRIVATE(manager);
142  index = g_list_index (priv->plugins, plugin);
143 
144  if (index < 0)
145  return;
146 
147  priv->plugins = g_list_remove (priv->plugins, plugin);
148  g_hash_table_remove (priv->plugins_table,
149  GNC_PLUGIN_GET_CLASS(plugin)->plugin_name);
150 
151  g_signal_emit (G_OBJECT (manager), signals[PLUGIN_REMOVED], 0, plugin);
152 
153  LEAVE ("removed %s from GncPluginManager",
154  gnc_plugin_get_name(plugin));
155  g_object_unref (plugin);
156 }
157 
158 GList *
160 {
162 
163  g_return_val_if_fail (GNC_IS_PLUGIN_MANAGER (manager), NULL);
164 
165  priv = GNC_PLUGIN_MANAGER_GET_PRIVATE(manager);
166  return g_list_copy (priv->plugins);
167 }
168 
169 GncPlugin *
171  const gchar *name)
172 {
174 
175  g_return_val_if_fail (GNC_IS_PLUGIN_MANAGER (manager), NULL);
176  g_return_val_if_fail (name != NULL, NULL);
177 
178  priv = GNC_PLUGIN_MANAGER_GET_PRIVATE(manager);
179  return GNC_PLUGIN (g_hash_table_lookup (priv->plugins_table, name));
180 }
181 
182 
183 static void
184 gnc_plugin_manager_class_init (GncPluginManagerClass *klass)
185 {
186  GObjectClass *object_class = G_OBJECT_CLASS (klass);
187 
188  parent_class = g_type_class_peek_parent (klass);
189 
190  object_class->dispose = gnc_plugin_manager_dispose;
191  object_class->finalize = gnc_plugin_manager_finalize;
192 
193  g_type_class_add_private(klass, sizeof(GncPluginManagerPrivate));
194 
195  signals[PLUGIN_ADDED] = g_signal_new ("plugin-added",
196  G_OBJECT_CLASS_TYPE (klass),
197  G_SIGNAL_RUN_FIRST,
198  G_STRUCT_OFFSET (GncPluginManagerClass, plugin_added),
199  NULL, NULL,
200  g_cclosure_marshal_VOID__OBJECT,
201  G_TYPE_NONE,
202  1,
203  GNC_TYPE_PLUGIN);
204  signals[PLUGIN_REMOVED] = g_signal_new ("plugin-removed",
205  G_OBJECT_CLASS_TYPE (klass),
206  G_SIGNAL_RUN_FIRST,
207  G_STRUCT_OFFSET (GncPluginManagerClass, plugin_removed),
208  NULL, NULL,
209  g_cclosure_marshal_VOID__OBJECT,
210  G_TYPE_NONE,
211  1,
212  GNC_TYPE_PLUGIN);
213 }
214 
215 static void
216 gnc_plugin_manager_init (GncPluginManager *manager)
217 {
219 
220  priv = GNC_PLUGIN_MANAGER_GET_PRIVATE(manager);
221  priv->plugins_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
222 }
223 
224 static void
225 gnc_plugin_manager_dispose (GObject *object)
226 {
227  GncPluginManager *manager = GNC_PLUGIN_MANAGER (object);
229 
230  g_return_if_fail (GNC_IS_PLUGIN_MANAGER (manager));
231 
232  priv = GNC_PLUGIN_MANAGER_GET_PRIVATE(manager);
233  if (priv->plugins_table)
234  {
235  g_hash_table_destroy (priv->plugins_table);
236  priv->plugins_table = NULL;
237 
238  g_list_foreach (priv->plugins, (GFunc)g_object_unref, NULL);
239  g_list_free (priv->plugins);
240  priv->plugins = NULL;
241  }
242 
243  G_OBJECT_CLASS (parent_class)->dispose (object);
244 }
245 
246 static void
247 gnc_plugin_manager_finalize (GObject *object)
248 {
249  g_return_if_fail (GNC_IS_PLUGIN_MANAGER (object));
250 
251  G_OBJECT_CLASS (parent_class)->finalize (object);
252 }
253 
254 static void
255 gnc_plugin_manager_shutdown (gpointer dummy, gpointer dummy2)
256 {
257  if (singleton != NULL)
258  {
259  g_object_unref(singleton);
260  singleton = NULL;
261  }
262 }
Plugin management functions for the GnuCash UI.
void gnc_plugin_manager_add_plugin(GncPluginManager *manager, GncPlugin *plugin)
#define ENTER(format, args...)
Definition: qoflog.h:261
void gnc_plugin_manager_remove_plugin(GncPluginManager *manager, GncPlugin *plugin)
GType gnc_plugin_manager_get_type(void)
GncPluginManager * gnc_plugin_manager_get(void)
const gchar * gnc_plugin_get_name(GncPlugin *plugin)
Definition: gnc-plugin.c:246
All type declarations for the whole Gnucash engine.
#define LEAVE(format, args...)
Definition: qoflog.h:271
GList * gnc_plugin_manager_get_plugins(GncPluginManager *manager)
GncPlugin * gnc_plugin_manager_get_plugin(GncPluginManager *manager, const gchar *name)
const gchar * QofLogModule
Definition: qofid.h:89