diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2019-05-04 17:56:33 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2019-05-04 17:57:10 (GMT) |
commit | b92a5e56de9198c08956ce486cd12712d7034731 (patch) | |
tree | 4ee902ed116b9988dfd284186c725f1bb1d20f22 /plugins/dex/python | |
parent | c9f7b4491b368f886b0852ba166cef969fd6d20f (diff) |
Created a GLib object for the Dex pool.
Diffstat (limited to 'plugins/dex/python')
-rw-r--r-- | plugins/dex/python/Makefile.am | 1 | ||||
-rw-r--r-- | plugins/dex/python/format.c | 336 | ||||
-rw-r--r-- | plugins/dex/python/module.c | 2 | ||||
-rw-r--r-- | plugins/dex/python/pool.c | 545 | ||||
-rw-r--r-- | plugins/dex/python/pool.h | 45 |
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 */ |