diff options
Diffstat (limited to 'src/analysis/loaded.c')
-rw-r--r-- | src/analysis/loaded.c | 425 |
1 files changed, 425 insertions, 0 deletions
diff --git a/src/analysis/loaded.c b/src/analysis/loaded.c index 450784b..1273ebd 100644 --- a/src/analysis/loaded.c +++ b/src/analysis/loaded.c @@ -28,17 +28,79 @@ #include "loaded-int.h" +#include "../core/global.h" #include "../glibext/chrysamarshal.h" #include "../glibext/gloadedpanel.h" +/* Analyse de contenu chargé (instance) */ +typedef struct _GLoadedAnalysis GLoadedAnalysis; + + + /* ---------------------- GESTION SOUS FORME DE CONTENU CHARGE ---------------------- */ /* Procède à l'initialisation de l'interface de contenu chargé. */ static void g_loaded_content_default_init(GLoadedContentInterface *); +/* Acquitte la fin d'une tâche d'analyse différée et complète. */ +static void on_loaded_content_analysis_completed(GLoadedAnalysis *, GLoadedContent *); + + + +/* -------------------------- PHASE D'ANALYSE EN PARALLELE -------------------------- */ + + +#define G_TYPE_LOADED_ANALYSIS g_loaded_analysis_get_type() +#define G_LOADED_ANALYSIS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_LOADED_ANALYSIS, GDelayedDisassembly)) +#define G_IS_LOADED_ANALYSIS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_LOADED_ANALYSIS)) +#define G_LOADED_ANALYSIS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_LOADED_ANALYSIS, GDelayedDisassemblyClass)) +#define G_IS_LOADED_ANALYSIS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_LOADED_ANALYSIS)) +#define G_LOADED_ANALYSIS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_LOADED_ANALYSIS, GDelayedDisassemblyClass)) + + +/* Analyse de contenu chargé (instance) */ +struct _GLoadedAnalysis +{ + GDelayedWork parent; /* A laisser en premier */ + + GLoadedContent *content; /* Cible de l'analyse à mener */ + + bool success; /* Bilan de l'opération */ + +}; + +/* Analyse de contenu chargé (classe) */ +typedef struct _GLoadedAnalysisClass +{ + GDelayedWorkClass parent; /* A laisser en premier */ + +} GLoadedAnalysisClass; + + +/* Indique le type défini pour les tâches d'analyse différée. */ +static GType g_loaded_analysis_get_type(void); + +/* Initialise la classe des tâches d'analyse différées. */ +static void g_loaded_analysis_class_init(GLoadedAnalysisClass *); + +/* Initialise une tâche d'analyse de contenu différée. */ +static void g_loaded_analysis_init(GLoadedAnalysis *); + +/* Supprime toutes les références externes. */ +static void g_loaded_analysis_dispose(GLoadedAnalysis *); + +/* Procède à la libération totale de la mémoire. */ +static void g_loaded_analysis_finalize(GLoadedAnalysis *); + +/* Crée une tâche d'analyse de contenu différée. */ +static GLoadedAnalysis *g_loaded_analysis_new(GLoadedContent *); + +/* Assure l'analyse d'un contenu chargé en différé. */ +static void g_loaded_analysis_process(GLoadedAnalysis *, GtkStatusStack *); + /* ---------------------------------------------------------------------------------- */ @@ -64,6 +126,14 @@ G_DEFINE_INTERFACE(GLoadedContent, g_loaded_content, G_TYPE_OBJECT) static void g_loaded_content_default_init(GLoadedContentInterface *iface) { + g_signal_new("analyzed", + G_TYPE_LOADED_CONTENT, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GLoadedContentIface, analyzed), + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + g_signal_new("display-changed", G_TYPE_LOADED_CONTENT, G_SIGNAL_RUN_LAST, @@ -77,6 +147,205 @@ static void g_loaded_content_default_init(GLoadedContentInterface *iface) /****************************************************************************** * * +* Paramètres : content = élément chargé à traiter. * +* xdoc = structure XML en cours d'édition. * +* context = contexte à utiliser pour les recherches. * +* path = chemin d'accès réservé au binaire. * +* * +* Description : Interprète un contenu chargé avec un appui XML. * +* * +* Retour : true si l'opération a bien tourné, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_loaded_content_restore(GLoadedContent *content, xmlDocPtr xdoc, xmlXPathContextPtr context, const char *path) +{ + bool result; /* Bilan à faire remonter */ + GLoadedContentIface *iface; /* Interface utilisée */ + + iface = G_LOADED_CONTENT_GET_IFACE(content); + + result = iface->restore(content, xdoc, context, path); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : content = élément chargé à traiter. * +* xdoc = structure XML en cours d'édition. * +* context = contexte à utiliser pour les recherches. * +* path = chemin d'accès réservé à l'élément. * +* * +* Description : Ecrit une sauvegarde de l'élément dans un fichier XML. * +* * +* Retour : true si l'opération a bien tourné, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_loaded_content_save(const GLoadedContent *content, xmlDocPtr xdoc, xmlXPathContextPtr context, const char *path) +{ + bool result; /* Bilan à faire remonter */ + GLoadedContentIface *iface; /* Interface utilisée */ + + iface = G_LOADED_CONTENT_GET_IFACE(content); + + result = iface->save(content, xdoc, context, path); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : content = élément chargé à manipuler. * +* * +* Description : Fournit le contenu représenté de l'élément chargé. * +* * +* Retour : Contenu représenté. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBinContent *g_loaded_content_get_content(const GLoadedContent *content) +{ + GBinContent *result; /* Contenu interne à renvoyer */ + GLoadedContentIface *iface; /* Interface utilisée */ + + iface = G_LOADED_CONTENT_GET_IFACE(content); + + result = iface->get_content(content); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : content = élément chargé à manipuler. * +* * +* Description : Fournit le format associé à l'élément chargé. * +* * +* Retour : Format associé à l'élément chargé. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const char *g_loaded_content_get_format_name(const GLoadedContent *content) +{ + const char *result; /* Contenu interne à renvoyer */ + GLoadedContentIface *iface; /* Interface utilisée */ + + iface = G_LOADED_CONTENT_GET_IFACE(content); + + result = iface->get_format_name(content); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : content = élément chargé à manipuler. * +* * +* Description : Lance l'analyse propre à l'élément chargé. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_loaded_content_analyze(GLoadedContent *content) +{ + GLoadedAnalysis *analysis; /* Analyse à mener */ + GWorkQueue *queue; /* Gestionnaire de différés */ + + analysis = g_loaded_analysis_new(content); + + g_signal_connect(analysis, "work-completed", + G_CALLBACK(on_loaded_content_analysis_completed), content); + + queue = get_work_queue(); + + g_work_queue_schedule_work(queue, G_DELAYED_WORK(analysis), DEFAULT_WORK_GROUP); + +} + + +/****************************************************************************** +* * +* Paramètres : analysis = tâche d'analyse menée à bien. * +* content = contenu chargé dont l'analyse est terminée. * +* * +* Description : Acquitte la fin d'une tâche d'analyse différée et complète. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_loaded_content_analysis_completed(GLoadedAnalysis *analysis, GLoadedContent *content) +{ + g_signal_emit_by_name(content, "analyzed", analysis->success); + +} + + +/****************************************************************************** +* * +* Paramètres : content = élément chargé à manipuler. * +* * +* Description : Lance l'analyse de l'élément chargé et attend sa conclusion. * +* * +* Retour : Conclusion obtenue suite à l'analyse. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_loaded_content_analyze_and_wait(GLoadedContent *content) +{ + bool result; /* Bilan à retourner */ + GLoadedAnalysis *analysis; /* Analyse à mener */ + GWorkQueue *queue; /* Gestionnaire de différés */ + wgroup_id_t gid; /* Identifiant pour les tâches */ + + analysis = g_loaded_analysis_new(content); + g_object_ref(G_OBJECT(analysis)); + + queue = get_work_queue(); + + gid = g_work_queue_define_work_group(queue); + + g_work_queue_schedule_work(queue, G_DELAYED_WORK(analysis), gid); + + g_work_queue_wait_for_completion(queue, gid); + + g_work_queue_delete_work_group(queue, gid); + + result = analysis->success; + g_object_unref(G_OBJECT(analysis)); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : content = élément chargé à consulter. * * long = précise s'il s'agit d'une version longue ou non. * * * @@ -243,6 +512,162 @@ void g_loaded_content_set_display_option(GLoadedContent *content, unsigned int i /* ---------------------------------------------------------------------------------- */ +/* PHASE D'ANALYSE EN PARALLELE */ +/* ---------------------------------------------------------------------------------- */ + + +/* Indique le type défini pour les tâches d'analyse différée. */ +G_DEFINE_TYPE(GLoadedAnalysis, g_loaded_analysis, G_TYPE_DELAYED_WORK); + + +/****************************************************************************** +* * +* Paramètres : klass = classe à initialiser. * +* * +* Description : Initialise la classe des tâches d'analyse différées. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_loaded_analysis_class_init(GLoadedAnalysisClass *klass) +{ + GObjectClass *object; /* Autre version de la classe */ + GDelayedWorkClass *work; /* Version en classe parente */ + + object = G_OBJECT_CLASS(klass); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_loaded_analysis_dispose; + object->finalize = (GObjectFinalizeFunc)g_loaded_analysis_finalize; + + work = G_DELAYED_WORK_CLASS(klass); + + work->run = (run_task_fc)g_loaded_analysis_process; + +} + + +/****************************************************************************** +* * +* Paramètres : analysis = instance à initialiser. * +* * +* Description : Initialise une tâche d'analyse de contenu différée. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_loaded_analysis_init(GLoadedAnalysis *analysis) +{ + analysis->success = false; + +} + + +/****************************************************************************** +* * +* Paramètres : disass = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_loaded_analysis_dispose(GLoadedAnalysis *analysis) +{ + g_object_unref(G_OBJECT(analysis->content)); + + G_OBJECT_CLASS(g_loaded_analysis_parent_class)->dispose(G_OBJECT(analysis)); + +} + + +/****************************************************************************** +* * +* Paramètres : analysis = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_loaded_analysis_finalize(GLoadedAnalysis *analysis) +{ + G_OBJECT_CLASS(g_loaded_analysis_parent_class)->finalize(G_OBJECT(analysis)); + +} + + +/****************************************************************************** +* * +* Paramètres : content = contenu chargé à traiter. * +* * +* Description : Crée une tâche d'analyse de contenu différée. * +* * +* Retour : Tâche créée. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GLoadedAnalysis *g_loaded_analysis_new(GLoadedContent *content) +{ + GLoadedAnalysis *result; /* Tâche à retourner */ + + result = g_object_new(G_TYPE_LOADED_ANALYSIS, NULL); + + result->content = content; + g_object_ref(G_OBJECT(content)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : analysis = analyse à mener. * +* status = barre de statut à tenir informée. * +* * +* Description : Assure l'analyse d'un contenu chargé en différé. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_loaded_analysis_process(GLoadedAnalysis *analysis, GtkStatusStack *status) +{ + GLoadedContentIface *iface; /* Interface utilisée */ + GWorkQueue *queue; /* Gestionnaire de différés */ + wgroup_id_t gid; /* Identifiant pour les tâches */ + + iface = G_LOADED_CONTENT_GET_IFACE(analysis->content); + + queue = get_work_queue(); + + gid = g_work_queue_define_work_group(queue); + + analysis->success = iface->analyze(analysis->content, gid, status); + + g_work_queue_delete_work_group(queue, gid); + +} + + + +/* ---------------------------------------------------------------------------------- */ /* VUES ET BASCULEMENT ENTRE LES VUES */ /* ---------------------------------------------------------------------------------- */ |