Intégrer InvestigationSession au cycle de vie GTK
#30
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ticket #029 — Intégrer
InvestigationSessionau cycle de vie GTKContexte
Le ticket #028 a ajouté
InvestigationSession, qui permet d’ouvrir une enquête existante de manière contrôlée.Une session valide possède désormais :
InvestigationProject;Databaseouverte ;InvestigationRecordchargé depuis SQLite.L’application GTK utilise encore l’ancien objet
Investigationpour représenter le dossier sélectionné.Son fonctionnement actuel est approximativement le suivant :
Cette organisation ne conserve pas la connexion SQLite et n’utilise pas les informations persistées dans la table
investigation.Il faut désormais remplacer l’ancien objet détenu par
Applicationpar une véritableInvestigationSession.Objectif
Faire de
InvestigationSessionle contexte actif de l’application.Après la sélection d’un dossier :
InvestigationSession;InvestigationProject;InvestigationTreeModel;L’application ne doit posséder qu’une seule session active à la fois.
Architecture attendue
Principe de remplacement transactionnel
L’ouverture d’une nouvelle enquête doit suivre cet ordre :
En cas d’échec avant le remplacement :
L’application ne doit jamais perdre une enquête déjà ouverte simplement parce qu’une nouvelle sélection est invalide.
Travail à réaliser
1. Remplacer l’ancien objet dans
ApplicationModifier :
La structure privée actuelle contient notamment :
Remplacer le premier champ par :
La structure doit devenir au minimum :
Ne pas exposer cette structure dans le header public.
2. Modifier les dépendances de
application.cSupprimer :
Ajouter :
Conserver les dépendances nécessaires à :
application.cne doit pas inclure directement :et ne doit appeler aucune fonction
sqlite3_*.3. Ouvrir la session après la sélection du dossier
Dans :
remplacer la création de l’ancien objet :
par :
Utiliser des variables temporaires :
Ne jamais écrire directement dans :
avant que toute l’ouverture soit validée.
4. Gérer une sélection annulée
Lorsque :
la fonction doit simplement retourner.
L’enquête déjà ouverte doit rester active.
Aucune session ne doit être fermée.
Aucune erreur ne doit être affichée.
Un message de diagnostic avec
g_print()reste acceptable :5. Gérer l’échec d’ouverture de session
Si :
la fonction doit :
GError;GError;Exemple de diagnostic acceptable :
Le dialogue graphique d’erreur est hors périmètre de ce ticket.
6. Construire l’arborescence depuis la session
Récupérer le projet de la nouvelle session :
avec :
Récupérer ensuite son chemin racine :
avec :
Construire le nouvel arbre avec :
La logique de construction du chemin ne doit pas être dupliquée dans
application.c.7. Gérer l’échec de construction de l’arbre
Si
InvestigationTreeBuilderéchoue après l’ouverture de la session :la fonction doit :
puis retourner.
L’ancienne session et l’ancien arbre doivent rester actifs.
Le message suivant est acceptable :
8. Remplacer les anciens objets uniquement après validation
Lorsque
new_sessionetnew_tree_modelsont tous deux valides :Après le transfert :
Cette remise à
NULLn’est pas obligatoire si la fonction retourne immédiatement, mais elle est recommandée pour rendre la propriété explicite.9. Conserver la connexion SQLite ouverte
Après une ouverture réussie, la session doit rester stockée dans :
Il est interdit de fermer la session à la fin de :
La connexion
Databasedoit rester utilisable pendant toute la durée d’ouverture de l’enquête.10. Ajouter un accesseur interne ou public
Ajouter dans :
la déclaration suivante :
Implémenter dans :
Le pointeur retourné appartient à
Application.Le code appelant ne doit pas fermer cette session.
Cet accesseur servira aux futurs contrôleurs et DAO.
11. Mettre à jour la fenêtre principale
Ajouter dans :
la fonction :
Implémenter dans :
Cette fonction doit :
main_window == NULL;NULLsans planter ;Titre attendu
Lorsque le nom est valide :
Exemple :
Lorsque le nom est absent :
Construire le titre avec GLib :
puis le libérer avec :
Barre d’état attendue
Lorsque l’enquête est ouverte :
Lorsque certaines valeurs sont absentes, utiliser une formulation sûre sans déréférencer
NULL.La barre d’état ne doit pas conserver un pointeur vers une chaîne temporaire.
gtk_label_set_text()copie le texte fourni.12. Récupérer le nom persistant
Dans
application_on_folder_selected(), récupérer :avec :
Utiliser les données du
InvestigationRecord.Ne pas reconstruire le nom à partir du dernier composant du chemin.
13. Mettre à jour la fenêtre après le modèle
Après l’installation de la nouvelle session et du nouvel arbre :
puis :
L’ordre attendu est :
14. Fermer la session dans
application_free()Remplacer :
par :
L’ordre de nettoyage conseillé est :
Puis libérer
GtkApplicationetApplicationcomme actuellement.application_free(NULL)doit rester valide.15. Ne plus utiliser l’ancien objet dans l’application
À la fin du ticket, les symboles suivants ne doivent plus apparaître dans
application.c:Le module historique
investigation.cn’est pas supprimé dans ce ticket.Sa suppression éventuelle sera effectuée séparément après vérification qu’aucun autre composant ne l’utilise.
Tests et validations
16. Tests automatisés existants
Aucun nouveau test GTK automatisé n’est obligatoire dans ce ticket.
Tous les tests existants doivent rester valides :
En particulier :
17. Test manuel d’ouverture valide
Créer ou utiliser une enquête valide.
Lancer :
Sélectionner le dossier racine de l’enquête.
Vérifier :
18. Test manuel d’annulation
Relancer l’application et annuler la sélection.
Vérifier :
19. Test manuel d’un dossier invalide
Sélectionner un dossier qui ne contient pas :
Vérifier :
20. Test manuel de remplacement
Si l’interface permet une seconde sélection pendant la même exécution :
Si une seconde sélection n’est pas encore accessible dans l’interface, cette validation sera complétée lors de l’ajout de l’action « Ouvrir ».
La logique du callback doit néanmoins déjà préserver l’ancienne session.
Gestion de la mémoire
Les propriétaires doivent être clairement définis.
ApplicationpossèdeInvestigationSessionpossèdeVariables temporaires du callback
En cas d’échec :
En cas de succès :
Critères d’acceptation
Applicationpossède unInvestigationSession *.Applicationne possède plus d’Investigation *.investigation_session_open().InvestigationProject.InvestigationRecord.application_free()ferme la session.application_get_session(NULL)retourneNULL.main_window_set_investigation()accepteNULL.application.cn’appelle aucune fonction SQLite.application.c.makeréussit sans warning.make testréussit.git diff --checkne retourne aucune erreur.Audit attendu
La commande suivante ne doit rien afficher :
La commande suivante ne doit rien afficher :
Vérifier la présence de la nouvelle session :
Vérifier la mise à jour de la fenêtre :
Hors périmètre
Ce ticket ne doit pas ajouter :
Investigation.Fichiers principalement concernés
Fichiers utilisés sans modification attendue :
Le
Makefilene devrait pas nécessiter de nouvelle cible, car les sources de production sont détectées automatiquement avec :Résultat attendu
À la fin du ticket, la sélection d’un dossier doit ouvrir une véritable session d’enquête.
L’application doit conserver ensemble :
Le flux final doit être :
Commit attendu
Avant le commit :
Préparer les fichiers :
Contrôler :
Créer le commit :
Puis pousser après validation complète :