From de62d34d2dc6135b42af7f8a103c8c7af09fd54f Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Wed, 25 Oct 2017 21:53:25 +0200
Subject: Ensured the Python modules are available for other plugins in
 standalone mode.

---
 ChangeLog                   | 15 ++++++++++++++
 plugins/pychrysa/pychrysa.c | 48 ++++++++++++++++++++++++++++++++++++++++++++-
 plugins/pychrysa/pychrysa.h |  3 +++
 src/main.c                  |  2 +-
 src/plugins/pglist.c        | 29 ++++++++++++++++++++++++---
 src/plugins/pglist.h        |  8 +++++++-
 src/plugins/plugin.c        | 22 ++++++++++++++++++++-
 src/plugins/plugin.h        |  3 +++
 8 files changed, 123 insertions(+), 7 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 671d873..eb5c3c2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
 17-10-25  Cyrille Bagard <nocbos@gmail.com>
 
+	* plugins/pychrysa/pychrysa.c:
+	* plugins/pychrysa/pychrysa.h:
+	Ensure the Python modules are available for other plugins in standalone mode.
+
+	* src/main.c:
+	Update code.
+
+	* src/plugins/pglist.c:
+	* src/plugins/pglist.h:
+	* src/plugins/plugin.c:
+	* src/plugins/plugin.h:
+	Extend the features for the fix.
+
+17-10-25  Cyrille Bagard <nocbos@gmail.com>
+
 	* plugins/dalvik/core.c:
 	* plugins/dalvik/core.h:
 	* plugins/dalvik/register.c:
diff --git a/plugins/pychrysa/pychrysa.c b/plugins/pychrysa/pychrysa.c
index 7c082d6..c971e56 100644
--- a/plugins/pychrysa/pychrysa.c
+++ b/plugins/pychrysa/pychrysa.c
@@ -24,6 +24,7 @@
 #include "pychrysa.h"
 
 
+#include <assert.h>
 #include <errno.h>
 #include <pygobject.h>
 #include <stdio.h>
@@ -62,6 +63,9 @@ DEFINE_CHRYSALIDE_ACTIVE_PLUGIN("PyChrysalide", "Provides bindings to Python", "
 /* Note la nature du chargement */
 static bool _standalone = true;
 
+/* Réceptacle pour le chargement forcé */
+static PyObject *_chrysalide_module = NULL;
+
 
 /* Fournit la révision du programme global. */
 static PyObject *py_chrysalide_revision(PyObject *, PyObject *);
@@ -299,6 +303,8 @@ PyMODINIT_FUNC PyInit_pychrysalide(void)
 {
     PyObject *result;                       /* Module Python à retourner   */
     bool status;                            /* Bilan des inclusions        */
+    GPluginModule *self;                    /* Représentation interne      */
+    PluginStatusFlags self_flags;           /* Fanions à mettre à jour     */
 
     static PyMethodDef py_chrysalide_methods[] = {
 
@@ -400,7 +406,25 @@ PyMODINIT_FUNC PyInit_pychrysalide(void)
     }
 
     if (_standalone)
-        init_all_plugins();
+    {
+        init_all_plugins(false);
+
+        lock_plugin_list_for_reading();
+
+        self = get_plugin_by_name("PyChrysalide", NULL);
+        assert(self != NULL);
+
+        self_flags = g_plugin_module_get_flags(self);
+        self_flags &= ~(PSF_FAILURE | PSF_LOADED);
+        self_flags |= (status ? PSF_LOADED : PSF_FAILURE);
+
+        g_plugin_module_override_flags(self, self_flags);
+
+        unlock_plugin_list_for_reading();
+
+        load_remaning_plugins();
+
+    }
 
     return result;
 
@@ -556,6 +580,8 @@ G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *plugin)
 
     PySys_SetArgv(0, (wchar_t *[]) { NULL });
 
+    _chrysalide_module = PyImport_ImportModule("pychrysalide");
+
     result = load_python_plugins(plugin);
 
  cpi_done:
@@ -563,3 +589,23 @@ G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *plugin)
     return result;
 
 }
+
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : plugin = greffon à manipuler.                                *
+*                                                                             *
+*  Description : Prend acte du déchargement du greffon.                       *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+G_MODULE_EXPORT void chrysalide_plugin_exit(GPluginModule *plugin)
+{
+    Py_XDECREF(_chrysalide_module);
+
+}
diff --git a/plugins/pychrysa/pychrysa.h b/plugins/pychrysa/pychrysa.h
index 51d0470..eb8fc5b 100644
--- a/plugins/pychrysa/pychrysa.h
+++ b/plugins/pychrysa/pychrysa.h
@@ -91,6 +91,9 @@ PyMODINIT_FUNC PyInit_pychrysalide(void);
 /* Prend acte du chargement du greffon. */
 G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *);
 
