refactor(core): centralize investigation loading
This commit is contained in:
parent
2e08253aca
commit
9ee7ee61c1
1 changed files with 244 additions and 165 deletions
|
|
@ -22,6 +22,35 @@
|
||||||
*/
|
*/
|
||||||
#define APPLICATION_ID "com.labfytools.investigation"
|
#define APPLICATION_ID "com.labfytools.investigation"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Erreurs produites lors du chargement d'une enquête.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
APPLICATION_OPEN_ERROR_INVALID_ARGUMENT,
|
||||||
|
APPLICATION_OPEN_ERROR_INVALID_PROJECT,
|
||||||
|
APPLICATION_OPEN_ERROR_TREE_BUILD,
|
||||||
|
APPLICATION_OPEN_ERROR_INSTALL
|
||||||
|
} ApplicationOpenError;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Domaine d'erreur du chargement d'une enquête.
|
||||||
|
*/
|
||||||
|
#define APPLICATION_OPEN_ERROR \
|
||||||
|
application_open_error_quark()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Retourne le domaine d'erreur du chargement d'une enquête.
|
||||||
|
*
|
||||||
|
* @return Quark GLib du domaine d'erreur.
|
||||||
|
*/
|
||||||
|
static GQuark application_open_error_quark(void)
|
||||||
|
{
|
||||||
|
return g_quark_from_static_string(
|
||||||
|
"labfy-investigation-application-open-error"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief État interne de l'application.
|
* @brief État interne de l'application.
|
||||||
*
|
*
|
||||||
|
|
@ -129,6 +158,197 @@ static gboolean application_install_session(
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Ouvre une enquête et l'installe dans l'application.
|
||||||
|
*
|
||||||
|
* En cas de succès, Application devient propriétaire de la nouvelle
|
||||||
|
* session et du nouvel arbre.
|
||||||
|
*
|
||||||
|
* En cas d'échec, l'état précédent de l'application reste inchangé.
|
||||||
|
*
|
||||||
|
* @param application Application à mettre à jour.
|
||||||
|
* @param root_path Chemin racine de l'enquête.
|
||||||
|
* @param error Emplacement facultatif pour l'erreur.
|
||||||
|
*
|
||||||
|
* @return TRUE si l'enquête est ouverte et installée, sinon FALSE.
|
||||||
|
*/
|
||||||
|
static gboolean application_open_and_install_investigation(
|
||||||
|
Application *application,
|
||||||
|
const char *root_path,
|
||||||
|
GError **error
|
||||||
|
)
|
||||||
|
{
|
||||||
|
InvestigationSession *new_session = NULL;
|
||||||
|
InvestigationTreeModel *new_tree_model = NULL;
|
||||||
|
|
||||||
|
const InvestigationProject *project = NULL;
|
||||||
|
const char *canonical_root_path = NULL;
|
||||||
|
|
||||||
|
GError *session_error = NULL;
|
||||||
|
|
||||||
|
g_return_val_if_fail(
|
||||||
|
error == NULL || *error == NULL,
|
||||||
|
FALSE
|
||||||
|
);
|
||||||
|
|
||||||
|
if (application == NULL ||
|
||||||
|
application->main_window == NULL)
|
||||||
|
{
|
||||||
|
g_set_error_literal(
|
||||||
|
error,
|
||||||
|
APPLICATION_OPEN_ERROR,
|
||||||
|
APPLICATION_OPEN_ERROR_INVALID_ARGUMENT,
|
||||||
|
"L'application ou sa fenêtre principale est invalide."
|
||||||
|
);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (root_path == NULL ||
|
||||||
|
root_path[0] == '\0')
|
||||||
|
{
|
||||||
|
g_set_error_literal(
|
||||||
|
error,
|
||||||
|
APPLICATION_OPEN_ERROR,
|
||||||
|
APPLICATION_OPEN_ERROR_INVALID_ARGUMENT,
|
||||||
|
"Le chemin racine de l'enquête est invalide."
|
||||||
|
);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
new_session = investigation_session_open(
|
||||||
|
root_path,
|
||||||
|
&session_error
|
||||||
|
);
|
||||||
|
|
||||||
|
if (new_session == NULL)
|
||||||
|
{
|
||||||
|
if (session_error != NULL)
|
||||||
|
{
|
||||||
|
if (error != NULL)
|
||||||
|
{
|
||||||
|
g_propagate_prefixed_error(
|
||||||
|
error,
|
||||||
|
session_error,
|
||||||
|
"Impossible d'ouvrir la session : "
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_clear_error(
|
||||||
|
&session_error
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_set_error_literal(
|
||||||
|
error,
|
||||||
|
APPLICATION_OPEN_ERROR,
|
||||||
|
APPLICATION_OPEN_ERROR_INVALID_PROJECT,
|
||||||
|
"Impossible d'ouvrir la session de l'enquête."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
project = investigation_session_get_project(
|
||||||
|
new_session
|
||||||
|
);
|
||||||
|
|
||||||
|
if (project == NULL)
|
||||||
|
{
|
||||||
|
g_set_error_literal(
|
||||||
|
error,
|
||||||
|
APPLICATION_OPEN_ERROR,
|
||||||
|
APPLICATION_OPEN_ERROR_INVALID_PROJECT,
|
||||||
|
"La session ne fournit aucun projet valide."
|
||||||
|
);
|
||||||
|
|
||||||
|
investigation_session_close(
|
||||||
|
new_session
|
||||||
|
);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
canonical_root_path =
|
||||||
|
investigation_project_get_root_path(
|
||||||
|
project
|
||||||
|
);
|
||||||
|
|
||||||
|
if (canonical_root_path == NULL ||
|
||||||
|
canonical_root_path[0] == '\0')
|
||||||
|
{
|
||||||
|
g_set_error_literal(
|
||||||
|
error,
|
||||||
|
APPLICATION_OPEN_ERROR,
|
||||||
|
APPLICATION_OPEN_ERROR_INVALID_PROJECT,
|
||||||
|
"Le projet ne fournit aucun chemin racine valide."
|
||||||
|
);
|
||||||
|
|
||||||
|
investigation_session_close(
|
||||||
|
new_session
|
||||||
|
);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
new_tree_model = investigation_tree_builder_build(
|
||||||
|
canonical_root_path
|
||||||
|
);
|
||||||
|
|
||||||
|
if (new_tree_model == NULL)
|
||||||
|
{
|
||||||
|
g_set_error(
|
||||||
|
error,
|
||||||
|
APPLICATION_OPEN_ERROR,
|
||||||
|
APPLICATION_OPEN_ERROR_TREE_BUILD,
|
||||||
|
"Impossible de construire l'arborescence de l'enquête "
|
||||||
|
"située dans '%s'.",
|
||||||
|
canonical_root_path
|
||||||
|
);
|
||||||
|
|
||||||
|
investigation_session_close(
|
||||||
|
new_session
|
||||||
|
);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!application_install_session(
|
||||||
|
application,
|
||||||
|
new_session,
|
||||||
|
new_tree_model
|
||||||
|
))
|
||||||
|
{
|
||||||
|
g_set_error_literal(
|
||||||
|
error,
|
||||||
|
APPLICATION_OPEN_ERROR,
|
||||||
|
APPLICATION_OPEN_ERROR_INSTALL,
|
||||||
|
"Impossible d'installer la session dans l'application."
|
||||||
|
);
|
||||||
|
|
||||||
|
investigation_tree_model_free(
|
||||||
|
new_tree_model
|
||||||
|
);
|
||||||
|
|
||||||
|
investigation_session_close(
|
||||||
|
new_session
|
||||||
|
);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* La propriété de new_session et new_tree_model a été
|
||||||
|
* transférée à Application.
|
||||||
|
*/
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Traite le dossier d'enquête sélectionné par l'utilisateur.
|
* @brief Traite le dossier d'enquête sélectionné par l'utilisateur.
|
||||||
*
|
*
|
||||||
|
|
@ -141,13 +361,6 @@ static void application_on_folder_selected(
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
Application *application = user_data;
|
Application *application = user_data;
|
||||||
|
|
||||||
InvestigationSession *new_session = NULL;
|
|
||||||
InvestigationTreeModel *new_tree_model = NULL;
|
|
||||||
|
|
||||||
const InvestigationProject *project = NULL;
|
|
||||||
const char *root_path = NULL;
|
|
||||||
|
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
if (application == NULL)
|
if (application == NULL)
|
||||||
|
|
@ -155,88 +368,30 @@ static void application_on_folder_selected(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* L'annulation du sélecteur ne constitue pas une erreur.
|
||||||
|
*/
|
||||||
if (folder_path == NULL)
|
if (folder_path == NULL)
|
||||||
{
|
{
|
||||||
g_print("Ouverture annulée.\n");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_session = investigation_session_open(
|
if (!application_open_and_install_investigation(
|
||||||
|
application,
|
||||||
folder_path,
|
folder_path,
|
||||||
&error
|
&error
|
||||||
);
|
))
|
||||||
|
|
||||||
if (new_session == NULL)
|
|
||||||
{
|
{
|
||||||
g_warning(
|
g_warning(
|
||||||
"Impossible d'ouvrir l'enquête : %s",
|
"Impossible d'ouvrir l'enquête '%s' : %s",
|
||||||
|
folder_path,
|
||||||
error != NULL
|
error != NULL
|
||||||
? error->message
|
? error->message
|
||||||
: "erreur inconnue"
|
: "erreur inconnue"
|
||||||
);
|
);
|
||||||
|
|
||||||
g_clear_error(&error);
|
g_clear_error(
|
||||||
return;
|
&error
|
||||||
}
|
|
||||||
|
|
||||||
project = investigation_session_get_project(
|
|
||||||
new_session
|
|
||||||
);
|
|
||||||
|
|
||||||
if (project != NULL)
|
|
||||||
{
|
|
||||||
root_path = investigation_project_get_root_path(
|
|
||||||
project
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (root_path == NULL ||
|
|
||||||
root_path[0] == '\0')
|
|
||||||
{
|
|
||||||
g_warning(
|
|
||||||
"La session ne fournit aucun chemin racine valide."
|
|
||||||
);
|
|
||||||
|
|
||||||
investigation_session_close(
|
|
||||||
new_session
|
|
||||||
);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
new_tree_model = investigation_tree_builder_build(
|
|
||||||
root_path
|
|
||||||
);
|
|
||||||
|
|
||||||
if (new_tree_model == NULL)
|
|
||||||
{
|
|
||||||
g_warning(
|
|
||||||
"Impossible de construire l'arborescence de l'enquête."
|
|
||||||
);
|
|
||||||
|
|
||||||
investigation_session_close(
|
|
||||||
new_session
|
|
||||||
);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!application_install_session(
|
|
||||||
application,
|
|
||||||
new_session,
|
|
||||||
new_tree_model
|
|
||||||
))
|
|
||||||
{
|
|
||||||
g_warning(
|
|
||||||
"Impossible d'installer l'enquête dans l'application."
|
|
||||||
);
|
|
||||||
|
|
||||||
investigation_tree_model_free(
|
|
||||||
new_tree_model
|
|
||||||
);
|
|
||||||
|
|
||||||
investigation_session_close(
|
|
||||||
new_session
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -257,13 +412,6 @@ static void application_on_create_investigation(
|
||||||
Application *application = user_data;
|
Application *application = user_data;
|
||||||
|
|
||||||
char *created_root_path = NULL;
|
char *created_root_path = NULL;
|
||||||
|
|
||||||
InvestigationSession *new_session = NULL;
|
|
||||||
InvestigationTreeModel *new_tree_model = NULL;
|
|
||||||
|
|
||||||
const InvestigationProject *project = NULL;
|
|
||||||
const char *root_path = NULL;
|
|
||||||
|
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
if (application == NULL)
|
if (application == NULL)
|
||||||
|
|
@ -296,98 +444,29 @@ static void application_on_create_investigation(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_session = investigation_session_open(
|
if (!application_open_and_install_investigation(
|
||||||
|
application,
|
||||||
created_root_path,
|
created_root_path,
|
||||||
&error
|
&error
|
||||||
);
|
))
|
||||||
|
|
||||||
if (new_session == NULL)
|
|
||||||
{
|
{
|
||||||
g_warning(
|
g_warning(
|
||||||
"L'enquête a été créée dans '%s', mais son ouverture "
|
"L'enquête a été créée dans '%s', mais son "
|
||||||
"a échoué : %s",
|
"ouverture a échoué : %s",
|
||||||
created_root_path,
|
created_root_path,
|
||||||
error != NULL
|
error != NULL
|
||||||
? error->message
|
? error->message
|
||||||
: "erreur inconnue"
|
: "erreur inconnue"
|
||||||
);
|
);
|
||||||
|
|
||||||
g_clear_error(&error);
|
g_clear_error(
|
||||||
g_free(created_root_path);
|
&error
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
project = investigation_session_get_project(
|
|
||||||
new_session
|
|
||||||
);
|
|
||||||
|
|
||||||
if (project != NULL)
|
|
||||||
{
|
|
||||||
root_path = investigation_project_get_root_path(
|
|
||||||
project
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (root_path == NULL ||
|
g_free(
|
||||||
root_path[0] == '\0')
|
|
||||||
{
|
|
||||||
g_warning(
|
|
||||||
"L'enquête a été créée dans '%s', mais la session "
|
|
||||||
"ne fournit aucun chemin racine valide.",
|
|
||||||
created_root_path
|
created_root_path
|
||||||
);
|
);
|
||||||
|
|
||||||
investigation_session_close(new_session);
|
|
||||||
g_free(created_root_path);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
new_tree_model = investigation_tree_builder_build(
|
|
||||||
root_path
|
|
||||||
);
|
|
||||||
|
|
||||||
if (new_tree_model == NULL)
|
|
||||||
{
|
|
||||||
g_warning(
|
|
||||||
"L'enquête a été créée dans '%s', mais son "
|
|
||||||
"arborescence n'a pas pu être construite.",
|
|
||||||
created_root_path
|
|
||||||
);
|
|
||||||
|
|
||||||
investigation_session_close(new_session);
|
|
||||||
g_free(created_root_path);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!application_install_session(
|
|
||||||
application,
|
|
||||||
new_session,
|
|
||||||
new_tree_model
|
|
||||||
))
|
|
||||||
{
|
|
||||||
g_warning(
|
|
||||||
"L'enquête a été créée dans '%s', mais la session "
|
|
||||||
"n'a pas pu être installée dans l'application.",
|
|
||||||
created_root_path
|
|
||||||
);
|
|
||||||
|
|
||||||
investigation_tree_model_free(
|
|
||||||
new_tree_model
|
|
||||||
);
|
|
||||||
|
|
||||||
investigation_session_close(
|
|
||||||
new_session
|
|
||||||
);
|
|
||||||
|
|
||||||
g_free(created_root_path);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free(created_root_path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue