diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/analysis/project.c | 69 | ||||
| -rw-r--r-- | src/analysis/project.h | 8 | ||||
| -rw-r--r-- | src/gui/editor.c | 49 | ||||
| -rw-r--r-- | src/gui/menus/project.c | 2 | ||||
| -rw-r--r-- | src/main.c | 2 | 
5 files changed, 112 insertions, 18 deletions
diff --git a/src/analysis/project.c b/src/analysis/project.c index e01a126..8474610 100644 --- a/src/analysis/project.c +++ b/src/analysis/project.c @@ -38,6 +38,7 @@  #include "../core/logs.h"  #include "../core/params.h"  #include "../core/queue.h" +#include "../glibext/chrysamarshal.h"  #include "../glibext/delayed-int.h" @@ -66,6 +67,7 @@ struct _GStudyProjectClass      /* Signaux */ +    void (* contents_available) (GStudyProject, GLoadedContent **, guint);      void (* content_added) (GStudyProject *, GLoadedContent *);      void (* content_removed) (GStudyProject *, GLoadedContent *); @@ -92,9 +94,6 @@ static void g_study_project_finalize(GStudyProject *);  /* Assure l'intégration de contenus listés dans du XML. */  static void g_study_project_recover_binary_contents(GStudyProject *, xmlDoc *, xmlXPathContext *); -/* Réceptionne la recette d'une analyse de contenu. */ -static void on_loaded_content_analyzed(GLoadedContent *, gboolean, GStudyProject *); -  /* ------------------------ CHARGEMENTS DE CONTENUS BINAIRES ------------------------ */ @@ -124,6 +123,9 @@ typedef struct _GLoadingHandler      GCond wait_cond;                        /* Réveil d'attente de fin     */      GMutex mutex;                           /* Encadrement des accès       */ +    filter_loadable_cb filter;              /* Filtre des contenus ?       */ +    void *data;                             /* Données utiles au filtrage  */ +  } GLoadingHandler;  /* Chargement de contenus binaires (classe) */ @@ -150,7 +152,7 @@ static void g_loading_handler_dispose(GLoadingHandler *);  static void g_loading_handler_finalize(GLoadingHandler *);  /* Crée une tâche de chargement de contenu bianire. */ -static GLoadingHandler *g_loading_handler_new_discovering(GStudyProject *, GBinContent *); +static GLoadingHandler *g_loading_handler_new_discovering(GStudyProject *, GBinContent *, filter_loadable_cb, void *);  /* Crée une tâche de chargement de contenu bianire. */  static GLoadingHandler *g_loading_handler_new_recovering(GStudyProject *, xmlDoc *, xmlXPathContext *); @@ -199,6 +201,14 @@ static void g_study_project_class_init(GStudyProjectClass *klass)      object->dispose = (GObjectFinalizeFunc/* ! */)g_study_project_dispose;      object->finalize = (GObjectFinalizeFunc)g_study_project_finalize; +    g_signal_new("contents-available", +                 G_TYPE_STUDY_PROJECT, +                 G_SIGNAL_RUN_LAST, +                 G_STRUCT_OFFSET(GStudyProjectClass, contents_available), +                 NULL, NULL, +                 g_cclosure_user_marshal_VOID__POINTER_UINT, +                 G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_UINT); +      g_signal_new("content-added",                   G_TYPE_STUDY_PROJECT,                   G_SIGNAL_RUN_LAST, @@ -545,6 +555,8 @@ static void g_study_project_recover_binary_contents(GStudyProject *project, xmlD  *                                                                             *  *  Paramètres  : project = projet dont le contenu est à compléter.            *  *                content = contenu binaire à mémoriser pour le projet.        * +*                filter  = procédure de filtrage de contenus chargés.         * +*                data    = données utiles à la procédure de filtre.           *  *                                                                             *  *  Description : Assure l'intégration de contenus binaires dans un projet.    *  *                                                                             * @@ -554,11 +566,11 @@ static void g_study_project_recover_binary_contents(GStudyProject *project, xmlD  *                                                                             *  ******************************************************************************/ -void g_study_project_discover_binary_content(GStudyProject *project, GBinContent *content) +void g_study_project_discover_binary_content(GStudyProject *project, GBinContent *content, filter_loadable_cb filter, void *data)  {      GLoadingHandler *handler;               /* Encadrement du chargement   */ -    handler = g_loading_handler_new_discovering(project, content); +    handler = g_loading_handler_new_discovering(project, content, filter, data);      g_work_queue_schedule_work(get_work_queue(), G_DELAYED_WORK(handler), LOADING_WORK_GROUP); @@ -579,7 +591,7 @@ void g_study_project_discover_binary_content(GStudyProject *project, GBinContent  *                                                                             *  ******************************************************************************/ -static void on_loaded_content_analyzed(GLoadedContent *content, gboolean success, GStudyProject *project) +void on_loaded_content_analyzed(GLoadedContent *content, gboolean success, GStudyProject *project)  {      const char *desc;                       /* Description du contenu      */ @@ -908,6 +920,8 @@ static void g_loading_handler_finalize(GLoadingHandler *handler)  *                                                                             *  *  Paramètres  : project = projet dont le contenu est à compléter.            *  *                content = contenu binaire à mémoriser pour le projet.        * +*                filter  = procédure de filtrage de contenus chargés.         * +*                data    = données utiles à la procédure de filtre.           *  *                                                                             *  *  Description : Crée une tâche de chargement de contenu bianire.             *  *                                                                             * @@ -917,7 +931,7 @@ static void g_loading_handler_finalize(GLoadingHandler *handler)  *                                                                             *  ******************************************************************************/ -static GLoadingHandler *g_loading_handler_new_discovering(GStudyProject *project, GBinContent *content) +static GLoadingHandler *g_loading_handler_new_discovering(GStudyProject *project, GBinContent *content, filter_loadable_cb filter, void *data)  {      GLoadingHandler *result;                /* Tâche à retourner           */      GContentExplorer *explorer;             /* Explorateur de contenus     */ @@ -935,6 +949,9 @@ static GLoadingHandler *g_loading_handler_new_discovering(GStudyProject *project      result->resolved = 0; +    result->filter = filter; +    result->data = data; +      explorer = get_current_content_explorer();      g_mutex_lock(&result->mutex); @@ -993,6 +1010,9 @@ static GLoadingHandler *g_loading_handler_new_recovering(GStudyProject *project,          result->resolved = 0; +        result->filter = NULL; +        result->data = NULL; +          explorer = get_current_content_explorer();          explored = 0; @@ -1211,6 +1231,7 @@ static void on_new_content_resolved(GContentResolver *resolver, wgroup_id_t wid,  {      GLoadedContent **available;             /* Contenus chargés valables   */      size_t count;                           /* Quantité de ces contenus    */ +    bool keep;                              /* Conservation finale de liste*/      size_t i;                               /* Boucle de parcours          */      GBinContent *content;                   /* Contenu brut à manipuler    */      const gchar *hash;                      /* Empreinte d'un contenu      */ @@ -1223,6 +1244,8 @@ static void on_new_content_resolved(GContentResolver *resolver, wgroup_id_t wid,      {          available = g_content_resolver_get_all(resolver, wid, &count); +        keep = false; +          /* Rechargement à partir d'XML ? */          if (handler->xdoc != NULL)          { @@ -1295,19 +1318,39 @@ static void on_new_content_resolved(GContentResolver *resolver, wgroup_id_t wid,                   */                  g_object_ref(G_OBJECT(available[i])); -                g_signal_connect(available[i], "analyzed", -                                 G_CALLBACK(on_loaded_content_analyzed), handler->project); +            } -                g_loaded_content_analyze(available[i]); +            if (is_batch_mode()) +            { +                for (i = 0; i < count; i++) +                { +                    if (handler->filter == NULL || handler->filter(available[i], handler->data)) +                    { +                        g_signal_connect(available[i], "analyzed", +                                         G_CALLBACK(on_loaded_content_analyzed), handler->project); -                g_object_unref(G_OBJECT(available[i])); +                        g_loaded_content_analyze(available[i]); + +                    } + +                    g_object_unref(G_OBJECT(available[i])); + +                } + +            } + +            else +            { +                g_signal_emit_by_name(handler->project, "contents-available", available, count); + +                keep = true;              }          }          /* Dans tous les cas... */ -        if (available != NULL) +        if (available != NULL && !keep)              free(available);          /* Si c'était la dernière résolution... */ diff --git a/src/analysis/project.h b/src/analysis/project.h index c634fb2..9b42a47 100644 --- a/src/analysis/project.h +++ b/src/analysis/project.h @@ -74,8 +74,14 @@ const char *g_study_project_get_filename(const GStudyProject *);  /* ------------------------ INTEGRATION DE CONTENUS BINAIRES ------------------------ */ +/* Filtre sur les contenus chargeables */ +typedef bool (* filter_loadable_cb) (GLoadedContent *, void *); +  /* Assure l'intégration de contenus binaires dans un projet. */ -void g_study_project_discover_binary_content(GStudyProject *, GBinContent *); +void g_study_project_discover_binary_content(GStudyProject *, GBinContent *, filter_loadable_cb, void *); + +/* Réceptionne la recette d'une analyse de contenu. */ +void on_loaded_content_analyzed(GLoadedContent *, gboolean, GStudyProject *);  #define g_study_project_lock_contents(p) \      _g_study_project_lock_unlock_contents(p, true) diff --git a/src/gui/editor.c b/src/gui/editor.c index 16b7a59..b52ec9d 100644 --- a/src/gui/editor.c +++ b/src/gui/editor.c @@ -46,6 +46,7 @@  #include "../common/extstr.h"  #include "../core/global.h"  #include "../core/params.h" +#include "../glibext/chrysamarshal.h"  #include "../glibext/signal.h"  #include "../gtkext/easygtk.h"  #include "../gtkext/gtkdisplaypanel.h" @@ -129,8 +130,11 @@ static void notify_editor_project_change(GStudyProject *, bool);  /* Assure un positionnement initial idéal. */  static gboolean scroll_for_the_first_time(GtkWidget *, GdkEvent *, GLoadedContent *); +/* Présente une possibilité de sélection des contenus chargés. */ +static void on_editor_contents_available(GStudyProject *, GLoadedContent **, guint, void *); +  /* Affiche le contenu qui vient de rejoindre un projet donné. */ -void on_editor_loaded_content_added(GStudyProject *, GLoadedContent *, void *); +static void on_editor_loaded_content_added(GStudyProject *, GLoadedContent *, void *);  /* Recherche et retirer de l'affichage un contenu chargé. */  static void remove_loaded_content_from_editor(GtkWidget *, GLoadedContent *); @@ -905,9 +909,15 @@ static void notify_editor_project_change(GStudyProject *project, bool new)      contents = _g_study_project_get_contents(project, &count);      if (new) +    { +        g_signal_connect_to_main(project, "contents-available", G_CALLBACK(on_editor_contents_available), NULL, +                                 g_cclosure_user_marshal_VOID__POINTER_UINT); +          g_signal_connect_to_main(project, "content-added", G_CALLBACK(on_editor_loaded_content_added), NULL,                                   g_cclosure_marshal_VOID__OBJECT); +    } +      g_study_project_unlock_contents(project);      if (new) @@ -934,6 +944,41 @@ static void notify_editor_project_change(GStudyProject *project, bool new)  /******************************************************************************  *                                                                             * +*  Paramètres  : project  = project impliqué dans l'opération.                * +*                contents = nouveaux contenus à éventuellement charger.       * +*                count    = taille de la liste fournie.                       * +*                unused   = adresse non utilisée ici.                         * +*                                                                             * +*  Description : Présente une possibilité de sélection des contenus chargés.  * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void on_editor_contents_available(GStudyProject *project, GLoadedContent **contents, guint count, void *unused) +{ +    guint i;                                /* Boucle de parcours          */ + +    for (i = 0; i < count; i++) +    { +        g_signal_connect(contents[i], "analyzed", G_CALLBACK(on_loaded_content_analyzed), project); + +        g_loaded_content_analyze(contents[i]); + +        g_object_unref(G_OBJECT(contents[i])); + +    } + +    if (contents != NULL) +        free(contents); + +} + + +/****************************************************************************** +*                                                                             *  *  Paramètres  : project = project impliqué dans l'opération.                 *  *                content = nouveau contenu à présenter dans l'éditeur.        *  *                unused  = adresse non utilisée ici.                          * @@ -946,7 +991,7 @@ static void notify_editor_project_change(GStudyProject *project, bool new)  *                                                                             *  ******************************************************************************/ -void on_editor_loaded_content_added(GStudyProject *project, GLoadedContent *content, void *unused) +static void on_editor_loaded_content_added(GStudyProject *project, GLoadedContent *content, void *unused)  {      GtkWidget *selected;                    /* Interface de prédilection   */      const char *name;                       /* Titre associé au binaire    */ diff --git a/src/gui/menus/project.c b/src/gui/menus/project.c index a6a078b..80eff6f 100644 --- a/src/gui/menus/project.c +++ b/src/gui/menus/project.c @@ -205,7 +205,7 @@ static void mcb_project_add_binary_file(GtkMenuItem *menuitem, GMenuBar *bar)          if (content != NULL)          { -            g_study_project_discover_binary_content(project, content); +            g_study_project_discover_binary_content(project, content, NULL, NULL);              g_object_unref(G_OBJECT(content));          } @@ -479,7 +479,7 @@ static int open_binaries(char **files, int count)          if (content != NULL)          { -            g_study_project_discover_binary_content(project, content); +            g_study_project_discover_binary_content(project, content, NULL, NULL);              g_object_unref(G_OBJECT(content));          }  | 
