summaryrefslogtreecommitdiff
path: root/plugins/dex/python
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2019-05-04 17:56:33 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2019-05-04 17:57:10 (GMT)
commitb92a5e56de9198c08956ce486cd12712d7034731 (patch)
tree4ee902ed116b9988dfd284186c725f1bb1d20f22 /plugins/dex/python
parentc9f7b4491b368f886b0852ba166cef969fd6d20f (diff)
Created a GLib object for the Dex pool.
Diffstat (limited to 'plugins/dex/python')
-rw-r--r--plugins/dex/python/Makefile.am1
-rw-r--r--plugins/dex/python/format.c336
-rw-r--r--plugins/dex/python/module.c2
-rw-r--r--plugins/dex/python/pool.c545
-rw-r--r--plugins/dex/python/pool.h45
5 files changed, 608 insertions, 321 deletions
diff --git a/plugins/dex/python/Makefile.am b/plugins/dex/python/Makefile.am
index b371b87..2e3316b 100644
--- a/plugins/dex/python/Makefile.am
+++ b/plugins/dex/python/Makefile.am
@@ -8,6 +8,7 @@ libdexpython_la_SOURCES = \
format.h format.c \
method.h method.c \
module.h module.c \
+ pool.h pool.c \
routine.h routine.c \
translate.h translate.c
diff --git a/plugins/dex/python/format.c b/plugins/dex/python/format.c
index 8f18fc8..77ebef6 100644
--- a/plugins/dex/python/format.c
+++ b/plugins/dex/python/format.c
@@ -39,30 +39,14 @@
#include "constants.h"
#include "../class.h"
#include "../format.h"
-#include "../pool.h"
/* Crée un nouvel objet Python de type 'DexFormat'. */
static PyObject *py_dex_format_new(PyTypeObject *, PyObject *, PyObject *);
-/* Fournit la liste de toutes les chaînes de la table globale. */
-static PyObject *py_dex_format_get_pool_strings(PyObject *, void *);
-
-/* Fournit la liste de tous les types de la table globale. */
-static PyObject *py_dex_format_get_pool_types(PyObject *, void *);
-
-/* Fournit la liste de tous les prototypes de la table globale. */
-static PyObject *py_dex_format_get_pool_prototypes(PyObject *, void *);
-
-/* Fournit la liste de tous les champs de la table globale. */
-static PyObject *py_dex_format_get_pool_fields(PyObject *, void *);
-
-/* Fournit la liste de toutes les méthodes de la table globale. */
-static PyObject *py_dex_format_get_pool_methods(PyObject *, void *);
-
-/* Fournit la liste de toutes les classes du format. */
-static PyObject *py_dex_format_get_classes(PyObject *, void *);
+/* Fournit la table des ressources associée au format Dex. */
+static PyObject *py_dex_format_get_pool(PyObject *, void *);
@@ -117,300 +101,33 @@ static PyObject *py_dex_format_new(PyTypeObject *type, PyObject *args, PyObject
* Paramètres : self = objet Python concerné par l'appel. *
* closure = non utilisé ici. *
* *
-* Description : Fournit la liste de toutes les chaînes de la table globale. *
-* *
-* Retour : Liste vide ou remplie de chaînes. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static PyObject *py_dex_format_get_pool_strings(PyObject *self, void *closure)
-{
- PyObject *result; /* Valeur à retourner */
- GDexFormat *format; /* Version native */
- uint32_t count; /* Nombre d'éléments à traiter */
- uint32_t i; /* Boucle de parcours */
- const char *string; /* Chaîne à intégrer */
- PyObject *str; /* Chaîne au format Python */
-
- format = G_DEX_FORMAT(pygobject_get(self));
-
- count = count_strings_in_dex_pool(format);
-
- result = PyTuple_New(count);
-
- for (i = 0; i < count; i++)
- {
- string = get_string_from_dex_pool(format, i, NULL);
-
- if (string == NULL)
- {
- str = Py_None;
- Py_INCREF(str);
- }
-
- else
- str = PyUnicode_FromString(string);
-
- PyTuple_SetItem(result, i, str);
-
- }
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : self = objet Python concerné par l'appel. *
-* closure = non utilisé ici. *
-* *
-* Description : Fournit la liste de tous les types de la table globale. *
-* *
-* Retour : Liste vide ou remplie de types. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static PyObject *py_dex_format_get_pool_types(PyObject *self, void *closure)
-{
- PyObject *result; /* Valeur à retourner */
- GDexFormat *format; /* Version native */
- uint32_t count; /* Nombre d'éléments à traiter */
- uint32_t i; /* Boucle de parcours */
- GDataType *type; /* Type à intégrer */
- PyObject *tp; /* Type au format Python */
-
- format = G_DEX_FORMAT(pygobject_get(self));
-
- count = count_types_in_dex_pool(format);
-
- result = PyTuple_New(count);
-
- for (i = 0; i < count; i++)
- {
- type = get_type_from_dex_pool(format, i);
-
- if (type == NULL)
- {
- tp = Py_None;
- Py_INCREF(tp);
- }
-
- else
- {
- tp = pygobject_new(G_OBJECT(type));
- g_object_unref(type);
- }
-
- PyTuple_SetItem(result, i, tp);
-
- }
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : self = objet Python concerné par l'appel. *
-* closure = non utilisé ici. *
-* *
-* Description : Fournit la liste de tous les champs de la table globale. *
-* *
-* Retour : Liste vide ou remplie de méthodes. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static PyObject *py_dex_format_get_pool_fields(PyObject *self, void *closure)
-{
- PyObject *result; /* Valeur à retourner */
- GDexFormat *format; /* Version native */
- uint32_t count; /* Nombre d'éléments à traiter */
- uint32_t i; /* Boucle de parcours */
- GBinVariable *variable; /* Champ à intégrer */
- PyObject *var; /* Champ au format Python */
-
- format = G_DEX_FORMAT(pygobject_get(self));
-
- count = count_fields_in_dex_pool(format);
-
- result = PyTuple_New(count);
-
- for (i = 0; i < count; i++)
- {
- variable = get_field_from_dex_pool(format, i);
-
- if (variable == NULL)
- {
- var = Py_None;
- Py_INCREF(var);
- }
-
- else
- {
- var = pygobject_new(G_OBJECT(variable));
- g_object_unref(variable);
- }
-
- PyTuple_SetItem(result, i, var);
-
- }
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : self = objet Python concerné par l'appel. *
-* closure = non utilisé ici. *
-* *
-* Description : Fournit la liste de toutes les méthodes de la table globale. *
-* *
-* Retour : Liste vide ou remplie de méthodes. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static PyObject *py_dex_format_get_pool_methods(PyObject *self, void *closure)
-{
- PyObject *result; /* Valeur à retourner */
- GDexFormat *format; /* Version native */
- uint32_t count; /* Nombre d'éléments à traiter */
- uint32_t i; /* Boucle de parcours */
- GDexMethod *method; /* Méthode à intégrer */
- PyObject *meth; /* Méthode au format Python */
-
- format = G_DEX_FORMAT(pygobject_get(self));
-
- count = count_methods_in_dex_pool(format);
-
- result = PyTuple_New(count);
-
- for (i = 0; i < count; i++)
- {
- method = get_method_from_dex_pool(format, i);
-
- if (method == NULL)
- {
- meth = Py_None;
- Py_INCREF(meth);
- }
-
- else
- {
- meth = pygobject_new(G_OBJECT(method));
- g_object_unref(method);
- }
-
- PyTuple_SetItem(result, i, meth);
-
- }
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : self = objet Python concerné par l'appel. *
-* closure = non utilisé ici. *
-* *
-* Description : Fournit la liste de tous les prototypes de la table globale. *
+* Description : Fournit la table des ressources associée au format Dex. *
* *
-* Retour : Liste vide ou remplie de méthodes. *
+* Retour : Table de ressources mise en place ou None si aucune. *
* *
* Remarques : - *
* *
******************************************************************************/
-static PyObject *py_dex_format_get_pool_prototypes(PyObject *self, void *closure)
+static PyObject *py_dex_format_get_pool(PyObject *self, void *closure)
{
PyObject *result; /* Valeur à retourner */
GDexFormat *format; /* Version native */
- uint32_t count; /* Nombre d'éléments à traiter */
- uint32_t i; /* Boucle de parcours */
- GBinRoutine *routine; /* Routine à intégrer */
- PyObject *rtn; /* Routine au format Python */
-
- format = G_DEX_FORMAT(pygobject_get(self));
-
- count = count_prototypes_in_dex_pool(format);
-
- result = PyTuple_New(count);
-
- for (i = 0; i < count; i++)
- {
- routine = get_prototype_from_dex_pool(format, i);
-
- if (routine == NULL)
- {
- rtn = Py_None;
- Py_INCREF(rtn);
- }
-
- else
- {
- rtn = pygobject_new(G_OBJECT(routine));
- g_object_unref(routine);
- }
-
- PyTuple_SetItem(result, i, rtn);
-
- }
-
- return result;
-
-}
+ GDexPool *pool; /* Table de ressources associée*/
-
-/******************************************************************************
-* *
-* Paramètres : self = objet Python concerné par l'appel. *
-* closure = non utilisé ici. *
-* *
-* Description : Fournit la liste de toutes les classes du format. *
-* *
-* Retour : Liste vide ou remplie de classes. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static PyObject *py_dex_format_get_classes(PyObject *self, void *closure)
-{
- PyObject *result; /* Valeur à retourner */
- GDexFormat *format; /* Version native */
- size_t count; /* Nombre d'éléments à traiter */
- size_t i; /* Boucle de parcours */
- GDexClass *class; /* Classe du format à intégrer */
+#define DEX_FORMAT_POOL_ATTRIB PYTHON_GET_DEF_FULL \
+( \
+ pool, py_dex_format, \
+ "Resource pool of the Dex format." \
+)
format = G_DEX_FORMAT(pygobject_get(self));
- count = g_dex_format_count_classes(format);
+ pool = g_dex_format_get_pool(format);
- result = PyTuple_New(count);
+ result = pygobject_new(G_OBJECT(pool));
- for (i = 0; i < count; i++)
- {
- class = g_dex_format_get_class(format, i);
- assert(class != NULL);
-
- PyTuple_SetItem(result, i, pygobject_new(G_OBJECT(class)));
-
- g_object_unref(G_OBJECT(class));
-
- }
+ g_object_unref(G_OBJECT(pool));
return result;
@@ -436,30 +153,7 @@ PyTypeObject *get_python_dex_format_type(void)
};
static PyGetSetDef py_dex_format_getseters[] = {
- {
- "pool_strings", py_dex_format_get_pool_strings, NULL,
- "Strings inside the Dex pool.", NULL
- },
- {
- "pool_types", py_dex_format_get_pool_types, NULL,
- "Types inside the Dex pool.", NULL
- },
- {
- "pool_prototypes", py_dex_format_get_pool_prototypes, NULL,
- "Prototypes inside the Dex pool.", NULL
- },
- {
- "pool_fields", py_dex_format_get_pool_fields, NULL,
- "Fields inside the Dex pool.", NULL
- },
- {
- "pool_methods", py_dex_format_get_pool_methods, NULL,
- "Methods inside the Dex pool.", NULL
- },
- {
- "classes", py_dex_format_get_classes, NULL,
- "Classes inside the Dex format.", NULL
- },
+ DEX_FORMAT_POOL_ATTRIB,
{ NULL }
};
diff --git a/plugins/dex/python/module.c b/plugins/dex/python/module.c
index 007b794..9fca785 100644
--- a/plugins/dex/python/module.c
+++ b/plugins/dex/python/module.c
@@ -36,6 +36,7 @@
#include "field.h"
#include "format.h"
#include "method.h"
+#include "pool.h"
#include "routine.h"
@@ -81,6 +82,7 @@ bool add_format_dex_module_to_python_module(void)
if (result) result = register_python_dex_field(module);
if (result) result = register_python_dex_format(module);
if (result) result = register_python_dex_method(module);
+ if (result) result = register_python_dex_pool(module);
if (result) result = register_python_dex_routine(module);
assert(result);
diff --git a/plugins/dex/python/pool.c b/plugins/dex/python/pool.c
new file mode 100644
index 0000000..eae1e86
--- /dev/null
+++ b/plugins/dex/python/pool.c
@@ -0,0 +1,545 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * pool.c - équivalent Python du fichier "plugins/dex/pool.c"
+ *
+ * Copyright (C) 2019 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 "pool.h"
+
+
+#include <pygobject.h>
+
+
+#include <plugins/pychrysalide/helpers.h>
+
+
+#include "translate.h"
+#include "../pool.h"
+
+
+
+/* Fournit la liste de toutes les chaînes de la table globale. */
+static PyObject *py_dex_pool_get_strings(PyObject *, void *);
+
+/* Fournit la liste de tous les types de la table globale. */
+static PyObject *py_dex_pool_get_types(PyObject *, void *);
+
+/* Fournit la liste de tous les champs de la table globale. */
+static PyObject *py_dex_pool_get_fields(PyObject *, void *);
+
+/* Fournit la liste de tous les prototypes de la table globale. */
+static PyObject *py_dex_pool_get_prototypes(PyObject *, void *);
+
+/* Fournit la liste de toutes les méthodes de la table globale. */
+static PyObject *py_dex_pool_get_methods(PyObject *, void *);
+
+/* Fournit la liste de toutes les classes de la table globale. */
+static PyObject *py_dex_pool_get_classes(PyObject *, void *);
+
+
+
+#define DEX_POOL_DOC \
+ "DexPool is the class collecting all resources of a Dex format." \
+ "\n" \
+ "The pool is populated when the format gets analyzed."
+
+
+
+/******************************************************************************
+* *
+* Paramètres : self = objet Python concerné par l'appel. *
+* closure = non utilisé ici. *
+* *
+* Description : Fournit la liste de toutes les chaînes de la table globale. *
+* *
+* Retour : Liste vide ou remplie de chaînes. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_dex_pool_get_strings(PyObject *self, void *closure)
+{
+ PyObject *result; /* Valeur à retourner */
+ GDexPool *pool; /* Version native */
+ uint32_t count; /* Nombre d'éléments à traiter */
+ uint32_t i; /* Boucle de parcours */
+ const char *string; /* Chaîne à intégrer */
+ PyObject *str; /* Chaîne au format Python */
+
+#define DEX_POOL_STRINGS_ATTRIB PYTHON_GET_DEF_FULL \
+( \
+ strings, py_dex_pool, \
+ "Strings inside the Dex pool." \
+ "\n" \
+ "These objects are the Chrysalide version of all *string_id_item*" \
+ " structures stored in the Dex format header." \
+)
+
+ pool = G_DEX_POOL(pygobject_get(self));
+
+ count = g_dex_pool_count_strings(pool);
+
+ result = PyTuple_New(count);
+
+ for (i = 0; i < count; i++)
+ {
+ string = g_dex_pool_get_string(pool, i, NULL);
+
+ if (string == NULL)
+ {
+ str = Py_None;
+ Py_INCREF(str);
+ }
+
+ else
+ str = PyUnicode_FromString(string);
+
+ PyTuple_SetItem(result, i, str);
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : self = objet Python concerné par l'appel. *
+* closure = non utilisé ici. *
+* *
+* Description : Fournit la liste de tous les types de la table globale. *
+* *
+* Retour : Liste vide ou remplie de types. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_dex_pool_get_types(PyObject *self, void *closure)
+{
+ PyObject *result; /* Valeur à retourner */
+ GDexPool *pool; /* Version native */
+ uint32_t count; /* Nombre d'éléments à traiter */
+ uint32_t i; /* Boucle de parcours */
+ GDataType *type; /* Type à intégrer */
+ PyObject *tp; /* Type au format Python */
+
+#define DEX_POOL_TYPES_ATTRIB PYTHON_GET_DEF_FULL \
+( \
+ types, py_dex_pool, \
+ "Types inside the Dex pool." \
+ "\n" \
+ "These objects are the Chrysalide version of all *type_id_item*" \
+ " structures stored in the Dex format header." \
+)
+
+ pool = G_DEX_POOL(pygobject_get(self));
+
+ count = g_dex_pool_count_types(pool);
+
+ result = PyTuple_New(count);
+
+ for (i = 0; i < count; i++)
+ {
+ type = g_dex_pool_get_type_(pool, i);
+
+ if (type == NULL)
+ {
+ tp = Py_None;
+ Py_INCREF(tp);
+ }
+
+ else
+ {
+ tp = pygobject_new(G_OBJECT(type));
+ g_object_unref(type);
+ }
+
+ PyTuple_SetItem(result, i, tp);
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : self = objet Python concerné par l'appel. *
+* closure = non utilisé ici. *
+* *
+* Description : Fournit la liste de tous les champs de la table globale. *
+* *
+* Retour : Liste vide ou remplie de méthodes. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_dex_pool_get_fields(PyObject *self, void *closure)
+{
+ PyObject *result; /* Valeur à retourner */
+ GDexPool *pool; /* Version native */
+ uint32_t count; /* Nombre d'éléments à traiter */
+ uint32_t i; /* Boucle de parcours */
+ GBinVariable *variable; /* Champ à intégrer */
+ PyObject *var; /* Champ au format Python */
+
+#define DEX_POOL_FIELDS_ATTRIB PYTHON_GET_DEF_FULL \
+( \
+ fields, py_dex_pool, \
+ "Fields inside the Dex pool." \
+ "\n" \
+ "These objects are the Chrysalide version of all *field_id_item*" \
+ " structures stored in the Dex format header." \
+)
+
+ pool = G_DEX_POOL(pygobject_get(self));
+
+ count = g_dex_pool_count_fields(pool);
+
+ result = PyTuple_New(count);
+
+ for (i = 0; i < count; i++)
+ {
+ variable = g_dex_pool_get_field(pool, i);
+
+ if (variable == NULL)
+ {
+ var = Py_None;
+ Py_INCREF(var);
+ }
+
+ else
+ {
+ var = pygobject_new(G_OBJECT(variable));
+ g_object_unref(variable);
+ }
+
+ PyTuple_SetItem(result, i, var);
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : self = objet Python concerné par l'appel. *
+* closure = non utilisé ici. *
+* *
+* Description : Fournit la liste de tous les prototypes de la table globale. *
+* *
+* Retour : Liste vide ou remplie de méthodes. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_dex_pool_get_prototypes(PyObject *self, void *closure)
+{
+ PyObject *result; /* Valeur à retourner */
+ GDexPool *pool; /* Version native */
+ uint32_t count; /* Nombre d'éléments à traiter */
+ uint32_t i; /* Boucle de parcours */
+ GBinRoutine *routine; /* Routine à intégrer */
+ PyObject *rtn; /* Routine au format Python */
+
+#define DEX_POOL_PROTOTYPES_ATTRIB PYTHON_GET_DEF_FULL \
+( \
+ prototypes, py_dex_pool, \
+ "Prototypes inside the Dex pool." \
+ "\n" \
+ "These objects are the Chrysalide version of all *proto_id_item*" \
+ " structures stored in the Dex format header." \
+)
+
+ pool = G_DEX_POOL(pygobject_get(self));
+
+ count = g_dex_pool_count_prototypes(pool);
+
+ result = PyTuple_New(count);
+
+ for (i = 0; i < count; i++)
+ {
+ routine = g_dex_pool_get_prototype(pool, i);
+
+ if (routine == NULL)
+ {
+ rtn = Py_None;
+ Py_INCREF(rtn);
+ }
+
+ else
+ {
+ rtn = pygobject_new(G_OBJECT(routine));
+ g_object_unref(routine);
+ }
+
+ PyTuple_SetItem(result, i, rtn);
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : self = objet Python concerné par l'appel. *
+* closure = non utilisé ici. *
+* *
+* Description : Fournit la liste de toutes les méthodes de la table globale. *
+* *
+* Retour : Liste vide ou remplie de méthodes. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_dex_pool_get_methods(PyObject *self, void *closure)
+{
+ PyObject *result; /* Valeur à retourner */
+ GDexPool *pool; /* Version native */
+ uint32_t count; /* Nombre d'éléments à traiter */
+ uint32_t i; /* Boucle de parcours */
+ GDexMethod *method; /* Méthode à intégrer */
+ PyObject *meth; /* Méthode au format Python */
+
+#define DEX_POOL_METHODS_ATTRIB PYTHON_GET_DEF_FULL \
+( \
+ methods, py_dex_pool, \
+ "Methods inside the Dex pool." \
+ "\n" \
+ "These objects are the Chrysalide version of all *method_id_item*" \
+ " structures stored in the Dex format header." \
+)
+
+ pool = G_DEX_POOL(pygobject_get(self));
+
+ count = g_dex_pool_count_methods(pool);
+
+ result = PyTuple_New(count);
+
+ for (i = 0; i < count; i++)
+ {
+ method = g_dex_pool_get_method(pool, i);
+
+ if (method == NULL)
+ {
+ meth = Py_None;
+ Py_INCREF(meth);
+ }
+
+ else
+ {
+ meth = pygobject_new(G_OBJECT(method));
+ g_object_unref(method);
+ }
+
+ PyTuple_SetItem(result, i, meth);
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : self = objet Python concerné par l'appel. *
+* closure = non utilisé ici. *
+* *
+* Description : Fournit la liste de toutes les classes de la table globale. *
+* *
+* Retour : Liste vide ou remplie de classes. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_dex_pool_get_classes(PyObject *self, void *closure)
+{
+ PyObject *result; /* Valeur à retourner */
+ GDexPool *pool; /* Version native */
+ size_t count; /* Nombre d'éléments à traiter */
+ size_t i; /* Boucle de parcours */
+ GDexClass *class; /* Classe du format à intégrer */
+
+#define DEX_POOL_CLASSES_ATTRIB PYTHON_GET_DEF_FULL \
+( \
+ classes, py_dex_pool, \
+ "Classes inside the Dex pool." \
+ "\n" \
+ "These objects are the Chrysalide version of all *class_def_item*" \
+ " structures stored in the Dex format header." \
+)
+
+ pool = G_DEX_POOL(pygobject_get(self));
+
+ count = g_dex_pool_count_classes(pool);
+
+ result = PyTuple_New(count);
+
+ for (i = 0; i < count; i++)
+ {
+ class = g_dex_pool_get_class(pool, i);
+ assert(class != NULL);
+
+ PyTuple_SetItem(result, i, pygobject_new(G_OBJECT(class)));
+
+ g_object_unref(G_OBJECT(class));
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : Fournit un accès à une définition de type à diffuser. *
+* *
+* Retour : Définition d'objet pour Python. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+PyTypeObject *get_python_dex_pool_type(void)
+{
+ static PyMethodDef py_dex_pool_methods[] = {
+ { NULL }
+ };
+
+ static PyGetSetDef py_dex_pool_getseters[] = {
+ DEX_POOL_STRINGS_ATTRIB,
+ DEX_POOL_TYPES_ATTRIB,
+ DEX_POOL_FIELDS_ATTRIB,
+ DEX_POOL_METHODS_ATTRIB,
+ DEX_POOL_PROTOTYPES_ATTRIB,
+ DEX_POOL_CLASSES_ATTRIB,
+ { NULL }
+ };
+
+ static PyTypeObject py_dex_pool_type = {
+
+ PyVarObject_HEAD_INIT(NULL, 0)
+
+ .tp_name = "pychrysalide.format.dex.DexPool",
+ .tp_basicsize = sizeof(PyGObject),
+
+ .tp_flags = Py_TPFLAGS_DEFAULT,
+
+ .tp_doc = DEX_POOL_DOC,
+
+ .tp_methods = py_dex_pool_methods,
+ .tp_getset = py_dex_pool_getseters
+
+ };
+
+ return &py_dex_pool_type;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : module = module dont la définition est à compléter. *
+* *
+* Description : Prend en charge l'objet 'pychrysalide.format.dex.DexPool'. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool register_python_dex_pool(PyObject *module)
+{
+ PyTypeObject *type; /* Type Python 'DexPool' */
+ PyObject *dict; /* Dictionnaire du module */
+
+ type = get_python_dex_pool_type();
+
+ dict = PyModule_GetDict(module);
+
+ if (!register_class_for_pygobject(dict, G_TYPE_DEX_POOL, type, &PyGObject_Type))
+ return false;
+
+ return true;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : arg = argument quelconque à tenter de convertir. *
+* dst = destination des valeurs récupérées en cas de succès. *
+* *
+* Description : Tente de convertir en table de ressources pour format Dex. *
+* *
+* Retour : Bilan de l'opération, voire indications supplémentaires. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+int convert_to_dex_pool(PyObject *arg, void *dst)
+{
+ int result; /* Bilan à retourner */
+
+ result = PyObject_IsInstance(arg, (PyObject *)get_python_dex_pool_type());
+
+ switch (result)
+ {
+ case -1:
+ /* L'exception est déjà fixée par Python */
+ result = 0;
+ break;
+
+ case 0:
+ PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to loaded binary");
+ break;
+
+ case 1:
+ *((GDexPool **)dst) = G_DEX_POOL(pygobject_get(arg));
+ break;
+
+ default:
+ assert(false);
+ break;
+
+ }
+
+ return result;
+
+}
diff --git a/plugins/dex/python/pool.h b/plugins/dex/python/pool.h
new file mode 100644
index 0000000..50af852
--- /dev/null
+++ b/plugins/dex/python/pool.h
@@ -0,0 +1,45 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * pool.h - prototypes pour l'équivalent Python du fichier "plugins/dex/pool.h"
+ *
+ * Copyright (C) 2019 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_DEX_PYTHON_POOL_H
+#define _PLUGINS_DEX_PYTHON_POOL_H
+
+
+#include <Python.h>
+#include <stdbool.h>
+
+
+
+/* Fournit un accès à une définition de type à diffuser. */
+PyTypeObject *get_python_dex_pool_type(void);
+
+/* Prend en charge l'objet 'pychrysalide.format.dex.DexPool'. */
+bool register_python_dex_pool(PyObject *module);
+
+/* Tente de convertir en table de ressources pour format Dex. */
+int convert_to_dex_pool(PyObject *, void *);
+
+
+
+#endif /* _PLUGINS_DEX_PYTHON_POOL_H */