diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2025-01-12 14:23:01 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2025-01-12 14:23:01 (GMT) |
commit | baa854bfcc969022a00617b58a661e37f345cab5 (patch) | |
tree | 093d3ace4c2e1ad8fa37ce5e08723f768fffbada /src/plugins/plugin-int.h | |
parent | 0fdba5bd3e2c9ed913619990dbda7925867e46c5 (diff) |
Rewrite the plugin system.
Diffstat (limited to 'src/plugins/plugin-int.h')
-rw-r--r-- | src/plugins/plugin-int.h | 88 |
1 files changed, 73 insertions, 15 deletions
diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h index 3ba19dc..07b455a 100644 --- a/src/plugins/plugin-int.h +++ b/src/plugins/plugin-int.h @@ -37,21 +37,28 @@ #include "../common/bits.h" -/* Transfert de la conscience de soi. */ -typedef void (* pg_set_self_fc) (GPluginModule *); -/* Prend acte du [dé]chargement du greffon. */ +/* Pointe le fichier contenant le greffon manipulé. */ +typedef char * (* get_plugin_filename_fc) (const GPluginModule *); + +/* Fournit le nom brut associé au greffon. */ +typedef char * (* get_plugin_modname_fc) (const GPluginModule *); + +/* Prend acte de (l'|la dés)activation du greffon. */ typedef bool (* pg_management_fc) (GPluginModule *); + + + +/* Transfert de la conscience de soi. */ +typedef void (* pg_set_self_fc) (GPluginModule *); + /* Accompagne la fin du chargement des modules natifs. */ typedef void (* pg_plugins_loaded_fc) (GPluginModule *, PluginAction); /* Crée une instance à partir d'un type dynamique externe. */ typedef gpointer (* pg_build_instance_fc) (GPluginModule *, PluginAction, GType); -/* Fournit le nom brut associé au greffon. */ -typedef char * (* pg_get_modname_fc) (const GPluginModule *); - #if 0 /* Procède à une opération liée à un contenu binaire. */ @@ -90,22 +97,47 @@ typedef void (* pg_detect_tools_fc) (const GPluginModule *, PluginAction, const #endif +/* Marqueur identifiable */ +#define CHRYSALIDE_PLUGIN_MAGIC 0xdeadc0de + + +/* Version identifiant les définitions courantes */ +typedef uint32_t plugin_abi_version_t; + +#define DEFINE_PLUGIN_ABI_VERSION(maj, min, rev) \ + (((maj & 0xff) << 24) | ((min & 0xff) << 16) | (rev & 0xffff)) + +#define GET_ABI_MAJ_VERSION(vs) ((vs >> 24) & 0xff) +#define GET_ABI_MIN_VERSION(vs) ((vs >> 16) & 0xff) +#define GET_ABI_REV_VERSION(vs) (vs & 0xffff) + +/** + * 0.3.0 : dernière version avec actions et fonctions associées + * 1.0.0 (04/01/25) : bascule en chargement d'objet et interfaces + */ +#define CURRENT_ABI_VERSION DEFINE_PLUGIN_ABI_VERSION(1, 0, 0) + + /* Greffon pour Chrysalide (instance) */ struct _GPluginModule { GObject parent; /* A laisser en premier */ - char *filename; /* Fichier associé au greffon */ - GModule *module; /* Abstration de manipulation */ + uint32_t magic; /* Vérification a minima */ + plugin_abi_version_t abi_version; /* Version du protocole utilisé*/ + + char *name; /* Désignation humaine courte */ + char *desc; /* Description plus loquace */ + char *version; /* Version du greffon */ + char *url; /* Site Web associé */ - const plugin_interface *interface; /* Déclaration d'interfaçage */ + char **required; /* Pré-chargements requis */ + size_t required_count; /* Quantité de ces dépendances */ PluginStatusFlags flags; /* Fanion pour l'état courant */ bitfield_t *dependencies; /* Cartographie des dépendances*/ - //GGenConfig *config; /* Configuration dédiée */ - }; @@ -114,6 +146,18 @@ struct _GPluginModuleClass { GObjectClass parent; /* A laisser en premier */ + get_plugin_filename_fc get_filename; /* Obtention du chemin */ + get_plugin_modname_fc get_modname; /* Fourniture du nom brut */ + + pg_management_fc enable; /* Procédure d'activation */ + pg_management_fc disable; /* Procédure d'extinction */ + + + + ///////////////////////////////////////////// + +#if 0 + pg_management_fc init; /* Procédure d'initialisation */ pg_management_fc manage; /* Etape dans la vie du greffon*/ pg_management_fc exit; /* Procédure d'extinction */ @@ -121,8 +165,6 @@ struct _GPluginModuleClass pg_plugins_loaded_fc plugins_loaded; /* Fin des chargements */ pg_build_instance_fc build_instance; /* Création d'objets */ - pg_get_modname_fc get_modname; /* Fourniture du nom brut */ - #if 0 #ifdef INCLUDE_GTK_SUPPORT pg_include_theme_fc include_theme; /* Extension d'un thème */ @@ -141,12 +183,28 @@ struct _GPluginModuleClass pg_detect_tools_fc detect; /* Lancement de détections */ #endif +#endif + + ///////////////////////////////////////////// + }; -/* Met en place la configuration dédiée au greffon. */ -void g_plugin_module_create_config(GPluginModule *); + +#define STORE_PLUGIN_ABI(p) \ + do \ + { \ + GPluginModule *_p; \ + _p = G_PLUGIN_MODULE(p); \ + _p->magic = CHRYSALIDE_PLUGIN_MAGIC; \ + _p->abi_version = CURRENT_ABI_VERSION; \ + } \ + while (0); + + +/* Met en place un greffon. */ +bool g_plugin_module_create(GPluginModule *, const char *, const char *, const char *, const char *, const char * const *, size_t); |