From ec826257323b853d3171f464fb57d37989715a44 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Wed, 29 Aug 2018 22:52:23 +0200
Subject: Updated the root API of the Python bindings.

---
 plugins/pychrysalide/plugin.c   | 26 +++++++++++++++++---------
 plugins/pychrysalide/plugin.h   |  2 +-
 plugins/pychrysalide/pychrysa.c |  8 +++++++-
 plugins/pychrysalide/struct.c   | 28 +++++++++++++++++++---------
 plugins/pychrysalide/struct.h   |  2 +-
 5 files changed, 45 insertions(+), 21 deletions(-)

diff --git a/plugins/pychrysalide/plugin.c b/plugins/pychrysalide/plugin.c
index a916668..cc69dd7 100644
--- a/plugins/pychrysalide/plugin.c
+++ b/plugins/pychrysalide/plugin.c
@@ -37,6 +37,7 @@
 #include <plugins/plugin-int.h>
 
 
+#include "access.h"
 #include "helpers.h"
 
 
@@ -912,7 +913,7 @@ PyTypeObject *get_python_plugin_module_type(void)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : module = module dont la définition est à compléter.          *
+*  Paramètres  : -                                                            *
 *                                                                             *
 *  Description : Prend en charge l'objet 'pychrysalide.PluginModule'.         *
 *                                                                             *
@@ -922,20 +923,27 @@ PyTypeObject *get_python_plugin_module_type(void)
 *                                                                             *
 ******************************************************************************/
 
-bool register_python_plugin_module(PyObject *module)
+bool ensure_python_plugin_module_is_registered(void)
 {
-    PyTypeObject *py_plugin_module_type;    /* Type Python 'PluginModule'  */
+    PyTypeObject *type;                     /* Type Python 'PluginModule'  */
+    PyObject *module;                       /* Module à recompléter        */
     PyObject *dict;                         /* Dictionnaire du module      */
 
-    py_plugin_module_type = get_python_plugin_module_type();
+    type = get_python_plugin_module_type();
 
-    dict = PyModule_GetDict(module);
+    if (!PyType_HasFeature(type, Py_TPFLAGS_READY))
+    {
+        module = get_access_to_python_module("pychrysalide");
 
-    if (!register_class_for_pygobject(dict, G_TYPE_PLUGIN_MODULE, py_plugin_module_type, &PyGObject_Type))
-        return false;
+        dict = PyModule_GetDict(module);
 
-    if (!py_plugin_module_define_constants(py_plugin_module_type))
-        return false;
+        if (!register_class_for_pygobject(dict, G_TYPE_PLUGIN_MODULE, type, &PyGObject_Type))
+            return false;
+
+        if (!py_plugin_module_define_constants(type))
+            return false;
+
+    }
 
     return true;
 
diff --git a/plugins/pychrysalide/plugin.h b/plugins/pychrysalide/plugin.h
index 1b7f7ba..e129155 100644
--- a/plugins/pychrysalide/plugin.h
+++ b/plugins/pychrysalide/plugin.h
@@ -68,7 +68,7 @@ GPluginModule *g_python_plugin_new(const char *, const char *);
 PyTypeObject *get_python_plugin_module_type(void);
 
 /* Prend en charge l'objet 'pychrysalide.PluginModule'. */
-bool register_python_plugin_module(PyObject *);
+bool ensure_python_plugin_module_is_registered(void);
 
 
 
diff --git a/plugins/pychrysalide/pychrysa.c b/plugins/pychrysalide/pychrysa.c
index dee0d84..7403927 100644
--- a/plugins/pychrysalide/pychrysa.c
+++ b/plugins/pychrysalide/pychrysa.c
@@ -43,6 +43,7 @@
 #include <plugins/plugin-int.h>
 
 
+#include "access.h"
 #include "helpers.h"
 #include "plugin.h"
 #include "struct.h"
@@ -360,7 +361,9 @@ PyMODINIT_FUNC PyInit_pychrysalide(void)
 
     result = PyModule_Create(&py_chrysalide_module);
 
-    status = register_python_py_struct(result);
+    register_access_to_python_module(py_chrysalide_module.m_name, result);
+
+    status = true;
 
     if (status) status = add_analysis_module(result);
     if (status) status = add_arch_module(result);
@@ -373,6 +376,9 @@ PyMODINIT_FUNC PyInit_pychrysalide(void)
     if (status) status = add_gui_module(result);
     if (status) status = add_mangling_module(result);
 
+    if (status) status = ensure_python_plugin_module_is_registered();
+    if (status) status = ensure_python_py_struct_is_registered();
+
     if (status) status = populate_analysis_module();
     if (status) status = populate_arch_module();
     if (status) status = populate_common_module();
diff --git a/plugins/pychrysalide/struct.c b/plugins/pychrysalide/struct.c
index 33b58b8..98704c0 100644
--- a/plugins/pychrysalide/struct.c
+++ b/plugins/pychrysalide/struct.c
@@ -25,6 +25,9 @@
 #include "struct.h"
 
 
+#include "access.h"
+
+
 
 /* Objet à vocation abstraite */
 typedef struct _PyStructObject
@@ -130,7 +133,7 @@ PyTypeObject *get_python_py_struct_type(void)
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : module = module dont la définition est à compléter.          *
+*  Paramètres  : -                                                            *
 *                                                                             *
 *  Description : Prend en charge l'objet 'pychrysalide.PyStructObject'.       *
 *                                                                             *
@@ -140,21 +143,28 @@ PyTypeObject *get_python_py_struct_type(void)
 *                                                                             *
 ******************************************************************************/
 
-bool register_python_py_struct(PyObject *module)
+bool ensure_python_py_struct_is_registered(void)
 {
-    PyTypeObject *py_struct_type;           /* Type Python 'PyStructObject'*/
+    PyTypeObject *type;                     /* Type Python 'PyStructObject'*/
+    PyObject *module;                       /* Module à recompléter        */
     int ret;                                /* Bilan des préparatifs       */
 
-    py_struct_type = get_python_py_struct_type();
+    type = get_python_py_struct_type();
 
-    ret = PyType_Ready(py_struct_type);
+    if (!PyType_HasFeature(type, Py_TPFLAGS_READY))
+    {
+        module = get_access_to_python_module("pychrysalide");
 
-    if (ret != 0)
-        return false;
+        ret = PyType_Ready(type);
 
-    Py_INCREF(py_struct_type);
+        if (ret != 0)
+            return false;
 
-    PyModule_AddObject(module, "PyStructObject", (PyObject *)py_struct_type);;
+        Py_INCREF(type);
+
+        PyModule_AddObject(module, "PyStructObject", (PyObject *)type);
+
+    }
 
     return true;
 
diff --git a/plugins/pychrysalide/struct.h b/plugins/pychrysalide/struct.h
index 7c5391c..c063c5e 100644
--- a/plugins/pychrysalide/struct.h
+++ b/plugins/pychrysalide/struct.h
@@ -35,7 +35,7 @@
 PyTypeObject *get_python_py_struct_type(void);
 
 /* Prend en charge l'objet 'pychrysalide.PyStructObject'. */
-bool register_python_py_struct(PyObject *);
+bool ensure_python_py_struct_is_registered(void);
 
 
 
-- 
cgit v0.11.2-87-g4458