summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/pychrysalide/analysis/project.c80
-rw-r--r--plugins/pychrysalide/helpers.c45
-rw-r--r--plugins/pychrysalide/helpers.h3
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 *);