From 1c391335c6c84fd5e3a3d92666be9a96d6e84a49 Mon Sep 17 00:00:00 2001 From: grayTerminal-sh Date: Fri, 17 Jul 2026 14:35:21 +0200 Subject: [PATCH] feat: add task manager and activity panel --- docs/tickets/closed/TICKET-035.md | 790 +++++++++++++++++ include/core/task_manager.h | 198 +++++ include/views/main_window.h | 38 +- include/widgets/task_panel.h | 66 ++ labfy-investigation | Bin 218256 -> 250944 bytes src/core/application.c | 312 ++++++- src/core/task_manager.c | 736 ++++++++++++++++ src/views/main_window.c | 233 +++++- src/widgets/task_panel.c | 1105 ++++++++++++++++++++++++ tests/test_background_task | Bin 46768 -> 0 bytes tests/test_database | Bin 41112 -> 0 bytes tests/test_error | Bin 32688 -> 0 bytes tests/test_investigation_dao | Bin 42288 -> 0 bytes tests/test_investigation_node | Bin 25824 -> 0 bytes tests/test_investigation_project | Bin 51616 -> 0 bytes tests/test_investigation_record | Bin 17392 -> 0 bytes tests/test_investigation_session | Bin 56880 -> 0 bytes tests/test_investigation_tree_builder | Bin 22848 -> 0 bytes tests/test_investigation_tree_model | Bin 17368 -> 0 bytes tests/test_statement | Bin 37456 -> 0 bytes tests/test_task_manager | Bin 0 -> 46416 bytes tests/test_task_manager.c | 1116 +++++++++++++++++++++++++ tests/test_transaction | Bin 32760 -> 0 bytes 23 files changed, 4569 insertions(+), 25 deletions(-) create mode 100644 docs/tickets/closed/TICKET-035.md create mode 100644 include/core/task_manager.h create mode 100644 include/widgets/task_panel.h create mode 100644 src/core/task_manager.c create mode 100644 src/widgets/task_panel.c delete mode 100755 tests/test_background_task delete mode 100755 tests/test_database delete mode 100755 tests/test_error delete mode 100755 tests/test_investigation_dao delete mode 100755 tests/test_investigation_node delete mode 100755 tests/test_investigation_project delete mode 100755 tests/test_investigation_record delete mode 100755 tests/test_investigation_session delete mode 100755 tests/test_investigation_tree_builder delete mode 100755 tests/test_investigation_tree_model delete mode 100755 tests/test_statement create mode 100755 tests/test_task_manager create mode 100644 tests/test_task_manager.c delete mode 100755 tests/test_transaction diff --git a/docs/tickets/closed/TICKET-035.md b/docs/tickets/closed/TICKET-035.md new file mode 100644 index 0000000..12d6487 --- /dev/null +++ b/docs/tickets/closed/TICKET-035.md @@ -0,0 +1,790 @@ +# Ticket #035 — File de tâches et panneau d’activité + +## Contexte + +Le ticket #034 a introduit `BackgroundTask`, une primitive asynchrone capable de : + +- lancer un worker dans un thread GLib ; +- suivre son état ; +- signaler sa progression ; +- gérer l’annulation ; +- conserver un résultat ou une erreur ; +- revenir sur le contexte principal à la fin ; +- rester vivante grâce au comptage de références. + +Cette primitive ne gère cependant pas encore plusieurs tâches ni leur présentation dans l’interface. + +## Objectif + +Créer un gestionnaire opaque : + +```c +TaskManager +``` + +chargé de suivre les tâches actives et terminées, puis ajouter un panneau GTK permettant de les consulter. + +Le ticket doit permettre de voir : + +```text +Titre +État +Progression +Message courant +Bouton Annuler +``` + +Le gestionnaire reste indépendant de GTK. + +--- + +# Architecture attendue + +Créer : + +```text +include/core/task_manager.h +src/core/task_manager.c +tests/test_task_manager.c + +include/widgets/task_panel.h +src/widgets/task_panel.c +``` + +Relations : + +```text +Application + ├── possède TaskManager + └── transmet TaskManager à MainWindow + +MainWindow + └── possède TaskPanel + +TaskPanel + └── observe TaskManager + +TaskManager + └── conserve des références vers BackgroundTask +``` + +--- + +# Phase A — `TaskManager` + +## 1. Type opaque + +Dans : + +```text +include/core/task_manager.h +``` + +déclarer : + +```c +typedef struct TaskManager TaskManager; +``` + +Le type doit rester indépendant de GTK, SQLite et des enquêtes. + +--- + +## 2. Callback de changement + +Définir : + +```c +typedef void (*TaskManagerChangedCallback)( + TaskManager *task_manager, + gpointer user_data +); +``` + +Le callback signale qu’un changement visible a eu lieu : + +- tâche ajoutée ; +- progression modifiée ; +- tâche terminée ; +- tâche retirée ; +- annulation demandée. + +Le callback est une notification globale. Il ne transmet pas directement une tâche particulière. + +--- + +## 3. API publique + +### Construction + +```c +TaskManager *task_manager_new(void); + +void task_manager_free( + TaskManager *task_manager +); +``` + +### Ajouter une tâche + +```c +gboolean task_manager_add( + TaskManager *task_manager, + BackgroundTask *task, + GError **error +); +``` + +Règles : + +- `task_manager` devient propriétaire d’une référence supplémentaire ; +- l’appelant conserve sa propre référence ; +- une même tâche ne peut pas être ajoutée deux fois ; +- une tâche déjà terminée peut être ajoutée, mais elle est immédiatement visible comme terminée ; +- `NULL` est refusé. + +### Consulter les tâches + +```c +gsize task_manager_get_count( + const TaskManager *task_manager +); + +BackgroundTask *task_manager_get_task( + const TaskManager *task_manager, + gsize index +); +``` + +`task_manager_get_task()` retourne une nouvelle référence que l’appelant doit libérer. + +### Retirer une tâche + +```c +gboolean task_manager_remove( + TaskManager *task_manager, + BackgroundTask *task +); +``` + +La tâche n’est pas annulée automatiquement. + +### Supprimer les tâches terminées + +```c +gsize task_manager_remove_finished( + TaskManager *task_manager +); +``` + +États concernés : + +```text +COMPLETED +FAILED +CANCELLED +``` + +### Annuler toutes les tâches actives + +```c +void task_manager_cancel_all( + TaskManager *task_manager +); +``` + +### Callback de changement + +```c +void task_manager_set_changed_callback( + TaskManager *task_manager, + TaskManagerChangedCallback callback, + gpointer user_data, + GDestroyNotify user_data_destroy +); +``` + +Le manager possède `user_data` après l’appel. + +Remplacer le callback existant doit détruire les anciennes données exactement une fois. + +--- + +## 4. Domaine d’erreur + +Définir : + +```c +typedef enum +{ + TASK_MANAGER_ERROR_INVALID_ARGUMENT, + TASK_MANAGER_ERROR_ALREADY_ADDED +} TaskManagerError; +``` + +Puis : + +```c +#define TASK_MANAGER_ERROR \ + task_manager_error_quark() + +GQuark task_manager_error_quark(void); +``` + +--- + +## 5. Structure interne recommandée + +```c +struct TaskManager +{ + GMutex mutex; + GPtrArray *tasks; + + TaskManagerChangedCallback changed_callback; + gpointer changed_user_data; + GDestroyNotify changed_user_data_destroy; +}; +``` + +`tasks` doit contenir des références `BackgroundTask *`. + +Configurer le `GPtrArray` avec : + +```c +background_task_unref +``` + +comme fonction de destruction. + +--- + +## 6. Notification périodique + +`BackgroundTask` ne possède pas encore de callback de progression. + +Pour ce ticket, `TaskPanel` peut rafraîchir périodiquement l’affichage avec : + +```c +g_timeout_add() +``` + +fréquence recommandée : + +```text +200 à 300 ms +``` + +`TaskManager` notifie immédiatement les changements structurels. + +La progression sera relue par le panneau. + +Une API d’observation plus fine pourra être ajoutée plus tard si nécessaire. + +--- + +# Phase B — Tests de `TaskManager` + +Créer : + +```text +tests/test_task_manager.c +``` + +## Tests minimaux + +### Construction + +Vérifier : + +```text +manager non NULL +compteur initial à zéro +``` + +### Ajout + +Ajouter une tâche et vérifier : + +```text +compteur à un +callback déclenché +tâche récupérable +référence indépendante +``` + +### Doublon + +Ajouter deux fois la même tâche : + +```text +FALSE +TASK_MANAGER_ERROR_ALREADY_ADDED +compteur inchangé +``` + +### Retrait + +Retirer une tâche : + +```text +TRUE +compteur décrémenté +callback déclenché +``` + +### Retrait inconnu + +Retirer une tâche absente : + +```text +FALSE +aucun crash +``` + +### Nettoyage des tâches terminées + +Ajouter : + +- une tâche en attente ; +- une tâche terminée ; +- une tâche échouée ; +- une tâche annulée. + +Vérifier que seules les tâches terminées sont supprimées. + +### Annulation globale + +Ajouter plusieurs tâches actives et appeler : + +```c +task_manager_cancel_all() +``` + +Vérifier que chaque `GCancellable` reçoit une demande d’annulation. + +### Durée de vie + +Vérifier que : + +- le manager conserve ses références ; +- la destruction du manager libère toutes les tâches ; +- le remplacement du callback détruit les anciennes données une seule fois. + +--- + +# Phase C — `TaskPanel` + +## 7. Type opaque + +Dans : + +```text +include/widgets/task_panel.h +``` + +déclarer : + +```c +typedef struct TaskPanel TaskPanel; +``` + +API : + +```c +TaskPanel *task_panel_new( + TaskManager *task_manager +); + +GtkWidget *task_panel_get_widget( + const TaskPanel *task_panel +); + +void task_panel_refresh( + TaskPanel *task_panel +); + +void task_panel_free( + TaskPanel *task_panel +); +``` + +`TaskPanel` ne devient pas propriétaire de `TaskManager`. + +`TaskPanel` doit rester valide tant que le manager existe. + +--- + +## 8. Interface recommandée + +Premier rendu simple : + +```text +┌──────────────────────────────────────────────────────────┐ +│ Activité [ Nettoyer ] │ +├──────────────────────────────────────────────────────────┤ +│ Extraction des métadonnées │ +│ En cours — 45 % │ +│ [████████░░░░░░░░░░] [ Annuler ] │ +├──────────────────────────────────────────────────────────┤ +│ Calcul SHA-256 │ +│ Terminé │ +│ [████████████████████] │ +└──────────────────────────────────────────────────────────┘ +``` + +Widgets GTK possibles : + +- `GtkBox` ; +- `GtkLabel` ; +- `GtkProgressBar` ; +- `GtkButton` ; +- `GtkScrolledWindow`. + +Ne pas utiliser encore de `GtkListView` si cela complexifie inutilement le ticket. + +--- + +## 9. État visuel + +Créer une fonction privée traduisant les états : + +```text +PENDING → En attente +RUNNING → En cours +COMPLETED → Terminée +FAILED → Échouée +CANCELLED → Annulée +``` + +Une tâche en erreur doit afficher son message d’erreur sous forme courte. + +Une tâche en cours doit afficher son message de progression lorsqu’il existe. + +--- + +## 10. Bouton d’annulation + +Le bouton `Annuler` doit être visible uniquement pour : + +```text +RUNNING +``` + +Son callback appelle : + +```c +background_task_cancel(task); +``` + +Le bouton ne doit pas retirer la tâche. + +--- + +## 11. Bouton de nettoyage + +Ajouter : + +```text +Nettoyer +``` + +Il appelle : + +```c +task_manager_remove_finished() +``` + +Les tâches actives restent visibles. + +--- + +## 12. Rafraîchissement périodique + +`TaskPanel` doit enregistrer une source GLib : + +```c +g_timeout_add() +``` + +Elle appelle : + +```c +task_panel_refresh() +``` + +Lors de `task_panel_free()` : + +- retirer la source avec `g_source_remove()` ; +- empêcher tout callback après destruction ; +- ne pas détruire `TaskManager`. + +--- + +# Phase D — Intégration GTK + +## 13. Ajouter le panneau à `MainWindow` + +Modifier : + +```text +include/views/main_window.h +src/views/main_window.c +``` + +Changer la construction : + +```c +MainWindow *main_window_new( + GtkApplication *application, + TaskManager *task_manager +); +``` + +`MainWindow` doit créer : + +```c +TaskPanel *task_panel; +``` + +Le panneau peut être placé : + +- sous la zone de travail ; +- dans un volet inférieur ; +- ou temporairement dans une colonne latérale secondaire. + +Pour ce ticket, un volet inférieur sous `GtkPaned` est acceptable. + +--- + +## 14. Ajouter `TaskManager` à `Application` + +Dans la structure privée : + +```c +TaskManager *task_manager; +``` + +Dans `application_new()` : + +```c +application->task_manager = + task_manager_new(); +``` + +En cas d’échec, nettoyer l’application. + +Dans `application_on_activate()` : + +```c +application->main_window = main_window_new( + gtk_application, + application->task_manager +); +``` + +Dans `application_free()` : + +1. fermer/détruire `MainWindow` ; +2. libérer `TaskManager` après le panneau ; +3. poursuivre le nettoyage existant. + +L’ordre doit éviter que `TaskPanel` lise un manager déjà détruit. + +--- + +# Phase E — Tâche de démonstration + +## 15. Ajouter temporairement une tâche de test + +Pour valider l’interface, ajouter un bouton temporaire : + +```text +Tâche de test +``` + +Il lance une `BackgroundTask` qui : + +- dure environ deux secondes ; +- progresse de 0 à 100 % ; +- accepte l’annulation ; +- retourne un résultat simple. + +Cette tâche doit être ajoutée au `TaskManager`. + +Le bouton pourra être supprimé lorsque le premier véritable traitement asynchrone sera disponible. + +Le code de démonstration doit rester clairement identifié : + +```c +/* Temporary demonstration task for ticket #035. */ +``` + +--- + +# Hors périmètre + +Ne pas ajouter encore : + +- de limite de concurrence ; +- de priorité ; +- de persistance SQLite ; +- de reprise après redémarrage ; +- d’historique permanent ; +- d’exécution de commandes ; +- de recherche DNS ; +- d’ExifTool ; +- de notifications système ; +- de tri avancé ; +- de pagination. + +--- + +# Critères d’acceptation + +- [ ] `TaskManager` est opaque. +- [ ] `TaskManager` ne dépend pas de GTK. +- [ ] `TaskManager` protège sa collection avec `GMutex`. +- [ ] Le manager conserve une référence par tâche. +- [ ] Une tâche ne peut pas être ajoutée deux fois. +- [ ] Une tâche peut être retirée. +- [ ] Les tâches terminées peuvent être nettoyées. +- [ ] Toutes les tâches actives peuvent être annulées. +- [ ] Le callback de changement fonctionne. +- [ ] `TaskPanel` affiche toutes les tâches. +- [ ] La progression est visible. +- [ ] L’état est lisible. +- [ ] Une tâche active peut être annulée. +- [ ] Les tâches terminées peuvent être supprimées. +- [ ] Le rafraîchissement périodique est correctement détruit. +- [ ] `MainWindow` ne devient pas propriétaire du manager. +- [ ] L’ordre de destruction ne provoque aucun crash. +- [ ] La tâche de démonstration fonctionne. +- [ ] `make` réussit. +- [ ] `make test` réussit. +- [ ] `git diff --check` ne retourne aucune erreur. + +--- + +# Audit attendu + +Vérifier l’indépendance du manager : + +```bash +rg -n \ + '#include + +/** + * @brief Représentation opaque du gestionnaire de tâches. + */ +typedef struct TaskManager TaskManager; + +/** + * @brief Codes d’erreur du gestionnaire de tâches. + */ +typedef enum +{ + TASK_MANAGER_ERROR_INVALID_ARGUMENT, + TASK_MANAGER_ERROR_ALREADY_ADDED +} TaskManagerError; + +/** + * @brief Domaine d’erreur du gestionnaire de tâches. + */ +#define TASK_MANAGER_ERROR \ + task_manager_error_quark() + +/** + * @brief Callback appelé lorsque la collection de tâches change. + * + * Ce callback est utilisé lorsqu’une tâche est ajoutée, retirée, + * nettoyée ou lorsqu’une demande globale d’annulation est effectuée. + * + * Il est appelé sans que le mutex interne du gestionnaire soit verrouillé. + * + * @param task_manager Gestionnaire ayant changé. + * @param user_data Données associées au callback. + */ +typedef void (*TaskManagerChangedCallback)( + TaskManager *task_manager, + gpointer user_data +); + +/** + * @brief Retourne le domaine d’erreur du module. + * + * @return Quark GLib du domaine d’erreur. + */ +GQuark task_manager_error_quark(void); + +/** + * @brief Crée un gestionnaire de tâches vide. + * + * @return Nouveau gestionnaire, ou NULL en cas d’échec. + */ +TaskManager *task_manager_new(void); + +/** + * @brief Libère le gestionnaire et ses références sur les tâches. + * + * Cette fonction accepte task_manager == NULL. + * + * Les tâches continuent d’exister si d’autres composants possèdent + * encore leurs propres références. + * + * @param task_manager Gestionnaire à libérer. + */ +void task_manager_free( + TaskManager *task_manager +); + +/** + * @brief Ajoute une tâche au gestionnaire. + * + * Le gestionnaire prend une référence supplémentaire sur la tâche. + * L’appelant conserve la propriété de sa propre référence. + * + * Une même instance de BackgroundTask ne peut pas être ajoutée deux fois. + * + * @param task_manager Gestionnaire concerné. + * @param task Tâche à ajouter. + * @param error Emplacement facultatif recevant une erreur. + * + * @return TRUE si la tâche est ajoutée, sinon FALSE. + */ +gboolean task_manager_add( + TaskManager *task_manager, + BackgroundTask *task, + GError **error +); + +/** + * @brief Retourne le nombre de tâches actuellement suivies. + * + * @param task_manager Gestionnaire concerné. + * + * @return Nombre de tâches. + */ +gsize task_manager_get_count( + const TaskManager *task_manager +); + +/** + * @brief Retourne une référence vers une tâche selon son index. + * + * L’appelant doit libérer la référence retournée avec : + * + * @code + * background_task_unref(task); + * @endcode + * + * @param task_manager Gestionnaire concerné. + * @param index Index de la tâche. + * + * @return Nouvelle référence vers la tâche, ou NULL si l’index est invalide. + */ +BackgroundTask *task_manager_get_task( + const TaskManager *task_manager, + gsize index +); + +/** + * @brief Retire une tâche du gestionnaire. + * + * La tâche n’est pas annulée automatiquement. + * + * La référence détenue par le gestionnaire est libérée. + * + * @param task_manager Gestionnaire concerné. + * @param task Tâche à retirer. + * + * @return TRUE si la tâche était présente et a été retirée, sinon FALSE. + */ +gboolean task_manager_remove( + TaskManager *task_manager, + BackgroundTask *task +); + +/** + * @brief Retire toutes les tâches terminées. + * + * États concernés : + * + * - BACKGROUND_TASK_STATE_COMPLETED ; + * - BACKGROUND_TASK_STATE_FAILED ; + * - BACKGROUND_TASK_STATE_CANCELLED. + * + * Les tâches en attente ou en cours sont conservées. + * + * @param task_manager Gestionnaire concerné. + * + * @return Nombre de tâches retirées. + */ +gsize task_manager_remove_finished( + TaskManager *task_manager +); + +/** + * @brief Demande l’annulation de toutes les tâches en cours. + * + * L’annulation reste coopérative. + * + * Les tâches ne sont pas retirées du gestionnaire. + * + * @param task_manager Gestionnaire concerné. + */ +void task_manager_cancel_all( + TaskManager *task_manager +); + +/** + * @brief Définit le callback signalant un changement du gestionnaire. + * + * Le gestionnaire devient propriétaire de user_data après cet appel. + * + * Lorsqu’un nouveau callback remplace l’ancien, les anciennes données + * sont détruites avec leur fonction de destruction. + * + * Le callback peut être désactivé en fournissant callback == NULL. + * + * @param task_manager Gestionnaire concerné. + * @param callback Nouveau callback, ou NULL. + * @param user_data Données transmises au callback. + * @param user_data_destroy Fonction de destruction associée. + */ +void task_manager_set_changed_callback( + TaskManager *task_manager, + TaskManagerChangedCallback callback, + gpointer user_data, + GDestroyNotify user_data_destroy +); + +#endif diff --git a/include/views/main_window.h b/include/views/main_window.h index 112f07c..4c96478 100644 --- a/include/views/main_window.h +++ b/include/views/main_window.h @@ -9,6 +9,7 @@ #include "core/investigation_tree_model.h" #include "widgets/investigation_tree_view.h" #include "core/investigation_node.h" +#include "core/task_manager.h" #include @@ -45,11 +46,17 @@ void main_window_set_new_investigation_callback( /** * @brief Crée une nouvelle fenêtre principale. * - * @param application Application GTK. + * MainWindow ne devient pas propriétaire de task_manager. * - * @return Une nouvelle fenêtre ou NULL en cas d'échec. + * @param application Application GTK. + * @param task_manager Gestionnaire de tâches de l'application. + * + * @return Nouvelle fenêtre, ou NULL en cas d'échec. */ -MainWindow *main_window_new(GtkApplication *application); +MainWindow *main_window_new( + GtkApplication *application, + TaskManager *task_manager +); /** * @brief Affiche la fenêtre principale. @@ -156,6 +163,16 @@ typedef void (*MainWindowQuitCallback)( gpointer user_data ); +/** + * @brief Callback appelé lorsque l'utilisateur demande une tâche + * de démonstration. + * + * @param user_data Données utilisateur associées au callback. + */ +typedef void (*MainWindowDemoTaskCallback)( + gpointer user_data +); + /** * @brief Définit le callback du bouton « Ouvrir une enquête ». * @@ -186,6 +203,21 @@ void main_window_set_quit_callback( gpointer user_data ); +/** + * @brief Définit le callback du bouton « Tâche de test ». + * + * Ce bouton est temporaire et sert à valider le panneau d'activité. + * + * @param main_window Fenêtre principale. + * @param callback Fonction appelée lors du clic. + * @param user_data Données transmises au callback. + */ +void main_window_set_demo_task_callback( + MainWindow *main_window, + MainWindowDemoTaskCallback callback, + gpointer user_data +); + /** * @brief Libère les ressources de la fenêtre. * diff --git a/include/widgets/task_panel.h b/include/widgets/task_panel.h new file mode 100644 index 0000000..3f07317 --- /dev/null +++ b/include/widgets/task_panel.h @@ -0,0 +1,66 @@ +/****************************************************************************** + * @file task_panel.h + * @brief Panneau GTK affichant les tâches suivies par TaskManager. + ******************************************************************************/ + +#ifndef LABFY_INVESTIGATION_TASK_PANEL_H +#define LABFY_INVESTIGATION_TASK_PANEL_H + +#include "core/task_manager.h" + +#include + +/** + * @brief Représentation opaque du panneau d’activité. + */ +typedef struct TaskPanel TaskPanel; + +/** + * @brief Crée un panneau affichant les tâches d’un gestionnaire. + * + * Le panneau ne devient pas propriétaire de task_manager. + * Le gestionnaire doit rester valide pendant toute la durée de vie + * du panneau. + * + * @param task_manager Gestionnaire de tâches observé. + * + * @return Nouveau panneau, ou NULL si le gestionnaire est invalide. + */ +TaskPanel *task_panel_new( + TaskManager *task_manager +); + +/** + * @brief Retourne le widget racine du panneau. + * + * Le pointeur retourné est emprunté. + * + * @param task_panel Panneau concerné. + * + * @return Widget racine, ou NULL. + */ +GtkWidget *task_panel_get_widget( + const TaskPanel *task_panel +); + +/** + * @brief Reconstruit l’affichage à partir du gestionnaire. + * + * @param task_panel Panneau à actualiser. + */ +void task_panel_refresh( + TaskPanel *task_panel +); + +/** + * @brief Libère le panneau et arrête son rafraîchissement périodique. + * + * Le gestionnaire associé n’est pas libéré. + * + * @param task_panel Panneau à libérer. + */ +void task_panel_free( + TaskPanel *task_panel +); + +#endif diff --git a/labfy-investigation b/labfy-investigation index 47f1d0005c52f95acc3b0633ba08ca918d124593..19ab421984624e06395036da3592beb8d3797a18 100755 GIT binary patch literal 250944 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%0D01TnB*{u3l*$CSj*#0&V%%yZUxk8WV?0?Es2>mc zcoyJN@A+Q)U1Woo-Vb7CQ1h8K!-%V86oy4cTrH!h za4fEtQ5cr-xLQVG*q<3!%P0z`Ag-2CRJbs%mQhr=D6W=K7U=EzxLQV03Hk(Z=0k-= zXc_thaOUI1v_X9WICE#!c%xw!|P8YG>NUQdJ1<#wDp<}&#MMH3oD0z&CosPsq)QV8@c#*Llu@SyU znQ@lLV8#X?O(EGTf?qlqnqTTHD{x==8B;RSNyYvQ}LqZh{Tesgr8FTc2Fs&hzuI2;cFOVx75jh{@?!i z`*HtgkH4E6P)VXvyd8jN{wuc~N zsmHWQ&Q|j=ro9&_=JSxTpilLu2#0qeY%YaG74)tCnSdn-n;i8P46hD_V0Y?FNa1{c zU;D2;Wmh$;E$ml48cFIjhvyK4Ob&jFdQ=?43>f^r*%R-dTnx3yGI2gJ7g0t0x~b$MkXyp*s~EKlcVL5s{H#2Rny?Dga${TrB)Q}AvA!n=Ltez2f?y#T|Oc7 zHH5YP%BCeS@Q{0rv(g15(;!Sh7TvS9i%-~Vj-dTGTcmPJ#!7pvw!P_8Nf#L zCf;&!6H)$#u!rZ3P0r-IWK}+ja5i@vV+0&xE%(<(fX-39wKCQh@)_O}!Oc2ZMf~2Q zQ3`8y-YH0ldEaH^l)QT6&s950)~Q|IK>kv1JDjt1dL4*mqSJXBY^_w39=VrcV*TLu z-m+_IGn7_p<;PZ&;|jPOt1$8>+%P}G;L$2Bo`3{6`fGq^m6($e%O-B@MF@0`RTjH} z8P~w9tuBcNnb9y`qO4ub^Nv+1qTV9fVuT3ds-jaf67!e z7T5{<&d_Jn{(!u?C~A%c6H}Qpv>M7ad*_Wh80;U+N-b3yIGRa&(OM1vXCv)5`p8l8 zAA{`DzA{-e1LZGU65CCTV$!6IsEZLD1S!joi;;I8M)pm8W%h^{MgZ2NH9mVJv{V;o zRTRQIi%Sp?RKJnMcOfM4E(8{lPoS!@8d+FUzNfG35&asnm3LQF6)hiO@9!%sQX?Qq zY2Wzm#D0a8NY03ULvXh^g@{g~4HhY7_%DI6n%(or;0

