4.9 KiB
Ticket #010
Titre
Construire l'arborescence d'une enquête depuis le système de fichiers.
Objectif
Créer le module InvestigationTreeBuilder.
Ce module doit parcourir récursivement le dossier racine d'une enquête et
construire un InvestigationTreeModel représentant son contenu.
Responsabilités
Le module InvestigationTreeBuilder doit :
- recevoir le chemin racine d'une enquête ;
- vérifier que ce chemin désigne un dossier existant ;
- créer le nœud racine ;
- parcourir récursivement les dossiers ;
- créer un
InvestigationNodepour chaque dossier ; - créer un
InvestigationNodepour chaque fichier ; - assembler les relations parent/enfants ;
- retourner un
InvestigationTreeModelcomplet ; - nettoyer toutes les ressources en cas d'erreur.
Hors périmètre
Ce ticket ne doit pas :
- afficher l'arborescence avec GTK ;
- modifier le système de fichiers ;
- créer ou supprimer des fichiers ;
- trier les éléments ;
- filtrer les fichiers cachés ;
- surveiller les changements du disque ;
- suivre les liens symboliques ;
- communiquer avec SQLite.
Architecture
Investigation
│
▼
InvestigationTreeBuilder
│
▼
InvestigationTreeModel
│
▼
InvestigationNode
Le module appartient à la couche core.
Il peut utiliser GLib et GIO, mais ne doit jamais dépendre de GTK.
Fichiers concernés
include/core/investigation_tree_builder.h
src/core/investigation_tree_builder.c
Les tests seront placés dans :
tests/test_investigation_tree_builder.c
Interface publique attendue
InvestigationTreeModel *investigation_tree_builder_build(
const char *root_path
);
Principe de propriété
En cas de succès, la fonction retourne un nouveau
InvestigationTreeModel.
Le code appelant devient propriétaire du modèle retourné et doit le libérer avec :
investigation_tree_model_free(tree_model);
En cas d'échec, la fonction retourne NULL et doit avoir libéré toutes les
ressources créées pendant la construction.
Comportement attendu
À partir de :
Enquete_Test/
├── 00_BaseDeDonnees/
│ └── Enquete.sqlite
├── 01_Preuves_Originales/
│ ├── Captures_Ecran/
│ └── Emails/
└── README.md
le module doit construire en mémoire :
Enquete_Test
├── 00_BaseDeDonnees
│ └── Enquete.sqlite
├── 01_Preuves_Originales
│ ├── Captures_Ecran
│ └── Emails
└── README.md
Gestion des liens symboliques
Les liens symboliques ne sont pas suivis.
Cette règle évite :
- les boucles récursives ;
- la sortie involontaire du dossier d'enquête ;
- l'analyse de fichiers extérieurs à l'enquête.
Leur prise en charge éventuelle fera l'objet d'un ticket distinct.
Dépendances
- C17 ;
- GLib ;
- GIO.
Aucune dépendance GTK ou SQLite.
Contraintes techniques
- aucune variable globale ;
- aucune modification du système de fichiers ;
- parcours récursif ;
- utilisation de
GFileetGFileEnumerator; - libération correcte des
GObjectavecg_object_unref(); - respect de la règle « le propriétaire détruit » ;
- documentation Doxygen ;
- compilation sans warning ;
- aucune fuite mémoire.
Cas à gérer
- chemin valide ;
- chemin relatif ;
- chemin
NULL; - chemin vide ;
- chemin inexistant ;
- chemin désignant un fichier ;
- dossier vide ;
- plusieurs niveaux de sous-dossiers ;
- fichiers et dossiers mélangés ;
- erreur rencontrée pendant le parcours.
Critères d'acceptation
- Le projet compile sans warning.
- Un dossier valide produit un modèle.
- Le nom du dossier racine est correct.
- Les dossiers produisent des nœuds de type
DIRECTORY. - Les fichiers produisent des nœuds de type
FILE. - Les relations parent/enfants sont correctes.
- Plusieurs niveaux de profondeur sont pris en charge.
- Un dossier vide est pris en charge.
- Un chemin invalide retourne
NULL. - Les liens symboliques ne sont pas suivis.
- Toutes les ressources sont libérées en cas d'erreur.
- Aucun code GTK.
- Aucun code SQLite.
make testexécute le nouveau test.
Tests
Le test doit créer une arborescence temporaire isolée :
TestCase/
├── DirectoryA/
│ └── FileA.txt
├── DirectoryB/
└── RootFile.md
Il doit vérifier :
- le nom du nœud racine ;
- le nombre d'enfants de la racine ;
- la présence des deux dossiers ;
- la présence du fichier racine ;
- la présence de
FileA.txtdansDirectoryA; - le type de chaque nœud ;
- le parent de chaque enfant ;
- la gestion d'un dossier vide ;
- les chemins invalides ;
- la destruction complète du modèle.
Commit attendu
feat(core): build investigation tree from filesystem