00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <libheraia.h>
00026
00027 static heraia_plugin_t *get_plugin_handle(heraia_window_t *main_window, heraia_plugin_t *plugin,
00028 const gchar *full_filename, const gchar *filename);
00029 static heraia_plugin_t *get_plugin_init_symbol(heraia_window_t *main_window, heraia_plugin_t *plugin);
00030 static void init_plugin(heraia_window_t *main_window, heraia_plugin_t *plugin, const gchar *filename, guint plugins_nb);
00031 static void load_one_plugin(heraia_window_t *main_window, const gchar *filename, guint plugins_nb);
00032
00036 gboolean plugin_capable(void)
00037 {
00038 return g_module_supported();
00039 }
00040
00046 heraia_plugin_t *new_plugin(void)
00047 {
00048 heraia_plugin_t *new = NULL;
00049
00050 new = (heraia_plugin_t *) g_malloc0(sizeof(heraia_plugin_t));
00051
00052 new->state = PLUGIN_STATE_NEW;
00053 new->handle = NULL;
00054 new->path = NULL;
00055 new->filename = NULL;
00056 new->info = (plugin_info_t *) g_malloc0(sizeof(plugin_info_t));
00057 new->filter = (plugin_filter_t *) g_malloc0(sizeof(plugin_filter_t));
00058 new->error = NULL;
00059 new->extra = NULL;
00060
00061
00062 new->init_proc = NULL;
00063
00064 new->quit_proc = NULL;
00065
00066 new->run_proc = NULL;
00067
00068 return new;
00069
00070 }
00071
00075 void free_plugin(heraia_plugin_t *plugin)
00076 {
00077 if (plugin != NULL)
00078 {
00079 if (plugin->handle != NULL)
00080 g_module_close(plugin->handle);
00081 if (plugin->info != NULL)
00082 {
00083 g_free(plugin->info->name);
00084 g_free(plugin->info->version);
00085 g_free(plugin->info->summary);
00086 g_free(plugin->info->description);
00087 g_free(plugin->info->author);
00088 g_free(plugin->info->homepage);
00089 g_free(plugin->info);
00090 }
00091 if (plugin->filter != NULL)
00092 {
00093 g_free(plugin->filter->extensions);
00094 g_free(plugin->filter);
00095 }
00096 g_free(plugin->path);
00097 g_free(plugin->filename);
00098 g_free(plugin->error);
00099 g_free(plugin->extra);
00100
00101 g_free(plugin);
00102 }
00103 }
00104
00108 static heraia_plugin_t *get_plugin_handle(heraia_window_t *main_window, heraia_plugin_t *plugin,
00109 const gchar *full_filename, const gchar *filename)
00110 {
00111 if (plugin != NULL)
00112 {
00113
00114 plugin->handle = g_module_open(full_filename, G_MODULE_BIND_MASK);
00115
00116 if (plugin->handle == NULL)
00117 {
00118 log_message(main_window, G_LOG_LEVEL_WARNING, "Could not open plugin %s - %s", filename, g_module_error());
00119 }
00120 }
00121
00122 return plugin;
00123 }
00124
00129 static heraia_plugin_t *get_plugin_init_symbol(heraia_window_t *main_window, heraia_plugin_t *plugin)
00130 {
00131 heraia_plugin_t *(*heraia_plugin_init)(heraia_plugin_t *);
00132 gboolean get_symbol = FALSE;
00133
00134 if (plugin != NULL && plugin->handle != NULL)
00135 {
00136 get_symbol = g_module_symbol(plugin->handle, "heraia_plugin_init", (gpointer *)(&heraia_plugin_init));
00137
00138 if (get_symbol == FALSE)
00139 {
00140 log_message(main_window, G_LOG_LEVEL_WARNING, "%s", g_module_error());
00141 free_plugin(plugin);
00142 return NULL;
00143 }
00144 else
00145 {
00146
00147 plugin = heraia_plugin_init(plugin);
00148 return plugin;
00149 }
00150 }
00151 else
00152 {
00153 free_plugin(plugin);
00154 return NULL;
00155 }
00156 }
00157
00162 static void init_plugin(heraia_window_t *main_window, heraia_plugin_t *plugin, const gchar *filename, guint plugins_nb)
00163 {
00164 if (plugin != NULL)
00165 {
00166 plugin->info->id = plugins_nb;
00167 main_window->plugins_list = g_list_append(main_window->plugins_list, plugin);
00168 log_message(main_window, G_LOG_LEVEL_INFO, "plugin %s loaded.", filename);
00169 plugin->init_proc(main_window);
00170 if (plugin->info->type == HERAIA_PLUGIN_ACTION)
00171 {
00172 add_entry_to_plugins_menu(main_window, plugin);
00173 }
00174
00175 }
00176 }
00177
00181 static void load_one_plugin(heraia_window_t *main_window, const gchar *filename, guint plugins_nb)
00182 {
00183 const gchar *full_filename = NULL;
00184 heraia_plugin_t *plugin = NULL;
00185 gchar *ext = g_strdup_printf(".%s", G_MODULE_SUFFIX);
00186
00187 full_filename = g_build_filename(PLUGINS_DIR, filename, NULL);
00188
00189
00190 if ( (g_file_test(full_filename, G_FILE_TEST_IS_DIR) == FALSE) &&
00191 (strcmp(strrchr(filename, '.'), ext) == 0)
00192 )
00193 {
00194 plugin = new_plugin();
00195 plugin->path = g_strdup_printf("%s", PLUGINS_DIR);
00196 plugin->filename = g_strdup_printf("%s", filename);
00197
00198 plugin = get_plugin_handle(main_window, plugin, full_filename, filename);
00199 plugin = get_plugin_init_symbol(main_window, plugin);
00200
00201 init_plugin(main_window, plugin, filename, plugins_nb);
00202 }
00203 }
00204
00205
00210 void load_plugins(heraia_window_t *main_window)
00211 {
00212 GDir *plugins_dir = NULL;
00213 GError *error = NULL;
00214 const gchar *filename = NULL;
00215 unsigned int plugins_nb = 0;
00216
00217
00218
00219 plugins_dir = g_dir_open(PLUGINS_DIR, 0, &error);
00220
00221 if (plugins_dir == NULL)
00222 {
00223 log_message(main_window, G_LOG_LEVEL_WARNING, "%s", error->message);
00224 g_error_free(error);
00225 }
00226 else
00227 {
00228 while ((filename = g_dir_read_name(plugins_dir)) != NULL)
00229 {
00230 load_one_plugin(main_window, filename, ++plugins_nb);
00231 }
00232 g_dir_close(plugins_dir);
00233 }
00234 }
00235
00240 void add_entry_to_plugins_menu(heraia_window_t *main_window, heraia_plugin_t *plugin)
00241 {
00242
00243 plugin->cmi_entry = GTK_CHECK_MENU_ITEM(gtk_check_menu_item_new_with_label(plugin->info->name));
00244
00245
00246 gtk_menu_shell_append(GTK_MENU_SHELL(heraia_get_widget(main_window->xmls->main, "plugins_menu")), GTK_WIDGET(plugin->cmi_entry));
00247
00248
00249 g_signal_connect(G_OBJECT(plugin->cmi_entry), "toggled", G_CALLBACK(plugin->run_proc), main_window);
00250
00251
00252 gtk_widget_show(GTK_WIDGET(plugin->cmi_entry));
00253 }
00254
00258 heraia_plugin_t *find_plugin_by_name(GList *plugins_list, gchar *name)
00259 {
00260 GList *list = g_list_first(plugins_list);
00261 heraia_plugin_t *plugin = NULL;
00262 gboolean stop = FALSE;
00263
00264 while (list != NULL && stop != TRUE)
00265 {
00266 plugin = (heraia_plugin_t *) list->data;
00267 if (plugin != NULL && plugin->info != NULL)
00268 {
00269 if (strcmp(plugin->info->name, name) == 0)
00270 stop = TRUE;
00271 }
00272 list = list->next;
00273 }
00274 if (stop == TRUE)
00275 return plugin;
00276 else
00277 return NULL;
00278 }
00279
00280
00285 gboolean load_plugin_glade_xml(heraia_window_t *main_window, heraia_plugin_t *plugin)
00286 {
00287 gchar *filename = NULL;
00288
00289 filename = g_strdup_printf("%s.glade", plugin->info->name);
00290
00291 plugin->xml = load_glade_xml_file(main_window->location_list, filename);
00292
00293 g_free(filename);
00294
00295 if (plugin->xml == NULL)
00296 return FALSE;
00297 else
00298 return TRUE;
00299 }
00300
00304 void show_hide_widget(GtkWidget *widget, gboolean show, window_prop_t *win_prop)
00305 {
00306 if (win_prop != NULL)
00307 {
00308 if (show)
00309 {
00310 move_and_show_dialog_box(widget, win_prop);
00311 }
00312 else
00313 {
00314 record_and_hide_dialog_box(widget, win_prop);
00315 }
00316 }
00317 else
00318 {
00319 if (show)
00320 {
00321 gtk_widget_show(widget);
00322 }
00323 else
00324 {
00325 gtk_widget_hide(widget);
00326 }
00327 }
00328 }
00329
00330
00334 void refresh_all_plugins(heraia_window_t *main_window)
00335 {
00336
00337 GList *list = g_list_first(main_window->plugins_list);
00338 heraia_plugin_t *plugin = NULL;
00339
00340 while (list != NULL)
00341 {
00342 plugin = (heraia_plugin_t *) list->data;
00343 if (plugin != NULL && plugin->refresh_proc != NULL)
00344 {
00345 plugin->refresh_proc(main_window, list->data);
00346 }
00347
00348 list = list->next;
00349 }
00350 }