diff options
Diffstat (limited to 'plugins/pychrysalide/analysis')
| -rw-r--r-- | plugins/pychrysalide/analysis/project.c | 80 | 
1 files changed, 75 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; | 
