/* OpenIDA - Outil d'analyse de fichiers binaires * gtkgraphview.c - affichage de morceaux de code sous forme graphique * * Copyright (C) 2009 Cyrille Bagard * * This file is part of OpenIDA. * * OpenIDA 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. * * OpenIDA 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 . */ #include "gtkgraphview.h" #include "gtkbinview-int.h" #include /* Représentation de code binaire sous forme graphique (instace) */ struct _GtkGraphView { GtkBinView parent; /* A laisser en premier */ GtkBinView **childs; /* Liste des sous-blocs */ size_t childs_count; /* Taille de cette liste */ }; /* Représentation de code binaire sous forme graphique (classe) */ struct _GtkGraphViewClass { GtkBinViewClass parent; /* A laisser en premier */ }; /* Initialise la classe générique des graphiques de code. */ static void gtk_graph_view_class_init(GtkGraphViewClass *); /* Initialise une instance d'afficheur de code en graphique. */ static void gtk_graph_view_init(GtkGraphView *); /* Définit les lignes du graphique de représentation. */ static void gtk_graph_view_set_rendering_lines(GtkGraphView *, GRenderingLine *, GRenderingLine *); /* Indique la position d'affichage d'une adresse donnée. */ static bool gtk_graph_view_get_address_coordinates(GtkGraphView *, vmpa_t, gint *, gint *); /* Détermine le type du composant d'affichage en graphique. */ G_DEFINE_TYPE(GtkGraphView, gtk_graph_view, GTK_TYPE_BIN_VIEW) /****************************************************************************** * * * Paramètres : class = classe GTK à initialiser. * * * * Description : Initialise la classe générique des graphiques de code. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void gtk_graph_view_class_init(GtkGraphViewClass *class) { } /****************************************************************************** * * * Paramètres : view = instance GTK à initialiser. * * * * Description : Initialise une instance d'afficheur de code en graphique. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void gtk_graph_view_init(GtkGraphView *view) { GtkBinView *binview; /* Instance parente */ binview = GTK_BIN_VIEW(view); binview->set_lines = (set_rendering_lines_fc)gtk_graph_view_set_rendering_lines; binview->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates; } /****************************************************************************** * * * Paramètres : - * * * * Description : Crée un nouveau composant pour l'affichage en graphique. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ GtkWidget* gtk_graph_view_new(void) { return g_object_new(GTK_TYPE_GRAPH_VIEW, NULL); } /****************************************************************************** * * * Paramètres : view = composant GTK à mettre à jour. * * lines = informations à intégrer. * * last = dernière ligne à intégrer ou NULL pour toutes. * * * * Description : Définit les lignes du graphique de représentation. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void gtk_graph_view_set_rendering_lines(GtkGraphView *view, GRenderingLine *lines, GRenderingLine *last) { GRenderingLine *mainl; view->childs = (GtkBinView **)calloc(2, sizeof(GtkBinView *)); view->childs_count = 2; view->childs[0] = GTK_BIN_VIEW(gtk_block_view_new()); gtk_widget_show(GTK_WIDGET(view->childs[0])); gtk_fixed_put(GTK_FIXED(view), GTK_WIDGET(view->childs[0]), 50, 50); gtk_bin_view_set_rendering_lines(view->childs[0], lines, lines); mainl = g_rendering_line_find_by_address(lines, last, 0x08048434); printf("mainl : %p\n", mainl); view->childs[1] = GTK_BIN_VIEW(gtk_block_view_new()); gtk_widget_show(GTK_WIDGET(view->childs[1])); gtk_fixed_put(GTK_FIXED(view), GTK_WIDGET(view->childs[1]), 100, 450); gtk_bin_view_set_rendering_lines(view->childs[1], mainl, mainl); } /****************************************************************************** * * * Paramètres : view = composant GTK à consulter. * * addr = adresse à présenter à l'écran. * * x = position horizontale au sein du composant. [OUT] * * y = position verticale au sein du composant. [OUT] * * * * Description : Indique la position d'affichage d'une adresse donnée. * * * * Retour : TRUE si l'adresse fait partie du composant, FALSE sinon. * * * * Remarques : - * * * ******************************************************************************/ static bool gtk_graph_view_get_address_coordinates(GtkGraphView *view, vmpa_t addr, gint *x, gint *y) { bool result; /* Bilan à retourner */ size_t i; /* Boucle de parcours */ result = false; *x = 0; *y = 0; for (i = 0; i < view->childs_count && !result; i++) if (view->childs[i]->get_coordinates(view->childs[i], addr, x, y)) { *x += GTK_WIDGET(view->childs[i])->allocation.x; *y += GTK_WIDGET(view->childs[i])->allocation.y; result = true; } return result; }