summaryrefslogtreecommitdiff
path: root/src/plugins/pglist.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-04-29 17:13:36 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-04-29 17:13:36 (GMT)
commite2f87e6e92a361cdd66b6867f51dda2abb1ed1b3 (patch)
tree2c3b5473c6042f64c145eb25cf923be8935ae793 /src/plugins/pglist.c
parent1e9b23fb37755fef5992f65cb9862fab271e13d9 (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.c147
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;
}