diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/pychrysalide/analysis/project.c | 80 | ||||
-rw-r--r-- | plugins/pychrysalide/helpers.c | 45 | ||||
-rw-r--r-- | plugins/pychrysalide/helpers.h | 3 |
3 files changed, 123 insertions, 5 deletions
diff --git a/plugins/pychrysalide/analysis/project.c b/plugins/pychrysalide/analysis/project.c index 1a85f71..137efbf 100644 --- a/plugins/pychrysalide/analysis/project.c +++ b/plugins/pychrysalide/analysis/project.c @@ -45,6 +45,9 @@ static PyObject *py_study_project_new(PyTypeObject *, PyObject *, PyObject *); /* Procède à l'enregistrement d'un projet donné. */ static PyObject *py_study_project_save(PyObject *, PyObject *); +/* Détermine si un contenu doit être écarté ou conservé. */ +static bool filter_loadable_content_with_python(GLoadedContent *, PyObject *); + /* Assure l'intégration de contenus binaires dans un projet. */ static PyObject *py_study_project_discover_binary_content(PyObject *, PyObject *); @@ -135,6 +138,57 @@ static PyObject *py_study_project_save(PyObject *self, PyObject *args) /****************************************************************************** * * +* Paramètres : content = contenu chargeable à étudier ou NULL à la fin. * +* callable = procédure de filtre en Python. * +* * +* Description : Détermine si un contenu doit être écarté ou conservé. * +* * +* Retour : true si le contenu doit être conservé, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool filter_loadable_content_with_python(GLoadedContent *content, PyObject *callable) +{ + bool result; /* Bilan à retourner */ + PyGILState_STATE gstate; /* Sauvegarde d'environnement */ + PyObject *arg; /* Argument à fournir au filtre*/ + PyObject *status; /* Bilan de l'analyse */ + + gstate = PyGILState_Ensure(); + + if (content == NULL) + { + Py_DECREF(callable); + result = false; + } + + else + { + arg = pygobject_new(G_OBJECT(content)); + + status = PyObject_CallFunctionObjArgs(callable, arg, NULL); + + if (PyErr_Occurred()) + PyErr_Print(); + + result = status == NULL || status == Py_False || status == Py_None ? false : true; + Py_XDECREF(status); + + Py_DECREF(arg); + + } + + PyGILState_Release(gstate); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : self = projet d'étude à manipuler. * * args = arguments accompagnant l'appel. * * * @@ -148,16 +202,32 @@ static PyObject *py_study_project_save(PyObject *self, PyObject *args) static PyObject *py_study_project_discover_binary_content(PyObject *self, PyObject *args) { - GStudyProject *project; /* Version GLib du format */ - int ret; /* Bilan de lecture des args. */ + PyObject *callable; /* Filtre de contenus éventuel */ GBinContent *content; /* Instance de contenu binaire */ + int ret; /* Bilan de lecture des args. */ + GStudyProject *project; /* Version GLib du format */ - project = G_STUDY_PROJECT(pygobject_get(self)); + callable = NULL; - ret = PyArg_ParseTuple(args, "O&", convert_to_binary_content, &content); + ret = PyArg_ParseTuple(args, "O&|O&", + convert_to_binary_content, &content, + convert_to_callable, &callable); if (!ret) return NULL; - g_study_project_discover_binary_content(project, content); + project = G_STUDY_PROJECT(pygobject_get(self)); + + if (callable != NULL) + { + Py_INCREF(callable); + + g_study_project_discover_binary_content(project, content, + (filter_loadable_cb)filter_loadable_content_with_python, + callable); + + } + + else + g_study_project_discover_binary_content(project, content, NULL, NULL); Py_RETURN_NONE; diff --git a/plugins/pychrysalide/helpers.c b/plugins/pychrysalide/helpers.c index 7e31fa7..2b62e57 100644 --- a/plugins/pychrysalide/helpers.c +++ b/plugins/pychrysalide/helpers.c @@ -109,6 +109,51 @@ PyObject *status_to_rich_cmp_state(int status, int op) /****************************************************************************** * * +* 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 élément appelable. * +* * +* Retour : Bilan de l'opération, voire indications supplémentaires. * +* * +* Remarques : - * +* * +******************************************************************************/ + +int convert_to_callable(PyObject *arg, void *dst) +{ + int result; /* Bilan à retourner */ + + result = PyCallable_Check(arg); + + 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 a callable object"); + break; + + case 1: + *((PyObject **)dst) = arg; + break; + + default: + assert(false); + break; + + } + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : target = propriétaire de la routine visée. * * method = désignation de la fonction à appeler. * * * diff --git a/plugins/pychrysalide/helpers.h b/plugins/pychrysalide/helpers.h index ce5840b..f7ebdc3 100644 --- a/plugins/pychrysalide/helpers.h +++ b/plugins/pychrysalide/helpers.h @@ -38,6 +38,9 @@ /* Traduit pour Python le bilan d'une comparaison riche. */ PyObject *status_to_rich_cmp_state(int, int); +/* Tente de convertir en élément appelable. */ +int convert_to_callable(PyObject *, void *); + /* Indique si une routine Python existe ou non. */ bool has_python_method(PyObject *, const char *); |