diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-04-29 17:13:36 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-04-29 17:13:36 (GMT) |
commit | e2f87e6e92a361cdd66b6867f51dda2abb1ed1b3 (patch) | |
tree | 2c3b5473c6042f64c145eb25cf923be8935ae793 /src/plugins/pglist.c | |
parent | 1e9b23fb37755fef5992f65cb9862fab271e13d9 (diff) |
Saved the current work on the overjump plugin.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@61 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/plugins/pglist.c')
-rw-r--r-- | src/plugins/pglist.c | 147 |
1 files changed, 138 insertions, 9 deletions
diff --git a/src/plugins/pglist.c b/src/plugins/pglist.c index 8301eb3..85421e6 100644 --- a/src/plugins/pglist.c +++ b/src/plugins/pglist.c @@ -25,7 +25,16 @@ #include "pglist.h" +#include <dirent.h> +#include <malloc.h> +#include <string.h> + + +#include <config.h> + + #include "plugin.h" +#include "../common/extstr.h" @@ -34,14 +43,21 @@ typedef struct _plugins_list { GObject *ref; /* Référencement global */ - - + GPluginModule **plugins; /* Liste de greffons */ + size_t plugins_count; /* Taille de cette liste */ } plugins_list; /* Liste de l'ensemble des greffons */ -static plugins_list list; +static plugins_list _list; + + +/* Filtre les répertoire et les modules de greffons pootentels. */ +int filter_dirs_or_mods(const struct dirent *); + +/* Part à la recherche de greffons sous forme de modules. */ +void browse_directory_for_plugins(plugins_list *, const char *); @@ -51,7 +67,7 @@ static plugins_list list; * * * Description : Procède au chargement des différents greffons trouvés. * * * -* Retour : Toujours true (même s'il y a des erreurs de chargemet). * +* Retour : Toujours true (même s'il y a des erreurs de chargement). * * * * Remarques : - * * * @@ -59,15 +75,128 @@ static plugins_list list; bool init_all_plugins(GObject *ref) { - GPluginModule *pg; + _list.ref = ref; - list.ref = ref; + browse_directory_for_plugins(&_list, PACKAGE_SOURCE_DIR "/src/plugins"); + return true; - pg = g_plugin_module_new("/home/ocb/prog/openida.pg/src/plugins/pyoida/pyoidamodule.so", list.ref); +} - printf("plug ? %p\n", pg); - return true; +/****************************************************************************** +* * +* Paramètres : entry = entrée de répertoire à analyser. * +* * +* Description : Filtre les répertoire et les modules de greffons pootentels. * +* * +* Retour : Valeur non nulle pour garder l'élément. * +* * +* Remarques : - * +* * +******************************************************************************/ + +int filter_dirs_or_mods(const struct dirent *entry) +{ + int result; /* Conclusion à remonter */ + + if (entry->d_type == DT_DIR) + result = strcmp(entry->d_name, ".") * strcmp(entry->d_name, ".."); + + else + result = (strrcmp(entry->d_name, "." G_MODULE_SUFFIX) == 0 ? 1 : 0); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : list = liste de greffons à compléter si possible. * +* dir = répertoire à parcourir en quête de greffons (sans /). * +* * +* Description : Part à la recherche de greffons sous forme de modules. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void browse_directory_for_plugins(plugins_list *list, const char *dir) +{ + struct dirent **namelist; /* Eléments trouvés */ + int ret; /* Bilan du parcours */ + char *filename; /* Elément à ausculter */ + GPluginModule *plugin; /* Greffon à intégrer ou pas */ + + ret = scandir(dir, &namelist, filter_dirs_or_mods, alphasort); + if (ret < 0) + { + perror("scandir"); + return; + } + + while (ret--) + { + filename = (char *)calloc(strlen(dir) + 1 + strlen(namelist[ret]->d_name) + 1, sizeof(char)); + + strcpy(filename, dir); + strcat(filename, "/"); /* FIXME : Win */ + strcat(filename, namelist[ret]->d_name); + + if (namelist[ret]->d_type == DT_DIR) + browse_directory_for_plugins(list, filename); + + else + { + plugin = g_plugin_module_new(filename, list->ref); + + if (plugin != NULL) + { + list->plugins = (GPluginModule **)realloc(list->plugins, ++list->plugins_count * sizeof(GPluginModule *)); + list->plugins[list->plugins_count - 1] = plugin; + } + + } + + free(filename); + free(namelist[ret]); + + } + + free(namelist); + +} + + +/****************************************************************************** +* * +* Paramètres : action = fonctionnalité recherchée. * +* * +* Description : Founit un greffon offrant le service demandé. * +* * +* Retour : Greffon satisfaisant ou NULL si aucun. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GPluginModule *get_one_plugin_for_action(PluginAction action) +{ + GPluginModule *result; /* Greffon à retourner */ + size_t i; /* Boucle de parcours */ + + result = NULL; + + for (i = 0; i < _list.plugins_count; i++) + if (g_plugin_module_get_action(_list.plugins[i]) & action) + { + result = _list.plugins[i]; + break; + } + + return result; } |