diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-12-26 23:52:44 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-12-26 23:52:44 (GMT) |
commit | 2c28d59fb3671c0fdd1987784076d4968c58b651 (patch) | |
tree | a301f6cd9c1fd9f92191fba7fe7b59a7e3a01b5a /src/analysis | |
parent | 67b4887317b7394d63b543aa48cb368406374103 (diff) |
Created the GLoadedContent interface to load all kinds of content.
Diffstat (limited to 'src/analysis')
-rwxr-xr-x | src/analysis/Makefile.am | 2 | ||||
-rw-r--r-- | src/analysis/binary.c | 327 | ||||
-rw-r--r-- | src/analysis/binary.h | 35 | ||||
-rw-r--r-- | src/analysis/loaded-int.h | 79 | ||||
-rw-r--r-- | src/analysis/loaded.c | 362 | ||||
-rw-r--r-- | src/analysis/loaded.h | 92 | ||||
-rw-r--r-- | src/analysis/project.c | 491 | ||||
-rw-r--r-- | src/analysis/project.h | 34 |
8 files changed, 907 insertions, 515 deletions
diff --git a/src/analysis/Makefile.am b/src/analysis/Makefile.am index 9e84753..c5f8c82 100755 --- a/src/analysis/Makefile.am +++ b/src/analysis/Makefile.am @@ -7,6 +7,8 @@ libanalysis_la_SOURCES = \ block.h block.c \ content-int.h \ content.h content.c \ + loaded-int.h \ + loaded.h loaded.c \ loading.h loading.c \ project.h project.c \ roptions.h roptions.c \ diff --git a/src/analysis/binary.c b/src/analysis/binary.c index 7b0e528..5b2caf0 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -35,6 +35,7 @@ #include <i18n.h> +#include "loaded-int.h" #include "routine.h" #include "db/client.h" //#include "decomp/decompiler.h" @@ -47,7 +48,11 @@ #include "../core/global.h" #include "../core/params.h" #include "../core/processors.h" -#include "../glibext/chrysamarshal.h" +//#include "../glibext/chrysamarshal.h" +#include "../gtkext/easygtk.h" +#include "../gtkext/gtkblockdisplay.h" +#include "../gtkext/gtkdisplaypanel.h" +#include "../gtkext/gtkgraphdisplay.h" #include "../gui/panels/log.h" @@ -98,7 +103,6 @@ struct _GLoadedBinaryClass /* Signaux */ void (* disassembly_done) (GLoadedBinary *); - void (* display_changed) (GLoadedBinary *, BinaryView, BufferLineColumn); }; @@ -109,6 +113,9 @@ static void g_loaded_binary_class_init(GLoadedBinaryClass *); /* Initialise une description de fichier binaire. */ static void g_loaded_binary_init(GLoadedBinary *); +/* Procède à l'initialisation de l'interface de contenu chargé. */ +static void g_loaded_binary_interface_init(GLoadedContentInterface *); + /* Supprime toutes les références externes. */ static void g_loaded_binary_dispose(GLoadedBinary *); @@ -145,6 +152,28 @@ static bool g_loaded_binary_connect_remote(GLoadedBinary *); static void _g_loaded_binary_analyse(GLoadedBinary *, disassembly_ack_fc); +/* ---------------------- GESTION SOUS FORME DE CONTENU CHARGE ---------------------- */ + + +/* Fournit le désignation associée à l'élément chargé. */ +static const char *g_loaded_binary_describe(const GLoadedBinary *, bool); + +/* Détermine le nombre de vues disponibles pour un contenu. */ +static unsigned int g_loaded_binary_count_views(const GLoadedBinary *); + +/* Met en place la vue demandée pour un contenu binaire. */ +static GtkWidget *g_loaded_binary_build_view(GLoadedBinary *, unsigned int); + +/* Retrouve l'indice correspondant à la vue donnée d'un contenu. */ +static unsigned int g_loaded_binary_get_view_index(GLoadedBinary *, GtkWidget *); + +/* Fournit toutes les options d'affichage pour un contenu. */ +bool * const g_loaded_binary_get_all_display_options(const GLoadedBinary *, unsigned int); + +/* Définit une option d'affichage pour un contenu chargé. */ +static bool g_loaded_binary_set_display_option(GLoadedBinary *, unsigned int, unsigned int, bool); + + /* ---------------------------------------------------------------------------------- */ /* ENCADREMENTS D'UN BINAIRE CHARGE */ @@ -152,7 +181,8 @@ static void _g_loaded_binary_analyse(GLoadedBinary *, disassembly_ack_fc); /* Indique le type défini pour une description de fichier binaire. */ -G_DEFINE_TYPE(GLoadedBinary, g_loaded_binary, G_TYPE_OBJECT); +G_DEFINE_TYPE_WITH_CODE(GLoadedBinary, g_loaded_binary, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE(G_TYPE_LOADED_CONTENT, g_loaded_binary_interface_init)); /****************************************************************************** @@ -184,14 +214,6 @@ static void g_loaded_binary_class_init(GLoadedBinaryClass *klass) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - g_signal_new("display-changed", - G_TYPE_LOADED_BINARY, - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GLoadedBinaryClass, display_changed), - NULL, NULL, - g_cclosure_user_marshal_VOID__ENUM_ENUM, - G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); - } @@ -237,6 +259,32 @@ static void g_loaded_binary_init(GLoadedBinary *binary) /****************************************************************************** * * +* Paramètres : iface = interface GLib à initialiser. * +* * +* Description : Procède à l'initialisation de l'interface de contenu chargé. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_loaded_binary_interface_init(GLoadedContentInterface *iface) +{ + iface->describe = (describe_loaded_fc)g_loaded_binary_describe; + + iface->count_views = (count_loaded_views_fc)g_loaded_binary_count_views; + iface->build_view = (build_loaded_view_fc)g_loaded_binary_build_view; + iface->get_view_index = (get_loaded_view_index_fc)g_loaded_binary_get_view_index; + + iface->get_all_options = (get_all_loaded_options_fc)g_loaded_binary_get_all_display_options; + iface->set_option = (set_loaded_option_fc)g_loaded_binary_set_display_option; + +} + + +/****************************************************************************** +* * * Paramètres : binary = instance d'objet GLib à traiter. * * * * Description : Supprime toutes les références externes. * @@ -499,6 +547,7 @@ GLoadedBinary *g_loaded_binary_new_from_xml(xmlXPathContextPtr context, const ch * xdoc = structure XML en cours d'édition. * * context = contexte à utiliser pour les recherches. * * path = chemin d'accès réservé au binaire. * +* base = référence au lieu d'enregistrement du projet. * * * * Description : Ecrit une sauvegarde du binaire dans un fichier XML. * * * @@ -508,13 +557,12 @@ GLoadedBinary *g_loaded_binary_new_from_xml(xmlXPathContextPtr context, const ch * * ******************************************************************************/ -bool g_loaded_binary_save(const GLoadedBinary *binary, xmlDocPtr xdoc, xmlXPathContextPtr context, const char *path) +bool g_loaded_binary_save(const GLoadedBinary *binary, xmlDocPtr xdoc, xmlXPathContextPtr context, const char *path, const char *base) { bool result; /* Bilan à faire remonter */ char *content_path; /* Partie "Contenus" */ char *access; /* Chemin d'accès à un élément */ GBinContent *content; /* Contenu à référencer */ - const gchar *hash; /* Empreinte à mémoriser */ size_t debugs_count; /* Quantité de formats liés */ size_t i; /* Boucle de parcours */ GDbgFormat *debug; /* Informations de débogage */ @@ -524,33 +572,28 @@ bool g_loaded_binary_save(const GLoadedBinary *binary, xmlDocPtr xdoc, xmlXPathC content_path = strdup(path); content_path = stradd(content_path, "/Contents"); - access = strdup(content_path); - access = stradd(access, "/Main"); + asprintf(&access, "%s/Main", content_path); content = g_binary_format_get_content(G_BIN_FORMAT(binary->format)); - hash = g_binary_content_get_checksum(content); + result = g_binary_content_save(content, xdoc, context, access, base); g_object_unref(G_OBJECT(content)); - result = add_content_to_node(xdoc, context, access, hash); - free(access); debugs_count = g_exe_format_count_debug_info(binary->format); - for (i = 0; i < debugs_count; i++) + for (i = 0; i < debugs_count && result; i++) { asprintf(&access, "%s/DebugInfo[position()=%zu]", content_path, i); debug = g_exe_format_get_debug_info(binary->format, i); content = g_binary_format_get_content(G_BIN_FORMAT(debug)); - hash = g_binary_content_get_checksum(content); + result = g_binary_content_save(content, xdoc, context, access, base); g_object_unref(G_OBJECT(content)); g_object_unref(G_OBJECT(debug)); - result &= add_content_to_node(xdoc, context, access, hash); - free(access); } @@ -1625,56 +1668,6 @@ GCodeBuffer *g_loaded_binary_get_decompiled_buffer(const GLoadedBinary *binary, /****************************************************************************** * * -* Paramètres : binary = élément binaire à mettre à jour. * -* view = type de représentation visée. * -* col = indice de colonne dont l'affichage est à modifier. * -* state = nouvel état de l'affichage. * -* * -* Description : Définit si une colonne donnée doit apparaître dans le rendu. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_loaded_binary_set_column_display(GLoadedBinary *binary, BinaryView view, BufferLineColumn col, bool state) -{ - bool old; /* Ancien état à remplacer */ - - old = binary->col_display[view][col]; - - if (state != old) - { - binary->col_display[view][col] = state; - g_signal_emit_by_name(binary, "display-changed", view, col); - } - -} - - -/****************************************************************************** -* * -* Paramètres : binary = élément binaire à consulter. * -* view = type de représentation visée. * -* * -* Description : Indique quelles colonnes doivent apparaître dans le rendu. * -* * -* Retour : Consigne d'affichage. [OUT] * -* * -* Remarques : - * -* * -******************************************************************************/ - -const bool *g_loaded_binary_get_column_display(GLoadedBinary *binary, BinaryView view) -{ - return binary->col_display[view]; - -} - - -/****************************************************************************** -* * * Paramètres : binary = élément binaire à consulter. * * * * Description : Indique si les lignes doivent apparaître dans le rendu. * @@ -1760,3 +1753,193 @@ void ack_completed_disassembly(GDelayedDisassembly *disass, GLoadedBinary *binar g_signal_emit_by_name(binary, "disassembly-done"); } + + + +/* ---------------------------------------------------------------------------------- */ +/* GESTION SOUS FORME DE CONTENU CHARGE */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : binary = élément chargé à consulter. * +* long = précise s'il s'agit d'une version longue ou non. * +* * +* Description : Fournit le désignation associée à l'élément chargé. * +* * +* Retour : Description courante. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static const char *g_loaded_binary_describe(const GLoadedBinary *binary, bool full) +{ + const char *result; /* Description à retourner */ + GBinContent *content; /* Contenu binaire mannipulé */ + + content = g_binary_format_get_content(G_BIN_FORMAT(binary->format)); + + result = g_binary_content_describe(content, full); + + g_object_unref(G_OBJECT(content)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : binary = contenu chargé à consulter. * +* * +* Description : Détermine le nombre de vues disponibles pour un contenu. * +* * +* Retour : Quantité strictement positive. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static unsigned int g_loaded_binary_count_views(const GLoadedBinary *binary) +{ + return BVW_COUNT; + +} + + +/****************************************************************************** +* * +* Paramètres : binary = contenu chargé à consulter. * +* index = indice de la vue ciblée. * +* * +* Description : Met en place la vue demandée pour un contenu binaire. * +* * +* Retour : Composant graphique nouveau. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GtkWidget *g_loaded_binary_build_view(GLoadedBinary *binary, unsigned int index) +{ + GtkWidget *result; /* Support à retourner */ + GtkWidget *display; /* Composant d'affichage */ + + assert(index < g_loaded_binary_count_views(binary)); + + switch (index) + { + case BVW_BLOCK: + display = gtk_block_display_new(); + break; + + case BVW_GRAPH: + display = gtk_graph_display_new(); + break; + + default: + assert(false); + break; + } + + gtk_widget_show(display); + + g_loaded_panel_set_content(G_LOADED_PANEL(display), G_LOADED_CONTENT(binary)); + + result = qck_create_scrolled_window(NULL, NULL); + gtk_container_add(GTK_CONTAINER(result), display); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : binary = contenu chargé à consulter. * +* index = composant graphique en place. * +* * +* Description : Retrouve l'indice correspondant à la vue donnée d'un contenu.* +* * +* Retour : Indice de la vue représentée, ou -1 en cas d'erreur. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static unsigned int g_loaded_binary_get_view_index(GLoadedBinary *binary, GtkWidget *view) +{ + unsigned int result; /* Indice à retourner */ + + if (GTK_IS_BLOCK_DISPLAY(view)) + result = BVW_BLOCK; + + else if (GTK_IS_GRAPH_DISPLAY(view)) + result = BVW_GRAPH; + + else + { + assert(false); + result = -1; + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : binary = contenu chargé à consulter. * +* index = composant graphique à cibler. * +* * +* Description : Fournit toutes les options d'affichage pour un contenu. * +* * +* Retour : Tableau de paramètres en accès libre. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool * const g_loaded_binary_get_all_display_options(const GLoadedBinary *binary, unsigned int index) +{ + return binary->col_display[index]; + +} + + +/****************************************************************************** +* * +* Paramètres : binary = contenu chargé à consulter. * +* index = composant graphique à cibler. * +* option = type de paramètre à manipuler. * +* state = valeur dudit paramètre. * +* * +* Description : Définit une option d'affichage pour un contenu chargé. * +* * +* Retour : true si un changement a été effectué, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_loaded_binary_set_display_option(GLoadedBinary *binary, unsigned int index, unsigned int option, bool state) +{ + bool result; /* Variation à faire remonter */ + bool old; /* Ancien état à remplacer */ + + old = binary->col_display[index][option]; + + if (state != old) + { + binary->col_display[index][option] = state; + result = true; + } + + else result = false; + + return result; + +} diff --git a/src/analysis/binary.h b/src/analysis/binary.h index 2df42aa..73b5a71 100644 --- a/src/analysis/binary.h +++ b/src/analysis/binary.h @@ -74,16 +74,6 @@ typedef enum _BinaryPartModel } BinaryPartModel; -/* Type de représentations */ -typedef enum _BinaryView -{ - BVW_BLOCK, /* Version basique */ - BVW_GRAPH, /* Affichage en graphique */ - - BVW_COUNT - -} BinaryView; - /* Indique le type défini pour une description de fichier binaire. */ GType g_loaded_binary_get_type(void); @@ -95,7 +85,7 @@ GLoadedBinary *g_loaded_binary_new(GBinContent *); GLoadedBinary *g_loaded_binary_new_from_xml(xmlXPathContextPtr, const char *, GStudyProject *); /* Ecrit une sauvegarde du binaire dans un fichier XML. */ -bool g_loaded_binary_save(const GLoadedBinary *, xmlDocPtr, xmlXPathContextPtr, const char *); +bool g_loaded_binary_save(const GLoadedBinary *, xmlDocPtr, xmlXPathContextPtr, const char *, const char *); /* Fournit le nom associé à l'élément binaire. */ const char *g_loaded_binary_get_name(const GLoadedBinary *, bool); @@ -191,15 +181,26 @@ GBufferCache *g_loaded_binary_get_disassembled_cache(const GLoadedBinary *); /* Fournit le tampon associé au contenu d'un fichier source. */ //GCodeBuffer *g_loaded_binary_get_decompiled_buffer(const GLoadedBinary *, size_t); -/* Définit si une colonne donnée doit apparaître dans le rendu. */ -void g_loaded_binary_set_column_display(GLoadedBinary *, BinaryView, BufferLineColumn, bool); - -/* Indique quelles colonnes doivent apparaître dans le rendu. */ -const bool *g_loaded_binary_get_column_display(GLoadedBinary *, BinaryView); - /* Indique si les lignes doivent apparaître dans le rendu. */ bool *g_loaded_binary_display_decomp_lines(GLoadedBinary *); + + +/* ---------------------- GESTION SOUS FORME DE CONTENU CHARGE ---------------------- */ + + +/* Type de représentations */ +typedef enum _BinaryView +{ + BVW_BLOCK, /* Version basique */ + BVW_GRAPH, /* Affichage en graphique */ + + BVW_COUNT + +} BinaryView; + + + #endif /* _ANALYSIS_BINARY_H */ diff --git a/src/analysis/loaded-int.h b/src/analysis/loaded-int.h new file mode 100644 index 0000000..a574d27 --- /dev/null +++ b/src/analysis/loaded-int.h @@ -0,0 +1,79 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * loaded-int.h - définitions internes propres aux contenus chargés + * + * Copyright (C) 2017 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _ANALYSIS_LOADED_INT_H +#define _ANALYSIS_LOADED_INT_H + + +#include "loaded.h" + + + +/* Fournit le désignation associée à l'élément chargé. */ +typedef const char * (* describe_loaded_fc) (const GLoadedContent *, bool); + +/* Détermine le nombre de vues disponibles pour un contenu. */ +typedef unsigned int (* count_loaded_views_fc) (const GLoadedContent *); + +/* Met en place la vue demandée pour un contenu chargé. */ +typedef GtkWidget * (* build_loaded_view_fc) (GLoadedContent *, unsigned int); + +/* Retrouve l'indice correspondant à la vue donnée d'un contenu. */ +typedef unsigned int (* get_loaded_view_index_fc) (GLoadedContent *, GtkWidget *); + +/* Fournit toutes les options d'affichage pour un contenu. */ +typedef bool * const (* get_all_loaded_options_fc) (const GLoadedContent *, unsigned int); + +/* Définit une option d'affichage pour un contenu. */ +typedef bool ( * set_loaded_option_fc) (GLoadedContent *, unsigned int, unsigned int, bool); + + +/* Accès à un contenu binaire quelconque (interface) */ +struct _GLoadedContentIface +{ + GTypeInterface base_iface; /* A laisser en premier */ + + /* Méthodes virtuelles */ + + describe_loaded_fc describe; /* Description de contenu */ + + count_loaded_views_fc count_views; /* Compteur de vues */ + build_loaded_view_fc build_view; /* Mise en place de vues */ + get_loaded_view_index_fc get_view_index;/* Récupération d'indice de vue*/ + + get_all_loaded_options_fc get_all_options; /* Obtention de liste brute*/ + set_loaded_option_fc set_option; /* Définition d'affichage */ + + /* Signaux */ + + void (* display_changed) (GLoadedContent *, unsigned int, unsigned int); + +}; + + +/* Redéfinition */ +typedef GLoadedContentIface GLoadedContentInterface; + + + +#endif /* _ANALYSIS_LOADED_INT_H */ diff --git a/src/analysis/loaded.c b/src/analysis/loaded.c new file mode 100644 index 0000000..5ce16c1 --- /dev/null +++ b/src/analysis/loaded.c @@ -0,0 +1,362 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * loaded.c - intégration des contenus chargés + * + * Copyright (C) 2017 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "loaded.h" + + +#include <assert.h> + + +#include "loaded-int.h" +#include "../glibext/chrysamarshal.h" +#include "../glibext/gloadedpanel.h" + + + +/* ---------------------- GESTION SOUS FORME DE CONTENU CHARGE ---------------------- */ + + +/* Procède à l'initialisation de l'interface de contenu chargé. */ +static void g_loaded_content_default_init(GLoadedContentInterface *); + + + +/* ---------------------------------------------------------------------------------- */ +/* GESTION SOUS FORME DE CONTENU CHARGE */ +/* ---------------------------------------------------------------------------------- */ + + +/* Détermine le type d'une interface pour l'intégration de contenu chargé. */ +G_DEFINE_INTERFACE(GLoadedContent, g_loaded_content, G_TYPE_OBJECT) + + +/****************************************************************************** +* * +* Paramètres : iface = interface GLib à initialiser. * +* * +* Description : Procède à l'initialisation de l'interface de contenu chargé. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_loaded_content_default_init(GLoadedContentInterface *iface) +{ + g_signal_new("display-changed", + G_TYPE_LOADED_CONTENT, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GLoadedContentIface, display_changed), + NULL, NULL, + g_cclosure_user_marshal_VOID__ENUM_ENUM, + G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); + +} + + +/****************************************************************************** +* * +* Paramètres : content = élément chargé à consulter. * +* long = précise s'il s'agit d'une version longue ou non. * +* * +* Description : Fournit le désignation associée à l'élément chargé. * +* * +* Retour : Description courante. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const char *g_loaded_content_describe(const GLoadedContent *content, bool full) +{ + GLoadedContentIface *iface; /* Interface utilisée */ + + iface = G_LOADED_CONTENT_GET_IFACE(content); + + return iface->describe(content, full); + +} + + +/****************************************************************************** +* * +* Paramètres : content = contenu chargé à consulter. * +* * +* Description : Détermine le nombre de vues disponibles pour un contenu. * +* * +* Retour : Quantité strictement positive. * +* * +* Remarques : - * +* * +******************************************************************************/ + +unsigned int g_loaded_content_count_views(const GLoadedContent *content) +{ + GLoadedContentIface *iface; /* Interface utilisée */ + + iface = G_LOADED_CONTENT_GET_IFACE(content); + + return iface->count_views(content); + +} + + +/****************************************************************************** +* * +* Paramètres : content = contenu chargé à consulter. * +* index = indice de la vue ciblée. * +* * +* Description : Met en place la vue demandée pour un contenu chargé. * +* * +* Retour : Composant graphique nouveau. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *g_loaded_content_build_view(GLoadedContent *content, unsigned int index) +{ + GtkWidget *result; /* Support à retourner */ + GLoadedContentIface *iface; /* Interface utilisée */ + + iface = G_LOADED_CONTENT_GET_IFACE(content); + + assert(index <= g_loaded_content_count_views(content)); + + result = iface->build_view(content, index); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : content = contenu chargé à consulter. * +* index = composant graphique en place. * +* * +* Description : Retrouve l'indice correspondant à la vue donnée d'un contenu.* +* * +* Retour : Indice de la vue représentée, ou -1 en cas d'erreur. * +* * +* Remarques : - * +* * +******************************************************************************/ + +unsigned int g_loaded_content_get_view_index(GLoadedContent *content, GtkWidget *view) +{ + unsigned int result; /* Indice à retourner */ + GLoadedContentIface *iface; /* Interface utilisée */ + + iface = G_LOADED_CONTENT_GET_IFACE(content); + + result = iface->get_view_index(content, view); + + assert(result == -1 || result <= g_loaded_content_count_views(content)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : content = contenu chargé à consulter. * +* index = composant graphique à cibler. * +* * +* Description : Fournit toutes les options d'affichage pour un contenu. * +* * +* Retour : Tableau de paramètres en accès libre. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool * const g_loaded_content_get_all_display_options(const GLoadedContent *content, unsigned int index) +{ + bool const *result; /* Accès aux options à renvoyer*/ + GLoadedContentIface *iface; /* Interface utilisée */ + + assert(index <= g_loaded_content_count_views(content)); + + iface = G_LOADED_CONTENT_GET_IFACE(content); + + result = iface->get_all_options(content, index); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : content = contenu chargé à consulter. * +* index = composant graphique à cibler. * +* option = type de paramètre à manipuler. * +* state = valeur dudit paramètre. * +* * +* Description : Définit une option d'affichage pour un contenu chargé. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_loaded_content_set_display_option(GLoadedContent *content, unsigned int index, unsigned int option, bool state) +{ + GLoadedContentIface *iface; /* Interface utilisée */ + bool changed; /* Note un changement */ + + assert(index <= g_loaded_content_count_views(content)); + + iface = G_LOADED_CONTENT_GET_IFACE(content); + + changed = iface->set_option(content, index, option, state); + + if (changed) + g_signal_emit_by_name(content, "display-changed", index, option); + +} + + + +/* ---------------------------------------------------------------------------------- */ +/* VUES ET BASCULEMENT ENTRE LES VUES */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : panel = panneau affichant un contenu binaire. * +* * +* Description : Fournit la station d'accueil d'un panneau d'affichage. * +* * +* Retour : Composant GTK fourni sans transfert de propriété. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkDockStation *get_dock_station_for_view_panel(GtkWidget *panel) +{ + GtkWidget *result; /* Support trouvé à retourner */ + + /** + * La hiérarchie des composants empilés est la suivante : + * + * - GtkBlockView / GtkGraphView / GtkSourceView (avec GtkViewport intégré) + * - GtkScrolledWindow + * - GtkDockStation + * + */ + + result = gtk_widget_get_parent(panel); /* ScrolledWindow */ + result = gtk_widget_get_parent(result); /* DockStation */ + + return GTK_DOCK_STATION(result); + +} + + +/****************************************************************************** +* * +* Paramètres : panel = panneau affichant un contenu binaire. * +* * +* Description : Fournit le support défilant d'un panneau d'affichage. * +* * +* Retour : Composant GTK fourni sans transfert de propriété. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *get_scroll_window_for_view_panel(GtkWidget *panel) +{ + GtkWidget *result; /* Support trouvé à retourner */ + + /** + * La hiérarchie des composants empilés est la suivante : + * + * - GtkBlockView / GtkGraphView / GtkSourceView (avec GtkViewport intégré) + * - GtkScrolledWindow + * - GtkDockStation + * + */ + + result = gtk_widget_get_parent(panel); /* ScrolledWindow */ + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : view = composant retourné par un contenu chargé. * +* * +* Description : Fournit le panneau chargé inclus dans un affichage. * +* * +* Retour : Composant GTK fourni sans transfert de propriété. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *get_loaded_panel_from_built_view(GtkWidget *view) +{ + GtkWidget *result; /* Support trouvé à retourner */ + + if (G_IS_LOADED_PANEL(view)) + result = view; + + else + { + assert(GTK_IS_CONTAINER(view)); + + result = NULL; + + void track_loaded_panel(GtkWidget *widget, GtkWidget **found) + { + if (*found == NULL) + { + if (G_IS_LOADED_PANEL(widget)) + *found = widget; + + else if (GTK_IS_CONTAINER(widget)) + gtk_container_foreach(GTK_CONTAINER(widget), (GtkCallback)track_loaded_panel, found); + + } + + } + + gtk_container_foreach(GTK_CONTAINER(view), (GtkCallback)track_loaded_panel, &result); + + assert(result != NULL); + + } + + return result; + +} diff --git a/src/analysis/loaded.h b/src/analysis/loaded.h new file mode 100644 index 0000000..d1d9102 --- /dev/null +++ b/src/analysis/loaded.h @@ -0,0 +1,92 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * loaded.h - prototypes pour l'intégration des contenus chargés + * + * Copyright (C) 2017 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _ANALYSIS_LOADED_H +#define _ANALYSIS_LOADED_H + + +#include <glib-object.h> +#include <stdbool.h> +#include <gtk/gtk.h> + + +#include "../gtkext/gtkdockstation.h" + + + +/* ---------------------- GESTION SOUS FORME DE CONTENU CHARGE ---------------------- */ + + +#define G_TYPE_LOADED_CONTENT (g_loaded_content_get_type()) +#define G_LOADED_CONTENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_LOADED_CONTENT, GLoadedContent)) +#define G_LOADED_CONTENT_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), G_TYPE_LOADED_CONTENT, GLoadedContentIface)) +#define G_IS_LOADED_CONTENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_LOADED_CONTENT)) +#define G_IS_LOADED_CONTENT_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE((vtable), G_TYPE_LOADED_CONTENT)) +#define G_LOADED_CONTENT_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE((inst), G_TYPE_LOADED_CONTENT, GLoadedContentIface)) + + +/* Accès à un contenu binaire quelconque (coquille vide) */ +typedef struct _GLoadedContent GLoadedContent; + +/* Accès à un contenu binaire quelconque (interface) */ +typedef struct _GLoadedContentIface GLoadedContentIface; + + +/* Détermine le type d'une interface pour l'intégration de contenu chargé. */ +GType g_loaded_content_get_type(void) G_GNUC_CONST; + +/* Fournit le désignation associée à l'élément chargé. */ +const char *g_loaded_content_describe(const GLoadedContent *, bool); + +/* Détermine le nombre de vues disponibles pour un contenu. */ +unsigned int g_loaded_content_count_views(const GLoadedContent *); + +/* Met en place la vue demandée pour un contenu chargé. */ +GtkWidget *g_loaded_content_build_view(GLoadedContent *, unsigned int); + +/* Retrouve l'indice correspondant à la vue donnée d'un contenu. */ +unsigned int g_loaded_content_get_view_index(GLoadedContent *, GtkWidget *); + +/* Fournit toutes les options d'affichage pour un contenu. */ +bool * const g_loaded_content_get_all_display_options(const GLoadedContent *, unsigned int); + +/* Définit une option d'affichage pour un contenu chargé. */ +void g_loaded_content_set_display_option(GLoadedContent *, unsigned int, unsigned int, bool); + + + +/* ----------------------- VUES ET BASCULEMENT ENTRE LES VUES ----------------------- */ + + +/* Fournit la station d'accueil d'un panneau d'affichage. */ +GtkDockStation *get_dock_station_for_view_panel(GtkWidget *); + +/* Fournit le support défilant d'un panneau d'affichage. */ +GtkWidget *get_scroll_window_for_view_panel(GtkWidget *); + +/* Fournit le panneau chargé inclus dans un affichage. */ +GtkWidget *get_loaded_panel_from_built_view(GtkWidget *); + + + +#endif /* _ANALYSIS_LOADED_H */ diff --git a/src/analysis/project.c b/src/analysis/project.c index cb1c70a..a5b59ab 100644 --- a/src/analysis/project.c +++ b/src/analysis/project.c @@ -33,15 +33,13 @@ #include <i18n.h> +#include "loaded.h" #include "loading.h" #include "../common/xml.h" #include "../core/global.h" #include "../core/params.h" -#include "../glibext/signal.h" -#include "../gtkext/easygtk.h" #include "../glibext/delayed-int.h" -#include "../gtkext/gtkblockdisplay.h" -#include "../gtkext/gtkgraphdisplay.h" +#include "../glibext/signal.h" #include "../gui/core/panels.h" #include "../gui/panels/log.h" #include "../gui/panels/panel.h" @@ -78,13 +76,9 @@ struct _GStudyProject char *filename; /* Lieu d'enregistrement */ - loaded_content *contents; /* Contenus binaires chargés */ - size_t contents_count; /* Nombre de ces contenus */ - GMutex cnt_mutex; /* Modification de la liste */ - - loaded_binary **binaries; /* Fichiers binaires associés */ - size_t binaries_count; /* Nombre de ces fichiers */ - GMutex bin_mutex; /* Modification de la liste */ + GLoadedContent **contents; /* Contenus chargés et intégrés*/ + size_t count; /* Quantité de ces contenus */ + GMutex mutex; /* Encadrement des accès */ }; @@ -94,6 +88,11 @@ struct _GStudyProjectClass { GObjectClass parent; /* A laisser en premier */ + /* Signaux */ + + void (* content_added) (GStudyProject *, GLoadedContent *); + void (* content_removed) (GStudyProject *, GLoadedContent *); + }; @@ -103,17 +102,6 @@ static void g_study_project_class_init(GStudyProjectClass *); /*Initialise une instance de projet d'étude. */ static void g_study_project_init(GStudyProject *); -/* Assure un positionnement initial idéal. */ -static gboolean scroll_for_the_first_time(GtkWidget *, GdkEvent *, GLoadedBinary *); - - - -/* ----------------------- VUES ET BASCULEMENT ENTRE LES VUES ----------------------- */ - - -/* Met en place un ensemble de vues pour un binaire. */ -GPanelItem *_setup_new_panel_item_for_binary(GStudyProject *, GLoadedBinary *, BinaryView, GtkDisplayPanel **); - /* ---------------------------------------------------------------------------------- */ @@ -139,6 +127,21 @@ G_DEFINE_TYPE(GStudyProject, g_study_project, G_TYPE_OBJECT); static void g_study_project_class_init(GStudyProjectClass *klass) { + g_signal_new("content-added", + G_TYPE_STUDY_PROJECT, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GStudyProjectClass, content_added), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_OBJECT); + + g_signal_new("content-removed", + G_TYPE_STUDY_PROJECT, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GStudyProjectClass, content_removed), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, G_TYPE_OBJECT); } @@ -157,9 +160,7 @@ static void g_study_project_class_init(GStudyProjectClass *klass) static void g_study_project_init(GStudyProject *project) { - g_mutex_init(&project->cnt_mutex); - - g_mutex_init(&project->bin_mutex); + g_mutex_init(&project->mutex); } @@ -201,6 +202,10 @@ GStudyProject *g_study_project_new(void) GStudyProject *g_study_project_open(const char *filename) { + return NULL; + +#if 0 + GStudyProject *result; /* Adresse à retourner */ xmlDocPtr xdoc; /* Structure XML chargée */ xmlXPathContextPtr context; /* Contexte pour les XPath */ @@ -318,6 +323,8 @@ GStudyProject *g_study_project_open(const char *filename) return result; +#endif + } @@ -336,50 +343,31 @@ GStudyProject *g_study_project_open(const char *filename) bool g_study_project_save(GStudyProject *project, const char *filename) { + return false; + +#if 0 + bool result; /* Bilan à retourner */ xmlDocPtr xdoc; /* Document XML à créer */ xmlXPathContextPtr context; /* Contexte pour les recherches*/ const char *final; /* Lieu d'enregistrement final */ size_t i; /* Boucle de parcours */ - size_t access_len; /* Taille d'un chemin interne */ char *access; /* Chemin pour une sous-config.*/ result = create_new_xml_file(&xdoc, &context); - result &= (ensure_node_exist(xdoc, context, "/ChrysalideProject") != NULL); + if (result) + result = (ensure_node_exist(xdoc, context, "/ChrysalideProject") != NULL); final = filename != NULL ? filename : project->filename; - /* Enregistrement des contenus binaires attachés */ - - for (i = 0; i < project->contents_count && result; i++) - { - if (project->contents[i].state == PCS_INTERNAL) continue; - - access_len = strlen("/ChrysalideProject/Contents/Content[position()=") + SIZE_T_MAXLEN + strlen("]") + 1; - - access = calloc(access_len, sizeof(char)); - snprintf(access, access_len, "/ChrysalideProject/Contents/Content[position()=%zu]", i + 1); - - result = g_binary_content_save(project->contents[i].content, xdoc, context, access, final); - - if (result) - result = add_long_attribute_to_node(xdoc, context, access, "state", project->contents[i].state); - - free(access); - - } - /* Enregistrement des binaires analysés */ for (i = 0; i < project->binaries_count && result; i++) { - access_len = strlen("/ChrysalideProject/Binaries/Binary[position()=") + SIZE_T_MAXLEN + strlen("]") + 1; - - access = calloc(access_len, sizeof(char)); - snprintf(access, access_len, "/ChrysalideProject/Binaries/Binary[position()=%zu]", i + 1); + asprintf(&access, "/ChrysalideProject/Binaries/Binary[position()=%zu]", i + 1); - result = g_loaded_binary_save(project->binaries[i]->binary, xdoc, context, access); + result = g_loaded_binary_save(project->binaries[i]->binary, xdoc, context, access, final); free(access); @@ -400,6 +388,8 @@ bool g_study_project_save(GStudyProject *project, const char *filename) return result; +#endif + } @@ -438,6 +428,8 @@ const char *g_study_project_get_filename(const GStudyProject *project) void g_study_project_add_binary_content(GStudyProject *project, GBinContent *content, ProjectContentState state) { +#if 0 + loaded_content *new; /* Nouveau contenu à définir */ g_mutex_lock(&project->cnt_mutex); @@ -454,6 +446,7 @@ void g_study_project_add_binary_content(GStudyProject *project, GBinContent *con g_mutex_unlock(&project->cnt_mutex); +#endif } @@ -473,6 +466,10 @@ void g_study_project_add_binary_content(GStudyProject *project, GBinContent *con GBinContent *g_study_project_find_binary_content_by_hash(GStudyProject *project, const char *hash) { + return NULL; + +#if 0 + GBinContent *result; /* Trouvaille à retourner */ size_t i; /* Boucle de parcours */ GBinContent *iter; /* Contenu binaire analysé */ @@ -499,6 +496,8 @@ GBinContent *g_study_project_find_binary_content_by_hash(GStudyProject *project, return result; +#endif + } @@ -524,7 +523,7 @@ void ack_loaded_binary(GBinaryLoader *loader, GStudyProject *project) if (binary != NULL) { g_signal_connect_to_main_swapped(binary, "disassembly-done", - G_CALLBACK(g_study_project_attach_binary), project, + G_CALLBACK(g_study_project_attach_content), project, g_cclosure_marshal_VOID__VOID); g_loaded_binary_analyse(binary); @@ -536,43 +535,10 @@ void ack_loaded_binary(GBinaryLoader *loader, GStudyProject *project) /****************************************************************************** * * -* Paramètres : widget = composant d'affichage nouvellement porté à l'écran. * -* event = informations liées à l'événement. * -* binary = fichier binaire à associer au projet actuel. * -* * -* Description : Assure un positionnement initial idéal. * -* * -* Retour : FALSE. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static gboolean scroll_for_the_first_time(GtkWidget *widget, GdkEvent *event, GLoadedBinary *binary) -{ - GExeFormat *format; /* Format associé au binaire */ - vmpa2t target; /* Position initiale à viser */ - - g_signal_handlers_disconnect_by_func(widget, G_CALLBACK(scroll_for_the_first_time), binary); - - format = g_loaded_binary_get_format(binary); - - if (g_exe_format_get_main_address(format, &target)) - gtk_display_panel_request_move(GTK_DISPLAY_PANEL(widget), &target); - - g_object_unref(G_OBJECT(format)); - - return FALSE; - -} - - -/****************************************************************************** -* * -* Paramètres : project = project à effacer de la mémoire. * -* binary = fichier binaire à associer au projet actuel. * +* Paramètres : project = project à manipuler. * +* content = contenu chargé à associer au projet actuel. * * * -* Description : Attache un fichier donné à un projet donné. * +* Description : Attache un contenu donné à un projet donné. * * * * Retour : - * * * @@ -580,48 +546,28 @@ static gboolean scroll_for_the_first_time(GtkWidget *widget, GdkEvent *event, GL * * ******************************************************************************/ -void g_study_project_attach_binary(GStudyProject *project, GLoadedBinary *binary) +void g_study_project_attach_content(GStudyProject *project, GLoadedContent *content) { - loaded_binary *new; /* Nouveau binaire à présenter */ - GtkDisplayPanel *display; /* Composant d'affichage */ - GPanelItem *panel; /* Nouveau panneau associé */ - - /* Mise en place */ - - new = (loaded_binary *)calloc(1, sizeof(loaded_binary)); - - new->binary = binary; - - /* Enregistrement dans le projet */ + g_mutex_lock(&project->mutex); - g_mutex_lock(&project->bin_mutex); + project->contents = (GLoadedContent **)realloc(project->contents, + ++project->count * sizeof(GLoadedContent *)); - project->binaries = (loaded_binary **)realloc(project->binaries, - ++project->binaries_count * sizeof(loaded_binary *)); + project->contents[project->count - 1] = content; - project->binaries[project->binaries_count - 1] = new; + g_mutex_unlock(&project->mutex); - /* Premier affichage */ - - panel = _setup_new_panel_item_for_binary(project, binary, BVW_BLOCK, &display); - - g_mutex_unlock(&project->bin_mutex); - - g_signal_connect(display, "size-allocate", G_CALLBACK(scroll_for_the_first_time), binary); - - g_panel_item_dock(panel); - - update_project_area(project); + g_signal_emit_by_name(project, "content-added", content); } /****************************************************************************** * * -* Paramètres : project = project à effacer de la mémoire. * -* binary = fichier binaire à dissocier au projet actuel. * +* Paramètres : project = project à manipuler. * +* content = contenu chargé à dissocier du projet actuel. * * * -* Description : Détache un fichier donné à un projet donné. * +* Description : Détache un contenu donné d'un projet donné. * * * * Retour : - * * * @@ -629,29 +575,27 @@ void g_study_project_attach_binary(GStudyProject *project, GLoadedBinary *binary * * ******************************************************************************/ -void g_study_project_detach_binary(GStudyProject *project, GLoadedBinary *binary) +void g_study_project_detach_content(GStudyProject *project, GLoadedContent *content) { - //GtkDockPanel *dpanel; /* Support de panneaux */ - //GDockItem *ditem; /* Support d'affichage utilisé */ size_t i; /* Boucle de parcours */ - //dpanel = GTK_DOCK_PANEL(g_object_get_data(project->ref, "binpanel")); - //ditem = gtk_dock_panel_get_item_from_binary(project, binary); FIXME !! - - //gtk_dock_panel_remove_item(dpanel, ditem); + g_mutex_lock(&project->mutex); + for (i = 0; i < project->count; i++) + if (project->contents[i] == content) break; + if ((i + 1) < project->count) + memmove(&project->contents[i], &project->contents[i + 1], + (project->count - i - 1) * sizeof(GLoadedContent *)); - for (i = 0; i < project->binaries_count; i++) - if (project->binaries[i]->binary == binary) break; + project->contents = (GLoadedContent **)realloc(project->contents, + --project->count * sizeof(GLoadedContent *)); - if ((i + 1) < project->binaries_count) - memmove(&project->binaries[i], &project->binaries[i + 1], (project->binaries_count - i - 1) * sizeof(loaded_binary *)); + g_mutex_unlock(&project->mutex); - project->binaries = (loaded_binary **)realloc(project->binaries, - --project->binaries_count * sizeof(loaded_binary *)); + g_signal_emit_by_name(project, "content-removed", content); - update_project_area(project); + g_object_unref(G_OBJECT(content)); } @@ -670,6 +614,7 @@ void g_study_project_detach_binary(GStudyProject *project, GLoadedBinary *binary void g_study_project_display(const GStudyProject *project) { +#if 0 size_t i; /* Boucle de parcours #1 */ loaded_binary *handled; /* Binaire prise en compte */ size_t j; /* Boucle de parcours #2 */ @@ -682,7 +627,7 @@ void g_study_project_display(const GStudyProject *project) g_panel_item_dock(handled->items[j]); } - +#endif } @@ -700,6 +645,7 @@ void g_study_project_display(const GStudyProject *project) void g_study_project_hide(const GStudyProject *project) { +#if 0 size_t i; /* Boucle de parcours #1 */ loaded_binary *handled; /* Binaire prise en compte */ size_t j; /* Boucle de parcours #2 */ @@ -712,16 +658,16 @@ void g_study_project_hide(const GStudyProject *project) g_panel_item_undock(handled->items[j]); } - +#endif } /****************************************************************************** * * * Paramètres : project = projet dont le contenu est à afficher. * -* count = nombre de binaires pris en compte. [OUT] * +* count = nombre de contenus pris en compte. [OUT] * * * -* Description : Fournit l'ensemble des binaires associés à un projet. * +* Description : Fournit l'ensemble des contenus associés à un projet. * * * * Retour : Liste à libérer de la mémoire. * * * @@ -729,278 +675,23 @@ void g_study_project_hide(const GStudyProject *project) * * ******************************************************************************/ -GLoadedBinary **g_study_project_get_binaries(const GStudyProject *project, size_t *count) +GLoadedContent **g_study_project_get_contents(GStudyProject *project, size_t *count) { - GLoadedBinary **result; /* Tableau à retourner */ + GLoadedContent **result; /* Tableau à retourner */ size_t i; /* Boucle de parcours */ - *count = project->binaries_count; - result = (GLoadedBinary **)calloc(*count, sizeof(GLoadedBinary *)); + g_mutex_lock(&project->mutex); + + *count = project->count; + result = (GLoadedContent **)calloc(*count, sizeof(GLoadedContent *)); for (i = 0; i < *count; i++) { - result[i] = project->binaries[i]->binary; + result[i] = project->contents[i]; g_object_ref(G_OBJECT(result[i])); } - return result; - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* VUES ET BASCULEMENT ENTRE LES VUES */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : project = zone d'inscription du nouveau panneau. * -* binary = fichier binaire dont les vues sont à créer. * -* wanted = interface de visualisation demandée. * -* panel = interface de visualisation principale. [OUT] * -* * -* Description : Met en place un ensemble de vues pour un binaire. * -* * -* Retour : Panneau mis en place et prêt à être inséré. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GPanelItem *_setup_new_panel_item_for_binary(GStudyProject *project, GLoadedBinary *binary, BinaryView wanted, GtkDisplayPanel **panel) -{ - GPanelItem *result; /* Nouveau panneau à renvoyer */ - size_t k; /* Boucle de parcours #3 */ - loaded_binary *handled; /* Dossier de suivi à compléter*/ - GtkDisplayPanel *displays[BVW_COUNT]; /* Composants pour l'affichage */ - BinaryView i; /* Boucle de parcours #1 */ - GtkWidget *display; /* Affichage du binaire */ - GtkWidget *scroll; /* Surface d'exposition */ - GtkWidget *selected; /* Interface de prédilection */ - const char *name; /* Titre associé au binaire */ - const char *lname; /* Description du binaire */ - BinaryView j; /* Boucle de parcours #2 */ - - /* Recherche du dossier correspondant */ - - for (k = 0; k < project->binaries_count; k++) - if (project->binaries[k]->binary == binary) - break; - - assert(k < project->binaries_count); - - handled = project->binaries[k]; - - /* Créations */ - - for (i = 0; i < BVW_COUNT; i++) - { - /* Préparation du support visuel */ - - switch (i) - { - case BVW_BLOCK: - display = gtk_block_display_new(); - break; - case BVW_GRAPH: - display = gtk_graph_display_new(); - break; - default: /* GCC ! */ - break; - } - - gtk_widget_show(display); - - displays[i] = GTK_DISPLAY_PANEL(display); - - gtk_display_panel_attach_binary(displays[i], binary, i); - - /* Intégration finale dans un support défilant */ - - scroll = qck_create_scrolled_window(NULL, NULL); - gtk_container_add(GTK_CONTAINER(scroll), display); - - if (i == wanted) - { - selected = scroll; - *panel = GTK_DISPLAY_PANEL(display); - } - - } - - /* Support graphique final */ - - name = g_loaded_binary_get_name(binary, false); - lname = g_loaded_binary_get_name(binary, true); - - result = g_panel_item_new(PIP_BINARY_VIEW, name, lname, selected, true, "N"); - register_panel_item(result, get_main_configuration()); - - handled->items = (GPanelItem **)realloc(handled->items, ++handled->count * sizeof(GPanelItem *)); - handled->items[handled->count - 1] = result; - - /* Etablissement des liens */ - - for (i = 0; i < BVW_COUNT; i++) - for (j = 0; j < BVW_COUNT; j++) - { - if (j == i) - continue; - - switch (j) - { - case BVW_BLOCK: - g_object_set_data(G_OBJECT(displays[i]), "block_alt_view", displays[j]); - break; - case BVW_GRAPH: - g_object_set_data(G_OBJECT(displays[i]), "graph_alt_view", displays[j]); - break; - default: /* GCC ! */ - break; - } - - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : project = zone d'inscription du nouveau panneau. * -* binary = fichier binaire dont les vues sont à créer. * -* wanted = interface de visualisation demandée. * -* panel = interface de visualisation principale. [OUT] * -* * -* Description : Met en place un ensemble de vues pour un binaire. * -* * -* Retour : Panneau mis en place et prêt à être inséré. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GPanelItem *setup_new_panel_item_for_binary(GStudyProject *project, GLoadedBinary *binary, BinaryView wanted, GtkDisplayPanel **panel) -{ - GPanelItem *result; /* Nouveau panneau à renvoyer */ - - /** - * La liste des binaires pris en charge ne doit pas évoluer en cours - * de traitement. On place donc le verrou adapté... - */ - - g_mutex_lock(&project->bin_mutex); - - result = _setup_new_panel_item_for_binary(project, binary, wanted, panel); - - g_mutex_unlock(&project->bin_mutex); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : panel = panneau affichant un contenu binaire. * -* * -* Description : Fournit la station d'accueil d'un panneau d'affichage. * -* * -* Retour : Composant GTK fourni sans transfert de propriété. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkDockStation *get_dock_station_for_view_panel(GtkDisplayPanel *panel) -{ - GtkWidget *result; /* Support trouvé à retourner */ - - /** - * La hiérarchie des composants empilés est la suivante : - * - * - GtkBlockView / GtkGraphView / GtkSourceView (avec GtkViewport intégré) - * - GtkScrolledWindow - * - GtkDockStation - * - */ - - result = gtk_widget_get_parent(GTK_WIDGET(panel)); /* ScrolledWindow */ - result = gtk_widget_get_parent(result); /* DockStation */ - - return GTK_DOCK_STATION(result); - -} - - -/****************************************************************************** -* * -* Paramètres : panel = panneau affichant un contenu binaire. * -* * -* Description : Fournit le support défilant d'un panneau d'affichage. * -* * -* Retour : Composant GTK fourni sans transfert de propriété. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkWidget *get_scroll_window_for_view_panel(GtkDisplayPanel *panel) -{ - GtkWidget *result; /* Support trouvé à retourner */ - - /** - * La hiérarchie des composants empilés est la suivante : - * - * - GtkBlockView / GtkGraphView / GtkSourceView (avec GtkViewport intégré) - * - GtkScrolledWindow - * - GtkDockStation - * - */ - - result = gtk_widget_get_parent(GTK_WIDGET(panel)); /* ScrolledWindow */ - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : panel = panneau affichant un contenu binaire. * -* view = autre vision recherchée. * -* * -* Description : Fournit une vision alternative d'un panneau d'affichage. * -* * -* Retour : Composant GTK fourni sans transfert de propriété. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkDisplayPanel *get_alt_view_for_view_panel(GtkDisplayPanel *panel, BinaryView view) -{ - GtkDisplayPanel *result; /* Panneau visé à renvoyer */ - - switch (view) - { - case BVW_BLOCK: - result = GTK_DISPLAY_PANEL(g_object_get_data(G_OBJECT(panel), "block_alt_view")); - break; - case BVW_GRAPH: - result = GTK_DISPLAY_PANEL(g_object_get_data(G_OBJECT(panel), "graph_alt_view")); - break; - default: - assert(false); - result = NULL; - break; - } - - if (result != NULL) - g_object_ref(G_OBJECT(result)); + g_mutex_unlock(&project->mutex); return result; diff --git a/src/analysis/project.h b/src/analysis/project.h index 8288384..9e777ee 100644 --- a/src/analysis/project.h +++ b/src/analysis/project.h @@ -29,15 +29,14 @@ #include "binary.h" -#include "../gtkext/gtkdockstation.h" -#include "../gtkext/gtkdisplaypanel.h" +#include "loaded.h" /** * Comme "gui/panels/panel.h" inclut "gui/editem.h", qui inclut lui même * ce fichier pour la mise à jour de la zone de projet, on redéfinit... */ -typedef struct _GPanelItem GPanelItem; +//typedef struct _GPanelItem GPanelItem; /** * Autre boucle sans fin similaire... @@ -99,11 +98,11 @@ GBinContent *g_study_project_find_binary_content_by_hash(GStudyProject *, const /* Acquitte la fin d'un chargement différé et complet. */ void ack_loaded_binary(GBinaryLoader *, GStudyProject *); -/* Attache un fichier donné à un projet donné. */ -void g_study_project_attach_binary(GStudyProject *, GLoadedBinary *); +/* Attache un contenu donné à un projet donné. */ +void g_study_project_attach_content(GStudyProject *, GLoadedContent *); -/* Détache un fichier donné à un projet donné. */ -void g_study_project_detach_binary(GStudyProject *, GLoadedBinary *); +/* Détache un contenu donné d'un projet donné. */ +void g_study_project_detach_content(GStudyProject *, GLoadedContent *); /* Met en place un projet à l'écran. */ void g_study_project_display(const GStudyProject *); @@ -111,25 +110,8 @@ void g_study_project_display(const GStudyProject *); /* Supprime de l'écran un projet en place. */ void g_study_project_hide(const GStudyProject *); -/* Fournit l'ensemble des binaires associés à un projet. */ -GLoadedBinary **g_study_project_get_binaries(const GStudyProject *, size_t *); - - - -/* ----------------------- VUES ET BASCULEMENT ENTRE LES VUES ----------------------- */ - - -/* Met en place un ensemble de vues pour un binaire. */ -GPanelItem *setup_new_panel_item_for_binary(GStudyProject *, GLoadedBinary *, BinaryView, GtkDisplayPanel **); - -/* Fournit la station d'accueil d'un panneau d'affichage. */ -GtkDockStation *get_dock_station_for_view_panel(GtkDisplayPanel *); - -/* Fournit le support défilant d'un panneau d'affichage. */ -GtkWidget *get_scroll_window_for_view_panel(GtkDisplayPanel *); - -/* Fournit une vision alternative d'un panneau d'affichage. */ -GtkDisplayPanel *get_alt_view_for_view_panel(GtkDisplayPanel *, BinaryView); +/* Fournit l'ensemble des contenus associés à un projet. */ +GLoadedContent **g_study_project_get_contents(GStudyProject *, size_t *); |