summaryrefslogtreecommitdiff
path: root/plugins/pychrysalide/format/known.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/pychrysalide/format/known.c')
-rw-r--r--plugins/pychrysalide/format/known.c185
1 files changed, 89 insertions, 96 deletions
diff --git a/plugins/pychrysalide/format/known.c b/plugins/pychrysalide/format/known.c
index 3167ba2..e38c975 100644
--- a/plugins/pychrysalide/format/known.c
+++ b/plugins/pychrysalide/format/known.c
@@ -2,7 +2,7 @@
/* Chrysalide - Outil d'analyse de fichiers binaires
* known.c - équivalent Python du fichier "format/known.c"
*
- * Copyright (C) 2019 Cyrille Bagard
+ * Copyright (C) 2019-2024 Cyrille Bagard
*
* This file is part of Chrysalide.
*
@@ -30,7 +30,6 @@
#include <i18n.h>
#include <format/known-int.h>
-#include <plugins/dt.h>
#include "../access.h"
@@ -42,12 +41,11 @@
/* ------------------------ GLUE POUR CREATION DEPUIS PYTHON ------------------------ */
-/* Accompagne la création d'une instance dérivée en Python. */
-static PyObject *py_known_format_new(PyTypeObject *, PyObject *, PyObject *);
-
/* Initialise la classe des descriptions de fichier binaire. */
static void py_known_format_init_gclass(GKnownFormatClass *, gpointer);
+CREATE_DYN_ABSTRACT_CONSTRUCTOR(known_format, G_TYPE_KNOWN_FORMAT, py_known_format_init_gclass);
+
/* Initialise une instance sur la base du dérivé de GObject. */
static int py_known_format_init(PyObject *, PyObject *, PyObject *);
@@ -57,11 +55,13 @@ static char *py_known_format_get_key_wrapper(const GKnownFormat *);
/* Fournit une description humaine du format. */
static char *py_known_format_get_description_wrapper(const GKnownFormat *);
+#if 0
/* Assure l'interprétation d'un format en différé. */
static bool py_known_format_analyze_wrapper(GKnownFormat *, wgroup_id_t, GtkStatusStack *);
/* Réalise un traitement post-désassemblage. */
static void py_known_format_complete_analysis_wrapper(GKnownFormat *, wgroup_id_t, GtkStatusStack *);
+#endif
@@ -69,10 +69,10 @@ static void py_known_format_complete_analysis_wrapper(GKnownFormat *, wgroup_id_
/* Assure l'interprétation d'un format en différé. */
-static PyObject *py_known_format_analyze(PyObject *, PyObject *);
+//static PyObject *py_known_format_analyze(PyObject *, PyObject *);
/* Réalise un traitement post-désassemblage. */
-static PyObject *py_known_format_complete_analysis(PyObject *, PyObject *);
+//static PyObject *py_known_format_complete_analysis(PyObject *, PyObject *);
/* Indique la désignation interne du format. */
static PyObject *py_known_format_get_key(PyObject *, void *);
@@ -92,73 +92,10 @@ static PyObject *py_known_format_get_content(PyObject *, void *);
/******************************************************************************
* *
-* Paramètres : type = type du nouvel objet à mettre en place. *
-* args = éventuelle liste d'arguments. *
-* kwds = éventuel dictionnaire de valeurs mises à disposition. *
-* *
-* Description : Accompagne la création d'une instance dérivée en Python. *
-* *
-* Retour : Nouvel objet Python mis en place ou NULL en cas d'échec. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static PyObject *py_known_format_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
- PyObject *result; /* Objet à retourner */
- PyTypeObject *base; /* Type de base à dériver */
- bool first_time; /* Evite les multiples passages*/
- GType gtype; /* Nouveau type de processeur */
- bool status; /* Bilan d'un enregistrement */
-
- /* Validations diverses */
-
- base = get_python_known_format_type();
-
- if (type == base)
- {
- result = NULL;
- PyErr_Format(PyExc_RuntimeError, _("%s is an abstract class"), type->tp_name);
- goto exit;
- }
-
- /* Mise en place d'un type dédié */
-
- first_time = (g_type_from_name(type->tp_name) == 0);
-
- gtype = build_dynamic_type(G_TYPE_KNOWN_FORMAT, type->tp_name,
- (GClassInitFunc)py_known_format_init_gclass, NULL, NULL);
-
- if (first_time)
- {
- status = register_class_for_dynamic_pygobject(gtype, type);
-
- if (!status)
- {
- result = NULL;
- goto exit;
- }
-
- }
-
- /* On crée, et on laisse ensuite la main à PyGObject_Type.tp_init() */
-
- result = PyType_GenericNew(type, args, kwds);
-
- exit:
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
* Paramètres : class = classe à initialiser. *
* unused = données non utilisées ici. *
* *
-* Description : Initialise la classe générique des processeurs. *
+* Description : Initialise la classe des formats connus. *
* *
* Retour : - *
* *
@@ -171,8 +108,8 @@ static void py_known_format_init_gclass(GKnownFormatClass *class, gpointer unuse
class->get_key = py_known_format_get_key_wrapper;
class->get_desc = py_known_format_get_description_wrapper;
- class->analyze = py_known_format_analyze_wrapper;
- class->complete = py_known_format_complete_analysis_wrapper;
+ //class->analyze = py_known_format_analyze_wrapper;
+ //class->complete = py_known_format_complete_analysis_wrapper;
}
@@ -201,12 +138,8 @@ static int py_known_format_init(PyObject *self, PyObject *args, PyObject *kwds)
"KnownFormat is a small class providing basic features for" \
" recognized formats.\n" \
"\n" \
- "One item has to be defined as class attribute in the final" \
- " class:\n" \
- "* *_key*: a string providing a small name used to identify the" \
- " format.\n" \
- "\n" \
"The following methods have to be defined for new classes:\n" \
+ "* pychrysalide.format.KnownFormat._get_key();\n" \
"* pychrysalide.format.KnownFormat._get_description();\n" \
"* pychrysalide.format.KnownFormat._analyze().\n" \
"\n" \
@@ -231,7 +164,8 @@ static int py_known_format_init(PyObject *self, PyObject *args, PyObject *kwds)
format = G_KNOWN_FORMAT(pygobject_get(self));
- g_known_format_set_content(format, content);
+ if (!g_known_format_create(format, content))
+ return -1;
return 0;
@@ -255,27 +189,39 @@ static char *py_known_format_get_key_wrapper(const GKnownFormat *format)
char *result; /* Désignation à renvoyer */
PyGILState_STATE gstate; /* Sauvegarde d'environnement */
PyObject *pyobj; /* Objet Python concerné */
- PyObject *pykey; /* Clef en objet Python */
+ PyObject *pyret; /* Valeur retournée */
int ret; /* Bilan d'une conversion */
+#define KNOWN_FORMAT_GET_KEY_WRAPPER PYTHON_WRAPPER_DEF \
+( \
+ _get_key, "$self", \
+ METH_NOARGS, \
+ "Abstract method used to define the internal name" \
+ " of the known format.\n" \
+ "\n" \
+ "The return value has to be a (tiny) string." \
+)
+
result = NULL;
gstate = PyGILState_Ensure();
pyobj = pygobject_new(G_OBJECT(format));
- if (PyObject_HasAttrString(pyobj, "_key"))
+ if (has_python_method(pyobj, "_get_key"))
{
- pykey = PyObject_GetAttrString(pyobj, "_key");
+ pyret = run_python_method(pyobj, "_get_key", NULL);
- if (pykey != NULL)
+ if (pyret != NULL)
{
- ret = PyUnicode_Check(pykey);
+ ret = PyUnicode_Check(pyret);
if (ret)
- result = strdup(PyUnicode_AsUTF8(pykey));
+ result = strdup(PyUnicode_AsUTF8(pyret));
+ else
+ PyErr_SetString(PyExc_ValueError, _("unexpected value type for known format key"));
- Py_DECREF(pykey);
+ Py_DECREF(pyret);
}
@@ -335,6 +281,8 @@ static char *py_known_format_get_description_wrapper(const GKnownFormat *format)
if (ret)
result = strdup(PyUnicode_AsUTF8(pyret));
+ else
+ PyErr_SetString(PyExc_ValueError, _("unexpected value type for known format description"));
Py_DECREF(pyret);
@@ -350,7 +298,7 @@ static char *py_known_format_get_description_wrapper(const GKnownFormat *format)
}
-
+#if 0
/******************************************************************************
* *
* Paramètres : format = format chargé dont l'analyse est lancée. *
@@ -475,7 +423,7 @@ static void py_known_format_complete_analysis_wrapper(GKnownFormat *format, wgro
PyGILState_Release(gstate);
}
-
+#endif
/* ---------------------------------------------------------------------------------- */
@@ -483,6 +431,7 @@ static void py_known_format_complete_analysis_wrapper(GKnownFormat *format, wgro
/* ---------------------------------------------------------------------------------- */
+#if 0
/******************************************************************************
* *
* Paramètres : self = objet représentant un format connu. *
@@ -584,6 +533,7 @@ static PyObject *py_known_format_complete_analysis(PyObject *self, PyObject *arg
return result;
}
+#endif
/******************************************************************************
@@ -615,9 +565,30 @@ static PyObject *py_known_format_get_key(PyObject *self, void *closure)
key = g_known_format_get_key(format);
- result = PyUnicode_FromString(key);
+ if (key != NULL)
+ {
+ result = PyUnicode_FromString(key);
+ free(key);
+ }
+ else
+ {
+ result = NULL;
- free(key);
+ /**
+ * Si l'absence de retour vient d'une instance implémentée en Python,
+ * une exception peut (et doit dans ce cas) avoir été définie dans la
+ * fonction py_known_format_get_key_wrapper().
+ *
+ * Aucun traitement supplémntaire n'est alors nécessaire.
+ *
+ * Une action est cependant nécessaire pour assurer un traitement
+ * des extensions purement natives offrant une mauvaise implémentation.
+ */
+
+ if (PyErr_Occurred() == NULL)
+ PyErr_SetString(PyExc_ValueError, _("unexpected NULL value for known format key"));
+
+ }
return result;
@@ -653,9 +624,30 @@ static PyObject *py_known_format_get_description(PyObject *self, void *closure)
desc = g_known_format_get_description(format);
- result = PyUnicode_FromString(desc);
+ if (desc != NULL)
+ {
+ result = PyUnicode_FromString(desc);
+ free(desc);
+ }
+ else
+ {
+ result = NULL;
- free(desc);
+ /**
+ * Si l'absence de retour vient d'une instance implémentée en Python,
+ * une exception peut (et doit dans ce cas) avoir été définie dans la
+ * fonction py_known_format_get_description_wrapper().
+ *
+ * Aucun traitement supplémntaire n'est alors nécessaire.
+ *
+ * Une action est cependant nécessaire pour assurer un traitement
+ * des extensions purement natives offrant une mauvaise implémentation.
+ */
+
+ if (PyErr_Occurred() == NULL)
+ PyErr_SetString(PyExc_ValueError, _("unexpected NULL value for known format description"));
+
+ }
return result;
@@ -724,11 +716,12 @@ static PyObject *py_known_format_get_content(PyObject *self, void *closure)
PyTypeObject *get_python_known_format_type(void)
{
static PyMethodDef py_known_format_methods[] = {
+ KNOWN_FORMAT_GET_KEY_WRAPPER,
KNOWN_FORMAT_GET_DESCRIPTION_WRAPPER,
- KNOWN_FORMAT_ANALYZE_WRAPPER,
- KNOWN_FORMAT_COMPLETE_ANALYSIS_WRAPPER,
- KNOWN_FORMAT_ANALYZE_METHOD,
- KNOWN_FORMAT_COMPLETE_ANALYSIS_METHOD,
+ //KNOWN_FORMAT_ANALYZE_WRAPPER,
+ //KNOWN_FORMAT_COMPLETE_ANALYSIS_WRAPPER,
+ //KNOWN_FORMAT_ANALYZE_METHOD,
+ //KNOWN_FORMAT_COMPLETE_ANALYSIS_METHOD,
{ NULL }
};