From d8242f20ca83fcc7974fb4ef72d3e5ab2659b545 Mon Sep 17 00:00:00 2001 From: grayTerminal-sh Date: Sun, 12 Jul 2026 16:15:51 +0200 Subject: [PATCH] feat(core): create investigation module --- .../include/core/investigation.h | 59 ++++++++ labfy-investigation/labfy-investigation | Bin 27960 -> 30712 bytes labfy-investigation/src/core/application.c | 30 ++-- labfy-investigation/src/core/investigation.c | 131 ++++++++++++++++++ 4 files changed, 212 insertions(+), 8 deletions(-) create mode 100644 labfy-investigation/include/core/investigation.h create mode 100644 labfy-investigation/src/core/investigation.c diff --git a/labfy-investigation/include/core/investigation.h b/labfy-investigation/include/core/investigation.h new file mode 100644 index 0000000..4757acd --- /dev/null +++ b/labfy-investigation/include/core/investigation.h @@ -0,0 +1,59 @@ +/****************************************************************************** + * @file investigation.h + * @brief Interface publique du module Investigation. + ******************************************************************************/ + +#ifndef LABFY_INVESTIGATION_INVESTIGATION_H +#define LABFY_INVESTIGATION_INVESTIGATION_H + +/** + * @brief Représentation opaque d'une enquête. + * + * La structure réelle est définie dans investigation.c. + * Les autres modules peuvent manipuler un pointeur vers Investigation, + * mais ne peuvent pas accéder directement à ses champs internes. + */ +typedef struct Investigation Investigation; + +/** + * @brief Crée une nouvelle enquête à partir d'un dossier racine. + * + * @param root_path Chemin du dossier racine de l'enquête. + * + * @return Une nouvelle enquête, ou NULL si le chemin est invalide + * ou si l'allocation mémoire échoue. + */ +Investigation *investigation_new(const char *root_path); + +/** + * @brief Libère toutes les ressources associées à une enquête. + * + * Cette fonction accepte NULL. + * + * @param investigation Enquête à libérer. + */ +void investigation_free(Investigation *investigation); + +/** + * @brief Retourne le chemin racine de l'enquête. + * + * @param investigation Enquête à consulter. + * + * @return Le chemin racine en lecture seule, ou NULL si l'enquête est invalide. + */ +const char *investigation_get_root_path( + const Investigation *investigation +); + +/** + * @brief Retourne le chemin de la base de données de l'enquête. + * + * @param investigation Enquête à consulter. + * + * @return Le chemin de la base en lecture seule, ou NULL si l'enquête est invalide. + */ +const char *investigation_get_database_path( + const Investigation *investigation +); + +#endif diff --git a/labfy-investigation/labfy-investigation b/labfy-investigation/labfy-investigation index 986bd25c8dc4b390c585444b997132b81cbd60e1..ad6da347005c606b1198d2ec3e68cac632a3f5b4 100755 GIT binary patch literal 30712 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 diff --git a/labfy-investigation/src/core/application.c b/labfy-investigation/src/core/application.c index 78fd0c1..843b021 100644 --- a/labfy-investigation/src/core/application.c +++ b/labfy-investigation/src/core/application.c @@ -5,6 +5,7 @@ #include "core/application.h" #include "views/folder_dialog.h" +#include "core/investigation.h" #include @@ -47,20 +48,34 @@ static void application_on_folder_selected( ) { GtkWindow *window = GTK_WINDOW(user_data); + Investigation *investigation = NULL; + const char *root_path = NULL; + const char *database_path = NULL; if (folder_path == NULL) { - gtk_window_set_title( - window, - "Labfy Investigation — aucune enquête sélectionnée" - ); - + g_print("Sélection annulée.\n"); return; } - gtk_window_set_title(window, folder_path); -} + investigation = investigation_new(folder_path); + if (investigation == NULL) + { + g_warning("Impossible de créer l'enquête à partir du dossier sélectionné."); + return; + } + + root_path = investigation_get_root_path(investigation); + database_path = investigation_get_database_path(investigation); + + g_print("Dossier racine : %s\n", root_path); + g_print("Base de données : %s\n", database_path); + + investigation_free(investigation); + + gtk_window_set_title(window, "Labfy Investigation"); +} static void application_on_activate(GtkApplication *gtk_application, gpointer user_data) { @@ -142,4 +157,3 @@ void application_free(Application *application) g_free(application); } - diff --git a/labfy-investigation/src/core/investigation.c b/labfy-investigation/src/core/investigation.c new file mode 100644 index 0000000..87f4643 --- /dev/null +++ b/labfy-investigation/src/core/investigation.c @@ -0,0 +1,131 @@ +/****************************************************************************** + * @file investigation.c + * @brief Implémentation du module représentant une enquête. + ******************************************************************************/ + +#include "core/investigation.h" + +#include + +#include + +/** + * @brief Nom du dossier contenant la base de données d'une enquête. + */ +#define INVESTIGATION_DATABASE_DIRECTORY "00_BaseDeDonnees" + +/** + * @brief Nom du fichier SQLite d'une enquête. + */ +#define INVESTIGATION_DATABASE_FILENAME "Enquete.sqlite" + +/** + * @struct Investigation + * @brief Représentation interne d'une enquête. + * + * Cette structure est privée au module. Les autres fichiers connaissent + * uniquement le type opaque déclaré dans investigation.h. + */ +struct Investigation +{ + char *root_path; + char *database_path; +}; + +/** + * @brief Vérifie qu'un chemin peut servir de dossier racine à une enquête. + * + * @param root_path Chemin à vérifier. + * + * @return true si le chemin désigne un dossier existant, sinon false. + */ +static bool investigation_root_path_is_valid(const char *root_path) +{ + if (root_path == NULL) + { + return false; + } + + if (root_path[0] == '\0') + { + return false; + } + + if (!g_file_test(root_path, G_FILE_TEST_IS_DIR)) + { + return false; + } + + return true; +} + +Investigation *investigation_new(const char *root_path) +{ + Investigation *investigation = NULL; + + if (!investigation_root_path_is_valid(root_path)) + { + return NULL; + } + + investigation = g_new0(Investigation, 1); + + investigation->root_path = g_canonicalize_filename(root_path, NULL); + + if (investigation->root_path == NULL) + { + investigation_free(investigation); + return NULL; + } + + investigation->database_path = g_build_filename( + investigation->root_path, + INVESTIGATION_DATABASE_DIRECTORY, + INVESTIGATION_DATABASE_FILENAME, + NULL + ); + + if (investigation->database_path == NULL) + { + investigation_free(investigation); + return NULL; + } + + return investigation; +} + +void investigation_free(Investigation *investigation) +{ + if (investigation == NULL) + { + return; + } + + g_free(investigation->database_path); + g_free(investigation->root_path); + g_free(investigation); +} + +const char *investigation_get_root_path( + const Investigation *investigation +) +{ + if (investigation == NULL) + { + return NULL; + } + + return investigation->root_path; +} + +const char *investigation_get_database_path( + const Investigation *investigation +) +{ + if (investigation == NULL) + { + return NULL; + } + + return investigation->database_path; +}