LX1!i2p3Pc_+mZ51Mx;Q zjw*r~Dg|=!rleO6_oKxlWKp3MxF2MTQwyvr!kNoiq$q~Ii(9Qj(_n=j-3N-r^4%{0?8b;MGIW!{~2QJ5B>SAPl z*WW&?zw9-1C50~6D!GuB*grmc#c8lAKD`%R;Ony_$y8s~aKi0F-QwenqgV8%_v} zC}*-IH8~{d=M1)_E~js(0E0j{VO@REMXd9NFnRbf!@PQc%p3Oyish|P`p@FpSPW}p zr5MaMGaCb{^hWd_&^LNIB{AQGnB^FN z&vBECysv>A`@|dEOb|s8W1#>e>kpV-%xmTl)b6Gk`chITjLQ8Q-GgA80DK zM~)u4<(^zzwaQFoBU2paC7L&w*Cie1<>;yrR;zgrfL<@Iyjp=rWG?kM;YItQK{9z9 zi~N{$RcjQC9D#=vY-h*XU>H=8B zZ28U}jr4|tEH)jV4M|x-ys3?^{NzD|z)NVWb7Y(&UM^s$wa&Rx>0CWoKzUDeMQE_L z0DXbZPJNvZlUgW~bSco6)e2oNN=ZlA%@+H+#ZvWmR7=74kgP%4j${pK$@r2lRe|GN zPV)lHd$^mo*(i7$HRX}#@79^zw}y#Ld|hLJy|-7EFf141iQ(JOiY%F+PeP@uLiyZ6 z;o*vfC`C}Jeu#>@awM9V8=Yq@gOp)6+Gy>CAQ3kTo9KeV7I?w%9C6An`|m^G(a8Q> zq1bbgNU=XpDE3?>QvA;sj#7U-U8xP9nW5Ua-KF$)u~2GL4+*jC_`D3q391r$L$B*_ z#sv*mJuE``*9#>-D{+DX1edwdMvH4!muqS?^4`5b%^D!GNdBj1 z?2Ct@M3i8lmVgz@>G@zcOSAO|Ze|UvME@tRd&NsSh z)-@zpGvB%uli*YtMmSzN5sGr_{2mpIYQsUS^tz3UZ%Ebd<&J8cLK8)|PGCiBY+odT`Z z>oigHoQ! zgHkA5YdM3;U;G)EIcK1_)~FKFdG{%eeq1_NEFZZj=4eOE89~w*iz1{nk&0~O@B5UK z6LqY9V$%@jByK;axbuvP9gw*0K?fC$#6g`y)OG0KyO%MjMB`vI=NvRXOZRkhom|t? zxl)^e8@y#OI(^lpF$Z%acL%`hb3}gF!>fnN+`gw^t6JEw8 z-57jLF|9Yh_Nf^f)pf}SNz#m`u(DCuO7Ulh@#_T8Ukp#6OBZk@>cJAM4w*i!T z6#XKG2ee6d8MGqJym0CAHl(sICS!wpg51AR??UTXN1fu=>!=-H2GbNCpf^+>I*I0? zct(KXpl=C+W`?>hsT$45Tc`(N_C#2k^|+em6@Yl~u(odk(mlgQ*D?2k4*kG8i>m&xQ>X8SoDpDn@WT;w&v zEu-u=rpsaS$x--_ysVbLjj~72kcSm71!|~=#jO}If#@rNEk0+S$g!jC>u2DQ?-9Te zgRT33)8lof;1w=l%b(apXq2Dj7{csqfxhj)KQ#ISl3@$JOAs3#`bfo^ef+q^2q)I) z%PTdE!vds<2fVOkkEKFrwgx#wGRiE}a2@W(FTCI%@Ab*lPRkaY^k@OohcV(y^7@E zX?f2wWga;OZy0S)I!@+SY=_!{f5{^-+8wfaUb1{1VDW+%i-Vm1sxkJ3$H~0WYk}&S zsw5beM)Cidnd%jEY6r9s3_XVwd60j82ejW<`?KR@v0OXK4jwOiO)#K??~#>%N& z=H#8Hax(91H}6Sq-g!pGC-oe1MyR~0P7aW>f5Nf*6#2BuBoD38(^+&^8DSK9hRkH; z_H#10{#$H%mZ;2z2IgkVr27~lul_&_($SYRSPt??SDqR2OSG%Qq-q+ndfhZhS1?M( zDIQv~Hy`#jMylq8;a`$ZGCco*Vc*syE6r=)H|&?1z8gI%m!J3 zVND*B=3;a`AG#BxgnFWXibM9;G+CZj^R5HqdJ$uzLJfJZMvgIQZ5y%YVVl3x1C+d@ z^YMvD{_r?EvIofV54Y+}xn-8-VQF7z*!`vE>&y3j^fAuh2$s5 zCGobV9!Ya)K%cI->~y&Vlz})V))-Ls;Tl|+jGoE0x6YC|sRo4Ck?NSYG}UMH4YKnQ zpa5|%b!Ez1(7M`KukE%u(14NIUmc<|j94}>PavfkZ)y@>rYU{q$~RkeC@}iGWhX5( zS~m-fATdJ-vqj8vtvSrLKi@SgqvA`bSBzFKYeqk2pL~K$rFvDvIy?Hg_n~I?a~(4|!XyW9+M2@#UkF>g@+wWiDOkE3L9eE?p-)=hwig zgAT>72pCa#&Z0T8I)`?g8zgK26BRvc=_q^V9GO3uUC^zMgT?coG81Nk`i3gJ2iWS< zVYe|08)0A^u-6iM=%i0LNe$yX~1wMbrzwudJD?;BAml;OvL;Flr2G}CNi2O z5)vH6W@fe`?01M;8R~SuvIj|fm?We!2&oK0YJ&){v0HdW9SDXwq{Q%&qk|~J;cE_O z4d)#PfL9MSz4~Kf;rem*izmw3%nzW@U9qC;nT6r-ti$cZ0y&=Up=p6^%ljCG_U%u` zmO;uhARgY3j*!`Foc-AXv}wL7CX83bgaQ2rllh`#@e0Tp=AW4L1)Y^27E@UT2^r?& z0$7uJ7S21)kpl zo=f>BlZ|v+p>he&R-F8=?ITDSkylalhpo&GiC(19v{~t_u0k!Q3BqDNM8YeZ)sZ zNIe?wl<}W#>O#XqHHA2H*r<8@wqFy!J%d) zNykb}u<<_#3ZFyo&+ zd#zmw0uzR-L+3Ng&@u-SSLn{9zf+FVBmX|8uhHX|d4 zmx}E@2eG~PAhzutZ2LibCz9>?`!Gg034>;qXTd>?7P{q8d=@EEX+BF2;&akLeA?1{ z3a?@#&dy>hbvuoJq!p>Yd7GpBxU@&L$%GQ3z!9QZm8USxhvSH%G-cx*_#=)ZE~|qd z?dYNg1#}m+%JCYxa4h_NgevixA95tjdb@{E|aaPg-G)CjDCW|YfwUy0h6zbG_OR+ z@ZWJbZ2Z_@B_QpDsv&fuh`HKD#yX%pN3dE9vbqBN0E0_^VrIiARafO+fF*Cj8tH?j z97@smacGhk*PO25tZrAbSCQ#(71uXJ zrJLcdjRY_pq-Y*~X6XNG-K}FTWba!kkM91TD|}vOjP^2!d7UvD%ZBlq-F7m1e>RDe zWl_$Z&`Kcb|-xNZr_A$5-L-H7nk%wfOl^!HZ$BdHR1o+#bFP zi@86Jv*)jpHN_k_dk(S2qqfBZ#Qh7f^b;fg!m;+YRhZ_`*?6n6PDApkX}ns}jQs>1 zh%VV=u*1!E#hcVZ15+E))J*64W_v0h~yk(ldlOC{7NnC}xUY6=Ko=A}r-=ajoZYPW)G z0q0L_3e(n#;M&J<=e6dD{F5*ic|07N1RGlqCsU|eP-v>*iU=Vk|z&YqD8w4r%Wp2p8$ z{&AW1X;;V`d)T!yH<+0eRe7YCWuJ7h%t|D)NjRh>z}zXnaH71p`tgcvak7@%o5f1^S8-- z(ak>TIw-Q@Y?-tNo+l$d;@0&r?6O;Bb^Bk>l6hwPEf>n2Uiby@;iVE$kLij?C{bgX zoocB4qs!!n!am}3nQ5PRs|>YYyj~8G?f<%5{^YZF+#$2tPrhEh6p}|D-#%%pY!>pA zW_#;4`Mj)eX+QH$4BEwc_N3i1*S_a&w6kw#x4(0@yj{xr6WcFpmwP-&ZMk1oWuFga zSr?&&_&GuGcm+;CZeQMh)&25K5#T`Ci;34ScFU_6REKS`71QT|z}|tD^BVsDf$$#u zzl(nR*hJ3RDh~2a};7i zT~uu;{JU)X?&oFW;q#Ej`aKcYm*Iaa{@r?Kohu5-8KlsLi&P<1-yZ<;z*?pume;VV zB&$lYs^po>!&>sIYT-w~eTqL`TE20&{4MqWi+|abY5pqoU-<(?TiMSL%)5h8WpA`H zi&kdQ$}C!$MJuytUxR%^DAE%YvyO-q=dJ=1n=%zTi!HsQuQPGHCC6Q?}S`Z^?P~^eaM0MiMW1-RfB)WF_`NrOhu3?*UA9B!gaej2 zi!G?6R7(5ESFvS9BRbG{&p=UKr=<)yb2cDCT|Pj)NIEBzF3F^Ic&L64t;0j>@X$Iu zS0RU&c45&jENb4O<}E7SqS7rY-Ga{vI5vIhJ?++O@@!$h{;sU7dkh5Fs@M(>6pn(W zJ!#?}6zm^%-FvdGC%O5^%|~uNGV+m!k9F#2b?R26D)G(x+RuJZo-E{J7L6=IyGIKO9YXsV&-wRF= z_D6pGI(_zm&+Kdue^8qeinvX?V z79FYi)(LMjlYurm;u0EL_oQEN+^+qNQ#2vQA|=X~lfIvAC}Q+#{!b~As%;+93N#@ICBIZBeIr7g?n zX(bNmXUqk8+*UR@mE9o|U`mI^Ty?V>!8AB+N_~CPVMmUeFxs9{YnI1PXlsQb&2DO2 zvShg;Y(L-4>|$Tg-7K=FU19dMW7TGcJ-NmlYi}MQYKz8>TDWA{ini8C+Ne=i+P2iq zzP{G1wo7WE$FHi*yyAnZz_D3q$01>#e1%!p2dbql&tKUJXhT~+R7M+vCLlc0Gi?8Zf4XTTxn+HEnje;H61`| z{ns^xUC}t2mZR317A=|Gy3jzYaZ2FW0$Y%ML#0_-I+wPM`a0N@$4zaTT0iBeaii+( zCHLdi7PG2g9~V`diGsPh&>dRSiXTl+F{#q5%N#pOI}atbF_*Q$nl7zqoN~nBXxs*6 zb5wIc6L%WV`iIMto|d+`C)kfypuCYg!FOyA*8#1rGZRc*Y5%L*tZaV*n{vWBc}d%X z*0%POa?Qok{yE=#sr}^w^A@Z9?w;l@zddWPIjDWxVAB!-x~mB-vsxG0_YN`pgwVv6 zH_ckHeEE{ac6_K=W6ov3=1{^DKqj*aEM(zPU?*J$0Blz+OMhJU&6EwU9)b zSY^vsFKxBI9%fe9-3~RI?6rrO$J?JDVt#AyA7sw5?;LODwr@Vv{3WCP=_%$h;r1;} z_@uo3VzXIhmox$OyJmB@oj1$unFX>3I1KIL?0>YF$Fwh6ce*iLqSo|~ieT~gWp}$aJbu*4q;cVm8!!=w(4dXNf zNWW3j!6Je4I~R9hB#q|}w=bPz_Q1s6esqp`Jf`k;`CPMS%AxbMLyqsIC7pWqiuhfn zZ))|K@VySayMw>i!H+G}h~GQ-LH6sww-#x@hYq|a2Ls0bKb)vxKR?%u|D8U*mqmfp`AKxXaJ|%(uIY#`kuh z6e%P9$#bXJ6*|EfvqnqeewCeHRb#OqI#a`0UHmO~;K{W*?!q@a@Xp__f7F3bKa2QX zus*Hx>2W+5+@KQlQ3EFZXpfw4=A?oi&41I`8vh$dUJhg_*F`i3{Ia14{^}k0_2=vO z#rkHr3h5Qq1hO6Y9N-^VeGXW?&Ij;Rx?bIc(;NowH|{E&gbN*b=WmbQ?7%yJCGDyI z!Pup*zd44LYL~&s4x!H9Lx^GEOHC}kLQBH;De^bOfp`8M#6kz&`O^~X9QZ*Wui#4g z15SeT-3`Nss^o8<13&c|9e+^YjC{;zC{X9GiKr8UfG@aKBMx!|UFqOof1QT+cj#OP zI3^<9DKa+i{*z=>3qgq zC*hTQG@!2o=ey^~Ab76^baUVjIPlJIHskv~{u|?O{{vp4DgEIP>ija0Ymb>t+Yu`SG%s08ddBogZcU2?_tr#w0cji0?kx@QaqqNCN)f@Jj*5N8=3l zl(<_3!yGscit9$=CNwz=+@tuj90q4Q@Xn_uH#zXm=Q8hc;GIu_^09dqpyLdx=5KuM zBusf%b3E2z91Z{Xk`)3@LY>d^4f-GWBmW0{V(Nb+%yt-b-t9cwfp^|hq2#1qpp{#>$SYD|2o6M`vW?^7Vb%h z;&*eke2q>6{Z!@L&ueclHfJeQ=R+{%4!rYG!ollzdvp48OE)eH(j#6?-!RThXll*Q z$hp! z*RS)Hi0f4Pc3$(IacFdY!1+ss^PRfJ*T?Kb3=zxuL$tCZ4Cs*gM2HeBc-aA#^j(L=u_XQ`{=ZiGtW@nW4 zwaSHEY-PcnpGhfp;J$zAT&Fs@2Cp9p8*5b8nY`vLbugc6)|fN&&A3S6Y~i){(+MHydSE(KdWoPK53PilUI?YQ9GXl8>N!Pk?PjF$-(M;g!pC0 z*{uAF=HSjv+jO>boor`xs=pf?_`Y{_wl0o*k87rH>DyQOChSL6L(qIQHTneS0e<5= zC(l5YERNH+)Aj8lecPgLdG|Y6Z+3j)%TCtkbnjY<=6NZh3rSnk9I_sZN*c`x@&zee>G; zPX+a)zE!JR-dLRcVAiS)S`^2-8?!amY5HdC+b#O`kiNaFZ+q1(?^lOVz2g~&IX0bX zzjqqA*6G_QeLGg)R_NP>`gV)HJ*jTvUc*ib1#9e7E5AAL&gV=^a6X;B!d*Af#laB{ zTcpgKmO)4+xuu=R9p}I^FVq=Mah&fm2QDwu@YxQ%4Gz5Xw;FC!Y{Y}=mbc5n%G#*2 z-R0!|Tw{6d$!pLwiVL(%oeu>M)5(oaa>qkgn#%DiSuE7I3)QXn%?@(s2hesn@XjaY zUeY}N?Id4vsiysyBWT=?p8*NG7itM#aEf2*B#&3gVzPbG8D`P35#x@(>I66aY$xBx zPXANq^%c)(K5yyUH|o|qT%?8S)u}3bI`9itYi_F?rsM5(XQC`8 zILWJ>M(1`)XRBm!wZ7e@ZY{eVUs^}LmvF$ zNzk=u6-VpaQhhs3-!9R&8};oGb<5l15K4dWM$<9A)>wW!eirCe>f0c7%j36<6B6^A zMhDrsq4t10ZU!{KCUN%J|4&<29vf8=#&`Ftq}`_4-7T?iZFO175ekJBgro(-5u{Wq zpi*rSC@mp1M#5Ez6-qHFr$Cnte6XS}6{R38ht*fRQjUfr0&Qv4a71jY!J?Q{h{g~R zzc=6al)O0q{4&4qn0Yg^J8#a%JpEs)uw3{aX$)pTZ4mwi>7{+5U(1P}WB7)lM}c-n zY^=8$yU|`r`SmLZ3?)}aP7+JmrvvsJrP@PsQ3B#iLJ*D#^aK8 z)FsUkaZDK(h*<@zh3_vsJ&XzwWv11Oc}VIyUzoZba}|MPx1cmQYA zdd5Ffnb}`b@X$iiQZEvL3ekVNi2Z*r$?PQF7}@N!yrF!=exeN5(Y^^%X~y+8*4iQgYz~WaJY`wxSwDiQD!JIqm z<;i~GFLbg4pZJ+5y!G>1uQTtqjg-zx+P7^DPS{Mvj0}erXy?U?^)pJ>SnD^|x-VLH z)^g&~{A`J6-$E{v8HO^@$p9j!8lOaV(d>myCKF;M--W~*t)P4!6UT&KCVW{T6E6y1 z#a=&F5I8Mb$BS7k8M1W?zeh^@NwJQ_nOiA`ngT6th><56JKMO5V?=8tYfWRVxuj*} zFtmilXGDwoGs9Pq;XQ^%wrLd`x~E zRo%^6_oO`*vv`$=>FkOM<3${1C;J$h89Ety73>Jo66c5@^uazsaMPU-_8>g^IYOC3 z-yf!3sF<}IreWDGSfsDp4dWcR`2$#t8Dk;ASY-6#_4nbBo*tn~-St&_p(Fw{nb1$)dkB8DW8D#05$a7#3N;ULCD3Io^X4yI zI{(di^A{|@%A?SO+v33kv|byEJf4pCKc!{#+^OIVwfi)j=%?+bSL)$A2l_Nf(z|rH z;=ry<+Hld?Nb8~fqp%#W_l1!=a>1$p5QUR=Og{*57(E6naB>r^KuoB7z#~|79IoQF2Jqn1lfj8KP2dSdQe*Jo3CP!D#s7(HAwt zb_cG@p>^>{JeA~gXW%F%orMFT+o_s<<1B<7xcV#Tax6~5qVtg9E~GJp5lpmsu$p*R zA=RMb1?#cvJPdax4`Vuc7l%9x0T}A5~tsz4C#$x!s2hGDdN~KL zJ`nB9L2nx=oBt%aSYSkD_Of9*hAHZjs5z-w(+9iTC`aaGOI03vFHsK60aYXq3og+G z=!9XyxTth$GqCFtjB&=xtL+=-(BDpGYmCzg6y^@cqIOFBd5*5k#%dC~X1~kvE6*w| zx^rNU2mfk^6xXPqSh6wh0m;}7NP(ta2hQ$*aeXiMvP!44hk>N|7S?t^y0ak#l-b0g Q*xdo69e1(^b diff --git a/src/core/application.c b/src/core/application.c index e7bc5df..2054ec3 100644 --- a/src/core/application.c +++ b/src/core/application.c @@ -15,6 +15,8 @@ #include "views/folder_dialog.h" #include "views/main_window.h" #include "views/application_message_dialog.h" +#include "core/task_manager.h" +#include "core/background_task.h" #include @@ -64,6 +66,7 @@ struct Application MainWindow *main_window; InvestigationSession *session; InvestigationTreeModel *tree_model; + TaskManager *task_manager; }; /** @@ -602,6 +605,269 @@ static void application_on_open_investigation_requested( ); } +/** + * @brief Exécute une tâche temporaire servant à tester le panneau. + * + * Cette fonction s'exécute dans un thread secondaire. + * + * @param task Tâche en cours. + * @param cancellable Objet d'annulation. + * @param worker_data Données inutilisées. + * @param result Emplacement recevant le résultat. + * @param error Emplacement recevant une erreur. + * + * @return TRUE en cas de succès, sinon FALSE. + */ +static gboolean application_demo_task_worker( + BackgroundTask *task, + GCancellable *cancellable, + gpointer worker_data, + gpointer *result, + GError **error +) +{ + guint step = 0; + char status_message[64]; + + (void) worker_data; + + if (task == NULL || + cancellable == NULL || + result == NULL || + error == NULL) + { + return FALSE; + } + + for (step = 0; step <= 20; step++) + { + if (g_cancellable_set_error_if_cancelled( + cancellable, + error + )) + { + return FALSE; + } + + g_snprintf( + status_message, + sizeof(status_message), + "Étape %u sur 20", + step + ); + + background_task_report_progress( + task, + (double) step / 20.0, + status_message + ); + + if (step < 20) + { + g_usleep( + 500000 + ); + } + } + + *result = g_strdup( + "Tâche de démonstration terminée." + ); + + return TRUE; +} + +/** + * @brief Journalise la fin de la tâche de démonstration. + * + * @param task Tâche terminée. + * @param user_data Données inutilisées. + */ +static void application_demo_task_completed( + BackgroundTask *task, + gpointer user_data +) +{ + BackgroundTaskState state; + const char *result = NULL; + GError *error = NULL; + + (void) user_data; + + if (task == NULL) + { + return; + } + + state = background_task_get_state( + task + ); + + if (state == BACKGROUND_TASK_STATE_COMPLETED) + { + result = background_task_get_result( + task + ); + + g_print( + "%s\n", + result != NULL + ? result + : "Tâche terminée." + ); + + return; + } + + if (state == BACKGROUND_TASK_STATE_CANCELLED) + { + g_print( + "Tâche de démonstration annulée.\n" + ); + + return; + } + + error = background_task_dup_error( + task + ); + + g_warning( + "La tâche de démonstration a échoué : %s", + error != NULL + ? error->message + : "erreur inconnue" + ); + + g_clear_error( + &error + ); +} + +/** + * @brief Crée et lance une tâche de démonstration. + * + * @param user_data Pointeur vers Application. + */ +static void application_on_demo_task_requested( + gpointer user_data +) +{ + Application *application = user_data; + BackgroundTask *task = NULL; + GError *error = NULL; + + if (application == NULL || + application->task_manager == NULL) + { + return; + } + + task = background_task_new( + "Tâche de démonstration" + ); + + if (task == NULL) + { + application_present_error( + application, + "Tâche impossible", + "La tâche de démonstration n'a pas pu être créée." + ); + + return; + } + + /* + * Le manager prend une référence supplémentaire. + */ + if (!task_manager_add( + application->task_manager, + task, + &error + )) + { + g_warning( + "Impossible d'ajouter la tâche : %s", + error != NULL + ? error->message + : "erreur inconnue" + ); + + application_present_error( + application, + "Tâche impossible", + error != NULL + ? error->message + : "La tâche n'a pas pu être ajoutée." + ); + + g_clear_error( + &error + ); + + background_task_unref( + task + ); + + return; + } + + if (!background_task_start( + task, + application_demo_task_worker, + NULL, + NULL, + g_free, + application_demo_task_completed, + NULL, + NULL, + &error + )) + { + g_warning( + "Impossible de démarrer la tâche : %s", + error != NULL + ? error->message + : "erreur inconnue" + ); + + application_present_error( + application, + "Démarrage impossible", + error != NULL + ? error->message + : "La tâche n'a pas pu être démarrée." + ); + + g_clear_error( + &error + ); + + task_manager_remove( + application->task_manager, + task + ); + + background_task_unref( + task + ); + + return; + } + + /* + * La référence locale n'est plus nécessaire : + * + * - TaskManager conserve une référence ; + * - BackgroundTask conserve une référence interne pendant + * l'exécution. + */ + background_task_unref( + task + ); +} + /** * @brief Traite la sélection d'un nœud dans l'arborescence. * @@ -675,6 +941,10 @@ static void application_on_quit_requested( return; } + task_manager_cancel_all( + application->task_manager + ); + g_application_quit( G_APPLICATION( application->gtk_application @@ -713,7 +983,8 @@ static void application_on_activate( } application->main_window = main_window_new( - gtk_application + gtk_application, + application->task_manager ); if (application->main_window == NULL) @@ -743,6 +1014,12 @@ static void application_on_activate( application ); + main_window_set_demo_task_callback( + application->main_window, + application_on_demo_task_requested, + application + ); + main_window_set_quit_callback( application->main_window, application_on_quit_requested, @@ -763,6 +1040,18 @@ Application *application_new(void) 1 ); + application->task_manager = + task_manager_new(); + + if (application->task_manager == NULL) + { + g_free( + application + ); + + return NULL; + } + application->gtk_application = gtk_application_new( APPLICATION_ID, G_APPLICATION_DEFAULT_FLAGS @@ -770,7 +1059,14 @@ Application *application_new(void) if (application->gtk_application == NULL) { - g_free(application); + task_manager_free( + application->task_manager + ); + + g_free( + application + ); + return NULL; } @@ -834,10 +1130,18 @@ void application_free( application->session ); + /* + * MainWindow contient TaskPanel. + * TaskPanel doit être détruit avant TaskManager. + */ main_window_free( application->main_window ); + task_manager_free( + application->task_manager + ); + if (application->gtk_application != NULL) { g_object_unref( @@ -845,5 +1149,7 @@ void application_free( ); } - g_free(application); + g_free( + application + ); } diff --git a/src/core/task_manager.c b/src/core/task_manager.c new file mode 100644 index 0000000..4f7ee6e --- /dev/null +++ b/src/core/task_manager.c @@ -0,0 +1,736 @@ +/****************************************************************************** + * @file task_manager.c + * @brief Implémentation du gestionnaire central des tâches. + ******************************************************************************/ + +#include "core/task_manager.h" + +/** + * @struct TaskManagerCallbackSlot + * @brief Stockage référencé du callback de changement. + * + * Le comptage de références permet d'appeler le callback hors du mutex + * sans risquer que ses données soient détruites pendant l'appel. + */ +typedef struct +{ + gatomicrefcount reference_count; + + TaskManagerChangedCallback callback; + gpointer user_data; + GDestroyNotify user_data_destroy; +} TaskManagerCallbackSlot; + +/** + * @struct TaskManager + * @brief État interne du gestionnaire de tâches. + */ +struct TaskManager +{ + GMutex mutex; + GPtrArray *tasks; + + TaskManagerCallbackSlot *changed_slot; +}; + +/** + * @brief Adapte background_task_unref() au type GDestroyNotify. + * + * @param user_data Pointeur vers BackgroundTask. + */ +static void task_manager_task_unref( + gpointer user_data +) +{ + background_task_unref( + user_data + ); +} + +/** + * @brief Crée un emplacement référencé pour un callback. + * + * @param callback Callback à conserver. + * @param user_data Données du callback. + * @param user_data_destroy Destructeur des données. + * + * @return Nouvel emplacement, ou NULL si aucune donnée n'est fournie. + */ +static TaskManagerCallbackSlot * +task_manager_callback_slot_new( + TaskManagerChangedCallback callback, + gpointer user_data, + GDestroyNotify user_data_destroy +) +{ + TaskManagerCallbackSlot *slot = NULL; + + if (callback == NULL && + user_data == NULL) + { + return NULL; + } + + slot = g_new0( + TaskManagerCallbackSlot, + 1 + ); + + g_atomic_ref_count_init( + &slot->reference_count + ); + + slot->callback = callback; + slot->user_data = user_data; + slot->user_data_destroy = + user_data_destroy; + + return slot; +} + +/** + * @brief Ajoute une référence à un emplacement de callback. + * + * @param slot Emplacement concerné. + * + * @return L'emplacement fourni, ou NULL. + */ +static TaskManagerCallbackSlot * +task_manager_callback_slot_ref( + TaskManagerCallbackSlot *slot +) +{ + if (slot == NULL) + { + return NULL; + } + + g_atomic_ref_count_inc( + &slot->reference_count + ); + + return slot; +} + +/** + * @brief Libère une référence à un emplacement de callback. + * + * @param slot Emplacement concerné. + */ +static void task_manager_callback_slot_unref( + TaskManagerCallbackSlot *slot +) +{ + gpointer user_data = NULL; + GDestroyNotify user_data_destroy = NULL; + + if (slot == NULL) + { + return; + } + + if (!g_atomic_ref_count_dec( + &slot->reference_count + )) + { + return; + } + + user_data = slot->user_data; + user_data_destroy = + slot->user_data_destroy; + + slot->callback = NULL; + slot->user_data = NULL; + slot->user_data_destroy = NULL; + + if (user_data != NULL && + user_data_destroy != NULL) + { + user_data_destroy( + user_data + ); + } + + g_free( + slot + ); +} + +/** + * @brief Signale un changement du gestionnaire. + * + * Le callback est appelé sans verrouiller le mutex du gestionnaire. + * + * @param task_manager Gestionnaire concerné. + */ +static void task_manager_notify_changed( + TaskManager *task_manager +) +{ + TaskManagerCallbackSlot *slot = NULL; + + if (task_manager == NULL) + { + return; + } + + g_mutex_lock( + &task_manager->mutex + ); + + slot = task_manager_callback_slot_ref( + task_manager->changed_slot + ); + + g_mutex_unlock( + &task_manager->mutex + ); + + if (slot != NULL && + slot->callback != NULL) + { + slot->callback( + task_manager, + slot->user_data + ); + } + + task_manager_callback_slot_unref( + slot + ); +} + +/** + * @brief Indique si un état représente une tâche terminée. + * + * @param state État à examiner. + * + * @return TRUE si la tâche est terminée, sinon FALSE. + */ +static gboolean task_manager_state_is_finished( + BackgroundTaskState state +) +{ + return + state == BACKGROUND_TASK_STATE_COMPLETED || + state == BACKGROUND_TASK_STATE_FAILED || + state == BACKGROUND_TASK_STATE_CANCELLED; +} + +GQuark task_manager_error_quark(void) +{ + return g_quark_from_static_string( + "labfy-investigation-task-manager-error" + ); +} + +TaskManager *task_manager_new(void) +{ + TaskManager *task_manager = NULL; + + task_manager = g_new0( + TaskManager, + 1 + ); + + g_mutex_init( + &task_manager->mutex + ); + + task_manager->tasks = + g_ptr_array_new_with_free_func( + task_manager_task_unref + ); + + if (task_manager->tasks == NULL) + { + g_mutex_clear( + &task_manager->mutex + ); + + g_free( + task_manager + ); + + return NULL; + } + + return task_manager; +} + +void task_manager_free( + TaskManager *task_manager +) +{ + GPtrArray *tasks = NULL; + + TaskManagerCallbackSlot *changed_slot = + NULL; + + if (task_manager == NULL) + { + return; + } + + g_mutex_lock( + &task_manager->mutex + ); + + tasks = task_manager->tasks; + task_manager->tasks = NULL; + + changed_slot = + task_manager->changed_slot; + + task_manager->changed_slot = NULL; + + g_mutex_unlock( + &task_manager->mutex + ); + + /* + * La libération des tâches et des données utilisateur se fait + * hors du mutex. + */ + if (tasks != NULL) + { + g_ptr_array_unref( + tasks + ); + } + + task_manager_callback_slot_unref( + changed_slot + ); + + g_mutex_clear( + &task_manager->mutex + ); + + g_free( + task_manager + ); +} + +gboolean task_manager_add( + TaskManager *task_manager, + BackgroundTask *task, + GError **error +) +{ + gsize index = 0; + gboolean already_added = FALSE; + + g_return_val_if_fail( + error == NULL || *error == NULL, + FALSE + ); + + if (task_manager == NULL || + task == NULL) + { + g_set_error_literal( + error, + TASK_MANAGER_ERROR, + TASK_MANAGER_ERROR_INVALID_ARGUMENT, + "Le gestionnaire ou la tâche est invalide." + ); + + return FALSE; + } + + g_mutex_lock( + &task_manager->mutex + ); + + for (index = 0; + index < task_manager->tasks->len; + index++) + { + if (g_ptr_array_index( + task_manager->tasks, + index + ) == task) + { + already_added = TRUE; + break; + } + } + + if (!already_added) + { + g_ptr_array_add( + task_manager->tasks, + background_task_ref(task) + ); + } + + g_mutex_unlock( + &task_manager->mutex + ); + + if (already_added) + { + g_set_error_literal( + error, + TASK_MANAGER_ERROR, + TASK_MANAGER_ERROR_ALREADY_ADDED, + "Cette tâche est déjà suivie par le gestionnaire." + ); + + return FALSE; + } + + task_manager_notify_changed( + task_manager + ); + + return TRUE; +} + +gsize task_manager_get_count( + const TaskManager *task_manager +) +{ + TaskManager *mutable_task_manager = NULL; + gsize count = 0; + + if (task_manager == NULL) + { + return 0; + } + + mutable_task_manager = + (TaskManager *) task_manager; + + g_mutex_lock( + &mutable_task_manager->mutex + ); + + if (mutable_task_manager->tasks != NULL) + { + count = + mutable_task_manager->tasks->len; + } + + g_mutex_unlock( + &mutable_task_manager->mutex + ); + + return count; +} + +BackgroundTask *task_manager_get_task( + const TaskManager *task_manager, + gsize index +) +{ + TaskManager *mutable_task_manager = NULL; + BackgroundTask *task = NULL; + + if (task_manager == NULL) + { + return NULL; + } + + mutable_task_manager = + (TaskManager *) task_manager; + + g_mutex_lock( + &mutable_task_manager->mutex + ); + + if (mutable_task_manager->tasks != NULL && + index < mutable_task_manager->tasks->len) + { + task = background_task_ref( + g_ptr_array_index( + mutable_task_manager->tasks, + index + ) + ); + } + + g_mutex_unlock( + &mutable_task_manager->mutex + ); + + return task; +} + +gboolean task_manager_remove( + TaskManager *task_manager, + BackgroundTask *task +) +{ + BackgroundTask *removed_task = NULL; + + gsize index = 0; + + if (task_manager == NULL || + task == NULL) + { + return FALSE; + } + + g_mutex_lock( + &task_manager->mutex + ); + + for (index = 0; + index < task_manager->tasks->len; + index++) + { + if (g_ptr_array_index( + task_manager->tasks, + index + ) == task) + { + removed_task = g_ptr_array_steal_index( + task_manager->tasks, + index + ); + + break; + } + } + + g_mutex_unlock( + &task_manager->mutex + ); + + if (removed_task == NULL) + { + return FALSE; + } + + /* + * La référence du gestionnaire est libérée hors du mutex. + */ + background_task_unref( + removed_task + ); + + task_manager_notify_changed( + task_manager + ); + + return TRUE; +} + +gsize task_manager_remove_finished( + TaskManager *task_manager +) +{ + GPtrArray *removed_tasks = NULL; + + gsize index = 0; + gsize removed_count = 0; + + if (task_manager == NULL) + { + return 0; + } + + removed_tasks = + g_ptr_array_new_with_free_func( + task_manager_task_unref + ); + + g_mutex_lock( + &task_manager->mutex + ); + + /* + * Le parcours se fait à l'envers afin que la suppression d'un + * élément ne décale pas les index encore à examiner. + */ + index = task_manager->tasks->len; + + while (index > 0) + { + BackgroundTask *task = NULL; + BackgroundTaskState state; + + index--; + + task = g_ptr_array_index( + task_manager->tasks, + index + ); + + state = background_task_get_state( + task + ); + + if (task_manager_state_is_finished( + state + )) + { + BackgroundTask *removed_task = NULL; + + removed_task = g_ptr_array_steal_index( + task_manager->tasks, + index + ); + + g_ptr_array_add( + removed_tasks, + removed_task + ); + } + } + + removed_count = + removed_tasks->len; + + g_mutex_unlock( + &task_manager->mutex + ); + + /* + * Les références retirées sont libérées hors du mutex. + */ + g_ptr_array_unref( + removed_tasks + ); + + if (removed_count > 0) + { + task_manager_notify_changed( + task_manager + ); + } + + return removed_count; +} + +void task_manager_cancel_all( + TaskManager *task_manager +) +{ + GPtrArray *task_snapshot = NULL; + + gsize index = 0; + gboolean cancellation_requested = FALSE; + + if (task_manager == NULL) + { + return; + } + + task_snapshot = + g_ptr_array_new_with_free_func( + task_manager_task_unref + ); + + g_mutex_lock( + &task_manager->mutex + ); + + for (index = 0; + index < task_manager->tasks->len; + index++) + { + BackgroundTask *task = NULL; + + task = g_ptr_array_index( + task_manager->tasks, + index + ); + + g_ptr_array_add( + task_snapshot, + background_task_ref(task) + ); + } + + g_mutex_unlock( + &task_manager->mutex + ); + + /* + * L'annulation et la lecture des états sont effectuées hors + * du mutex du gestionnaire. + */ + for (index = 0; + index < task_snapshot->len; + index++) + { + BackgroundTask *task = NULL; + + task = g_ptr_array_index( + task_snapshot, + index + ); + + if (background_task_get_state(task) == + BACKGROUND_TASK_STATE_RUNNING) + { + background_task_cancel( + task + ); + + cancellation_requested = TRUE; + } + } + + g_ptr_array_unref( + task_snapshot + ); + + if (cancellation_requested) + { + task_manager_notify_changed( + task_manager + ); + } +} + +void task_manager_set_changed_callback( + TaskManager *task_manager, + TaskManagerChangedCallback callback, + gpointer user_data, + GDestroyNotify user_data_destroy +) +{ + TaskManagerCallbackSlot *new_slot = NULL; + TaskManagerCallbackSlot *old_slot = NULL; + + if (task_manager == NULL) + { + /* + * Aucun transfert de propriété n'a lieu lorsque le + * gestionnaire est invalide. + */ + return; + } + + new_slot = task_manager_callback_slot_new( + callback, + user_data, + user_data_destroy + ); + + g_mutex_lock( + &task_manager->mutex + ); + + old_slot = + task_manager->changed_slot; + + task_manager->changed_slot = + new_slot; + + g_mutex_unlock( + &task_manager->mutex + ); + + /* + * L'ancien destructeur utilisateur est appelé hors du mutex. + */ + task_manager_callback_slot_unref( + old_slot + ); +} diff --git a/src/views/main_window.c b/src/views/main_window.c index 4e395ab..c673c4a 100644 --- a/src/views/main_window.c +++ b/src/views/main_window.c @@ -7,6 +7,7 @@ #include "widgets/sidebar.h" #include "widgets/workspace.h" #include "widgets/investigation_tree_view.h" +#include "widgets/task_panel.h" #include @@ -25,6 +26,11 @@ */ #define MAIN_WINDOW_SIDEBAR_POSITION 250 +/** + * @brief Position initiale de la séparation verticale. + */ +#define MAIN_WINDOW_TASK_PANEL_POSITION 430 + /** * @brief Titre par défaut de la fenêtre. */ @@ -52,12 +58,15 @@ struct MainWindow GtkWidget *action_bar; GtkWidget *new_investigation_button; GtkWidget *open_investigation_button; + GtkWidget *demo_task_button; + GtkWidget *content_paned; GtkWidget *main_paned; GtkWidget *status_label; GtkWidget *quit_button; Sidebar *sidebar; Workspace *workspace; + TaskPanel *task_panel; MainWindowNewInvestigationCallback new_investigation_callback; @@ -76,6 +85,12 @@ struct MainWindow gpointer quit_user_data; + + MainWindowDemoTaskCallback + demo_task_callback; + + gpointer + demo_task_user_data; }; /** @@ -130,6 +145,32 @@ static void main_window_on_open_investigation_clicked( ); } +/** + * @brief Transmet la demande de tâche de démonstration au contrôleur. + * + * @param button Bouton ayant reçu le clic. + * @param user_data Pointeur vers MainWindow. + */ +static void main_window_on_demo_task_clicked( + GtkButton *button, + gpointer user_data +) +{ + MainWindow *main_window = user_data; + + (void) button; + + if (main_window == NULL || + main_window->demo_task_callback == NULL) + { + return; + } + + main_window->demo_task_callback( + main_window->demo_task_user_data + ); +} + /** * @brief Transmet la demande de fermeture au contrôleur. * @@ -156,13 +197,18 @@ static void main_window_on_quit_clicked( ); } -MainWindow *main_window_new(GtkApplication *application) +MainWindow *main_window_new( + GtkApplication *application, + TaskManager *task_manager +) { MainWindow *main_window = NULL; GtkWidget *sidebar_widget = NULL; GtkWidget *workspace_widget = NULL; + GtkWidget *task_panel_widget = NULL; - if (application == NULL) + if (application == NULL || + task_manager == NULL) { return NULL; } @@ -239,6 +285,11 @@ MainWindow *main_window_new(GtkApplication *application) "Ouvrir une enquête" ); + main_window->demo_task_button = + gtk_button_new_with_label( + "Tâche de test" + ); + main_window->quit_button = gtk_button_new_with_label( "Quitter" @@ -254,6 +305,11 @@ MainWindow *main_window_new(GtkApplication *application) main_window->open_investigation_button ); + gtk_box_append( + GTK_BOX(main_window->action_bar), + main_window->demo_task_button + ); + gtk_box_append( GTK_BOX(main_window->action_bar), main_window->quit_button @@ -277,6 +333,15 @@ MainWindow *main_window_new(GtkApplication *application) main_window ); + g_signal_connect( + main_window->demo_task_button, + "clicked", + G_CALLBACK( + main_window_on_demo_task_clicked + ), + main_window + ); + g_signal_connect( main_window->quit_button, "clicked", @@ -345,6 +410,32 @@ MainWindow *main_window_new(GtkApplication *application) return NULL; } + main_window->task_panel = task_panel_new( + task_manager + ); + + if (main_window->task_panel == NULL) + { + main_window_free( + main_window + ); + + return NULL; + } + + task_panel_widget = task_panel_get_widget( + main_window->task_panel + ); + + if (task_panel_widget == NULL) + { + main_window_free( + main_window + ); + + return NULL; + } + /* * Placement des deux composants dans GtkPaned. */ @@ -393,6 +484,55 @@ MainWindow *main_window_new(GtkApplication *application) TRUE ); + main_window->content_paned = gtk_paned_new( + GTK_ORIENTATION_VERTICAL + ); + + gtk_widget_set_hexpand( + main_window->content_paned, + TRUE + ); + + gtk_widget_set_vexpand( + main_window->content_paned, + TRUE + ); + + gtk_paned_set_start_child( + GTK_PANED(main_window->content_paned), + main_window->main_paned + ); + + gtk_paned_set_end_child( + GTK_PANED(main_window->content_paned), + task_panel_widget + ); + + gtk_paned_set_position( + GTK_PANED(main_window->content_paned), + MAIN_WINDOW_TASK_PANEL_POSITION + ); + + gtk_paned_set_resize_start_child( + GTK_PANED(main_window->content_paned), + TRUE + ); + + gtk_paned_set_resize_end_child( + GTK_PANED(main_window->content_paned), + FALSE + ); + + gtk_paned_set_shrink_start_child( + GTK_PANED(main_window->content_paned), + TRUE + ); + + gtk_paned_set_shrink_end_child( + GTK_PANED(main_window->content_paned), + TRUE + ); + main_window->status_label = gtk_label_new( MAIN_WINDOW_NO_INVESTIGATION_STATUS ); @@ -436,7 +576,7 @@ MainWindow *main_window_new(GtkApplication *application) gtk_box_append( GTK_BOX(main_window->main_box), - main_window->main_paned + main_window->content_paned ); gtk_box_append( @@ -449,6 +589,9 @@ MainWindow *main_window_new(GtkApplication *application) main_window->main_box ); + /* + * Ce volet vertical sépare la zone principale du panneau d'activité. + */ return main_window; } @@ -652,6 +795,21 @@ void main_window_set_open_investigation_callback( main_window->open_investigation_user_data = user_data; } +void main_window_set_demo_task_callback( + MainWindow *main_window, + MainWindowDemoTaskCallback callback, + gpointer user_data +) +{ + if (main_window == NULL) + { + return; + } + + main_window->demo_task_callback = callback; + main_window->demo_task_user_data = user_data; +} + void main_window_set_quit_callback( MainWindow *main_window, MainWindowQuitCallback callback, @@ -693,11 +851,57 @@ void main_window_free( } /* - * La fenêtre et tous ses widgets doivent être détruits pendant que - * les structures MainWindow, Sidebar et Workspace existent encore. - * - * Certains widgets possèdent des callbacks dont user_data pointe vers - * ces structures. + * TaskPanel possède un timer et un callback enregistré dans + * TaskManager. Ils doivent être retirés avant la destruction + * des widgets GTK. + */ + task_panel_free( + main_window->task_panel + ); + + main_window->task_panel = NULL; + + /* + * Empêche la destruction du modèle de transmettre une dernière + * sélection à Application. + */ + if (main_window->sidebar != NULL) + { + sidebar_set_selection_callback( + main_window->sidebar, + NULL, + NULL + ); + + /* + * Le modèle est détaché pendant que le GtkListView existe + * encore. + */ + sidebar_set_tree_model( + main_window->sidebar, + NULL + ); + } + + /* + * Les structures qui manipulent encore leurs widgets doivent être + * nettoyées avant gtk_window_destroy(). + */ + sidebar_free( + main_window->sidebar + ); + + workspace_free( + main_window->workspace + ); + + main_window->sidebar = NULL; + main_window->workspace = NULL; + + /* + * Les modules ne manipulent plus leurs widgets. + * GTK peut maintenant détruire tout l'arbre sans callback vers + * des structures déjà libérées. */ if (main_window->window != NULL) { @@ -708,16 +912,7 @@ void main_window_free( main_window->window = NULL; } - workspace_free( - main_window->workspace + g_free( + main_window ); - - sidebar_free( - main_window->sidebar - ); - - main_window->workspace = NULL; - main_window->sidebar = NULL; - - g_free(main_window); } diff --git a/src/widgets/task_panel.c b/src/widgets/task_panel.c new file mode 100644 index 0000000..c469699 --- /dev/null +++ b/src/widgets/task_panel.c @@ -0,0 +1,1105 @@ +/****************************************************************************** + * @file task_panel.c + * @brief Implémentation du panneau GTK affichant les tâches. + ******************************************************************************/ + +#include "widgets/task_panel.h" + +/** + * @brief Intervalle de rafraîchissement du panneau, en millisecondes. + */ +#define TASK_PANEL_REFRESH_INTERVAL_MS 250 + +/** + * @brief Texte affiché lorsqu’aucune tâche n’est suivie. + */ +#define TASK_PANEL_EMPTY_TEXT \ + "Aucune tâche en cours ou terminée" + +/** + * @struct TaskPanelRow + * @brief Widgets persistants associés à une tâche. + * + * Les widgets sont créés une seule fois. Le rafraîchissement périodique + * modifie seulement leur contenu. + */ +typedef struct +{ + BackgroundTask *task; + + GtkWidget *frame; + GtkWidget *state_label; + GtkWidget *progress_bar; + GtkWidget *detail_label; + GtkWidget *cancel_button; +} TaskPanelRow; + +/** + * @struct TaskPanel + * @brief État interne du panneau d’activité. + * + * TaskManager est emprunté et doit rester valide pendant toute la durée + * de vie du panneau. + */ +struct TaskPanel +{ + TaskManager *task_manager; + + GtkWidget *root_box; + GtkWidget *header_box; + GtkWidget *title_label; + GtkWidget *clear_button; + + GtkWidget *scrolled_window; + GtkWidget *task_list_box; + + GPtrArray *rows; + + guint refresh_source_id; +}; + +/** + * @brief Retourne le libellé correspondant à l’état d’une tâche. + * + * @param state État de la tâche. + * + * @return Libellé statique. + */ +static const char *task_panel_get_state_label( + BackgroundTaskState state +) +{ + switch (state) + { + case BACKGROUND_TASK_STATE_PENDING: + return "En attente"; + + case BACKGROUND_TASK_STATE_RUNNING: + return "En cours"; + + case BACKGROUND_TASK_STATE_COMPLETED: + return "Terminée"; + + case BACKGROUND_TASK_STATE_FAILED: + return "Échouée"; + + case BACKGROUND_TASK_STATE_CANCELLED: + return "Annulée"; + + default: + return "État inconnu"; + } +} + +/** + * @brief Supprime tous les widgets enfants d’une boîte GTK. + * + * @param box Boîte à vider. + */ +static void task_panel_clear_box( + GtkWidget *box +) +{ + GtkWidget *child = NULL; + + if (box == NULL) + { + return; + } + + child = gtk_widget_get_first_child( + box + ); + + while (child != NULL) + { + gtk_box_remove( + GTK_BOX(box), + child + ); + + child = gtk_widget_get_first_child( + box + ); + } +} + +/** + * @brief Demande l’annulation d’une tâche. + * + * La tâche est conservée dans les données du bouton avec une référence + * indépendante. + * + * @param button Bouton ayant reçu le clic. + * @param user_data Pointeur vers TaskPanel. + */ +static void task_panel_on_cancel_clicked( + GtkButton *button, + gpointer user_data +) +{ + TaskPanel *task_panel = user_data; + BackgroundTask *task = NULL; + + if (button == NULL || + task_panel == NULL) + { + return; + } + + task = g_object_get_data( + G_OBJECT(button), + "labfy-background-task" + ); + + if (task == NULL) + { + return; + } + + background_task_cancel( + task + ); +} + +/** + * @brief Retire les tâches terminées du gestionnaire. + * + * @param button Bouton ayant reçu le clic. + * @param user_data Pointeur vers TaskPanel. + */ +static void task_panel_on_clear_clicked( + GtkButton *button, + gpointer user_data +) +{ + TaskPanel *task_panel = user_data; + + (void) button; + + if (task_panel == NULL || + task_panel->task_manager == NULL) + { + return; + } + + task_manager_remove_finished( + task_panel->task_manager + ); +} + +/** + * @brief Réagit aux changements structurels du gestionnaire. + * + * @param task_manager Gestionnaire ayant changé. + * @param user_data Pointeur vers TaskPanel. + */ +static void task_panel_on_manager_changed( + TaskManager *task_manager, + gpointer user_data +) +{ + TaskPanel *task_panel = user_data; + + if (task_panel == NULL || + task_manager == NULL || + task_panel->task_manager != task_manager) + { + return; + } + + task_panel_refresh( + task_panel + ); +} + +/** + * @brief Met à jour les lignes existantes sans reconstruire la liste. + * + * @param task_panel Panneau à mettre à jour. + */ +static void task_panel_update_rows( + TaskPanel *task_panel +); + +/** + * @brief Rafraîchit périodiquement les progressions. + * + * @param user_data Pointeur vers TaskPanel. + * + * @return G_SOURCE_CONTINUE. + */ +static gboolean task_panel_on_refresh_timeout( + gpointer user_data +) +{ + TaskPanel *task_panel = user_data; + + if (task_panel == NULL) + { + return G_SOURCE_REMOVE; + } + + task_panel_update_rows( + task_panel + ); + + return G_SOURCE_CONTINUE; +} + +/** + * @brief Crée le texte secondaire d’une tâche. + * + * @param task Tâche concernée. + * @param state État courant. + * @param progress Progression courante. + * @param status_message Message de progression facultatif. + * @param error Erreur finale facultative. + * + * @return Nouvelle chaîne à libérer avec g_free(). + */ +static char *task_panel_create_detail_text( + const BackgroundTask *task, + BackgroundTaskState state, + double progress, + const char *status_message, + const GError *error +) +{ + const char *state_label = NULL; + + if (task == NULL) + { + return g_strdup( + "Tâche invalide" + ); + } + + state_label = task_panel_get_state_label( + state + ); + + if (state == BACKGROUND_TASK_STATE_RUNNING) + { + if (status_message != NULL && + status_message[0] != '\0') + { + return g_strdup_printf( + "%s — %.0f %% — %s", + state_label, + progress * 100.0, + status_message + ); + } + + return g_strdup_printf( + "%s — %.0f %%", + state_label, + progress * 100.0 + ); + } + + if (state == BACKGROUND_TASK_STATE_FAILED && + error != NULL) + { + return g_strdup_printf( + "%s — %s", + state_label, + error->message + ); + } + + if (status_message != NULL && + status_message[0] != '\0') + { + return g_strdup_printf( + "%s — %s", + state_label, + status_message + ); + } + + return g_strdup( + state_label + ); +} + +/** + * @brief Libère les données privées d'une ligne. + * + * @param user_data Pointeur vers TaskPanelRow. + */ +static void task_panel_row_free( + gpointer user_data +) +{ + TaskPanelRow *task_row = user_data; + + if (task_row == NULL) + { + return; + } + + background_task_unref( + task_row->task + ); + + task_row->task = NULL; + + g_free( + task_row + ); +} + +/** + * @brief Met à jour l'affichage d'une ligne existante. + * + * Aucun widget n'est détruit ici. + * + * @param task_row Ligne à mettre à jour. + */ +static void task_panel_row_update( + TaskPanelRow *task_row +) +{ + BackgroundTaskState state; + double progress = 0.0; + + char *status_message = NULL; + char *detail_text = NULL; + + GError *error = NULL; + + if (task_row == NULL || + task_row->task == NULL) + { + return; + } + + state = background_task_get_state( + task_row->task + ); + + progress = background_task_get_progress( + task_row->task + ); + + status_message = + background_task_dup_status_message( + task_row->task + ); + + error = background_task_dup_error( + task_row->task + ); + + detail_text = task_panel_create_detail_text( + task_row->task, + state, + progress, + status_message, + error + ); + + gtk_label_set_text( + GTK_LABEL(task_row->state_label), + task_panel_get_state_label( + state + ) + ); + + gtk_progress_bar_set_fraction( + GTK_PROGRESS_BAR( + task_row->progress_bar + ), + state == BACKGROUND_TASK_STATE_COMPLETED + ? 1.0 + : progress + ); + + gtk_label_set_text( + GTK_LABEL(task_row->detail_label), + detail_text != NULL + ? detail_text + : "" + ); + + /* + * Le bouton existe en permanence, mais n'est visible que lorsque + * la tâche peut être annulée. + */ + gtk_widget_set_visible( + task_row->cancel_button, + state == BACKGROUND_TASK_STATE_RUNNING + ); + + gtk_widget_set_sensitive( + task_row->cancel_button, + state == BACKGROUND_TASK_STATE_RUNNING + ); + + g_clear_error( + &error + ); + + g_free( + detail_text + ); + + g_free( + status_message + ); +} + +/** + * @brief Crée une ligne GTK persistante pour une tâche. + * + * @param task_panel Panneau propriétaire. + * @param task Tâche à afficher. + * + * @return Nouvelle ligne, ou NULL. + */ +static TaskPanelRow *task_panel_create_task_row( + TaskPanel *task_panel, + BackgroundTask *task +) +{ + TaskPanelRow *task_row = NULL; + + GtkWidget *row_box = NULL; + GtkWidget *header_box = NULL; + GtkWidget *title_label = NULL; + + const char *title = NULL; + + if (task_panel == NULL || + task == NULL) + { + return NULL; + } + + task_row = g_new0( + TaskPanelRow, + 1 + ); + + task_row->task = background_task_ref( + task + ); + + task_row->frame = gtk_frame_new( + NULL + ); + + row_box = gtk_box_new( + GTK_ORIENTATION_VERTICAL, + 6 + ); + + gtk_widget_set_margin_start( + row_box, + 10 + ); + + gtk_widget_set_margin_end( + row_box, + 10 + ); + + gtk_widget_set_margin_top( + row_box, + 8 + ); + + gtk_widget_set_margin_bottom( + row_box, + 8 + ); + + header_box = gtk_box_new( + GTK_ORIENTATION_HORIZONTAL, + 8 + ); + + title = background_task_get_title( + task + ); + + title_label = gtk_label_new( + title != NULL + ? title + : "Tâche sans titre" + ); + + gtk_widget_set_hexpand( + title_label, + TRUE + ); + + gtk_widget_set_halign( + title_label, + GTK_ALIGN_START + ); + + gtk_label_set_xalign( + GTK_LABEL(title_label), + 0.0F + ); + + gtk_label_set_ellipsize( + GTK_LABEL(title_label), + PANGO_ELLIPSIZE_END + ); + + task_row->state_label = gtk_label_new( + NULL + ); + + gtk_widget_set_halign( + task_row->state_label, + GTK_ALIGN_END + ); + + task_row->cancel_button = + gtk_button_new_with_label( + "Annuler" + ); + + gtk_widget_set_halign( + task_row->cancel_button, + GTK_ALIGN_END + ); + + gtk_widget_set_valign( + task_row->cancel_button, + GTK_ALIGN_CENTER + ); + + /* + * TaskPanelRow conserve déjà une référence sur la tâche. + * Le bouton emprunte donc simplement ce pointeur. + */ + g_object_set_data( + G_OBJECT(task_row->cancel_button), + "labfy-background-task", + task_row->task + ); + + g_signal_connect( + task_row->cancel_button, + "clicked", + G_CALLBACK( + task_panel_on_cancel_clicked + ), + task_panel + ); + + gtk_box_append( + GTK_BOX(header_box), + title_label + ); + + gtk_box_append( + GTK_BOX(header_box), + task_row->state_label + ); + + gtk_box_append( + GTK_BOX(header_box), + task_row->cancel_button + ); + + task_row->progress_bar = + gtk_progress_bar_new(); + + gtk_progress_bar_set_show_text( + GTK_PROGRESS_BAR( + task_row->progress_bar + ), + TRUE + ); + + task_row->detail_label = gtk_label_new( + NULL + ); + + gtk_widget_set_halign( + task_row->detail_label, + GTK_ALIGN_START + ); + + gtk_label_set_xalign( + GTK_LABEL(task_row->detail_label), + 0.0F + ); + + gtk_label_set_wrap( + GTK_LABEL(task_row->detail_label), + TRUE + ); + + gtk_label_set_wrap_mode( + GTK_LABEL(task_row->detail_label), + PANGO_WRAP_WORD_CHAR + ); + + gtk_label_set_selectable( + GTK_LABEL(task_row->detail_label), + TRUE + ); + + gtk_box_append( + GTK_BOX(row_box), + header_box + ); + + gtk_box_append( + GTK_BOX(row_box), + task_row->progress_bar + ); + + gtk_box_append( + GTK_BOX(row_box), + task_row->detail_label + ); + + gtk_frame_set_child( + GTK_FRAME(task_row->frame), + row_box + ); + + task_panel_row_update( + task_row + ); + + return task_row; +} + +/** + * @brief Supprime les widgets et les données de toutes les lignes. + * + * @param task_panel Panneau à vider. + */ +static void task_panel_clear_rows( + TaskPanel *task_panel +) +{ + if (task_panel == NULL) + { + return; + } + + task_panel_clear_box( + task_panel->task_list_box + ); + + if (task_panel->rows != NULL) + { + g_ptr_array_set_size( + task_panel->rows, + 0 + ); + } +} + +/** + * @brief Met à jour toutes les lignes persistantes. + * + * @param task_panel Panneau concerné. + */ +static void task_panel_update_rows( + TaskPanel *task_panel +) +{ + guint index = 0; + + if (task_panel == NULL || + task_panel->rows == NULL) + { + return; + } + + for (index = 0; + index < task_panel->rows->len; + index++) + { + TaskPanelRow *task_row = NULL; + + task_row = g_ptr_array_index( + task_panel->rows, + index + ); + + task_panel_row_update( + task_row + ); + } +} + +TaskPanel *task_panel_new( + TaskManager *task_manager +) +{ + TaskPanel *task_panel = NULL; + + if (task_manager == NULL) + { + return NULL; + } + + task_panel = g_new0( + TaskPanel, + 1 + ); + + task_panel->task_manager = + task_manager; + + task_panel->rows = + g_ptr_array_new_with_free_func( + task_panel_row_free + ); + + task_panel->root_box = gtk_box_new( + GTK_ORIENTATION_VERTICAL, + 8 + ); + + task_panel->header_box = gtk_box_new( + GTK_ORIENTATION_HORIZONTAL, + 8 + ); + + gtk_widget_set_margin_start( + task_panel->header_box, + 8 + ); + + gtk_widget_set_margin_end( + task_panel->header_box, + 8 + ); + + gtk_widget_set_margin_top( + task_panel->header_box, + 8 + ); + + task_panel->title_label = gtk_label_new( + "Activité" + ); + + gtk_widget_set_hexpand( + task_panel->title_label, + TRUE + ); + + gtk_widget_set_halign( + task_panel->title_label, + GTK_ALIGN_START + ); + + gtk_label_set_xalign( + GTK_LABEL(task_panel->title_label), + 0.0F + ); + + task_panel->clear_button = + gtk_button_new_with_label( + "Nettoyer" + ); + + g_signal_connect( + task_panel->clear_button, + "clicked", + G_CALLBACK( + task_panel_on_clear_clicked + ), + task_panel + ); + + gtk_box_append( + GTK_BOX(task_panel->header_box), + task_panel->title_label + ); + + gtk_box_append( + GTK_BOX(task_panel->header_box), + task_panel->clear_button + ); + + task_panel->task_list_box = gtk_box_new( + GTK_ORIENTATION_VERTICAL, + 8 + ); + + gtk_widget_set_margin_start( + task_panel->task_list_box, + 8 + ); + + gtk_widget_set_margin_end( + task_panel->task_list_box, + 8 + ); + + gtk_widget_set_margin_bottom( + task_panel->task_list_box, + 8 + ); + + task_panel->scrolled_window = + gtk_scrolled_window_new(); + + gtk_scrolled_window_set_policy( + GTK_SCROLLED_WINDOW( + task_panel->scrolled_window + ), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC + ); + + gtk_scrolled_window_set_child( + GTK_SCROLLED_WINDOW( + task_panel->scrolled_window + ), + task_panel->task_list_box + ); + + gtk_widget_set_vexpand( + task_panel->scrolled_window, + TRUE + ); + + gtk_box_append( + GTK_BOX(task_panel->root_box), + task_panel->header_box + ); + + gtk_box_append( + GTK_BOX(task_panel->root_box), + task_panel->scrolled_window + ); + + task_manager_set_changed_callback( + task_manager, + task_panel_on_manager_changed, + task_panel, + NULL + ); + + task_panel->refresh_source_id = + g_timeout_add( + TASK_PANEL_REFRESH_INTERVAL_MS, + task_panel_on_refresh_timeout, + task_panel + ); + + if (task_panel->refresh_source_id == 0) + { + task_manager_set_changed_callback( + task_manager, + NULL, + NULL, + NULL + ); + + g_ptr_array_unref( + task_panel->rows + ); + + task_panel->rows = NULL; + + g_free( + task_panel + ); + + return NULL; + } + + task_panel_refresh( + task_panel + ); + + return task_panel; +} + +GtkWidget *task_panel_get_widget( + const TaskPanel *task_panel +) +{ + if (task_panel == NULL) + { + return NULL; + } + + return task_panel->root_box; +} + +void task_panel_refresh( + TaskPanel *task_panel +) +{ + gsize task_count = 0; + gsize index = 0; + + if (task_panel == NULL || + task_panel->task_manager == NULL || + task_panel->task_list_box == NULL || + task_panel->rows == NULL) + { + return; + } + + /* + * La liste n'est reconstruite que lorsque TaskManager signale + * un ajout ou une suppression. + */ + task_panel_clear_rows( + task_panel + ); + + task_count = task_manager_get_count( + task_panel->task_manager + ); + + gtk_widget_set_sensitive( + task_panel->clear_button, + task_count > 0 + ); + + if (task_count == 0) + { + GtkWidget *empty_label = NULL; + + empty_label = gtk_label_new( + TASK_PANEL_EMPTY_TEXT + ); + + gtk_widget_set_margin_top( + empty_label, + 16 + ); + + gtk_widget_set_margin_bottom( + empty_label, + 16 + ); + + gtk_widget_set_halign( + empty_label, + GTK_ALIGN_CENTER + ); + + gtk_box_append( + GTK_BOX(task_panel->task_list_box), + empty_label + ); + + return; + } + + for (index = 0; + index < task_count; + index++) + { + BackgroundTask *task = NULL; + TaskPanelRow *task_row = NULL; + + task = task_manager_get_task( + task_panel->task_manager, + index + ); + + if (task == NULL) + { + continue; + } + + task_row = task_panel_create_task_row( + task_panel, + task + ); + + if (task_row != NULL) + { + gtk_box_append( + GTK_BOX( + task_panel->task_list_box + ), + task_row->frame + ); + + g_ptr_array_add( + task_panel->rows, + task_row + ); + } + + background_task_unref( + task + ); + } +} + +void task_panel_free( + TaskPanel *task_panel +) +{ + if (task_panel == NULL) + { + return; + } + + /* + * Le callback du manager ne doit plus pouvoir utiliser TaskPanel. + */ + if (task_panel->task_manager != NULL) + { + task_manager_set_changed_callback( + task_panel->task_manager, + NULL, + NULL, + NULL + ); + } + + /* + * Arrêt du rafraîchissement périodique. + */ + if (task_panel->refresh_source_id != 0) + { + g_source_remove( + task_panel->refresh_source_id + ); + + task_panel->refresh_source_id = 0; + } + + if (task_panel->clear_button != NULL) + { + g_signal_handlers_disconnect_by_data( + task_panel->clear_button, + task_panel + ); + } + + task_panel_clear_rows( + task_panel + ); + + if (task_panel->rows != NULL) + { + g_ptr_array_unref( + task_panel->rows + ); + + task_panel->rows = NULL; + } + + task_panel->task_manager = NULL; + + g_free( + task_panel + ); +} diff --git a/tests/test_background_task b/tests/test_background_task deleted file mode 100755 index 0c76ca061ee73c9f29a46eaa1c9d1a8cb4998f6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46768 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 OzDG(U(-_i<*8c$C?X}?m diff --git a/tests/test_database b/tests/test_database deleted file mode 100755 index 2a1ae2522c4f231ed1559cc6b60d12d90f28ed9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41112 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 diff --git a/tests/test_error b/tests/test_error deleted file mode 100755 index 1185635c8f2fac9033677f79bb831ba8d661b8b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32688 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 M9A~8oq!q3I2K-LdAOHXW diff --git a/tests/test_investigation_dao b/tests/test_investigation_dao deleted file mode 100755 index 0234ddd470732e3c1dd7ba53ba45d9ccfe826f54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42288 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 diff --git a/tests/test_investigation_node b/tests/test_investigation_node deleted file mode 100755 index b7614efa3254dd41638e0c2b0d87f582c089bf9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25824 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 diff --git a/tests/test_investigation_project b/tests/test_investigation_project deleted file mode 100755 index 3bd6369a2f5df830c034c78550518290ce4c20a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51616 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 diff --git a/tests/test_investigation_record b/tests/test_investigation_record deleted file mode 100755 index ba2880ba891764294db9386029afaf85e4bc251a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17392 zcmeHPeRP!7nZHShL?tAOX`@mZQD{&zBtWvDP=`S9jfbzr(8Uk>GRaKHtjSEwOq8f> z=|)(mFkR|dJ#Ihtuy&8Kt+lDE9^`0^+C$K@Yhk-pSFMLywUY%|{A|`*W`EDU&-2bZ zZ)ONu&;GH8tCQzGU%%&mz4yKM&Ro9UynI=4QIV2VqQ0VtJ5XsP0any4G*2U+i>Q`t_al#nR-6-xU#fKbKtAiq*_V%|$< zR2W2|qIcr?j9z)@u5u$6>h`0y*;UK>MY(jS*zo(AiXXA$H^_d2>?gF6?S)EvQk&4{ zPHs;xy%;)5LdljAQThZp-WWeMaX^lc++xv~^v1qt8*wzJ8(&g0{EIS^#H5>wPqPO4f4t90L+H;sXJF0s65^=;txb_?E_Rbsa zj$otNE^yc@F>X+xOt{Emf5)dqndS)cMSx6N!`)#!Tk>&WoH*$aUZ; z?c#Y?=7XWLjC{98-ox^B0izdt;fJm?a+*u1yps02fME!OtE2^GE;+v{w7k+Km${P^)h@YvKJ>ZdXgDX;xa4OzQl;u#@-toX`7Ze+ zmptH-qobT;x#axHc66sQr&{1t3!G|!Q!Q|+1x~fV$+f`y6&HML4IC-6wwL~Nwo=yC zp+s@!fHm;*GFr(hm1%e$;>?VH#ovl)0py79B-O~F4AP8eh^HmS$N|moC7zZ#BSV^h zn0Q)hj0|f2hs4toV`P`+?<1a;KqEUf{~h9KsWGxe^LG(X%b1ZK&3}`4S^|x1(EMK$ zPfL)I)!?Z<_3yMK4}Q%`zF`f#d2DrSbNx{Lb5?56Z()?FI_y{KgARYiv^(H}3a1ub z3jixsx`xPt(L@!R;vpDOQ=FbTR55J}**(h?_OrBo!*n9Ej$6rN*3(C?w4NRHssi|%ZbxPI zl|F%N(fVhzZEo9wT5Io|1@jvhbj+`Z?htfo=;qfq zE@-GnNt@rX_B2Ot>I)~rww2sU<+S!7-x`i5px)Z41+x>~J+s5no2gF`o*8Le`);G4+*Iiy$hX^|n^Iq$5F!=vEfUfvHq=S&|LHrH0ds{|NK##tR_VW0`6tpRoXICHGm$m(o2jz@Q+cQiJq5maIUkV5Ex} z>Gz-HAk_(yX)FVFQ5I}Z6`?eI+kkyc1jV|9!G4$vR^ot}*3>0?5jI@18x7b}1NIJs z)ic=oT(B3hL^pLrlWU|MS)>aM(#I4qReG3_<}=ciT%-pbBy^KTYRV$Lgp&FRyU2ijLiI|OmU9n(mBFfV!J-b>tSs2#EZB=vbOZdv zfK@ZtdIsD7aZbq=J78bQf_(rRu4dAJwHdIv3>IRr+j7Cqalqcqw%G$&u!RP!%7B@G z2lw8{VE$aNLztF#THBjPL)N8chDnsBuZGQY&+6$X)v$wtq{_EyQq@FdOO;w6Etn>g z`N?(E5o@Q5ikY2;#4Ti?uRLoTAOs>qW9RH#JLCd5X8V%}fgL*`h(x^fG89~x8 zdJFFqLEUChuQaF>pPne1@yT+XMlC<2$4S+HYSQongGznVlH5<`0=&ZoTx)>erU@oh zYBTV+7&tRZ#V!9E18g3_hN}(mQy>6-Tu>Wbs4w9V0oB}TQ2QD6UPk?AgIaG;kDB6s zph;;2sEhXq<{Nm;N)rqi%!LLs#hCXo=2~FxT+h9>NKXT)@?YpdP_@HExXVO%R5ys8 zRtH@0Ap`$wyqM7t_b~j!4FA#ZsUa5ql?E)o#o*2}xFNDlmHq@APuG{aa3>kutp@io z#(jcu|H0tSG`Q0Y?i3B!@P_6}|00X~ORPeqIUd2m5SqBw;J(1P`xtkb!F@rGm-1(H zk5%2F0UN$)a5ErW-rHQbHyGSs;mJUyUT53`jC=GW-3~Wt!19=eue!|O&M~+TWN|NY z;Z88Pn+@*UjQa}X-UD3jKJ!RD6U?(9@hMEn%Pc*ysHZCC*JQpKjxGzwwbcAFNZl&?(SSO$RooRo_HydDsR-nr4||1i`9B zBWFarm;zV>Lq%j!XDp5(_A$qQnzl%-F0!_-NF$GF^93@VLdIZusvS5I&_zl19ny=p z#0giT@)S26`X(1H`{$_)74Y1BcVU)_mU? zx^5${qqaY*!Jnt7ZPIlgWNWCzhNew;>n0ecX5YRRlSeT`x&V(jq9*J)Od)nJ9^#e39C!{{2kmFjats!|7kV2cyD{ z)s}G_g_+|B;c)t%6FZ`CI^t7qM+k@0>rd=h#*W+Ejt~x~FZMW|pHoN0ek;kZ!c-A5 zjF)$FYgp}eGle`a>jQ@;;BdHTC%3b-u{<6V8QSw)ike0YHE!8B`pR+i)#K=W>z{S@ z#m-I`1Lgl=D$4m*Vr&JmaZAK!(_cFhy%{93F_?(p8?4@Nd#pF)Z&xPcyKs?j<=W-T z1;KnvRO8F%WN!=uEmUJXXI5amJDl|-&he$#aYQbpadFyv!@)#2WCs&jpsdV68W*RpCo~2pD|2vU-!8j$*{jP=U2o1$rvC1B zpMEl^)1?fu>DL?maqE@aPt)Db4x$_q$Pq!}v-RKfF*r^HIbM*%1$~}yQsX4sm)ZWE zo)6B6MX=+Kzii*0EUvqDirZ1;eXgS6TWa)Ec$rTcd^)mj0OIr3qLAG5zJ9bLA$5Yd z(<32(li}wWa@=^XdUEK`T07l+pC+EST~8F>)rx;|oI?Fa@jp!*8VWp|KF?8dlJ)zX zLl%A>%(!&dltO>jQSxcxc%Qq1ab3Okr{EW=6VFgIKJt%mejk&8eh+KQ6Z9k5>-l}G zN8a+2z4MZ-8S8{l1^ry}a6ZR^ey({opI?i6F|$UmWqg1B^E9*ZV? zH{;hYp>W)9+Qa*|;L6C>eyXrO+Sk>Eg-9<}F!<$9+zZTnVgGP}$tRK}TPv2-F8S^uta9_Z?~GMPaVOs-rux%%pgGjA!| zqOLseic98RJe|bkdjmcP;s13UGN{FqE4LLdDL<{`)(Hrq^|wP@cQ})I4Dqu1pB9P! zdl2tKTj*V|fQycu#OWfLS3VRZ@0l31D!hSU^WZh+^V!O8;)Nc#9e$8LFUD zkt)jJi#0Q;;pw+=lyDMh5(Pz~^AAeZ zy0bAZ4D0;hW|e&^80ab;6@$?%b0$ZX$RArnQmix z57YaZKE`w(Q^8*sFuALiEVfMZ2OZ`)% zrYQNnxsMI-HCA4G8rH=$>hZmTJ6*`~I****A!IMloA_LfOc6%^hJcYsf72I&MHr>> zJQ%G~n~@U&{8kvHg=gQRsIZbU$GG zLu_Be_CE&ASFgtzNAUzB_VjL`^3{IU(&O!8v9y*=~(0NcOpsh7H@y*E+skI~(O zwuqewZd4Go;od{^8c4HOAnZi9-AEmvGWuP{(^c+g`n< zxwZ9Ld)eBROIll2t+Z|b+!J_tcYyi)=bXTQ%nmRgK>Y~-a<_o_yzBCB%oE{FIKhu| zz4PwD+haZbHrY`>hod3tW!ql1X7P${i|6)j5&+@Ya6E&;huLia`TmWOZOxGuir_~=11&UKtsxEvFT zMD4yfuHE1O9Jgk2F$!MT!8i>jg63`w>g~Q(lY@}A+nz?i4-uCXrM4d3^Bg2nzN?&RLMc0~*R-7@TG2 zlp3bghNzb3nvxR|_lL|CB}anGMdl(CJ?8ntP;s(HOiKCV{oRRR8)%}}&`!xkV~MbT zW3w-UOxN2V?&O)PGX!7ZP*6ReDZf*^p59mwE_d~_XmL|ZElsx?+RSxI zLrWed2zE!>QM?#JQ=xmRtj3xzH_`j2 z2p{o(5bse+LS;W{q{deAL>uwJZ$o0@FZ)!X;xBRarq2ZsKt6jKkln}1es&8L4vF@? zlofy3Pg;;sktM$Di-pQQ7$!O~oUm#&aEBt=mrwS!} zO5XAtsZw3Y5VrWsK3eDy8%lg{{cmRfCbpA(xzJ-Se`+(Y{}#xoO}N;}#NJ!}yVzga zU-{UQX&IJe?!;n8^d00VzWB>NNGO%hoxJgPL+SRvmp76^rwTBGNdF1u!^q&6*BO7_ z``9$T+{x>|7fSd15vVoR4s|;t@AdyTkH4HF2=#gVz4d<;dg@}HcAS0uE-r^Rp726{ z2j2>pznmNFK1u)g;Y(v*;>*5N{=ESCcLC(wP2$Qp`~<$#f8sCqQ-@|lh*V>U^H=(Fow1j43XJ#(PxpCACgtA{Fq#eQ@3p70x)YsO zkc`b8mH2z-5AkAVIu`%R-`DA~zM$WwY79O0pX_y9icnS`dk8 zlxnqBtzughtyXH)qD2g13B6c@MN8Gz)LOe+tfrP~RCIrz_nmjn&N}i&j%96tVU zm(R~pbzPc#++LH=yUN|e6kL}kAK9ki#|q!@3un2OkT}*!srm8&BhcE%35)W1XXzsX z9J@HV}U3972n=5>q9#nkpvQ2?4UF!Z_0zMjtuX>1^S+k`*uW?@|is_R4 zk`4kNgFhO+X*1_pcSS4vuIjh&!ue-kP_y{mfrBRB^6HbL>mt?T$BnM58C4gFCYO&| zK4JW*@#9JwVi%T>kv!2mU;8-0>*pVxLE(9fL&Hbqz|#E91%C+*=7N*`a>1!@ zx!|XIz)5Ex{@lj{9{ODBq0ejx$kpyb4|v!E{&SCZpYmw;C=dE35BlLA^tXA?H+tx~ z5^x{>+y_mYTy}WG1O7`7eVzur4}b3Ceh)qW>H&WR0&?lI2kj1V3rD@vgZ@Z z(eSl_Ya@vz%oV6jMnhI0u(&=J4KyZ#@kAg1>c&JoRNqjl&T5hkI0@B-gYiH(9*@Np zI7;w9<=h#8ns7Y4IMSF1$LG$NTo;Rm=LW0moQ(!+YQR+=tgDNKN&`{FcR((qU-iMI z;XtCEG>L~3$#^snsSVTyBXxmmgYjr2x|oy-Cu{|;Ne1If(ZyIjbt@4GQJ)l9O)vpb zk@|2T8I6Z)!I*{A#^UwC1VGeupfPe?nDn*<2kIi|Wv~vg>SUy@CQuux3yX#6G_V*d zgksS|IGSiA#zb6OEEJ5!qLEOr4l+%)x)`ZWLl65&SDBAJZTh~j~GFj^C< z*94@J(U3_PX$&kwGo*OD9)eM3J4mA+ja?f^CPIKG;wxlO92FX&#%rjrXUe!&N1`>b zUZV{rKp+ubo^V2<$+|il!oz3FiPa_RF>2Ao_;EG`bvdwXtX+?X(J#AJ8;P>HYydav zlmPSAH!ij*;Dil!C8V0HUIA;`!0_^L$gT*5qaSJpxztXqXb9U}XcGf#S4BuDmW*a~ zZ-|E*g7GkQt|19u2#_0wmIgvg;FWM&0D_H;VazwKK^`2*s$WXu6@Z&nlf%+G`M{%YC+cGNNm*Dl2XcB zOSvAazB(LAIANf30K@_|Q;5#SThpdjPMRDTTQX*xeR^j0G81Cyj0+wE_ju|yIk;kfm@rEJl(IG1zzNWKP+&c3*IL1QWv~a;N>p3 zb*pNx$^|bL_#zklEP*$;;8O+OEVX z4Me%afDba@9R~b718%jc3bjc&nm+orsWXCSBNO6}0jC(IkK#6UM)VS57~nJDDxxX6 z5eA%Wp^wrwbw+Zu?FcfVjs9B}!4b&pqr6R>68tb5YFQNq{BQ$aWx$Ux;FlTjeg=Gz z0q<|Xml*Iu1Kwc3iwyX31Ae3dZ!+NKb<|n|ezZZq&VUav;CC7DV-5Iv1Ad$V-(bLH z3zV@N4fqKL{U!rG(15oY@DmOA4g-FY0q-#2CmZnH2Ha=BI}P|?1D-PALkxJA0YAln zcN=h7(iB$aDfy2qfei0!z=tVH{$FIkha2!>13tol`waML27H78Kiz) z27J6hzs`W4Wx($;;1dk^dINs80pDQ2&oST|4fweRe3Jn`-+;Fn@Cyw14g-Fn0q-#2 zh)k}T1u^O4OUjv*O`dj=jJh>caR9`~4bY}*~&=;wmNA(V_KSy=C#7MVs{Yk3R zrA2xp*B_-iT~egibNvTYr%Q?SI2j{esZN&+=~Av=O?A3dNc*^6O?A3NNEdN^0oD6c-QxOes?#Mwy6Z~- zhF(NfPN{#ojq78nPAPwSBiB!-I$ipu*K>Uc)hYE)ujBd& zR6myLOXhoI8@PTL)#(y3y@>1iRHu|bUB&g!?n9kY{d76kKcYIN_~}xv|AXpu zDVg?h{T-@Ps-G_6`WsX~iRu>DU#0rVRPXwN`u}UH`>5W@^%to=nCcx|e~#*u!l&D~ z{v_2Ybx&{P`lD2*ls&zk>p!46rRwQ*T)&&@l%l7bxPBYeDK$?waQ$YgQ%as*#Px4d zol^0171yt$I;G(0a<0dzPN{dglYFa*`ah^n zTLx(#*MD%2W!0`joezo!WBys$yz{Dx=65Pqz1vka*FUCh%&#h1&wm|Gl^Jjk$oJNk z6rQ}A=>h*K1Xi>bJW9pc-H8DRC0BunLdl_-&cc(Mh;W;fp#KKbmt9B2X5)=Go7`CCr`=plYUL-pATLudFH%|Rp;k}(yD0wTcTe@ z%lRh(o*B?}w`HY57_03C#{iIb<+iN8(4*X{&DKd?dNF9{K?VY0X+`tO-4*Tr6e*3e zi_29jcU#HBHqm+dO2oQ~7XR)o6ay-n+f(1eG`X=2XbyrGXf%a5LSLuQ#}g0L-+))$ z*jD(Rw!&xH(nUi39EsjS|A^!)uv9erQx&ULrmVsnHv+8M{tFSb`@4y--Ty8X6)iKm zNHj~RX#O4enKm^E?LbI3gmhcUV?mQ5*-JmmWR$S)FgFMQ{SqxU``@i-Z-Xf^6|1^4 ziQ^EmAF2y<7b6p8X=Tj8`llUdGK-2}@X5 zHV8{aOL<>-IV;v%aXha$CJ9Haa4a)83ZJo7E1r%Zi7#tbJVS+NvG7a+&$^11E4!6F zV2(vK6)nAoQs|>`9n%I+*nkRo1i1*6o1|=$a)*>1QtpiZS- z-9r5hp}vf$TL*lbz%6J*IooGgbI|5Sw7F5W*|vxpE4y4tiHnrABIPL6=0W3Be52#(Z>vx5Ek)m!RiybnMTiO9`u8&vsPF?S#>d4Gi?ogUM86XwP zE>^OCEV3UI*}X~js+FCJc8#JvS<&7qv=0gG?vI(aL(wi!wEvz*;tLW&`>@bHMzk&d z9i;Pnr;^SuqPj`^TlA5J_2uzJM7-p>HZN1C^NRBIf5JX4ikXU#!rR$QCf_D*Upy zPgT5c&m~O?0>b;E@ZP0(IlP|7dNb3Jis@0sG+CIo2~)^ua6L6Bf#l6Asg1IP;wlra zUkcYKgX?N=WrN8N72kPIzF!I7fA(g(H`{2fUUBtNTxUsZFALWT2G<}*Yh{Y>cXQYv zns2A@-K6+BX?)H=>IY-)hBIOfrC{*sLhj*hig&EE`A6ZsSn=|za2nD$@T$dwd7oFj z^A&G@;eA_p3z>Hwt%n#4Ub6PVVB!GZP`oE7-hZ>N?R@Sp!u$JwvxT_b$`NQ+CgR7( z@;RbXdulg(6Du-K343`q^`+o-5w=H!ts!B#*HTOsR_shD#%n16?WrVrac%}3i}E!C z0PU$M-V9KcTi6L}a0{&a(O|%G;_t4hI72NWiGtJ?kl4$Mujlg8h5pd8qLztPvg-C1 z2$l-ripL%rj`5SOAXAk6;u5yVe`uN^*3nHU(l_xDn>V$EB?3@P;hH73r=}5-&RYk( z%zV7)SUs9}djU6bnQG!TX`;V0aiqJ6rzr+X6Yu^jli{|N`addyB=L)8B{g43og-3@ z6RE!dBSyFkU|aWEgZpB|{ZbXFRxm@jPZI8x;O=4d3V4TY_0pbJ?_?WktLq%J-M^dR zt(Z%#1CHT_*iLEEu-V_44flVbRHC)4ROxgSbqqr>PIO9lfu534>Hi~&I$u$LK?SJG zbpMIEwcjp^5H0@B=hXOR)66%?>W*M}xsvzfEK;I?!yn|GFY=bMym`AJ4Bo_!dR!qj zDbt*N=~yKqrbIkKGZrGIh=>u=fi0*5(VqG(MMbg;&OiTpJQ6 zLm#k_Z5LXjs9#Xj&k1$CP%kIy)_%jNy<9GI7mcUGg~ls+F(ofg#-E<;BomHcd2pfD zvThm<_N1Nqas>p7Ay7u|eTvMjWkZ#u*Jbps6-j^or?Veh6!j<5iK*ZtVnVN*gnA=U zw>n&R;Soe)y6)GMh^Lf@4`epoBqHjiLECkYq?JNkw_G7RsgLy-VClkXN@BH=xKt#r z6Nv+fDYrjq2iyUBWgYM^vUY9;w9F3pUCqF%{1ML4!vR-=WPc8*VpY4pljB9tSk}St zR(}U#*>Vn0?1(2)Zyede#T4jT%W5v>A^C>HvPY!%C%zB*7D$m9exjltuc*h6$uNMA z3iXG3K;7E!QWBEulDUu^%P|dJ=ESJ%y^FZ@(bD>pBJX~Z2an#;CV=}OKs32saXzLv z2MFg=LKs$>3|E@;jH)*(I~XbGWF>E*lBc8eR*^SAX_Ae4y|bDesyK%z&Nsz>=s{p| zv^W1jHksE!29e>v=}7iXV%I9M6GgM#B6gzU*??;Y?Yl3 zpOXjWW`OtebXcny0BBGB+M7We@KVjdx_=K0J?768ko>RBA6n1UWz(P1=#69koWU7t z*{KygbQ5LhJ{5EQDFu3C{(M0W*;@ATG^YL+F=76ECe%+5b!)%lNJy^v^9mW?F@GLc z@*Yz1K9qo(4@V(W22|_W`EwPlBEHe6IO`PWYr@%EIEN}t{!ZXrONw7GMq1-PK5*rApbNp{*($3mRGJ|l-~E!#Dfih?q+=g}gkmE;)qd|XjK zq^KXD#$nGvy8pV>?A$xN50RL2?`kC?q(pq5W-&yZA|eJ!gIfw@?zNG7%G~?#J=TW3 za1fi8XHc<{c%+h;FQynN5`RrhxhI64LD$0i*%|aK`CM*>PMJYdH3I}C$V#*WE75(tVDL(GJDH&wF>KXJ*%-;=w6W}s zDLnF@$UxAGK-8(*|Hii7p;w~clV`M+J*KE1_N!s55b7{dxAuFPguq>TWYss)usY`P zDkX2BlJ}srUM2DdsMdGeE738qj?AP=#W_TAwg~5J;e7L5)`a~k*PQ-b*}=HF_>>%` zwd~c&R1`Fdynx7SQSxq7v#4j!eyrpfGxHH8@0&{ARm2DfUo7&@C3!9LaBbKxpk%^_ z=<*{qf3T%@Qfrln3zdi}5fKp)-G8Mn&ZE6GEJ+;Ff5a$rnw_FV?3={B8ZR?-nTU9r zL}1%%3#KOz_vPfnt!f`^twQp0_cR7hBE?Ql*vcMN67Qk)3jO-JNDL8E?pdR!SrG;` zJI!W$&r4W@d-XPK#S8$nrv`g7=xO#7&A`*Fi<~I8O4@EKH3N6{1u*oOmsf*C%}aHu zJ&GclxZ!191gw>YU^8B z5D$oL)JSrB`&y5wB`+w+qaRoce-^npOJNbwbX^=mPZZqPG8Z0=F&e(3z>% z&=B{WB+Yb65;G}DLrBtNN)pf32l}z39T-F0LRf?b7+f)i!79M>&~~b!JshrZA~k@F zE_Ib|wiC^s?`&3557q3C-$t{%c_eoUes~OvQ1>BOez%fOcKm{-61k2}Uw(#LjOmZb zBG{_5z2;-|CA%CFBgX+^)LwHPF+R_XdX{la{LP;8laU8+SbcYEPZ21W>&%)h#6ib@Jxa5hN$Ka^0d_ zDJfUTGQkjs;~*GHySmNfAv_v;4pB`@sI^tnXfiHqCLzn=wTGuJm5zIo<3*6xU$#7TosO`cAKkRsZN)k=Mb40EV4Nx9>QeFa}VHsPreB$_QMQ&p$_*ZeUCPl-qiV((mk4L00$dpxI^~`5Cw7@W){)y ze-4avXc5&~>?y{8!l7vmPzmcFp&x}Imy0wfI}tj2{3~vw!cNlNd_6(a5(5 zw6CbM?f?cj;|+5d>cQRO-)ncW3iDtS5}%Dmpxn*9)QODVT5OrO5qf}@&2`*9o_Nyz zd7MYgV1gcfKLHA$@3O!O$0;iF=&)z$dt=W_#IvgtUuL%d%Yp6r7#kO85 z7|p}PweObQ{Tg+fHf-6UJLPJ);wZ~n)s?rpEiq3kvhh=wfu11N{Tt|B=$bXqpP?4_ zbq}8EGd!o3b?|rC^VDarS32Z8tOhxymQI;gw+YamR#&2d>;k!r8_^5oL$%$ zg2&)$p)Y_sD>P3F-4jITFdJbs&RB5@ryuZda{AV?t1q-Hr{AZzQF`vDOY&N9s7K-G zQ9uCOQ@GYp&n)igO(5G*itN;_aP<#CV`@A|-@>C$Ln4|FhM zg7O-$^Y`FW>7`0Zi(G6uo^bqrmIs}9n_B*#rldOM)G2A=DC!DN3nYy+ihBxpY*%&S zNmY3abrH<8q351v7pN)J>TCQqsmry4eJ!zD;GI;q`!{oypWPF;ET{FYb-=KRC|c}C z?#2&5ReMw6>Z8>9!sB^0E<>CBn^&#ejC^t*w8mL}lCH!ii3~e0IPw%M5cHiQ?76kk z;M+6g99$xBj7m1heq8oa`6L@Rmp9^x5A8#r_Ef%&n*iKymWd89?!7@;<{;oGPeqh9+sD+(AuGv_WSB)Ip#U8#D}{-2@tF zgJ=SD5~!~Raoab#+kSsA+J2h)(6SOr&p@Xrq$hWPzpb(vGqF8YL-ub*;HLFs zU=W$%CC$L2+Q*xrO&D(13;?vJUW0<#%2VJ~Y$yawJWO>AKaq=vsjdNs#JK~`b$g=w zc;U>owOM2xB( zn#)-gx}c!V%jOv!)0;5|^eQNxaU${}JT(7Qbqe2X z`9E=8CkcPX1lTeH|I`l4*Nq<9*DjQ>gF8j7wS!x&Q~3a~0#DhXNpx+)O03Vqs9{#* zTUl5!V64pYEQ}P!`odeGC~h4u7%GhE?5L}*b5(k?Wvi+1BW+bu`vGOw+17C?WqC#XM}P* zOYSon0c=mbMML7fB}6|6J9buQ&cEJz#juz7P|kDgc8c|7cfpu1!B0IfOY0z!G@3`#+H_9qL!7 z8nW!$NWZ0iwGQ~@1QZ-3c^=mvP8Nqg{O*sK-~mNieKv9QyOIi4nOB3y5ehMYHIOx1 z5d@qB6hA>Q85ZgU`wS;Gs<1&T(St#YFHrvfZ`*PnyD?U{O+5`w({t3ZLB9QKd%&S(i=Wi!6;88d2@uT6f!&Zt(+!e{1vvbL%SaoZKPqyvr^MVH>Y9oq;CU=$;5 zxa%demon<(K|_o@#$wf1wh>{@3s_yTt&sr?$gB9In!@u*V>zqp4@f z=Fj!P_mYU_HZ-PVWi>OZ>_P=NbwzpuNj@hy0q3Y+jXfFQMXKq0tgT+`SAQUT7sFu&YpIgVJimlu(ly4uSz0oh{Cgb?<_ zTF?x4&0cjnd~Cb_@78wzdk{h{J%c6!csQmUYPT+9azDl-HS3EUqje);I(T>_Y89^j zkJ1Oy+Eaf}O!}6{pA-tgvOTp`$J@diX(JN)P*7pieYmz!*K^w$@~LA%K)LupFnX3!q}q-J1` z-V56!n7n7l-%^Ud^zJ2H4CuJRTVV|<)>5p(*kHJ1c3p#nmV=Gau94YdT`l*CUyi4? zi@0|T#QPyM_ON=(ymy#@2G(R?$*` z?Wx~EZ|-h;xevZZGpD<~yqHe2YOZ=8-CUV!_wQp8vRUEk0W^Z#E55`)Zbm(XAGD{Q z-9mw4->Q}Sti<#d|2}}`qh)n-jI2g4nI;ZX9OZp+E3~yBG8W>nAAlnFt*2ci;lKm& zIL6F55PSB|*jGj{VKM^Po_f;7X!s~*94|8$5))Z zPU)4N*7Khn0~6qJ4>of1_Ea^5BOAT(Rshh1J2fTyVUCOaT8WuU zh_Q(nTL&odj|g~Qjn_Ct zMb{<4o14jd-!gs87y^|z#AVp^0GuZhXX}6qO3{m+!}SEqRr?61pdV@}J(0!2l0^XFoUQsCn#*}L@-+;z zBWS{>uwv?nDOtRk&}h?solML5DrGnwD#M}i+JR>a0NHJ4pb@N8YP>F1s4^x7t%bz|2$@eMy-|u_JM6N$#pt!TMQk&N(owZO$f} zo&_!5YmB_QpFr|UWl;C@R~coI9%NAm3#vT;$5NC)KGfphg~1;WHL;HLoFT0c!7A^; zS27xmx$0zd`VCkM_x|CG!X{N7Yqfd>#Vkt3a;2bDnFMK}er>xU%a=@jJu?#JeDR^#lm1}gkiGpG#9Cap?gi_kIER)O=hkw%))IRdj=#e7vag?>)1>!l03o&M9fSI|Ja$6ZNHf|3PuW}UC!~} zwU+nAcV^D@@4H^;=q4hM16}%XvNQpMv8ubE@H@O_t}SvJ&eSD4*s@aX#gNOG=Tc3s z!(S#MigGjy_|$fU&FlzW^j#lOwCj4|Qd_7lUB88~fUf8?jqVf#i#6oa&>y%=UU4cFW zm>bCU^1jq5k6Z|olRfBlkY}H)EykGkxX_|3wdWOwy2z5P9(-X+LP&PMnP212m9%af zu6)YQcAmm)RI&C@NI_>f^Lh-gq46SXC!Wt~MxC^N&1USNp0?7CJSUx9JuW`3+DKmW zE)A1?Es@G`Es@G5hKI8y)s>&VmN=9G2aRgayBP-OPV(f|0b@zup5Zv8Mu@Lh{_up3 zBedDapqB{5)^uG5o(rjV1kd_{o+%WiIpp4kR}iraeKIuY9LDy{ZYx*ftrZowrUL!0 zpv4ys`BFBpv~SWrRCafJ0p#j7UL!fAb{hs(0bgI+D^9$82v(|@BH(9l{4r2=gh5~HgRs{ zteJs1{yB4~^v|9>Yc}x+eJEBFCh8H3@k5%Y`NGQ^@Jo>48vK}OO<2>^qvhb@u-&4t z3iyiBD+x1vVJWW5EvqhAUAtnGL-kRj`Y8S#(ovW3fsWQU#Nt8x92G@9yd1w7Z3#(^87%!6Z2Tnh2wxBKk-lkxsg=|Hfw>5N z0sm!{bLP(Rkx%YVFV=^CXjv;o`UFSe$9EATV(}Fv3H-1z{}8hy-q6tCAy##WTILTi zkMP+%n7Bl}Fba!}8Z**2OvP|0wm-eJy>xKW>N&@Rw6~qCv@|dYVQflxN-P=;WxjyisNUv=~sqF_<9nK^p&1fTB-w#1fCN0L%>f zC@gk$!BDs!3!POHsjbCtq(>7uyj+L(%4jIIgo(nWt(CQRBpOLX_=m8KF;nKX7YBnI zUC7m*4%4o9tLHcUaJj5vBPbehJmRq690`+NMKl-re&lOoyE#;UE6wC*j#~VE=lBw_ zWTUSx+=$4BJjvIHA6NJBAcq_A2n7!IBl#_DtsPG`C060p4~>&==(I|(!q0f|9{55W zOE7-uz0sD>cr*6c?1p^uh5!~w3Ie(CnqS*N(XjrG_Py{dUwfO~0Q1xDuIru!f}s%1 z7gOpx$HUIdR7!VEG8kVfl2m|_MZ|ag^}f>`5Nmqa7g`doN3IzUh9c3h4|!zW@G!Eq zZI33xK8%h}3>fBtsYJGi=wDq2%HhGfx>zzC$3SW!DiuMh=af^@vz_5X8;AR%!>NIW zV52V?_0^DINaGbG7)|tO53R(aSa_2Nf!rp%2ESF0wvs;f@&t6!sw+35b_IpL)y9%> zOgmpN8A5x~?`7}^UtQ40X(M`HgNVEB5$%WIuZ@J3kX~~xnI56WdKf5J-AIY=IX>!> zwCk`_EV(Qmfth+XVzZd^WX)iFF&nlK=C6sGlp(CBQu#2U)JOhXMlo#Pme#>0!T z6vwwcf;9oGx^?G}n(gj)JPmo&#cX?x+a9UIiUjpwHtvrPrbgBs4>vZ%qBT6c!K7Bt zkYjfq@^b4D^vT@sF|fJg7fm>_hGq3wKoz(Le6(vlEFBZ5iieZ9VhhZQM{qS2M3f?V zx!|KG2OAPe^fTZO#e>|k2VD$dFy5#Jku}LpHzgKI(%RDK(Vibyg>_!YswJ^R%nLa` zQWGZRSi5_3<3YGHcaHkk6ES*X6bY2*oD1(?opRGvH};^ChgpCUASRM z%tbtrQVY~Qm_xFTr*d&YL6d{-IliHd`{UE`?kn(x5M7*&Wm|AfEcSZKn&Y4DpFGz`N2F#X zmvm*U&Uh(QIS^s8mzWBjy_EA!ojq#?EldbzvaxcmYG8WMhaG^ruoI~w5{8oEG)I2~ z@yOz+TGNQrX~#OX!Zad`)$!Q61FtpRUTA1hQi78l_n5&KtA_kwB1VGD1=MWEjJNf% znr$1Pwqtccp!MjF-DX2w5{o9TBvpSTdqRI^&hgKli`}ESvwX;Uf|PyuMl21l7)g0n zGJKkE{>16?{BwLGE*$B*@HDZWlh0w_5i}w)WcG+T2h25I+2J}(wZ$UP9F83Sp@Sc5 zM$%qr*-yt0~9~8#=s!hnDSMcLvLZ$)I~xZsjRFLmP7wQG8w6{hF(5uX#J?6 zHFJknoHKOBIYZ|x5WjSci)+2k`gGOoiPL6GL>>_j!+QcSXQS_Y->jMETHBhTW{5J8 zc&x6jIv85YLn$jhNhq;K$O;|7ML{&0dMId$r+E+$OHztNj1yB+_J6B=JAXBVHz1_pQUP%dv(If$ zL6X7-3+baxQAJl7+cr=@x95GMuK{tJSn49d2o?)uGsr(VcjZQUv{OgNp z?HgJnE&UhTp(QLFmxi37C8is2!_%aU<%eAe!%`%UmuKuhWrBslBH;) zN_={_FZuU>ef~K5Z;H=)(fh!uuGHaDlV{DCQ8|}5_Ddf`w8Jbfv1ZSjK7G=}$rqn%n zJqx^DYw$=I&O2_-WI9oHqFj&ik1d%@H_C8pCR2=O43oEHGUuV(^_@&+A_ho6%5szg@Obnhlw~NJP%c8b9_3)X_0Wd05@jdKT_~+XENd)Y z?D3(z8}H(jqkIg>pU0LcBZLhH^B@PL#7zT8CQJ-|!Nw59K@C!H@FVcJQOT6J-<1 zXHc$3c@n-f(S~yFufUIT)~~^joz>&;aS|WOj+eoYvgj4?qr4Cw18PE9i?0Z+M|sDq z;72*>_uxnQAxaA`^nYy^_)*^V8u(FO{5tqiK98~q<)yp9k1~a_4dwNJ1V75&Z-D;@ z=!MdUastY7lp&OhP}0F~YopA&Znl-TyeMzr5r_1pp9CT}zE5OLSewZVLupMpq=<@B z@rU=0t9F$d^JZEd`NRj*!sn1uDB$5h9(WHJHxiA~dM zK_8MqZS2Nh!?!b;Wu}Z?*RTM>cjIsSZJEqu%&#o}1^Jr47<_5Wvu`-?*W36Bz+d!T z*pqBv_u<@Ln*TE3uf98zndHEqZ{wE(|E=$5GIu%fx7+x;fbWg@`#8kg^7A*4c*_US zCg8sf{3H{!-ke10PfApAn$zXtrtCVoLy{`J6L2fWY3Uy;S%djR}q!QW@{ z=YP*`|1IFVA%7J5Y3tW(gzW?SfG^mP$$aeK|Ch}_2xIdm@PBjQJ8k@Vz^{KKliA=H z!ynpXxDfCWh>_bJ{9A4Q>w*6r@F9nOSK0dA3;dCYsn0w3H`)A~f&U5cUiN(p_{V|w znf!)*_X++C6JN{Xd3DHI;DdPY>9-DiyN%xrd_TNJ*Uw>}zP5ed0{%1L>7%sS@hh?M z`-uO!Oy&xQ{Q0*0L5QstzahFwPwq9Z~pUue;K(?t~H9| zKky57c;l}J{_ntl%VD3JZ2Q~`{2b&`Cpz>iw)NW#d=+x6pE>w{V)MTR{9l2OJMi^3 zejo5df!`|{H3mXm8)Lws^9FYKkTZvx$2#+x^=6w{bE=BELVN1tA2^AzSLD;>#G0A zRp08WzwN4j=&JW#=hSzgt3Jk6pX{p7a@7~O>LFJ>>Z*_6qy&3>w<$e#NU6u$CkvRa zm%8dxT=jXbdRXd5=x+MdNk6G?lp7z%OTFP2>V$I*oa(ika~sr`3!d^qIyC-2UuI%d z-$B=yIA|TGqlyv^97xgm=n}kut$Rd2Y;*BZEG6${$T=0lW~E+GK$Vl=x>g!GMrbMb zp@Z@oIy#P4rH1b)RCTR4k{UjcV)3Ed|2(7m10a)rDfQ*Tk1U4!tH%Xj_~82c{gs?g zr7qK30sjyEU(1^jJrx@7Q?RL0&X=-Q%4Jfnk@8L{ACmGJDYr}cx|Hup`LUFJ23vd_ zE9EdL$4fa?O8QYxI%=g{CgmC_@09W(DW8#YyOgg>`JR*?OW9|Ll6$O_!=xN9 zOIa)BGAY+cd8d>QN%@SF+ogP6%J-!FSjs-9Nc&O_lXAS2Q>C0QWv!IUq+BEAol-s| zZQyzAYH$9{Xv?yess*oU!HZW9lscee=G4v@-5dyZD#rbmX3#-egjT&>HkZSbEwGSJ#oO^5%?W) zF~xh~fbGLyo>gd7QA0R%e5LQQkvo`>|^u0?IJ@1p_^h%*$ zC-f&OwACo|*Ns*H-Z#hT%|gFX=#LZn^+NwVz8Odd@1vvqxzKmG=wBB43uu6F@V+|A zl+bqxyQS&zUpt$%?hsRM*~jwX*);3dEXtU(}ccM=(T;W6#C09 zQ1p+h!dfBpRYI@VGs5Q@-&;k_vUF1hDRSi~4yT1_lZv_5}3kTd$Kr93;f2*6`c2CaoVRq z_3O3;3eJ15I6YP1zq~@hrLZOeo~vIM3;k+Q@N>mxUFAW4wFi8;$oVH{8`w7$|GC41 z{`(&AhXK#S2F}I@MG>ROrT^2QryZ8k?-_(R-NABBu=6sF{WHUhEq9*L>oCjmSp%)q zR!ynOzk~iLCx~mGGrXS_izwu9=`Z~vbT0an8Q#zOalNAFJx82gAn@C#C^)S*bS(0a z6BYWehZG&}?c%ga;3tcG-tz?f2LivVLecZRB%HqBA^&BezhB}B-9w=x~<99 zSJA18ZkQ^py&m+v56NwxQyAXQy7Ou!fcKPfdM@BTk!cnedC0lK10MH)U(fJ6*A(w^_d;q)C3`j0%|bYC`?UmZ{I{Qj1{UeY!?nd$pk zGaD5|ujA(k{7LaQpDV6DJuFFlw3zY_ZL z>56c>(5D1GQ1o0b@ZN{!meZf%=xB2<6QpV2N(1duYS2y(LXM_ohW${q;%1M_@xHm;B>B;DbHj=P|sWwSAEitmV^lLAm6|J>WNqoL40dXgQC1&_C}1 zf6W7)68XhqV7}J|m3#Ngt><8d_p_FWU!9@4XN~iqp9px7aos26)(j8&B_jXAg^JQA z3~N2;zwZIxC~~aDN}kEI^wHN_=mv#0{4lcM`20G<^Mwgr?{>62ZY=j=|Ml)1HQ-uPWywo+P%R8zRm-F55xOe z@j9j9OAZxFUe3!Q(5e zT6%LfP?M~$UjY`QhHslh5)M*+Z`JwYg}lOtFP<>c<0A+Pne&a`K%i>2f9~AN15@YC zoXnp=36xAw^!$b`KaQ;5lZApksn0T~p&Y+4%nx#__knYHE57u)OHTP^1~I=A zqu&?KC3&1dtR?FgEOJUe(_qlr@0Ve$!NBU+uNUXiXN;ouc-c4?N2%-88vTMceKmn! zFAmh%!)U*mU9L_~r=) z&B5$yJ1bQXct^)ptOwGeR2C~Em`sEM3A_!7myGHgeM;@xq-P8C*dO}R$$8IGbhfdoNU1~m^o)+yy}wmQRj#SY%K%Tk!VeTCM9guBl{CYOp>5F0QGi|b=i zvL1XqU^OHYjpfs(S5BH77+W&7q|DZhVnm!xi;vqhqBZr6A9v)ENylbqnwn$-h!rLiGxI2Urtj9e`KsY~NM*rSE>ocfCA}O%$pp zwoLNstRNy#!sr`f2oVVAco{xRAV@M=7HG~A{UW5@0Glkg1#}4U&{q2cMkGq+wnK_S z*ww7}vw@)W_;D_g+A&#~K;_&Sfo$$HcgAGOoaWLC#4a`+yd6#$tf{dAm9yX|HIZl_ z*%+V{*rqc_j?+pw`nWekB|uw zJfMh&v3l~7L?lE3jFhzX%FbyC4%umq0i=A2mdijApAM;oKzd_ZWCZZ;BECuJniSfh zNUm;#zl66W?)DB_I0f!#?AibpXEc#*RDI+mtE=gcxMZo1Q05JHh*A=z-t~60q1%_B zMazs@8v~7z>o73`f$GLanLYt3LrVjpB};iYZ9(I*?Ngsj9n{;8ZbuHqlK2voS}1HO zw5ZtXWIZ)I^foe^Fxi69MTj%2^^J>Nb~pUieghx9wf)IXzwL%(ZLLm5>T38)MzWyt zm(8fF^g#jSKe%W_CPS9P*N#}AjZoKZj!yFO$5S-7f*5Ov%DT3TN{3=5|xRmfTLqpLVlbC-)-tEx!8BG8-94 zc3wNJX*iDYodm0-aYa48nt?JASLG6YhA+T`OBP3yCG0w*5Kc=t6=<*+x`e($Qc|-b z3JI!&?=nVzufePYfWuc3gTx?b4Rr~Uh}m6&(~`xwz%JqNSVFrHAd2yjmV_zOqg{w4 zH4vg}(3qiCiLECbrU4f-D+DxgQspSxEa5g(?r5=SeNN&@DYV2L2-ZhJ=s_$&`T#-> zRf5oAl~5GI6mjn3{C8_~KMJ?faPMCoYw>&l9lAVKRqg-!{)`5c;DokJHUDG6uS@Je zIu6-hwPE9N_A#Ed)BO7RLtX0jb-TFTu?*B63pCkhH^Om~Q&u0=p-5YiDHvvXA5i@7^7kvQY(Dyr4 zP3fx7sr(xLOn#q_pb+EZ!s--%QZ?H9RfjIuplb5-3ot}-s-n~Ss#;cm4Zjr#lV9JT z*X4b)G^Z+cyBbROtxSG>e_5B<{&yUD95nDAoDjbrKdVVFQkLomdj;%n|A&B^{QCJ0 zUDCG=%){OOPhI?*NFf}$+=u(8=ArGTVZXr1Uc-MkJ*Y6cT&oGCbn|Zm+>AfVA5w(6 zEEhgqxcOfP!sOS_E9%mx8Krdh|6Raw3xZ<+k?7|I8-7f+tiPyQwyyQ)0s>p{Hotzp zdihu6-v?eAKkerFxw0nB?;1ZJXw8Fui;L!-=GV{btd$!MKH;bML5J2``_avSneA_Q zfyt~5PpGm~750D4uS)1+!=F{asH~&^emmK1<8j;1GF&10Cf@9wAOA7~QeT=ScyYlxVm_({cBAvcrgKF?(QX?^tiL(@y^ jt~k{HMK7sxq00ceT}^u=PIB>Y-lZt?a~zu9&Hw)ZTQ^{k diff --git a/tests/test_investigation_tree_builder b/tests/test_investigation_tree_builder deleted file mode 100755 index d6cd4844176447be928bb7a3bda21977ee4298de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22848 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 W+(;x$-3^Z5wGT^fbQVKa*7`rxh(>$> literal 0 HcmV?d00001 diff --git a/tests/test_task_manager.c b/tests/test_task_manager.c new file mode 100644 index 0000000..fe42ed5 --- /dev/null +++ b/tests/test_task_manager.c @@ -0,0 +1,1116 @@ +/****************************************************************************** + * @file test_task_manager.c + * @brief Tests du gestionnaire central des tâches. + ******************************************************************************/ + +#include "core/task_manager.h" + +#include +#include +#include + +#define TEST_TASK_MANAGER_TIMEOUT_SECONDS 5 + +/** + * @struct TestTaskManagerCallbackData + * @brief Données utilisées pour contrôler le callback du gestionnaire. + */ +typedef struct +{ + guint *changed_count; + guint *destroy_count; +} TestTaskManagerCallbackData; + +/** + * @struct TestTaskManagerAsyncGroup + * @brief Suit la fin de plusieurs tâches asynchrones. + */ +typedef struct +{ + GMainLoop *main_loop; + guint remaining_tasks; +} TestTaskManagerAsyncGroup; + +/** + * @brief Interrompt un test asynchrone trop long. + * + * @param user_data Boucle principale du test. + * + * @return G_SOURCE_REMOVE. + */ +static gboolean test_task_manager_timeout( + gpointer user_data +) +{ + GMainLoop *main_loop = user_data; + + if (main_loop != NULL) + { + g_main_loop_quit( + main_loop + ); + } + + return G_SOURCE_REMOVE; +} + +/** + * @brief Compte la fin d'une tâche d'un groupe. + * + * @param task Tâche terminée. + * @param user_data Groupe asynchrone. + */ +static void test_task_manager_group_completed( + BackgroundTask *task, + gpointer user_data +) +{ + TestTaskManagerAsyncGroup *group = + user_data; + + assert(task != NULL); + assert(group != NULL); + assert(group->remaining_tasks > 0); + + group->remaining_tasks--; + + if (group->remaining_tasks == 0) + { + g_main_loop_quit( + group->main_loop + ); + } +} + +/** + * @brief Compte les notifications émises par le gestionnaire. + * + * @param task_manager Gestionnaire ayant changé. + * @param user_data Données TestTaskManagerCallbackData. + */ +static void test_task_manager_changed( + TaskManager *task_manager, + gpointer user_data +) +{ + TestTaskManagerCallbackData *callback_data = + user_data; + + assert(task_manager != NULL); + assert(callback_data != NULL); + assert(callback_data->changed_count != NULL); + + (*callback_data->changed_count)++; +} + +/** + * @brief Détruit les données du callback et compte leur destruction. + * + * @param user_data Données TestTaskManagerCallbackData. + */ +static void test_task_manager_callback_data_free( + gpointer user_data +) +{ + TestTaskManagerCallbackData *callback_data = + user_data; + + assert(callback_data != NULL); + assert(callback_data->destroy_count != NULL); + + (*callback_data->destroy_count)++; + + g_free( + callback_data + ); +} + +/** + * @brief Installe un callback de test sur un gestionnaire. + * + * @param task_manager Gestionnaire concerné. + * @param changed_count Compteur de notifications. + * @param destroy_count Compteur de destructions. + */ +static void test_task_manager_install_callback( + TaskManager *task_manager, + guint *changed_count, + guint *destroy_count +) +{ + TestTaskManagerCallbackData *callback_data = + NULL; + + assert(task_manager != NULL); + assert(changed_count != NULL); + assert(destroy_count != NULL); + + callback_data = g_new0( + TestTaskManagerCallbackData, + 1 + ); + + callback_data->changed_count = + changed_count; + + callback_data->destroy_count = + destroy_count; + + task_manager_set_changed_callback( + task_manager, + test_task_manager_changed, + callback_data, + test_task_manager_callback_data_free + ); +} + +/** + * @brief Vérifie la construction d'un gestionnaire vide. + */ +static void test_task_manager_creation(void) +{ + TaskManager *task_manager = NULL; + + task_manager = task_manager_new(); + + assert(task_manager != NULL); + + assert( + task_manager_get_count( + task_manager + ) == 0 + ); + + assert( + task_manager_get_task( + task_manager, + 0 + ) == NULL + ); + + assert( + task_manager_get_count(NULL) == 0 + ); + + assert( + task_manager_get_task( + NULL, + 0 + ) == NULL + ); + + task_manager_cancel_all( + NULL + ); + + assert( + task_manager_remove_finished(NULL) == 0 + ); + + task_manager_free( + task_manager + ); + + task_manager_free( + NULL + ); +} + +/** + * @brief Vérifie l'ajout et la récupération d'une tâche. + */ +static void test_task_manager_add(void) +{ + TaskManager *task_manager = NULL; + + BackgroundTask *task = NULL; + BackgroundTask *retrieved_task = NULL; + + GError *error = NULL; + + guint changed_count = 0; + guint destroy_count = 0; + + task_manager = task_manager_new(); + + assert(task_manager != NULL); + + test_task_manager_install_callback( + task_manager, + &changed_count, + &destroy_count + ); + + task = background_task_new( + "Tâche ajoutée" + ); + + assert(task != NULL); + + assert( + task_manager_add( + task_manager, + task, + &error + ) + ); + + assert(error == NULL); + + assert( + task_manager_get_count( + task_manager + ) == 1 + ); + + assert(changed_count == 1); + + retrieved_task = task_manager_get_task( + task_manager, + 0 + ); + + assert(retrieved_task != NULL); + + /* + * Le manager retourne une nouvelle référence vers la même instance. + */ + assert(retrieved_task == task); + + assert( + strcmp( + background_task_get_title( + retrieved_task + ), + "Tâche ajoutée" + ) == 0 + ); + + background_task_unref( + retrieved_task + ); + + /* + * Le gestionnaire possède encore sa référence. + * L'appelant possède toujours la référence créée par new(). + */ + task_manager_free( + task_manager + ); + + assert(destroy_count == 1); + + assert( + strcmp( + background_task_get_title(task), + "Tâche ajoutée" + ) == 0 + ); + + background_task_unref( + task + ); +} + +/** + * @brief Vérifie qu'une même tâche ne peut pas être ajoutée deux fois. + */ +static void test_task_manager_duplicate(void) +{ + TaskManager *task_manager = NULL; + BackgroundTask *task = NULL; + + GError *error = NULL; + + guint changed_count = 0; + guint destroy_count = 0; + + task_manager = task_manager_new(); + task = background_task_new( + "Tâche unique" + ); + + assert(task_manager != NULL); + assert(task != NULL); + + test_task_manager_install_callback( + task_manager, + &changed_count, + &destroy_count + ); + + assert( + task_manager_add( + task_manager, + task, + &error + ) + ); + + assert(error == NULL); + + assert( + !task_manager_add( + task_manager, + task, + &error + ) + ); + + assert(error != NULL); + + assert( + error->domain == + TASK_MANAGER_ERROR + ); + + assert( + error->code == + TASK_MANAGER_ERROR_ALREADY_ADDED + ); + + g_clear_error( + &error + ); + + assert( + task_manager_get_count( + task_manager + ) == 1 + ); + + /* + * Seul le premier ajout constitue un changement. + */ + assert(changed_count == 1); + + task_manager_free( + task_manager + ); + + assert(destroy_count == 1); + + background_task_unref( + task + ); +} + +/** + * @brief Vérifie le retrait d'une tâche. + */ +static void test_task_manager_remove_task(void) +{ + TaskManager *task_manager = NULL; + BackgroundTask *task = NULL; + + GError *error = NULL; + + guint changed_count = 0; + guint destroy_count = 0; + + task_manager = task_manager_new(); + + task = background_task_new( + "Tâche retirée" + ); + + assert(task_manager != NULL); + assert(task != NULL); + + test_task_manager_install_callback( + task_manager, + &changed_count, + &destroy_count + ); + + assert( + task_manager_add( + task_manager, + task, + &error + ) + ); + + assert(error == NULL); + assert(changed_count == 1); + + assert( + task_manager_remove( + task_manager, + task + ) + ); + + assert( + task_manager_get_count( + task_manager + ) == 0 + ); + + assert(changed_count == 2); + + /* + * Une seconde tentative ne modifie rien. + */ + assert( + !task_manager_remove( + task_manager, + task + ) + ); + + assert(changed_count == 2); + + /* + * La référence de l'appelant reste valide après le retrait. + */ + assert( + strcmp( + background_task_get_title(task), + "Tâche retirée" + ) == 0 + ); + + task_manager_free( + task_manager + ); + + assert(destroy_count == 1); + + background_task_unref( + task + ); +} + +/** + * @brief Worker terminant normalement. + */ +static gboolean test_task_manager_success_worker( + BackgroundTask *task, + GCancellable *cancellable, + gpointer worker_data, + gpointer *result, + GError **error +) +{ + (void) task; + (void) worker_data; + + assert(cancellable != NULL); + assert(result != NULL); + assert(error != NULL); + assert(*error == NULL); + + *result = NULL; + + return TRUE; +} + +/** + * @brief Worker terminant avec une erreur. + */ +static gboolean test_task_manager_failure_worker( + BackgroundTask *task, + GCancellable *cancellable, + gpointer worker_data, + gpointer *result, + GError **error +) +{ + (void) task; + (void) cancellable; + (void) worker_data; + (void) result; + + assert(error != NULL); + assert(*error == NULL); + + g_set_error_literal( + error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Échec volontaire." + ); + + return FALSE; +} + +/** + * @brief Worker suffisamment lent pour tester l'annulation. + */ +static gboolean test_task_manager_wait_worker( + BackgroundTask *task, + GCancellable *cancellable, + gpointer worker_data, + gpointer *result, + GError **error +) +{ + guint step = 0; + + (void) worker_data; + + assert(task != NULL); + assert(cancellable != NULL); + assert(result != NULL); + assert(error != NULL); + assert(*error == NULL); + + for (step = 0; step < 100; step++) + { + if (g_cancellable_set_error_if_cancelled( + cancellable, + error + )) + { + return FALSE; + } + + background_task_report_progress( + task, + (double) step / 100.0, + "Traitement en cours" + ); + + g_usleep( + 10000 + ); + } + + *result = NULL; + + return TRUE; +} + +/** + * @brief Vérifie que seules les tâches terminées sont retirées. + */ +static void test_task_manager_remove_finished_tasks(void) +{ + TaskManager *task_manager = NULL; + + BackgroundTask *pending_task = NULL; + BackgroundTask *completed_task = NULL; + BackgroundTask *failed_task = NULL; + BackgroundTask *cancelled_task = NULL; + BackgroundTask *remaining_task = NULL; + + TestTaskManagerAsyncGroup group = {0}; + + GMainLoop *main_loop = NULL; + GError *error = NULL; + + guint timeout_source_id = 0; + guint changed_count = 0; + guint destroy_count = 0; + + main_loop = g_main_loop_new( + NULL, + FALSE + ); + + assert(main_loop != NULL); + + group.main_loop = main_loop; + group.remaining_tasks = 3; + + task_manager = task_manager_new(); + + pending_task = background_task_new( + "En attente" + ); + + completed_task = background_task_new( + "Terminée" + ); + + failed_task = background_task_new( + "Échouée" + ); + + cancelled_task = background_task_new( + "Annulée" + ); + + assert(task_manager != NULL); + assert(pending_task != NULL); + assert(completed_task != NULL); + assert(failed_task != NULL); + assert(cancelled_task != NULL); + + test_task_manager_install_callback( + task_manager, + &changed_count, + &destroy_count + ); + + assert( + task_manager_add( + task_manager, + pending_task, + &error + ) + ); + + assert( + task_manager_add( + task_manager, + completed_task, + &error + ) + ); + + assert( + task_manager_add( + task_manager, + failed_task, + &error + ) + ); + + assert( + task_manager_add( + task_manager, + cancelled_task, + &error + ) + ); + + assert(error == NULL); + assert(changed_count == 4); + + assert( + background_task_start( + completed_task, + test_task_manager_success_worker, + NULL, + NULL, + NULL, + test_task_manager_group_completed, + &group, + NULL, + &error + ) + ); + + assert( + background_task_start( + failed_task, + test_task_manager_failure_worker, + NULL, + NULL, + NULL, + test_task_manager_group_completed, + &group, + NULL, + &error + ) + ); + + assert( + background_task_start( + cancelled_task, + test_task_manager_wait_worker, + NULL, + NULL, + NULL, + test_task_manager_group_completed, + &group, + NULL, + &error + ) + ); + + assert(error == NULL); + + background_task_cancel( + cancelled_task + ); + + timeout_source_id = g_timeout_add_seconds( + TEST_TASK_MANAGER_TIMEOUT_SECONDS, + test_task_manager_timeout, + main_loop + ); + + assert(timeout_source_id != 0); + + g_main_loop_run( + main_loop + ); + + assert(group.remaining_tasks == 0); + + assert( + g_source_remove( + timeout_source_id + ) + ); + + assert( + background_task_get_state(completed_task) == + BACKGROUND_TASK_STATE_COMPLETED + ); + + assert( + background_task_get_state(failed_task) == + BACKGROUND_TASK_STATE_FAILED + ); + + assert( + background_task_get_state(cancelled_task) == + BACKGROUND_TASK_STATE_CANCELLED + ); + + assert( + background_task_get_state(pending_task) == + BACKGROUND_TASK_STATE_PENDING + ); + + assert( + task_manager_remove_finished( + task_manager + ) == 3 + ); + + assert( + task_manager_get_count( + task_manager + ) == 1 + ); + + /* + * Une seule notification est produite pour le nettoyage groupé. + */ + assert(changed_count == 5); + + remaining_task = task_manager_get_task( + task_manager, + 0 + ); + + assert(remaining_task == pending_task); + + background_task_unref( + remaining_task + ); + + task_manager_free( + task_manager + ); + + assert(destroy_count == 1); + + background_task_unref( + pending_task + ); + + background_task_unref( + completed_task + ); + + background_task_unref( + failed_task + ); + + background_task_unref( + cancelled_task + ); + + g_main_loop_unref( + main_loop + ); +} + +/** + * @brief Vérifie l'annulation de toutes les tâches actives. + */ +static void test_task_manager_cancel_all_tasks(void) +{ + TaskManager *task_manager = NULL; + + BackgroundTask *first_task = NULL; + BackgroundTask *second_task = NULL; + BackgroundTask *pending_task = NULL; + + TestTaskManagerAsyncGroup group = {0}; + + GMainLoop *main_loop = NULL; + GError *error = NULL; + + guint timeout_source_id = 0; + guint changed_count = 0; + guint destroy_count = 0; + + main_loop = g_main_loop_new( + NULL, + FALSE + ); + + assert(main_loop != NULL); + + group.main_loop = main_loop; + group.remaining_tasks = 2; + + task_manager = task_manager_new(); + + first_task = background_task_new( + "Première tâche active" + ); + + second_task = background_task_new( + "Seconde tâche active" + ); + + pending_task = background_task_new( + "Tâche en attente" + ); + + assert(task_manager != NULL); + assert(first_task != NULL); + assert(second_task != NULL); + assert(pending_task != NULL); + + test_task_manager_install_callback( + task_manager, + &changed_count, + &destroy_count + ); + + assert( + task_manager_add( + task_manager, + first_task, + &error + ) + ); + + assert( + task_manager_add( + task_manager, + second_task, + &error + ) + ); + + assert( + task_manager_add( + task_manager, + pending_task, + &error + ) + ); + + assert(error == NULL); + assert(changed_count == 3); + + assert( + background_task_start( + first_task, + test_task_manager_wait_worker, + NULL, + NULL, + NULL, + test_task_manager_group_completed, + &group, + NULL, + &error + ) + ); + + assert( + background_task_start( + second_task, + test_task_manager_wait_worker, + NULL, + NULL, + NULL, + test_task_manager_group_completed, + &group, + NULL, + &error + ) + ); + + assert(error == NULL); + + task_manager_cancel_all( + task_manager + ); + + /* + * Une notification globale supplémentaire signale la demande + * d'annulation. + */ + assert(changed_count == 4); + + timeout_source_id = g_timeout_add_seconds( + TEST_TASK_MANAGER_TIMEOUT_SECONDS, + test_task_manager_timeout, + main_loop + ); + + assert(timeout_source_id != 0); + + g_main_loop_run( + main_loop + ); + + assert(group.remaining_tasks == 0); + + assert( + g_source_remove( + timeout_source_id + ) + ); + + assert( + background_task_get_state(first_task) == + BACKGROUND_TASK_STATE_CANCELLED + ); + + assert( + background_task_get_state(second_task) == + BACKGROUND_TASK_STATE_CANCELLED + ); + + assert( + background_task_get_state(pending_task) == + BACKGROUND_TASK_STATE_PENDING + ); + + assert( + !background_task_is_cancelled( + pending_task + ) + ); + + task_manager_free( + task_manager + ); + + assert(destroy_count == 1); + + background_task_unref( + first_task + ); + + background_task_unref( + second_task + ); + + background_task_unref( + pending_task + ); + + g_main_loop_unref( + main_loop + ); +} + +/** + * @brief Vérifie que le remplacement du callback détruit les anciennes + * données exactement une fois. + */ +static void test_task_manager_replace_callback(void) +{ + TaskManager *task_manager = NULL; + BackgroundTask *task = NULL; + + GError *error = NULL; + + guint first_changed_count = 0; + guint first_destroy_count = 0; + + guint second_changed_count = 0; + guint second_destroy_count = 0; + + task_manager = task_manager_new(); + + assert(task_manager != NULL); + + test_task_manager_install_callback( + task_manager, + &first_changed_count, + &first_destroy_count + ); + + assert(first_destroy_count == 0); + + test_task_manager_install_callback( + task_manager, + &second_changed_count, + &second_destroy_count + ); + + assert(first_destroy_count == 1); + assert(second_destroy_count == 0); + + task = background_task_new( + "Notification du second callback" + ); + + assert(task != NULL); + + assert( + task_manager_add( + task_manager, + task, + &error + ) + ); + + assert(error == NULL); + + assert(first_changed_count == 0); + assert(second_changed_count == 1); + + task_manager_set_changed_callback( + task_manager, + NULL, + NULL, + NULL + ); + + assert(second_destroy_count == 1); + + assert( + task_manager_remove( + task_manager, + task + ) + ); + + /* + * Le callback étant désactivé, le compteur reste inchangé. + */ + assert(second_changed_count == 1); + + task_manager_free( + task_manager + ); + + assert(first_destroy_count == 1); + assert(second_destroy_count == 1); + + background_task_unref( + task + ); +} + +int main(void) +{ + test_task_manager_creation(); + test_task_manager_add(); + test_task_manager_duplicate(); + test_task_manager_remove_task(); + test_task_manager_remove_finished_tasks(); + test_task_manager_cancel_all_tasks(); + test_task_manager_replace_callback(); + + printf( + "TaskManager : tous les tests sont valides.\n" + ); + + return 0; +} diff --git a/tests/test_transaction b/tests/test_transaction deleted file mode 100755 index 3533f197f356319952e8176b0788354d8f1b182e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32760 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 G(fU7t_!_DJ