From 68a624f3983bae99ac00215b6533f6c3e9802b04 Mon Sep 17 00:00:00 2001 From: grayTerminal-sh Date: Tue, 14 Jul 2026 17:16:21 +0200 Subject: [PATCH] feat(core): add path to investigation nodes --- docs/tickets/closed/TICKET-017.md | 241 ++++++++++++++++++++++++++ include/core/investigation_node.h | 68 +++++--- labfy-investigation | Bin 97632 -> 98032 bytes src/core/investigation_node.c | 30 +++- src/core/investigation_tree_builder.c | 49 ++++-- tests/test_investigation_node | Bin 17496 -> 25824 bytes tests/test_investigation_node.c | 33 ++++ tests/test_investigation_tree_builder | Bin 22744 -> 22848 bytes tests/test_investigation_tree_model | Bin 17312 -> 17368 bytes tests/test_investigation_tree_model.c | 8 + 10 files changed, 388 insertions(+), 41 deletions(-) create mode 100644 docs/tickets/closed/TICKET-017.md diff --git a/docs/tickets/closed/TICKET-017.md b/docs/tickets/closed/TICKET-017.md new file mode 100644 index 0000000..e2c234f --- /dev/null +++ b/docs/tickets/closed/TICKET-017.md @@ -0,0 +1,241 @@ +# Ticket #017 + +## Titre + +Ajouter le chemin complet à `InvestigationNode`. + +--- + +## Objectif + +Faire évoluer `InvestigationNode` afin que chaque nœud connaisse le chemin +complet qu'il représente sur le système de fichiers. + +Cette information permettra ensuite au `Workspace` et aux futurs visualiseurs +de savoir exactement quel fichier ou dossier est sélectionné. + +--- + +## Responsabilités + +Le module `InvestigationNode` doit : + +- mémoriser un chemin complet ; +- posséder sa propre copie de ce chemin ; +- exposer le chemin en lecture seule ; +- libérer correctement cette chaîne lors de sa destruction. + +Le module `InvestigationTreeBuilder` doit : + +- fournir le chemin complet lors de la création de chaque nœud ; +- construire correctement le chemin des enfants ; +- ne jamais reconstruire le chemin dans la GUI. + +--- + +## Architecture + +```text +InvestigationTreeBuilder + │ + ▼ +InvestigationNode +├── name +├── path +├── type +├── parent +└── children +``` + +Le chemin appartient au Core. + +La couche graphique ne fait que le lire. + +--- + +## Fichiers concernés + +```text +include/core/investigation_node.h +src/core/investigation_node.c + +src/core/investigation_tree_builder.c + +tests/test_investigation_node.c +tests/test_investigation_tree_builder.c +``` + +Aucune modification graphique dans ce ticket. + +--- + +## API publique à faire évoluer + +Le constructeur devient : + +```c +InvestigationNode *investigation_node_new( + const char *name, + const char *path, + InvestigationNodeType type +); +``` + +Un nouveau getter est ajouté : + +```c +const char *investigation_node_get_path( + const InvestigationNode *node +); +``` + +--- + +## Principe de propriété + +Le nœud copie le chemin reçu avec une allocation dédiée. + +Après : + +```c +node = investigation_node_new( + "Enquete.sqlite", + "/home/fy59/Enquetes/Test/00_BaseDeDonnees/Enquete.sqlite", + INVESTIGATION_NODE_FILE +); +``` + +le code appelant peut modifier ou libérer ses propres chaînes. + +Le nœud reste propriétaire de ses copies internes. + +--- + +## Structure interne attendue + +```c +struct InvestigationNode +{ + char *name; + char *path; + InvestigationNodeType type; + InvestigationNode *parent; + GPtrArray *children; +}; +``` + +La structure reste opaque. + +--- + +## Comportement attendu + +Pour le dossier racine : + +```text +Nom : +Test + +Chemin : +/home/fy59/Enquetes/Test +``` + +Pour un fichier enfant : + +```text +Nom : +Enquete.sqlite + +Chemin : +/home/fy59/Enquetes/Test/00_BaseDeDonnees/Enquete.sqlite +``` + +--- + +## Règles de validation + +Le constructeur doit refuser : + +- `name == NULL` ; +- un nom vide ; +- `path == NULL` ; +- un chemin vide. + +Le getter doit retourner : + +```c +NULL +``` + +si le nœud vaut `NULL`. + +--- + +## Hors périmètre + +Ce ticket ne doit pas : + +- afficher le chemin dans le `Workspace` ; +- ouvrir un fichier ; +- normaliser les permissions ; +- résoudre les liens symboliques ; +- calculer un chemin relatif ; +- modifier le système de fichiers ; +- ajouter des métadonnées. + +--- + +## Contraintes techniques + +- C17 ; +- GLib autorisée ; +- aucune dépendance GTK ; +- structure opaque ; +- aucun état global ; +- documentation Doxygen ; +- compilation sans warning ; +- aucune fuite mémoire. + +--- + +## Critères d'acceptation + +- [ ] Le projet compile sans warning. +- [ ] `InvestigationNode` possède un chemin. +- [ ] Le chemin est copié. +- [ ] Le getter retourne le bon chemin. +- [ ] Les chemins racine et enfants sont corrects. +- [ ] Les noms invalides sont refusés. +- [ ] Les chemins invalides sont refusés. +- [ ] Le builder construit correctement tous les chemins. +- [ ] Tous les tests existants sont adaptés. +- [ ] `make test` reste entièrement valide. +- [ ] Aucun code GTK n'est modifié. + +--- + +## Tests + +### InvestigationNode + +- créer un nœud avec un chemin valide ; +- lire le chemin ; +- tester `path == NULL` ; +- tester un chemin vide ; +- vérifier que la chaîne est copiée ; +- tester `investigation_node_get_path(NULL)`. + +### InvestigationTreeBuilder + +- vérifier le chemin de la racine ; +- vérifier le chemin de `DirectoryA` ; +- vérifier le chemin de `FileA.txt` ; +- vérifier le chemin de `RootFile.md`. + +--- + +## Commit attendu + +```text +feat(core): add path to investigation nodes +``` diff --git a/include/core/investigation_node.h b/include/core/investigation_node.h index 794fe34..38b3890 100644 --- a/include/core/investigation_node.h +++ b/include/core/investigation_node.h @@ -6,21 +6,16 @@ #ifndef LABFY_INVESTIGATION_INVESTIGATION_NODE_H #define LABFY_INVESTIGATION_INVESTIGATION_NODE_H - #include #include /** - * @brief Représentation opaque d'un nœud d'enquête. - * - * La structure réelle est définie dans investigation_node.c. - * Les autres modules manipulent uniquement un pointeur vers - * InvestigationNode. + * @brief Représentation opaque d'un nœud. */ typedef struct InvestigationNode InvestigationNode; /** - * @brief Type d'un nœud de l'arborescence. + * @brief Type d'un nœud. */ typedef enum { @@ -29,24 +24,26 @@ typedef enum } InvestigationNodeType; /** - * @brief Crée un nouveau nœud d'enquête. + * @brief Crée un nouveau nœud. * - * Le nom fourni est copié. Le code appelant peut donc modifier ou libérer - * sa chaîne après l'appel sans affecter le nœud. + * Le nom et le chemin sont copiés. + * Le code appelant peut donc modifier ou libérer ses chaînes après l'appel. * * @param name Nom du fichier ou du dossier. + * @param path Chemin complet du fichier ou du dossier. * @param type Type du nœud. * - * @return Un nouveau nœud, ou NULL si le nom est invalide ou si la création - * échoue. + * @return Un nouveau nœud, ou NULL si le nom ou le chemin est invalide, + * ou si une allocation échoue. */ InvestigationNode *investigation_node_new( const char *name, + const char *path, InvestigationNodeType type ); /** - * @brief Libère les ressources associées à un nœud. + * @brief Libère un nœud et tous ses enfants. * * Cette fonction accepte NULL. * @@ -57,21 +54,35 @@ void investigation_node_free( ); /** - * @brief Retourne le nom du nœud. + * @brief Retourne le nom d'un nœud. * - * La chaîne retournée appartient au nœud et ne doit pas être modifiée - * ni libérée par le code appelant. + * La chaîne retournée appartient au nœud. + * Elle ne doit être ni modifiée ni libérée. * * @param node Nœud à consulter. * - * @return Le nom en lecture seule, ou NULL si node vaut NULL. + * @return Le nom du nœud, ou NULL si node vaut NULL. */ const char *investigation_node_get_name( const InvestigationNode *node ); /** - * @brief Retourne le type du nœud. + * @brief Retourne le chemin complet d'un nœud. + * + * La chaîne retournée appartient au nœud. + * Elle ne doit être ni modifiée ni libérée. + * + * @param node Nœud à consulter. + * + * @return Le chemin complet, ou NULL si node vaut NULL. + */ +const char *investigation_node_get_path( + const InvestigationNode *node +); + +/** + * @brief Retourne le type d'un nœud. * * @param node Nœud à consulter. * @@ -86,7 +97,10 @@ InvestigationNodeType investigation_node_get_type( * * En cas de succès, le parent devient propriétaire de l'enfant. * - * @return true si l'ajout a réussi. + * @param parent Nœud parent. + * @param child Nœud enfant. + * + * @return true si l'ajout a réussi, sinon false. */ bool investigation_node_add_child( InvestigationNode *parent, @@ -94,9 +108,12 @@ bool investigation_node_add_child( ); /** - * @brief Retourne un enfant. + * @brief Retourne un enfant par son index. * - * @return L'enfant ou NULL. + * @param node Nœud parent. + * @param index Index de l'enfant. + * + * @return L'enfant demandé, ou NULL si l'index est invalide. */ const InvestigationNode *investigation_node_get_child( const InvestigationNode *node, @@ -105,6 +122,10 @@ const InvestigationNode *investigation_node_get_child( /** * @brief Retourne le nombre d'enfants. + * + * @param node Nœud à consulter. + * + * @return Le nombre d'enfants, ou 0 si node vaut NULL. */ size_t investigation_node_get_children_count( const InvestigationNode *node @@ -112,6 +133,11 @@ size_t investigation_node_get_children_count( /** * @brief Retourne le parent d'un nœud. + * + * @param node Nœud à consulter. + * + * @return Le parent, ou NULL si le nœud n'a pas de parent + * ou si node vaut NULL. */ const InvestigationNode *investigation_node_get_parent( const InvestigationNode *node diff --git a/labfy-investigation b/labfy-investigation index f51fc01cf9ef050e9f61c87ec2fb2905bdb40766..5c29528ee908d7d1f72653fd07d5a1c03229956c 100755 GIT binary patch delta 35363 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 delta 34428 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 z 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 Z6&rsQlqsh7X2lu-spath = g_strdup(path); + + if (node->path == NULL) + { + investigation_node_free(node); + return NULL; + } + node->children = g_ptr_array_new_with_free_func( (GDestroyNotify) investigation_node_free ); @@ -81,11 +96,24 @@ void investigation_node_free( { g_ptr_array_free(node->children, TRUE); } - + + g_free(node->path); g_free(node->name); g_free(node); } +const char *investigation_node_get_path( + const InvestigationNode *node +) +{ + if (node == NULL) + { + return NULL; + } + + return node->path; +} + const char *investigation_node_get_name( const InvestigationNode *node ) diff --git a/src/core/investigation_tree_builder.c b/src/core/investigation_tree_builder.c index 3c76f54..e2e36d1 100644 --- a/src/core/investigation_tree_builder.c +++ b/src/core/investigation_tree_builder.c @@ -64,6 +64,7 @@ static bool investigation_tree_builder_build_children( GFileType child_file_type; GFile *child_file = NULL; InvestigationNode *child_node = NULL; + char *child_path = NULL; InvestigationNodeType child_node_type; file_info = g_file_enumerator_next_file( @@ -118,12 +119,12 @@ static bool investigation_tree_builder_build_children( child_node_type = INVESTIGATION_NODE_FILE; } - child_node = investigation_node_new( - child_name, - child_node_type + child_file = g_file_get_child( + directory, + child_name ); - if (child_node == NULL) + if (child_file == NULL) { success = false; g_object_unref(file_info); @@ -131,6 +132,26 @@ static bool investigation_tree_builder_build_children( break; } + child_path = g_file_get_path(child_file); + + if (child_path == NULL) + { + success = false; + g_object_unref(child_file); + g_object_unref(file_info); + file_info = NULL; + break; + } + + child_node = investigation_node_new( + child_name, + child_path, + child_node_type + ); + + g_free(child_path); + child_path = NULL; + /* * En cas de succès, parent_node devient propriétaire de child_node. */ @@ -138,6 +159,7 @@ static bool investigation_tree_builder_build_children( { investigation_node_free(child_node); success = false; + g_object_unref(child_file); g_object_unref(file_info); file_info = NULL; break; @@ -148,29 +170,17 @@ static bool investigation_tree_builder_build_children( */ if (child_node_type == INVESTIGATION_NODE_DIRECTORY) { - child_file = g_file_get_child( - directory, - child_name - ); - - if (child_file == NULL) - { - success = false; - g_object_unref(file_info); - file_info = NULL; - break; - } - success = investigation_tree_builder_build_children( child_file, child_node, error ); - - g_object_unref(child_file); } + g_object_unref(child_file); g_object_unref(file_info); + + child_file = NULL; file_info = NULL; } @@ -234,6 +244,7 @@ InvestigationTreeModel *investigation_tree_builder_build( root_node = investigation_node_new( root_name, + root_path, INVESTIGATION_NODE_DIRECTORY ); diff --git a/tests/test_investigation_node b/tests/test_investigation_node index 9cb1d29e24fcecf36293296044ed6dd59953fec5..b7614efa3254dd41638e0c2b0d87f582c089bf9e 100755 GIT binary patch literal 25824 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 literal 17496 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 diff --git a/tests/test_investigation_node.c b/tests/test_investigation_node.c index 07a3557..6aeb76f 100644 --- a/tests/test_investigation_node.c +++ b/tests/test_investigation_node.c @@ -15,6 +15,7 @@ static void test_directory_node(void) node = investigation_node_new( "01_Preuves_Originales", + "/test/01_Preuves_Originales", INVESTIGATION_NODE_DIRECTORY ); @@ -39,6 +40,7 @@ static void test_file_node(void) node = investigation_node_new( "Chronologie.md", + "/test/Chronologie.md", INVESTIGATION_NODE_FILE ); @@ -64,16 +66,19 @@ static void test_add_children(void) root = investigation_node_new( "Template", + "/test/Template", INVESTIGATION_NODE_DIRECTORY ); database_directory = investigation_node_new( "00_BaseDeDonnees", + "/test/Template/00_BaseDeDonnees", INVESTIGATION_NODE_DIRECTORY ); database_file = investigation_node_new( "Enquete.sqlite", + "/test/Template/00_BaseDeDonnees/Enquete.sqlite", INVESTIGATION_NODE_FILE ); @@ -131,21 +136,25 @@ static void test_invalid_additions(void) directory = investigation_node_new( "Directory", + "/test/Directory", INVESTIGATION_NODE_DIRECTORY ); file = investigation_node_new( "File.txt", + "/test/File.txt", INVESTIGATION_NODE_FILE ); child = investigation_node_new( "Child", + "/test/Directory/Child", INVESTIGATION_NODE_DIRECTORY ); second_parent = investigation_node_new( "SecondParent", + "/test/SecondParent", INVESTIGATION_NODE_DIRECTORY ); @@ -177,6 +186,7 @@ static void test_invalid_index(void) node = investigation_node_new( "Template", + "/test/Template", INVESTIGATION_NODE_DIRECTORY ); @@ -194,12 +204,33 @@ static void test_invalid_names(void) assert( investigation_node_new( NULL, + "/test/file", INVESTIGATION_NODE_FILE ) == NULL ); assert( investigation_node_new( + "", + "/test/file", + INVESTIGATION_NODE_FILE + ) == NULL + ); +} + +static void test_invalid_paths(void) +{ + assert( + investigation_node_new( + "File.txt", + NULL, + INVESTIGATION_NODE_FILE + ) == NULL + ); + + assert( + investigation_node_new( + "File.txt", "", INVESTIGATION_NODE_FILE ) == NULL @@ -211,6 +242,7 @@ static void test_null_behaviour(void) assert(investigation_node_get_name(NULL) == NULL); assert(investigation_node_get_children_count(NULL) == 0); assert(investigation_node_get_parent(NULL) == NULL); + assert(investigation_node_get_path(NULL) == NULL); investigation_node_free(NULL); } @@ -224,6 +256,7 @@ int main(void) test_invalid_index(); test_invalid_names(); test_null_behaviour(); + test_invalid_paths(); printf( "InvestigationNode : tous les tests de hiérarchie sont valides.\n" diff --git a/tests/test_investigation_tree_builder b/tests/test_investigation_tree_builder index fd9d9016dee9be0479cb68587ac4f6ce7b70868d..d6cd4844176447be928bb7a3bda21977ee4298de 100755 GIT binary patch delta 6694 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 delta 6232 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 VmroQ=FR*iExrW#tpfl6 diff --git a/tests/test_investigation_tree_model b/tests/test_investigation_tree_model index a439b7694364b47c544a14c3cee1f1c986b8223c..2c823e18e59b54d65116865487c80830d8f2eebc 100755 GIT binary patch delta 2798 zcmZuzYfKbZ7@Zkj3$n00_JNYJtjo(5Sg4>949i11HY9~ADOwF;Bq7FEb*Z+IAO#;= zYD#;P)~adzQCm|fDc!`XHHuohCD8^G)6&M+nm#g0wOCtSDKb6xvAbY9$;`R;yXTzy z-S6I=*~5F}kv(#6u3{^HYtHq!lLm=hCk-T7E{JnQ^R6qJJS(3`8qVU~5Rx<{C)t$E zqhTb^E7|`;_9{7fY^ZeD2BZl^2#C z*z8^H>x-x`Dz*r6+ceo>v?oZCx-TjhaEdyr-fvW|U&~WybCITYwQEvamb%aUAdwPF z44j`s!F%OYI+OUd1(Uk2_J9xV!6>F3gLaH-zu?+SMrslDhyt{BN$NnuuRVIi#ACEQ z0|msy0f+-!+`+}YTzplConqp1TpOU;fe5NSk119#)>o?cJ8cYvU4tIFgc9zwm^*z0 z=%9Jf-JtSqQ>>l|S;=9m55rcYtPCX+@sRF|I>I0* zD^!7ra2fg|C8>AlLWAo4^(=-ZZ3zOZ@OhK_?BqT}V)7bcGXNW|IX6Y~BG=S%%|)T< zP=%-+qTW?g<}08H@PKv_%h9&zcwEB+>;0U`{aOxGCun+{sCNDCR=w>bs<&;}+i*$s zFVg5BwsJ)B%)s#&Njxrf54OcI&CN)e?tfSNFdrPAHb|9ca`8ATmGJ z?U3fwnPoF5siy(Qy~-{a_7H=*Sc8*{CeZPohD+W$mJP|YrZgpXU*xF=)E+k#ddy(4 z&KbH~>M%ZzDg1*dxUO~ubWghKKhHXxXi&Z1Qrgd;jZ$Z-M$oU-kCQv8&Xi+xAdwF+ z!z z;fZoLpjvgdVA|-T{4Apv9uk{nwwcvKNS+STNS!53wv%<1ylLac(D+e{Q?`-ImO`a7 zKqf8KO4=iq^@2cXHOTtdgHYBMCj1Q+CI6mBXHAU%1fj!ahi(s4Sg~+AovA%<>NU z#!bdOa$DDjfqU=p)8F}rt_RSsxU1_nY+pZcKJYBC5vT#T1GDbw`hH;KU(f-az!6|I zFaTTwwBfz00p|m2{)Qg-GH|;hS)_N+*pI+1;0a*WeHak0BPZ=^q{KcdH8Cb+A~|u> z*NQ}j966btNR*wc$^_GHrP>%BaZ-+tF-Y{~y#sd!Nt&G@ZzM%{Hj(<-8I`SLy1o!8 zNg>7jkYWPiU0BkOz|gqz12trh>Cn}XdgrXDa@HDfT4U)98A9L{f5`fR?qf__CYWs_5``^#DJz_@{1mJ%eB0}Whh z9Ha+8MT(d9r0~Ed5l=*#l2CJvw`)0xh zKAvYR;>mP{OR{MTD||!bgl`4AYDIkgV~(vN9wRD}C-@tD^`#REDK4`{($|l#cEMGJ zxFRBb_VS+;<@*?-R20MoH@(kB$|@EsszP3?C`kIxe?D@qqA*EwaOWVdB(l3OZpuHu zGIwcg_#fvh?s>-WKTSwUQDlm5*zLl>iY7{RY3$BYZn%|HR?myQSH^o!kjjM_{{pJ` BJjeh5 delta 2414 zcmZuz4Qx|Y6n^iH{;bliU0HuN;@Y*P8_F1C8v-*c%<03R8HVXJ;v{AS5F;5|lrYi& zL#%UVa)}|h7}P`^qHZ<;GI0Y0$B#i4!$6%137SU`86a53p;<3xZzCXo)4_a-<_Hm&kJc-;T>m)F*(J<_qu z{l-ttv7IU9R&tQgi?&-4gEvi*dYD#;_Nl+g3@cS-!&+5p3@WXeUFl$2ODu>|S`GOO zqW#_3BEI65rYS9mhxVOux^@WKA+BxY+T&JTt1*B!M`%q<8)>N=Vqznf4HL&9j&t!$ zF5b+=148T<;$#2n6UUi$Ct=zHD6d+N`c{daQil<+abE*#;gVi^iNZ5=h)iq?lxU<+ zT{kAxI;0Y+Zmx20)n1{xU(7$Bi}c#BrbtrTk#DM%=nAjSf!rsgFk>(bMXSur;@g1cY-o<3ru61FSz1<8i=L(-bM&D{P8BnD-lV@| z1{~Wk@r88m)+y026gLvAlo7cX zPv2jJ=25xCHLn<6JMl<0;banK%@L}1+4|yojf3=@;C-TwX9d58E-rC-UWeBvWl7J6 z1ubBU?)_M3{bDU@g!d5LU*ei}RCt@jjH4^{hn~}OSI&zp=R6DkCRlfCMLk6#XQAL1 z-H~m+;A3Jn@V)db{DNLf0)E&+Ff2?zw6tB z-YB1HZ_DM$MzM^}3{SO;`2wjAm!>Aae7eFjtjRAPNa?h3j+l8)At9=P&Z;O)U0TW$ PK1Eko%#eF&S4HSQstm#S diff --git a/tests/test_investigation_tree_model.c b/tests/test_investigation_tree_model.c index 5a295e4..e918aea 100644 --- a/tests/test_investigation_tree_model.c +++ b/tests/test_investigation_tree_model.c @@ -21,6 +21,7 @@ static void test_tree_model_creation(void) root_node = investigation_node_new( "Template", + "/test/Template", INVESTIGATION_NODE_DIRECTORY ); @@ -41,6 +42,13 @@ static void test_tree_model_creation(void) ) == 0 ); + assert( + strcmp( + investigation_node_get_path(returned_node), + "/test/Template" + ) == 0 + ); + assert( investigation_node_get_type(returned_node) == INVESTIGATION_NODE_DIRECTORY