From 46c8fd10ec5bff1ee1146a0b6a7aa7eb9f47a2da Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Tue, 14 Jul 2015 20:36:35 +0000 Subject: Moved the project information into the analysis domain. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@550 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 24 ++ plugins/ropgadgets/select.c | 2 +- src/Makefile.am | 3 +- src/analysis/Makefile.am | 1 + src/analysis/project.c | 715 ++++++++++++++++++++++++++++++++++++++++++++ src/analysis/project.h | 106 +++++++ src/dialogs/shellcode.h | 2 +- src/editor.c | 2 +- src/gui/editem.h | 2 +- src/gui/menus/file.c | 2 +- src/gui/menus/project.h | 2 +- src/gui/menus/view.c | 2 +- src/main.c | 2 +- src/project.c | 715 -------------------------------------------- src/project.h | 106 ------- 15 files changed, 855 insertions(+), 831 deletions(-) create mode 100644 src/analysis/project.c create mode 100644 src/analysis/project.h delete mode 100644 src/project.c delete mode 100644 src/project.h diff --git a/ChangeLog b/ChangeLog index fed6745..81fc42d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,29 @@ 15-07-14 Cyrille Bagard + * plugins/ropgadgets/select.c: + * src/analysis/Makefile.am: + Update code. + + * src/analysis/project.c: + * src/analysis/project.h: + New entries: move the project information into the analysis domain. + + * src/dialogs/shellcode.h: + * src/editor.c: + * src/gui/editem.h: + * src/gui/menus/file.c: + * src/gui/menus/project.h: + * src/gui/menus/view.c: + * src/main.c: + * src/Makefile.am: + Update code. + + * src/project.c: + * src/project.h: + Moved entries. + +15-07-14 Cyrille Bagard + * src/gui/panels/log.c: * src/gui/panels/log.h: Give to the log panel its own GLib instance. diff --git a/plugins/ropgadgets/select.c b/plugins/ropgadgets/select.c index 2889eb5..66c2add 100644 --- a/plugins/ropgadgets/select.c +++ b/plugins/ropgadgets/select.c @@ -35,7 +35,7 @@ #include -#include +#include #include #include #include diff --git a/src/Makefile.am b/src/Makefile.am index 5fcc34f..e82ecfb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -88,8 +88,7 @@ libchrysaplugin_la_LIBADD = \ chrysalide_SOURCES = \ editor.h editor.c \ - main.c \ - project.h project.c + main.c AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/intl $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) `pkg-config --cflags gthread-2.0` $(LIBPYTHON_CFLAGS) diff --git a/src/analysis/Makefile.am b/src/analysis/Makefile.am index 4842ec4..26f9df6 100755 --- a/src/analysis/Makefile.am +++ b/src/analysis/Makefile.am @@ -5,6 +5,7 @@ libanalysis_la_SOURCES = \ binary.h binary.c \ block-int.h \ block.h block.c \ + project.h project.c \ roptions.h roptions.c \ routine.h routine.c \ type-int.h \ diff --git a/src/analysis/project.c b/src/analysis/project.c new file mode 100644 index 0000000..7f86b11 --- /dev/null +++ b/src/analysis/project.c @@ -0,0 +1,715 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * project.c - gestion d'un groupe de fichiers binaires + * + * Copyright (C) 2008-2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 "project.h" + + +#include +#include +#include + + +#include "binaries/file.h" +#include "../common/xml.h" +#include "../core/params.h" +#include "../glibext/signal.h" +#include "../gtkext/easygtk.h" +#include "../gtkext/gtkblockview.h" +#include "../gtkext/gtkgraphview.h" +#include "../gtkext/gtksourceview.h" +#include "../gui/panels/panel.h" + + + +/* ------------------------- DEFINITION D'UN PROJET INTERNE ------------------------- */ + + +/* Conservation d'un binaire chargé */ +typedef struct _loaded_binary +{ + GLoadedBinary *binary; /* Binaire en question */ + GtkViewPanel *views[BVW_COUNT]; /* Composants pour l'affichage */ + GtkWidget *scrollwindows[BVW_COUNT]; /* Supports pour l'affichage */ + + GEditorItem *item; /* Support d'affichage final */ + +} loaded_binary; + + +/* Projet d'étude regroupant les binaires analysés (instance) */ +struct _GStudyProject +{ + GObject parent; /* A laisser en premier */ + + GObject *ref; /* Espace de référencement */ + + char *filename; /* Lieu d'enregistrement */ + + loaded_binary **binaries; /* Fichiers binaires associés */ + size_t binaries_count; /* Nombre de ces fichiers */ + GMutex mutex; /* Modification de la liste */ + +}; + + +/* Projet d'étude regroupant les binaires analysés (classe) */ +struct _GStudyProjectClass +{ + GObjectClass parent; /* A laisser en premier */ + +}; + + +/* Initialise la classe des projets d'étude. */ +static void g_study_project_class_init(GStudyProjectClass *); + +/*Initialise une instance de projet d'étude. */ +static void g_study_project_init(GStudyProject *); + +/* Supprime de l'écran un projet en place. */ +static void g_study_project_hide(const GStudyProject *); + + + +/* ---------------------------------------------------------------------------------- */ +/* DEFINITION D'UN PROJET INTERNE */ +/* ---------------------------------------------------------------------------------- */ + + +/* Indique le type défini pour un projet d'étude. */ +G_DEFINE_TYPE(GStudyProject, g_study_project, G_TYPE_OBJECT); + + +/****************************************************************************** +* * +* Paramètres : klass = classe à initialiser. * +* * +* Description : Initialise la classe des projets d'étude. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_study_project_class_init(GStudyProjectClass *klass) +{ + +} + + +/****************************************************************************** +* * +* Paramètres : project = instance à initialiser. * +* * +* Description : Initialise une instance de projet d'étude. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_study_project_init(GStudyProject *project) +{ + g_mutex_init(&project->mutex); + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Crée un nouveau projet vierge. * +* * +* Retour : Instance mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GStudyProject *g_study_project_new(GObject *ref) +{ + GStudyProject *result; /* Composant à retourner */ + + result = g_object_new(G_TYPE_STUDY_PROJECT, NULL); + + g_object_ref(ref); + result->ref = ref; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : filename = chemin d'accès au fichier à charger. * +* * +* Description : Crée un projet à partir du contenu XML d'un fichier. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +GStudyProject *g_study_project_open(GObject *ref, const char *filename) +{ + GStudyProject *result; /* Adresse à retourner */ + xmlDocPtr xdoc; /* Structure XML chargée */ + xmlXPathContextPtr context; /* Contexte pour les XPath */ + xmlXPathObjectPtr xobject; /* Cible d'une recherche */ + unsigned int i; /* Boucle de parcours */ + size_t access_len; /* Taille d'un chemin interne */ + char *access; /* Chemin pour une sous-config.*/ + GLoadedBinary *binary; /* Représentation à intégrer */ + + if (!open_xml_file(filename, &xdoc, &context)) return NULL; + + result = g_study_project_new(ref); + + result->filename = strdup(filename); + + /* Chargement des éléments binaires attachés */ + + xobject = get_node_xpath_object(context, "/OpenIDAProject/Binaries/Binary"); + + for (i = 0; i < XPATH_OBJ_NODES_COUNT(xobject); i++) + { + access_len = strlen("/OpenIDAProject/Binaries/Binary[position()=") + + strlen("4294967295" /* UINT_MAX */) + strlen("]") + 1; + + access = calloc(access_len, sizeof(char)); + snprintf(access, access_len, "/OpenIDAProject/Binaries/Binary[position()=%u]", i + 1); + + binary = g_loaded_binary_new_from_xml(context, access); + + free(access); + + if (binary != NULL) + { + g_signal_connect_to_main(binary, "disassembly-done", + G_CALLBACK(g_study_project_add_loaded_binary), result); + g_loaded_binary_analyse(binary); + } + + } + + if(xobject != NULL) + xmlXPathFreeObject(xobject); + + /* Fin du chargement */ + + close_xml_file(xdoc, context); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : project = project à sauvegarder. * +* filename = nom de fichier à utiliser ou NULL pour l'existant.* +* * +* Description : Procède à l'enregistrement d'un projet donné. * +* * +* Retour : true si l'enregistrement s'est déroule sans encombre. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_study_project_save(GStudyProject *project, const char *filename) +{ + bool result; /* Bilan à retourner */ + xmlDocPtr xdoc; /* Document XML à créer */ + xmlXPathContextPtr context; /* Contexte pour les recherches*/ + 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, "/OpenIDAProject") != NULL); + + /* Enregistrement des éléments binaires attachés */ + + for (i = 0; i < project->binaries_count && result; i++) + { + access_len = strlen("/OpenIDAProject/Binaries/Binary[position()=") + + strlen("4294967295" /* UINT_MAX */) + strlen("]") + 1; + + access = calloc(access_len, sizeof(char)); + snprintf(access, access_len, "/OpenIDAProject/Binaries/Binary[position()=%zu]", i + 1); + + result = g_loaded_binary_save(project->binaries[i]->binary, xdoc, context, access); + + free(access); + + } + + /* Sauvegarde finale */ + + result &= save_xml_file(xdoc, filename != NULL ? filename : project->filename); + + if (result && filename != NULL) + { + if (project->filename != NULL) free(project->filename); + project->filename = strdup(filename); + + } + + close_xml_file(xdoc, context); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : project = project à consulter. * +* * +* Description : Indique le chemin du fichier destiné à la sauvegarde. * +* * +* Retour : Chemin de fichier pour l'enregistrement ou NULL si indéfini. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const char *g_study_project_get_filename(const GStudyProject *project) +{ + return project->filename; + +} + + +/****************************************************************************** +* * +* Paramètres : binary = élément binaire tout juste désassemblé. * +* project = projet dont le contenu est à compléter. * +* * +* Description : Assure l'intégration d'un élément binaire dans un projet. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_study_project_add_loaded_binary(GLoadedBinary *binary, GStudyProject *project) +{ + size_t index; /* Indice du nouveau binaire */ + + index = g_study_project_attach_binary(project, binary); + + gboolean scroll_for_the_first_time(GtkWidget *widget, GdkEvent *event, GLoadedBinary *binary) + { + GBinFormat *format; /* Format associé au binaire */ + GBinSymbol *symbol; /* Point d'entrée trouvé */ + const mrange_t *range; /* Emplacement de ce point */ + + g_signal_handlers_disconnect_by_func(widget, G_CALLBACK(scroll_for_the_first_time), binary); + + format = G_BIN_FORMAT(g_loaded_binary_get_format(binary)); + + if (g_binary_format_find_symbol_by_label(format, "entry_point", &symbol)) + { + range = g_binary_symbol_get_range(symbol); + + gtk_view_panel_scroll_to_address(GTK_VIEW_PANEL(widget), get_mrange_addr(range), SPT_CENTER); + + } + + return FALSE; + + } + + g_signal_connect(project->binaries[index]->views[BVW_BLOCK], "size-allocate", + G_CALLBACK(scroll_for_the_first_time), binary); + + g_panel_item_dock(G_PANEL_ITEM(project->binaries[index]->item)); + +} + + +/****************************************************************************** +* * +* Paramètres : project = project à effacer de la mémoire. * +* binary = fichier binaire à associer au projet actuel. * +* * +* Description : Attache un fichier donné à un projet donné. * +* * +* Retour : Emplacement de l'élément créé. * +* * +* Remarques : - * +* * +******************************************************************************/ + +size_t g_study_project_attach_binary(GStudyProject *project, GLoadedBinary *binary) +{ + size_t result; /* Indice à retourner */ + loaded_binary *loaded; /* Structure à renvoyer */ + BinaryView i; /* Boucle de parcours */ + GtkWidget *view; /* Affichage du binaire */ + GtkWidget *scroll; /* Surface d'exposition */ + const char *name; /* Titre associé au binaire */ + const char *lname; /* Description du binaire */ + + loaded = (loaded_binary *)calloc(1, sizeof(loaded_binary)); + + loaded->binary = binary; + + for (i = 0; i < BVW_COUNT; i++) + { + /* Préparation du support visuel */ + + switch (i) + { + case BVW_BLOCK: + view = gtk_block_view_new(/*MRD_BLOCK*/); + break; + case BVW_GRAPH: + view = gtk_graph_view_new(); + break; + case BVW_SOURCE: + view = gtk_source_view_new(); + break; + default: /* GCC ! */ + break; + } + + manage_editor_items_view(GTK_VIEW_PANEL(view), true); + + gtk_widget_show(view); + + loaded->views[i] = GTK_VIEW_PANEL(view); + + gtk_view_panel_attach_binary(loaded->views[i], binary, i); + + /* Intégration finale dans un support défilant */ + + scroll = qck_create_scrolled_window(NULL, NULL); + gtk_container_add(GTK_CONTAINER(scroll), view); + + loaded->scrollwindows[i] = scroll; + + } + + /* Support graphique final */ + + scroll = loaded->scrollwindows[BVW_BLOCK]; + name = g_loaded_binary_get_name(binary, false); + lname = g_loaded_binary_get_name(binary, true); + + loaded->item = g_panel_item_new(project->ref, name, lname, scroll, "M"); + + /* Enregistrement dans le projet */ + + g_mutex_lock(&project->mutex); + + project->binaries = (loaded_binary **)realloc(project->binaries, + ++project->binaries_count * sizeof(loaded_binary *)); + + result = project->binaries_count - 1; + + project->binaries[result] = loaded; + + g_mutex_unlock(&project->mutex); + + update_project_area(project); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : project = project à effacer de la mémoire. * +* binary = fichier binaire à dissocier au projet actuel. * +* * +* Description : Détache un fichier donné à un projet donné. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_study_project_detach_binary(GStudyProject *project, GLoadedBinary *binary) +{ + //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); + + + //manage_editor_items_view(GObject *ref, GtkViewPanel *view, bool created) + + for (i = 0; i < project->binaries_count; i++) + if (project->binaries[i]->binary == binary) break; + + if ((i + 1) < project->binaries_count) + memmove(&project->binaries[i], &project->binaries[i + 1], (project->binaries_count - i - 1) * sizeof(loaded_binary *)); + + project->binaries = (loaded_binary **)realloc(project->binaries, + --project->binaries_count * sizeof(loaded_binary *)); + + update_project_area(project); + +} + + +/****************************************************************************** +* * +* Paramètres : project = projet à consulter. * +* binary = binaire chargé, encadré et concerné. * +* kind = type d'affichage requis. * +* view = afficheur effectif quelconque. [OUT] * +* * +* Description : Fournit un support d'affichage donné pour un binaire chargé. * +* * +* Retour : Composant GTK dédié à un affichage particulier. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *g_study_project_get_view_for_binary(const GStudyProject *project, const GLoadedBinary *binary, BinaryView kind, GtkViewPanel **view) +{ + GtkWidget *result; /* Composant GTK à retourner */ + size_t i; /* Boucle de parcours */ + + result = NULL; + *view = NULL; + + for (i = 0; i < project->binaries_count; i++) + if (project->binaries[i]->binary == binary) + { + result = project->binaries[i]->scrollwindows[kind]; + *view = project->binaries[i]->views[kind]; + break; + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : project = projet dont le contenu est à afficher. * +* * +* Description : Met en place un projet à l'écran. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_study_project_display(const GStudyProject *project) +{ + size_t i; /* Boucle de parcours */ + + for (i = 0; i < project->binaries_count; i++) + g_panel_item_dock(G_PANEL_ITEM(project->binaries[i]->item)); + +} + + +/****************************************************************************** +* * +* Paramètres : project = projet dont le contenu est à cacher. * +* * +* Description : Supprime de l'écran un projet en place. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_study_project_hide(const GStudyProject *project) +{ + size_t i; /* Boucle de parcours */ + + for (i = 0; i < project->binaries_count; i++) + g_panel_item_undock(G_PANEL_ITEM(project->binaries[i]->item)); + +} + + +/****************************************************************************** +* * +* Paramètres : project = projet dont le contenu est à afficher. * +* count = nombre de binaires pris en compte. [OUT] * +* * +* Description : Fournit l'ensemble des binaires associés à un projet. * +* * +* Retour : Liste à libérer de la mémoire. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GLoadedBinary **g_study_project_get_binaries(const GStudyProject *project, size_t *count) +{ + GLoadedBinary **result; /* Tableau à retourner */ + size_t i; /* Boucle de parcours */ + + *count = project->binaries_count; + result = (GLoadedBinary **)calloc(*count, sizeof(GLoadedBinary *)); + + for (i = 0; i < *count; i++) + { + result[i] = project->binaries[i]->binary; + g_object_ref(G_OBJECT(result[i])); + } + + return result; + +} + + +/* ---------------------------------------------------------------------------------- */ +/* GESTION GLOBALISEE DES PROJETS */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : project = éventuel adresse à renvoyer désormais. * +* * +* Description : Fournit l'adresse du projet courant. * +* * +* Retour : Adresse du projet ouvert ou NULL si aucun (!). * +* * +* Remarques : - * +* * +******************************************************************************/ + +GStudyProject *_get_current_study_project(GStudyProject *project) +{ + static GStudyProject *result = NULL; /* Adresse à retourner */ + + if (project != NULL) + { + if (result != NULL) + { + g_study_project_hide(result); + g_object_unref(G_OBJECT(result)); + } + + result = project; + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Fournit le gestionnaire des projets connus. * +* * +* Retour : Instance de gestion unique. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkRecentManager *get_projects_manager(void) +{ + static GtkRecentManager *result = NULL; /* Singleton à retourner */ + + if (result == NULL) + { + result = gtk_recent_manager_get_default(); + //gtk_recent_manager_purge_items(result, NULL); + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : project = projet à traiter. * +* * +* Description : Place un projet au sommet de la pile des projets récents. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void push_project_into_recent_list(const GStudyProject *project) +{ + GtkRecentManager *manager; /* Gestionnaire global */ + char *qualified; /* Chemin avec 'file://' */ + GtkRecentData recent; /* Données complètes */ + + if (project->filename == NULL) + return; + + /* Constitution de la liste des projets récents */ + + /* Constitution de la liste des projets récents */ + + manager = get_projects_manager(); + + qualified = (char *)calloc(strlen("file://") + strlen(project->filename) + 1, sizeof(char)); + + strcpy(qualified, "file://"); + strcat(qualified, project->filename); + + memset(&recent, 0, sizeof(GtkRecentData)); + + recent.mime_type = "application/chrysalide.project"; + recent.app_name = "Chrysalide"; + recent.app_exec = "chrysalide %f"; + + gtk_recent_manager_add_full(manager, qualified, &recent); + + free(qualified); + + /* Pour la prochaine ouverture du programme... */ + + g_generic_config_set_value(get_main_configuration(), MPK_LAST_PROJECT, project->filename); + +} diff --git a/src/analysis/project.h b/src/analysis/project.h new file mode 100644 index 0000000..05e7f12 --- /dev/null +++ b/src/analysis/project.h @@ -0,0 +1,106 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * project.h - prototypes pour la gestion d'un groupe de fichiers binaires + * + * Copyright (C) 2008-2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 . + */ + + +#ifndef _ANALYSIS_PROJECT_H +#define _ANALYSIS_PROJECT_H + + +#include + + +#include "binary.h" +#include "../gtkext/gtkviewpanel.h" + + + +/* ------------------------- DEFINITION D'UN PROJET INTERNE ------------------------- */ + + +#define G_TYPE_STUDY_PROJECT g_study_project_get_type() +#define G_STUDY_PROJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_study_project_get_type(), GStudyProject)) +#define G_IS_STUDY_PROJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_study_project_get_type())) +#define G_STUDY_PROJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_STUDY_PROJECT, GStudyProjectClass)) +#define G_IS_STUDY_PROJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_STUDY_PROJECT)) +#define G_STUDY_PROJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_STUDY_PROJECT, GStudyProjectClass)) + + +/* Projet d'étude regroupant les binaires analysés (instance) */ +typedef struct _GStudyProject GStudyProject; + +/* Projet d'étude regroupant les binaires analysés (classe) */ +typedef struct _GStudyProjectClass GStudyProjectClass; + + +/* Indique le type défini pour un projet d'étude. */ +GType g_study_project_get_type(void); + +/* Crée un nouveau projet vierge. */ +GStudyProject *g_study_project_new(GObject *); + +/* Crée un projet à partir du contenu XML d'un fichier. */ +GStudyProject *g_study_project_open(GObject *, const char *); + +/* Procède à l'enregistrement d'un projet donné. */ +bool g_study_project_save(GStudyProject *, const char *); + +/* Indique le chemin du fichier destiné à la sauvegarde. */ +const char *g_study_project_get_filename(const GStudyProject *); + +/* Assure l'intégration d'un élément binaire dans un projet. */ +void g_study_project_add_loaded_binary(GLoadedBinary *, GStudyProject *); + +/* Attache un fichier donné à un projet donné. */ +size_t g_study_project_attach_binary(GStudyProject *, GLoadedBinary *); + +/* Détache un fichier donné à un projet donné. */ +void g_study_project_detach_binary(GStudyProject *, GLoadedBinary *); + +/* Fournit un support d'affichage donné pour un binaire chargé. */ +GtkWidget *g_study_project_get_view_for_binary(const GStudyProject *, const GLoadedBinary *, BinaryView, GtkViewPanel **); + +/* Met en place un projet à l'écran. */ +void g_study_project_display(const GStudyProject *); + +/* Fournit l'ensemble des binaires associés à un projet. */ +GLoadedBinary **g_study_project_get_binaries(const GStudyProject *, size_t *); + + + +/* ------------------------- GESTION GLOBALISEE DES PROJETS ------------------------- */ + + +/* Fournit l'adresse du projet courant. */ +GStudyProject *_get_current_study_project(GStudyProject *); + +#define set_current_project(prj) _get_current_study_project(prj) +#define get_current_project() _get_current_study_project(NULL) + +/* Fournit le gestionnaire des projets connus. */ +GtkRecentManager *get_projects_manager(void); + +/* Place un projet au sommet de la pile des projets récents. */ +void push_project_into_recent_list(const GStudyProject *); + + + +#endif /* _PROJECT_H */ diff --git a/src/dialogs/shellcode.h b/src/dialogs/shellcode.h index 52313c3..d3bb422 100644 --- a/src/dialogs/shellcode.h +++ b/src/dialogs/shellcode.h @@ -25,7 +25,7 @@ #define _DIALOGS_EXPORT_H -#include "../project.h" +#include "../analysis/project.h" diff --git a/src/editor.c b/src/editor.c index 7e041f4..63b467b 100644 --- a/src/editor.c +++ b/src/editor.c @@ -28,7 +28,7 @@ #include -#include "project.h" +#include "analysis/project.h" #include "core/params.h" #include "gtkext/easygtk.h" #include "gtkext/gtkdockstation.h" diff --git a/src/gui/editem.h b/src/gui/editem.h index 827c752..c716337 100644 --- a/src/gui/editem.h +++ b/src/gui/editem.h @@ -29,8 +29,8 @@ #include -#include "../project.h" #include "../analysis/binary.h" +#include "../analysis/project.h" #include "../gtkext/gtkviewpanel.h" diff --git a/src/gui/menus/file.c b/src/gui/menus/file.c index e343788..6135f62 100644 --- a/src/gui/menus/file.c +++ b/src/gui/menus/file.c @@ -28,7 +28,7 @@ #include -#include "../../project.h" +#include "../../analysis/project.h" #include "../../gtkext/easygtk.h" diff --git a/src/gui/menus/project.h b/src/gui/menus/project.h index 92cede8..641f801 100644 --- a/src/gui/menus/project.h +++ b/src/gui/menus/project.h @@ -30,7 +30,7 @@ #include "menubar.h" -#include "../../project.h" +#include "../../analysis/project.h" diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c index c907bc8..c6299a6 100644 --- a/src/gui/menus/view.c +++ b/src/gui/menus/view.c @@ -29,7 +29,7 @@ #include "../editem-int.h" -#include "../../project.h" +#include "../../analysis/project.h" #include "../../gtkext/easygtk.h" #include "../../gtkext/gtkdockstation.h" diff --git a/src/main.c b/src/main.c index ffef584..cae6426 100644 --- a/src/main.c +++ b/src/main.c @@ -30,7 +30,7 @@ #include #include "editor.h" -#include "project.h" +#include "analysis/project.h" #include "analysis/db/server.h" #include "core/core.h" #include "core/params.h" diff --git a/src/project.c b/src/project.c deleted file mode 100644 index 5786532..0000000 --- a/src/project.c +++ /dev/null @@ -1,715 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * project.c - gestion d'un groupe de fichiers binaires - * - * Copyright (C) 2008-2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 "project.h" - - -#include -#include -#include - - -#include "analysis/binaries/file.h" -#include "common/xml.h" -#include "core/params.h" -#include "glibext/signal.h" -#include "gtkext/easygtk.h" -#include "gtkext/gtkblockview.h" -#include "gtkext/gtkgraphview.h" -#include "gtkext/gtksourceview.h" -#include "gui/panels/panel.h" - - - -/* ------------------------- DEFINITION D'UN PROJET INTERNE ------------------------- */ - - -/* Conservation d'un binaire chargé */ -typedef struct _loaded_binary -{ - GLoadedBinary *binary; /* Binaire en question */ - GtkViewPanel *views[BVW_COUNT]; /* Composants pour l'affichage */ - GtkWidget *scrollwindows[BVW_COUNT]; /* Supports pour l'affichage */ - - GEditorItem *item; /* Support d'affichage final */ - -} loaded_binary; - - -/* Projet d'étude regroupant les binaires analysés (instance) */ -struct _GStudyProject -{ - GObject parent; /* A laisser en premier */ - - GObject *ref; /* Espace de référencement */ - - char *filename; /* Lieu d'enregistrement */ - - loaded_binary **binaries; /* Fichiers binaires associés */ - size_t binaries_count; /* Nombre de ces fichiers */ - GMutex mutex; /* Modification de la liste */ - -}; - - -/* Projet d'étude regroupant les binaires analysés (classe) */ -struct _GStudyProjectClass -{ - GObjectClass parent; /* A laisser en premier */ - -}; - - -/* Initialise la classe des projets d'étude. */ -static void g_study_project_class_init(GStudyProjectClass *); - -/*Initialise une instance de projet d'étude. */ -static void g_study_project_init(GStudyProject *); - -/* Supprime de l'écran un projet en place. */ -static void g_study_project_hide(const GStudyProject *); - - - -/* ---------------------------------------------------------------------------------- */ -/* DEFINITION D'UN PROJET INTERNE */ -/* ---------------------------------------------------------------------------------- */ - - -/* Indique le type défini pour un projet d'étude. */ -G_DEFINE_TYPE(GStudyProject, g_study_project, G_TYPE_OBJECT); - - -/****************************************************************************** -* * -* Paramètres : klass = classe à initialiser. * -* * -* Description : Initialise la classe des projets d'étude. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_study_project_class_init(GStudyProjectClass *klass) -{ - -} - - -/****************************************************************************** -* * -* Paramètres : project = instance à initialiser. * -* * -* Description : Initialise une instance de projet d'étude. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_study_project_init(GStudyProject *project) -{ - g_mutex_init(&project->mutex); - -} - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Crée un nouveau projet vierge. * -* * -* Retour : Instance mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GStudyProject *g_study_project_new(GObject *ref) -{ - GStudyProject *result; /* Composant à retourner */ - - result = g_object_new(G_TYPE_STUDY_PROJECT, NULL); - - g_object_ref(ref); - result->ref = ref; - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : filename = chemin d'accès au fichier à charger. * -* * -* Description : Crée un projet à partir du contenu XML d'un fichier. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -GStudyProject *g_study_project_open(GObject *ref, const char *filename) -{ - GStudyProject *result; /* Adresse à retourner */ - xmlDocPtr xdoc; /* Structure XML chargée */ - xmlXPathContextPtr context; /* Contexte pour les XPath */ - xmlXPathObjectPtr xobject; /* Cible d'une recherche */ - unsigned int i; /* Boucle de parcours */ - size_t access_len; /* Taille d'un chemin interne */ - char *access; /* Chemin pour une sous-config.*/ - GLoadedBinary *binary; /* Représentation à intégrer */ - - if (!open_xml_file(filename, &xdoc, &context)) return NULL; - - result = g_study_project_new(ref); - - result->filename = strdup(filename); - - /* Chargement des éléments binaires attachés */ - - xobject = get_node_xpath_object(context, "/OpenIDAProject/Binaries/Binary"); - - for (i = 0; i < XPATH_OBJ_NODES_COUNT(xobject); i++) - { - access_len = strlen("/OpenIDAProject/Binaries/Binary[position()=") - + strlen("4294967295" /* UINT_MAX */) + strlen("]") + 1; - - access = calloc(access_len, sizeof(char)); - snprintf(access, access_len, "/OpenIDAProject/Binaries/Binary[position()=%u]", i + 1); - - binary = g_loaded_binary_new_from_xml(context, access); - - free(access); - - if (binary != NULL) - { - g_signal_connect_to_main(binary, "disassembly-done", - G_CALLBACK(g_study_project_add_loaded_binary), result); - g_loaded_binary_analyse(binary); - } - - } - - if(xobject != NULL) - xmlXPathFreeObject(xobject); - - /* Fin du chargement */ - - close_xml_file(xdoc, context); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : project = project à sauvegarder. * -* filename = nom de fichier à utiliser ou NULL pour l'existant.* -* * -* Description : Procède à l'enregistrement d'un projet donné. * -* * -* Retour : true si l'enregistrement s'est déroule sans encombre. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool g_study_project_save(GStudyProject *project, const char *filename) -{ - bool result; /* Bilan à retourner */ - xmlDocPtr xdoc; /* Document XML à créer */ - xmlXPathContextPtr context; /* Contexte pour les recherches*/ - 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, "/OpenIDAProject") != NULL); - - /* Enregistrement des éléments binaires attachés */ - - for (i = 0; i < project->binaries_count && result; i++) - { - access_len = strlen("/OpenIDAProject/Binaries/Binary[position()=") - + strlen("4294967295" /* UINT_MAX */) + strlen("]") + 1; - - access = calloc(access_len, sizeof(char)); - snprintf(access, access_len, "/OpenIDAProject/Binaries/Binary[position()=%zu]", i + 1); - - result = g_loaded_binary_save(project->binaries[i]->binary, xdoc, context, access); - - free(access); - - } - - /* Sauvegarde finale */ - - result &= save_xml_file(xdoc, filename != NULL ? filename : project->filename); - - if (result && filename != NULL) - { - if (project->filename != NULL) free(project->filename); - project->filename = strdup(filename); - - } - - close_xml_file(xdoc, context); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : project = project à consulter. * -* * -* Description : Indique le chemin du fichier destiné à la sauvegarde. * -* * -* Retour : Chemin de fichier pour l'enregistrement ou NULL si indéfini. * -* * -* Remarques : - * -* * -******************************************************************************/ - -const char *g_study_project_get_filename(const GStudyProject *project) -{ - return project->filename; - -} - - -/****************************************************************************** -* * -* Paramètres : binary = élément binaire tout juste désassemblé. * -* project = projet dont le contenu est à compléter. * -* * -* Description : Assure l'intégration d'un élément binaire dans un projet. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_study_project_add_loaded_binary(GLoadedBinary *binary, GStudyProject *project) -{ - size_t index; /* Indice du nouveau binaire */ - - index = g_study_project_attach_binary(project, binary); - - gboolean scroll_for_the_first_time(GtkWidget *widget, GdkEvent *event, GLoadedBinary *binary) - { - GBinFormat *format; /* Format associé au binaire */ - GBinSymbol *symbol; /* Point d'entrée trouvé */ - const mrange_t *range; /* Emplacement de ce point */ - - g_signal_handlers_disconnect_by_func(widget, G_CALLBACK(scroll_for_the_first_time), binary); - - format = G_BIN_FORMAT(g_loaded_binary_get_format(binary)); - - if (g_binary_format_find_symbol_by_label(format, "entry_point", &symbol)) - { - range = g_binary_symbol_get_range(symbol); - - gtk_view_panel_scroll_to_address(GTK_VIEW_PANEL(widget), get_mrange_addr(range), SPT_CENTER); - - } - - return FALSE; - - } - - g_signal_connect(project->binaries[index]->views[BVW_BLOCK], "size-allocate", - G_CALLBACK(scroll_for_the_first_time), binary); - - g_panel_item_dock(G_PANEL_ITEM(project->binaries[index]->item)); - -} - - -/****************************************************************************** -* * -* Paramètres : project = project à effacer de la mémoire. * -* binary = fichier binaire à associer au projet actuel. * -* * -* Description : Attache un fichier donné à un projet donné. * -* * -* Retour : Emplacement de l'élément créé. * -* * -* Remarques : - * -* * -******************************************************************************/ - -size_t g_study_project_attach_binary(GStudyProject *project, GLoadedBinary *binary) -{ - size_t result; /* Indice à retourner */ - loaded_binary *loaded; /* Structure à renvoyer */ - BinaryView i; /* Boucle de parcours */ - GtkWidget *view; /* Affichage du binaire */ - GtkWidget *scroll; /* Surface d'exposition */ - const char *name; /* Titre associé au binaire */ - const char *lname; /* Description du binaire */ - - loaded = (loaded_binary *)calloc(1, sizeof(loaded_binary)); - - loaded->binary = binary; - - for (i = 0; i < BVW_COUNT; i++) - { - /* Préparation du support visuel */ - - switch (i) - { - case BVW_BLOCK: - view = gtk_block_view_new(/*MRD_BLOCK*/); - break; - case BVW_GRAPH: - view = gtk_graph_view_new(); - break; - case BVW_SOURCE: - view = gtk_source_view_new(); - break; - default: /* GCC ! */ - break; - } - - manage_editor_items_view(GTK_VIEW_PANEL(view), true); - - gtk_widget_show(view); - - loaded->views[i] = GTK_VIEW_PANEL(view); - - gtk_view_panel_attach_binary(loaded->views[i], binary, i); - - /* Intégration finale dans un support défilant */ - - scroll = qck_create_scrolled_window(NULL, NULL); - gtk_container_add(GTK_CONTAINER(scroll), view); - - loaded->scrollwindows[i] = scroll; - - } - - /* Support graphique final */ - - scroll = loaded->scrollwindows[BVW_BLOCK]; - name = g_loaded_binary_get_name(binary, false); - lname = g_loaded_binary_get_name(binary, true); - - loaded->item = g_panel_item_new(project->ref, name, lname, scroll, "M"); - - /* Enregistrement dans le projet */ - - g_mutex_lock(&project->mutex); - - project->binaries = (loaded_binary **)realloc(project->binaries, - ++project->binaries_count * sizeof(loaded_binary *)); - - result = project->binaries_count - 1; - - project->binaries[result] = loaded; - - g_mutex_unlock(&project->mutex); - - update_project_area(project); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : project = project à effacer de la mémoire. * -* binary = fichier binaire à dissocier au projet actuel. * -* * -* Description : Détache un fichier donné à un projet donné. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_study_project_detach_binary(GStudyProject *project, GLoadedBinary *binary) -{ - //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); - - - //manage_editor_items_view(GObject *ref, GtkViewPanel *view, bool created) - - for (i = 0; i < project->binaries_count; i++) - if (project->binaries[i]->binary == binary) break; - - if ((i + 1) < project->binaries_count) - memmove(&project->binaries[i], &project->binaries[i + 1], (project->binaries_count - i - 1) * sizeof(loaded_binary *)); - - project->binaries = (loaded_binary **)realloc(project->binaries, - --project->binaries_count * sizeof(loaded_binary *)); - - update_project_area(project); - -} - - -/****************************************************************************** -* * -* Paramètres : project = projet à consulter. * -* binary = binaire chargé, encadré et concerné. * -* kind = type d'affichage requis. * -* view = afficheur effectif quelconque. [OUT] * -* * -* Description : Fournit un support d'affichage donné pour un binaire chargé. * -* * -* Retour : Composant GTK dédié à un affichage particulier. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkWidget *g_study_project_get_view_for_binary(const GStudyProject *project, const GLoadedBinary *binary, BinaryView kind, GtkViewPanel **view) -{ - GtkWidget *result; /* Composant GTK à retourner */ - size_t i; /* Boucle de parcours */ - - result = NULL; - *view = NULL; - - for (i = 0; i < project->binaries_count; i++) - if (project->binaries[i]->binary == binary) - { - result = project->binaries[i]->scrollwindows[kind]; - *view = project->binaries[i]->views[kind]; - break; - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : project = projet dont le contenu est à afficher. * -* * -* Description : Met en place un projet à l'écran. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_study_project_display(const GStudyProject *project) -{ - size_t i; /* Boucle de parcours */ - - for (i = 0; i < project->binaries_count; i++) - g_panel_item_dock(G_PANEL_ITEM(project->binaries[i]->item)); - -} - - -/****************************************************************************** -* * -* Paramètres : project = projet dont le contenu est à cacher. * -* * -* Description : Supprime de l'écran un projet en place. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_study_project_hide(const GStudyProject *project) -{ - size_t i; /* Boucle de parcours */ - - for (i = 0; i < project->binaries_count; i++) - g_panel_item_undock(G_PANEL_ITEM(project->binaries[i]->item)); - -} - - -/****************************************************************************** -* * -* Paramètres : project = projet dont le contenu est à afficher. * -* count = nombre de binaires pris en compte. [OUT] * -* * -* Description : Fournit l'ensemble des binaires associés à un projet. * -* * -* Retour : Liste à libérer de la mémoire. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GLoadedBinary **g_study_project_get_binaries(const GStudyProject *project, size_t *count) -{ - GLoadedBinary **result; /* Tableau à retourner */ - size_t i; /* Boucle de parcours */ - - *count = project->binaries_count; - result = (GLoadedBinary **)calloc(*count, sizeof(GLoadedBinary *)); - - for (i = 0; i < *count; i++) - { - result[i] = project->binaries[i]->binary; - g_object_ref(G_OBJECT(result[i])); - } - - return result; - -} - - -/* ---------------------------------------------------------------------------------- */ -/* GESTION GLOBALISEE DES PROJETS */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : project = éventuel adresse à renvoyer désormais. * -* * -* Description : Fournit l'adresse du projet courant. * -* * -* Retour : Adresse du projet ouvert ou NULL si aucun (!). * -* * -* Remarques : - * -* * -******************************************************************************/ - -GStudyProject *_get_current_study_project(GStudyProject *project) -{ - static GStudyProject *result = NULL; /* Adresse à retourner */ - - if (project != NULL) - { - if (result != NULL) - { - g_study_project_hide(result); - g_object_unref(G_OBJECT(result)); - } - - result = project; - - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Fournit le gestionnaire des projets connus. * -* * -* Retour : Instance de gestion unique. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkRecentManager *get_projects_manager(void) -{ - static GtkRecentManager *result = NULL; /* Singleton à retourner */ - - if (result == NULL) - { - result = gtk_recent_manager_get_default(); - //gtk_recent_manager_purge_items(result, NULL); - } - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : project = projet à traiter. * -* * -* Description : Place un projet au sommet de la pile des projets récents. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void push_project_into_recent_list(const GStudyProject *project) -{ - GtkRecentManager *manager; /* Gestionnaire global */ - char *qualified; /* Chemin avec 'file://' */ - GtkRecentData recent; /* Données complètes */ - - if (project->filename == NULL) - return; - - /* Constitution de la liste des projets récents */ - - /* Constitution de la liste des projets récents */ - - manager = get_projects_manager(); - - qualified = (char *)calloc(strlen("file://") + strlen(project->filename) + 1, sizeof(char)); - - strcpy(qualified, "file://"); - strcat(qualified, project->filename); - - memset(&recent, 0, sizeof(GtkRecentData)); - - recent.mime_type = "application/chrysalide.project"; - recent.app_name = "Chrysalide"; - recent.app_exec = "chrysalide %f"; - - gtk_recent_manager_add_full(manager, qualified, &recent); - - free(qualified); - - /* Pour la prochaine ouverture du programme... */ - - g_generic_config_set_value(get_main_configuration(), MPK_LAST_PROJECT, project->filename); - -} diff --git a/src/project.h b/src/project.h deleted file mode 100644 index 0f4a8f0..0000000 --- a/src/project.h +++ /dev/null @@ -1,106 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * project.h - prototypes pour la gestion d'un groupe de fichiers binaires - * - * Copyright (C) 2008-2014 Cyrille Bagard - * - * This file is part of Chrysalide. - * - * 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 . - */ - - -#ifndef _PROJECT_H -#define _PROJECT_H - - -#include - - -#include "analysis/binary.h" -#include "gtkext/gtkviewpanel.h" - - - -/* ------------------------- DEFINITION D'UN PROJET INTERNE ------------------------- */ - - -#define G_TYPE_STUDY_PROJECT g_study_project_get_type() -#define G_STUDY_PROJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_study_project_get_type(), GStudyProject)) -#define G_IS_STUDY_PROJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_study_project_get_type())) -#define G_STUDY_PROJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_STUDY_PROJECT, GStudyProjectClass)) -#define G_IS_STUDY_PROJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_STUDY_PROJECT)) -#define G_STUDY_PROJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_STUDY_PROJECT, GStudyProjectClass)) - - -/* Projet d'étude regroupant les binaires analysés (instance) */ -typedef struct _GStudyProject GStudyProject; - -/* Projet d'étude regroupant les binaires analysés (classe) */ -typedef struct _GStudyProjectClass GStudyProjectClass; - - -/* Indique le type défini pour un projet d'étude. */ -GType g_study_project_get_type(void); - -/* Crée un nouveau projet vierge. */ -GStudyProject *g_study_project_new(GObject *); - -/* Crée un projet à partir du contenu XML d'un fichier. */ -GStudyProject *g_study_project_open(GObject *, const char *); - -/* Procède à l'enregistrement d'un projet donné. */ -bool g_study_project_save(GStudyProject *, const char *); - -/* Indique le chemin du fichier destiné à la sauvegarde. */ -const char *g_study_project_get_filename(const GStudyProject *); - -/* Assure l'intégration d'un élément binaire dans un projet. */ -void g_study_project_add_loaded_binary(GLoadedBinary *, GStudyProject *); - -/* Attache un fichier donné à un projet donné. */ -size_t g_study_project_attach_binary(GStudyProject *, GLoadedBinary *); - -/* Détache un fichier donné à un projet donné. */ -void g_study_project_detach_binary(GStudyProject *, GLoadedBinary *); - -/* Fournit un support d'affichage donné pour un binaire chargé. */ -GtkWidget *g_study_project_get_view_for_binary(const GStudyProject *, const GLoadedBinary *, BinaryView, GtkViewPanel **); - -/* Met en place un projet à l'écran. */ -void g_study_project_display(const GStudyProject *); - -/* Fournit l'ensemble des binaires associés à un projet. */ -GLoadedBinary **g_study_project_get_binaries(const GStudyProject *, size_t *); - - - -/* ------------------------- GESTION GLOBALISEE DES PROJETS ------------------------- */ - - -/* Fournit l'adresse du projet courant. */ -GStudyProject *_get_current_study_project(GStudyProject *); - -#define set_current_project(prj) _get_current_study_project(prj) -#define get_current_project() _get_current_study_project(NULL) - -/* Fournit le gestionnaire des projets connus. */ -GtkRecentManager *get_projects_manager(void); - -/* Place un projet au sommet de la pile des projets récents. */ -void push_project_into_recent_list(const GStudyProject *); - - - -#endif /* _PROJECT_H */ -- cgit v0.11.2-87-g4458