summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2020-11-22 22:36:53 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2020-11-22 22:36:53 (GMT)
commit6122bb7f34b178d4c07285adae16afcc55294b1f (patch)
treecb9b2b2b19ef43d4782a228f28143e745e18c5dd /src
parentf20d4a9ec9fa9382a562844de83b5380103283b3 (diff)
Provided a configuration directory for plugins.
Diffstat (limited to 'src')
-rw-r--r--src/plugins/plugin-int.h5
-rw-r--r--src/plugins/plugin.c133
-rw-r--r--src/plugins/plugin.h6
3 files changed, 144 insertions, 0 deletions
diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h
index 6b7eb7f..876dc99 100644
--- a/src/plugins/plugin-int.h
+++ b/src/plugins/plugin-int.h
@@ -45,6 +45,9 @@ typedef bool (* pg_management_fc) (GPluginModule *);
/* Accompagne la fin du chargement des modules natifs. */
typedef void (* pg_native_loaded_fc) (GPluginModule *, PluginAction);
+/* Fournit le nom brut associé au greffon. */
+typedef char * (* pg_get_modname_fc) (const GPluginModule *);
+
/* Procède à une opération liée à un contenu binaire. */
typedef void (* pg_handle_content_fc) (const GPluginModule *, PluginAction, GBinContent *, wgroup_id_t, GtkStatusStack *);
@@ -97,6 +100,8 @@ struct _GPluginModuleClass
pg_native_loaded_fc native_loaded; /* Fin des chargements natifs */
+ pg_get_modname_fc get_modname; /* Fourniture du nom brut */
+
pg_include_theme_fc include_theme; /* Extension d'un thème */
pg_handle_content_fc handle_content; /* Explorations ou résolutions */
diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c
index e96ddc9..cc3db70 100644
--- a/src/plugins/plugin.c
+++ b/src/plugins/plugin.c
@@ -38,6 +38,9 @@
#include "dt.h"
#include "pglist.h"
#include "plugin-int.h"
+#include "../common/extstr.h"
+#include "../common/pathname.h"
+#include "../common/xdg.h"
@@ -56,6 +59,9 @@ static void g_plugin_module_finalize(GPluginModule *);
/* Initialise la classe des greffons d'extension. */
static void g_plugin_module_init_gclass(GPluginModuleClass *, GModule *);
+/* Fournit le nom brut associé au greffon. */
+static char *_g_plugin_module_get_modname(const GPluginModule *);
+
/* Indique le type défini pour un greffon. */
@@ -78,12 +84,17 @@ G_DEFINE_TYPE(GPluginModule, g_plugin_module, G_TYPE_OBJECT);
static void g_plugin_module_class_init(GPluginModuleClass *class)
{
GObjectClass *object; /* Autre version de la classe */
+ GPluginModuleClass *plugin; /* Version parente de la classe*/
object = G_OBJECT_CLASS(class);
object->dispose = (GObjectFinalizeFunc/* ! */)g_plugin_module_dispose;
object->finalize = (GObjectFinalizeFunc)g_plugin_module_finalize;
+ plugin = G_PLUGIN_MODULE_CLASS(class);
+
+ plugin->get_modname = (pg_get_modname_fc)_g_plugin_module_get_modname;
+
}
@@ -712,6 +723,75 @@ static void g_plugin_module_init_gclass(GPluginModuleClass *class, GModule *modu
/******************************************************************************
* *
+* Paramètres : plugin = greffon à valider. *
+* *
+* Description : Fournit le nom brut associé au greffon. *
+* *
+* Retour : Désignation brute du greffon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+char *g_plugin_module_get_modname(const GPluginModule *plugin)
+{
+ char *result; /* Désignation brute à renvoyer*/
+ GPluginModuleClass *class; /* Classe de l'instance active */
+
+ class = G_PLUGIN_MODULE_GET_CLASS(plugin);
+
+ result = class->get_modname(plugin);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : plugin = greffon à valider. *
+* *
+* Description : Fournit le nom brut associé au greffon. *
+* *
+* Retour : Désignation brute du greffon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static char *_g_plugin_module_get_modname(const GPluginModule *plugin)
+{
+ char *result; /* Désignation brute à renvoyer*/
+ char *path; /* Chemin à traiter */
+ char *filename; /* Nom de bibliothèque partagée*/
+ size_t length; /* Taille du nom */
+
+ path = strdup(g_plugin_module_get_filename(G_PLUGIN_MODULE(plugin)));
+
+ filename = basename(path);
+
+ if (strncmp(filename, "lib", 3) == 0)
+ filename += 3;
+
+ length = strlen(filename);
+
+ if (length >= 3)
+ {
+ if (strncmp(&filename[length - 3], ".so", 3) == 0)
+ filename[length - 3] = '\0';
+ }
+
+ result = strdup(filename);
+
+ free(path);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : plugin = greffon à consulter. *
* *
* Description : Indique le fichier contenant le greffon manipulé. *
@@ -981,6 +1061,59 @@ bool g_plugin_module_load(GPluginModule *plugin, GPluginModule **list, size_t co
/******************************************************************************
* *
* Paramètres : plugin = greffon à consulter. *
+* final = fin imposée du nom de fichier final. *
+* create = amorce la création des répertoire ? *
+* *
+* Description : Construit le nom d'un fichier de configuration du greffon. *
+* *
+* Retour : Chemin d'accès déterminé, ou NULL en cas d'erreur. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+char *g_plugin_module_build_config_filename(const GPluginModule *plugin, const char *final, bool create)
+{
+ char *result; /* Chaîne à retourner */
+ char *modname; /* Désignation brute de greffon*/
+ char *suffix; /* Fin du répertoire personnel */
+ bool status; /* Bilan d'une création */
+
+ modname = g_plugin_module_get_modname(plugin);
+
+ suffix = strdup("chrysalide");
+ suffix = stradd(suffix, G_DIR_SEPARATOR_S);
+ suffix = stradd(suffix, "plugins");
+ suffix = stradd(suffix, G_DIR_SEPARATOR_S);
+ suffix = stradd(suffix, modname);
+ suffix = stradd(suffix, G_DIR_SEPARATOR_S);
+ suffix = stradd(suffix, final);
+
+ result = get_xdg_config_dir(suffix);
+
+ free(suffix);
+ free(modname);
+
+ if (create)
+ {
+ status = mkpath(result);
+
+ if (!status)
+ {
+ free(result);
+ result = NULL;
+ }
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : plugin = greffon à consulter. *
* msg = message à faire apparaître à l'écran. *
* *
* Description : Présente dans le journal un message simple. *
diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h
index 37e4c57..70687fe 100644
--- a/src/plugins/plugin.h
+++ b/src/plugins/plugin.h
@@ -75,6 +75,9 @@ GType g_plugin_module_get_type(void);
/* Crée un module pour un greffon donné. */
GPluginModule *g_plugin_module_new(const gchar *);
+/* Fournit le nom brut associé au greffon. */
+char *g_plugin_module_get_modname(const GPluginModule *);
+
/* Indique le fichier contenant le greffon manipulé. */
const char *g_plugin_module_get_filename(const GPluginModule *);
@@ -93,6 +96,9 @@ bool g_plugin_module_resolve_dependencies(GPluginModule *, GPluginModule **, siz
/* Termine le chargement du greffon préparé. */
bool g_plugin_module_load(GPluginModule *, GPluginModule **, size_t);
+/* Construit le nom d'un fichier de configuration du greffon. */
+char *g_plugin_module_build_config_filename(const GPluginModule *, const char *, bool);
+
/* Présente dans le journal un message simple. */
void g_plugin_module_log_simple_message(const GPluginModule *, LogMessageType, const char *);