summaryrefslogtreecommitdiff
path: root/src/analysis/loaded.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-04-21 22:00:00 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-04-21 22:00:00 (GMT)
commit8eb95d316f7b6fbad0ff798abfe7f70f89e812d2 (patch)
tree4f310c7ffdb94d48fff236e63c7e6f0ed9f1dee1 /src/analysis/loaded.c
parent315146a49b5570294ca20beca720c4e3f74a86bd (diff)
Improved the way file formats are detected and loaded.
Diffstat (limited to 'src/analysis/loaded.c')
-rw-r--r--src/analysis/loaded.c425
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 */
/* ---------------------------------------------------------------------------------- */