+/* Prend acte du déchargement du greffon. */
+G_MODULE_EXPORT void chrysalide_plugin_exit(GPluginModule *);
+
 
 
 #endif  /* _PLUGINS_PYCHRYSA_H */
diff --git a/src/main.c b/src/main.c
index 3bcedf4..e05ccb6 100644
--- a/src/main.c
+++ b/src/main.c
@@ -249,7 +249,7 @@ int main(int argc, char **argv)
     if (!batch_mode)
         gtk_widget_show_now(editor);
 
-    init_all_plugins();
+    init_all_plugins(true);
 
     config = get_main_configuration();
 
diff --git a/src/plugins/pglist.c b/src/plugins/pglist.c
index 2010cda..1f608b4 100644
--- a/src/plugins/pglist.c
+++ b/src/plugins/pglist.c
@@ -58,7 +58,7 @@ static void browse_directory_for_plugins(const char *);
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : -                                                            *
+*  Paramètres  : load = procéde à un chargement dans la foulée ?              *
 *                                                                             *
 *  Description : Procède au chargement des différents greffons trouvés.       *
 *                                                                             *
@@ -68,13 +68,14 @@ static void browse_directory_for_plugins(const char *);
 *                                                                             *
 ******************************************************************************/
 
-bool init_all_plugins(void)
+bool init_all_plugins(bool load)
 {
     g_rw_lock_init(&_pg_lock);
 
     browse_directory_for_plugins(PACKAGE_SOURCE_DIR "/plugins");
 
-    load_remaning_plugins();
+    if (load)
+        load_remaning_plugins();
 
     return true;
 
@@ -113,6 +114,28 @@ void exit_all_plugins(void)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : lock = type d'action à mener.                                *
+*                                                                             *
+*  Description : Verrouille ou déverrouille l'accès en lecture à la liste.    *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void _lock_unlock_plugin_list_for_reading(bool lock)
+{
+    if (lock)
+        g_rw_lock_reader_lock(&_pg_lock);
+    else
+        g_rw_lock_reader_unlock(&_pg_lock);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : entry = entrée de répertoire à analyser.                     *
 *                                                                             *
 *  Description : Filtre les répertoire et les modules de greffons pootentels. *
diff --git a/src/plugins/pglist.h b/src/plugins/pglist.h
index d2f2243..d406cc8 100644
--- a/src/plugins/pglist.h
+++ b/src/plugins/pglist.h
@@ -36,11 +36,17 @@
 
 
 /* Procède au chargement des différents greffons trouvés. */
-bool init_all_plugins(void);
+bool init_all_plugins(bool);
 
 /* Procède au déchargement des différents greffons présents. */
 void exit_all_plugins(void);
 
+/* Verrouille ou déverrouille l'accès en lecture à la liste. */
+void _lock_unlock_plugin_list_for_reading(bool lock);
+
+#define lock_plugin_list_for_reading() _lock_unlock_plugin_list_for_reading(true)
+#define unlock_plugin_list_for_reading() _lock_unlock_plugin_list_for_reading(false)
+
 /* Ajoute un greffon à la liste principale de greffons. */
 void _register_plugin(GPluginModule *);
 
diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c
index a57cb6f..2cfb3de 100644
--- a/src/plugins/plugin.c
+++ b/src/plugins/plugin.c
@@ -391,6 +391,26 @@ PluginStatusFlags g_plugin_module_get_flags(const GPluginModule *plugin)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : plugin = greffon à modifier.                                 *
+*                flags  = fanions à ajouter brutalement au greffon.           *
+*                                                                             *
+*  Description : Ajoute des indications sur l'état du greffon.                *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void g_plugin_module_override_flags(GPluginModule *plugin, PluginStatusFlags flags)
+{
+    plugin->flags |= flags;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : plugin = greffon à mettre à jour.                            *
 *                list   = ensemble des greffons disponibles.                  *
 *                count  = taille de cet ensemble.                             *
@@ -543,7 +563,7 @@ bool g_plugin_module_load(GPluginModule *plugin, GPluginModule **list, size_t co
 
                 plugin->flags |= PSF_FAILURE;
 
-        }
+            }
 
         }
 
diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h
index 78dcaa6..d86682c 100644
--- a/src/plugins/plugin.h
+++ b/src/plugins/plugin.h
@@ -82,6 +82,9 @@ const plugin_interface *g_plugin_module_get_interface(const GPluginModule *);
 /* Fournit des indications sur l'état du greffon. */
 PluginStatusFlags g_plugin_module_get_flags(const GPluginModule *);
 
+/* Ajoute des indications sur l'état du greffon. */
+void g_plugin_module_override_flags(GPluginModule *, PluginStatusFlags);
+
 /* Met à jour l'ensemble des dépendances du greffon. */
 bool g_plugin_module_resolve_dependencies(GPluginModule *, GPluginModule **, size_t);
 
-- 
cgit v0.11.2-87-g4458