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)); } |