From 9d74efa39abcbe68b102ceff79c8d61766387f53 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Tue, 11 Dec 2018 22:20:53 +0100
Subject: Collected all Python bindings features using a fake module.

---
 plugins/pychrysalide/Makefile.am |  1 +
 plugins/pychrysalide/helpers.c   | 30 ++++++++++++++++++
 plugins/pychrysalide/pychrysa.c  |  3 ++
 plugins/pychrysalide/star.c      | 66 ++++++++++++++++++++++++++++++++++++++++
 plugins/pychrysalide/star.h      | 39 ++++++++++++++++++++++++
 5 files changed, 139 insertions(+)
 create mode 100644 plugins/pychrysalide/star.c
 create mode 100644 plugins/pychrysalide/star.h

diff --git a/plugins/pychrysalide/Makefile.am b/plugins/pychrysalide/Makefile.am
index 0483b2a..8051bb9 100644
--- a/plugins/pychrysalide/Makefile.am
+++ b/plugins/pychrysalide/Makefile.am
@@ -10,6 +10,7 @@ pychrysalide_la_SOURCES =				\
 	helpers.h helpers.c					\
 	plugin.h plugin.c					\
 	pychrysa.h pychrysa.c				\
+	star.h star.c						\
 	struct.h struct.c					\
 	weak.h weak.c
 
diff --git a/plugins/pychrysalide/helpers.c b/plugins/pychrysalide/helpers.c
index 51c2f31..3a67e2b 100644
--- a/plugins/pychrysalide/helpers.c
+++ b/plugins/pychrysalide/helpers.c
@@ -458,6 +458,11 @@ bool _register_class_for_pygobject(PyObject *dict, GType gtype, PyTypeObject *ty
     PyObject *static_bases;                 /* Base(s) de l'objet          */
     va_list ap;                             /* Parcours des arguments      */
     PyTypeObject *static_base;              /* Base à rajouter à la liste  */
+    PyObject *features;                     /* Module à recompléter        */
+    PyObject *features_dict;                /* Dictionnaire à compléter    */
+    char *name;                             /* Désignation de la classe    */
+    PyObject *item;                         /* Nouvel élément à exporter   */
+    int ret;                                /* Bilan d'une insertion       */
 
     /**
      * pygobject_register_class() définit type->tp_base à partir des arguments fournis,
@@ -531,6 +536,31 @@ bool _register_class_for_pygobject(PyObject *dict, GType gtype, PyTypeObject *ty
 
     assert(PyErr_Occurred() == NULL);
 
+    /**
+     * Création d'un dictionnaire complet pour la simulation d'un "import *".
+     */
+
+    if (result)
+    {
+        features = get_access_to_python_module("pychrysalide.features");
+
+        features_dict = PyModule_GetDict(features);
+
+        name = strrchr(type->tp_name, '.');
+        assert(name != NULL);
+
+        name++;
+
+        item = PyDict_GetItemString(dict, name);
+        assert(item != NULL);
+
+        ret = PyDict_SetItemString(features_dict, name, item);
+        assert(ret == 0);
+
+        result = (ret == 0);
+
+    }
+
     return result;
 
 }
diff --git a/plugins/pychrysalide/pychrysa.c b/plugins/pychrysalide/pychrysa.c
index 785481b..514442a 100644
--- a/plugins/pychrysalide/pychrysa.c
+++ b/plugins/pychrysalide/pychrysa.c
@@ -47,6 +47,7 @@
 #include "dt.h"
 #include "helpers.h"
 #include "plugin.h"
+#include "star.h"
 #include "struct.h"
 #include "analysis/module.h"
 #include "arch/module.h"
@@ -371,6 +372,8 @@ PyMODINIT_FUNC PyInit_pychrysalide(void)
 
     status = true;
 
+    if (status) status = add_features_module(result);
+
     if (status) status = add_analysis_module(result);
     if (status) status = add_arch_module(result);
     if (status) status = add_common_module(result);
diff --git a/plugins/pychrysalide/star.c b/plugins/pychrysalide/star.c
new file mode 100644
index 0000000..5034d7c
--- /dev/null
+++ b/plugins/pychrysalide/star.c
@@ -0,0 +1,66 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * features.c - exportation complète de tous les éléments du greffon Python
+ *
+ * Copyright (C) 2018 Cyrille Bagard
+ *
+ *  This file is part of Chrysalide.
+ *
+ *  Chrysalide is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  Chrysalide is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+#include "star.h"
+
+
+#include "helpers.h"
+
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : super = module dont la définition est à compléter.           *
+*                                                                             *
+*  Description : Ajoute le module 'features' à un module Python.              *
+*                                                                             *
+*  Retour      : Bilan de l'opération.                                        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool add_features_module(PyObject *super)
+{
+    bool result;                            /* Bilan à retourner           */
+    PyObject *module;                       /* Sous-module mis en place    */
+
+    static PyModuleDef py_chrysalide_features_module = {
+
+        .m_base = PyModuleDef_HEAD_INIT,
+
+        .m_name = "pychrysalide.features",
+        .m_doc = "Python pseudo-module to import all items from Chrysalide bindings",
+
+        .m_size = -1,
+
+    };
+
+    module = build_python_module(super, &py_chrysalide_features_module);
+
+    result = (module != NULL);
+
+    return result;
+
+}
diff --git a/plugins/pychrysalide/star.h b/plugins/pychrysalide/star.h
new file mode 100644
index 0000000..2a53d3e
--- /dev/null
+++ b/plugins/pychrysalide/star.h
@@ -0,0 +1,39 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * star.h - prototypes pour l'exportation complète de tous les éléments du greffon Python
+ *
+ * Copyright (C) 2018 Cyrille Bagard
+ *
+ *  This file is part of Chrysalide.
+ *
+ *  Chrysalide is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  Chrysalide is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+#ifndef _PLUGINS_PYCHRYSALIDE_STAR_H
+#define _PLUGINS_PYCHRYSALIDE_STAR_H
+
+
+#include <Python.h>
+#include <stdbool.h>
+
+
+
+/* Ajoute le module 'features'à un module Python. */
+bool add_features_module(PyObject *);
+
+
+
+#endif  /* _PLUGINS_PYCHRYSALIDE_STAR_H */
-- 
cgit v0.11.2-87-g4458