diff options
| author | Cyrille Bagard <nocbos@gmail.com> | 2010-03-21 18:54:20 (GMT) | 
|---|---|---|
| committer | Cyrille Bagard <nocbos@gmail.com> | 2010-03-21 18:54:20 (GMT) | 
| commit | 8123d9342f92a2cf6fd999b350252c001f403092 (patch) | |
| tree | 5030aa5d40fa8551937649cdd3377062ec8991d0 /src/dialogs | |
| parent | a6acb5629572e6da4d72f4419b01672c2ea5ddf2 (diff) | |
Allowed a simple export of an assembly content.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@144 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/dialogs')
| -rw-r--r-- | src/dialogs/Makefile.am | 3 | ||||
| -rw-r--r-- | src/dialogs/export.c | 637 | ||||
| -rw-r--r-- | src/dialogs/export.h | 37 | 
3 files changed, 676 insertions, 1 deletions
| diff --git a/src/dialogs/Makefile.am b/src/dialogs/Makefile.am index 181f418..22eaeac 100644 --- a/src/dialogs/Makefile.am +++ b/src/dialogs/Makefile.am @@ -2,7 +2,8 @@  lib_LIBRARIES = libdialogs.a  libdialogs_a_SOURCES =					\ -	binparts.h binparts.c +	binparts.h binparts.c				\ +	export.h export.c  libdialogs_a_LDFLAGS =  diff --git a/src/dialogs/export.c b/src/dialogs/export.c new file mode 100644 index 0000000..3c97815 --- /dev/null +++ b/src/dialogs/export.c @@ -0,0 +1,637 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * export.c - assistant d'exportation de contenu binaire + * + * Copyright (C) 2010 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 <http://www.gnu.org/licenses/>. + */ + + +#include "export.h" + + +#include <stdio.h> +#include <string.h> + + +#include "../analysis/exporter.h" +#include "../glibext/delayed-int.h" +#include "../gtkext/easygtk.h" + + + +#ifndef _ +#   define _(str) str +#endif + + + + +/* ------------------------ PARTIE PRINCIPALE DE L'ASSISTANT ------------------------ */ + + +/* Ferme l'assistant sans dérouler la procédure. */ +static void export_assistant_cancel(GtkAssistant *, gpointer); + +/* Ferme l'assistant et déroule la procédure. */ +static void export_assistant_close(GtkAssistant *, GObject *); + + + +/* -------------------- DEFINITION DES REGLAGES DE L'EXPORTATION -------------------- */ + + +/* Ajoute le panneau de choix du type de sortie. */ +static void register_output_panel(GtkAssistant *); + +/* Réagit un changement du nom de fichier pour l'exportation. */ +static void on_export_filename_changed(GtkEntry *, GtkAssistant *); + +/* Sélectionne ou non un nouveau fichier de sortie. */ +static void on_filename_browsing_clicked(GtkButton *, GObject *); + + + +/* ------------------------- SELECTION DU CONTENU A TRAITER ------------------------- */ + + +/* Ajoute le panneau de sélection du contenu à exporter. */ +static void register_content_panel(GtkAssistant *); + + + +/* ------------------------- EXPORTATION DE BINAIRE DIFFERE ------------------------- */ + + +#define G_TYPE_DELAYED_EXPORT               g_delayed_export_get_type() +#define G_DELAYED_EXPORT(obj)               (G_TYPE_CHECK_INSTANCE_CAST((obj), g_delayed_export_get_type(), GDelayedExport)) +#define G_IS_DELAYED_EXPORT(obj)            (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_delayed_export_get_type())) +#define G_DELAYED_EXPORT_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_DELAYED_EXPORT, GDelayedExportClass)) +#define G_IS_DELAYED_EXPORT_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_DELAYED_EXPORT)) +#define G_DELAYED_EXPORT_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_DELAYED_EXPORT, GDelayedExportClass)) + + +/* Ensembles binaires à désassembler (instance) */ +typedef struct _GDelayedExport +{ +    GDelayedWork parent;                    /* A laisser en premier        */ + +    char *filename;                         /* Fichier à remplir           */ + +    GOpenidaBinary *binary;                 /* Destinataire final          */ +    GRenderingOptions *options;             /* Options d'exportation       */ + +} GDelayedExport; + +/* Ensembles binaires à désassembler (classe) */ +typedef struct _GDelayedExportClass +{ +    GDelayedWorkClass parent;               /* A laisser en premier        */ + +} GDelayedExportClass; + + +/* Indique le type défini pour les tâches d'exportation différée. */ +static GType g_delayed_export_get_type(void); + +/* Initialise la classe des tâches d'exportation différée. */ +static void g_delayed_export_class_init(GDelayedExportClass *); + +/* Initialise une tâche d'exportation différée. */ +static void g_delayed_export_init(GDelayedExport *); + +/* Crée une tâche d'exportation différée. */ +static GDelayedExport *g_delayed_export_new(const char *, GOpenidaBinary *, GRenderingOptions *); + +/* Assure l'exportation en différé. */ +static void g_delayed_export_process(GDelayedExport *, GtkExtStatusBar *); + + + +/* ---------------------------------------------------------------------------------- */ +/*                          PARTIE PRINCIPALE DE L'ASSISTANT                          */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : binary = binaire chargé en mémoire à traiter.                * +*                parent = fenêtre principale de l'éditeur.                    * +*                                                                             * +*  Description : Crée et affiche un assistant d'aide à l'exportation.         * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +void run_export_assistant(GOpenidaBinary *binary, GtkWindow *parent) +{ +    GtkWidget *assistant;                   /* Fenêtre à afficher          */ +    GObject *ref;                           /* Espace de référencement     */ + +    assistant = gtk_assistant_new(); +    gtk_widget_set_size_request(assistant, 450, 300); +    gtk_window_set_position(GTK_WINDOW(assistant), GTK_WIN_POS_CENTER); +    gtk_window_set_title(GTK_WINDOW(assistant), _("Export assistant")); + +    gtk_window_set_modal(GTK_WINDOW(assistant), TRUE); +    gtk_window_set_transient_for(GTK_WINDOW(assistant), parent); + +    ref = G_OBJECT(assistant); +    g_object_set_data(ref, "binary", binary); + +    register_output_panel(GTK_ASSISTANT(assistant)); +    register_content_panel(GTK_ASSISTANT(assistant)); + +    g_signal_connect(G_OBJECT(assistant), "cancel", G_CALLBACK(export_assistant_cancel), NULL); +    g_signal_connect(G_OBJECT(assistant), "close", G_CALLBACK(export_assistant_close), ref); + +    gtk_widget_show_all(assistant); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : assistant = fenêtre à compléter et référencement global.     * +*                data      = adresse non utilisée ici.                        * +*                                                                             * +*  Description : Ferme l'assistant sans dérouler la procédure.                * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void export_assistant_cancel(GtkAssistant *assistant, gpointer data) +{ +    gtk_widget_destroy(GTK_WIDGET(assistant)); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : assistant = fenêtre à compléter et référencement global.     * +*                ref       = adresse de l'espace de référencement global.     * +*                                                                             * +*  Description : Ferme l'assistant et déroule la procédure.                   * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void export_assistant_close(GtkAssistant *assistant, GObject *ref) +{ +    GOpenidaBinary *binary;                 /* Binaire chargé à parcourir  */ +    GExeFormat *format;                     /* Format du binaire           */ +    GArchProcessor *proc;                   /* Architecture visée          */ +    GRenderingOptions *options;             /* Options d'exportation       */ +    GtkToggleButton *checkbutton;           /* Coche à retrouver           */ +    gboolean state;                         /* Valeur à prendre en compte  */ +    GtkEntry *entry;                        /* Zone de saisie              */ +    const gchar *filename;                  /* Chemin d'accès du fichier   */ +    GDelayedExport *export;                 /* Procédure d'exportation     */ +    GWorkQueue *queue;                      /* Gestionnaire de différés    */ + +    binary = G_OPENIDA_BINARY(g_object_get_data(ref, "binary")); + +    format = g_openida_binary_get_format(binary); +    proc = get_arch_processor_from_format(format); + +    options = g_rendering_options_new(format, proc); + +    /* Eléments à afficher */ + +    checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "virtual_addr")); +    state = gtk_toggle_button_get_active(checkbutton); +    g_rendering_options_show_address(options, MRD_BLOCK, state); + +    checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "binary_code")); +    state = gtk_toggle_button_get_active(checkbutton); +    g_rendering_options_show_code(options, MRD_BLOCK, state); + +    checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "assembly_code")); +    state = gtk_toggle_button_get_active(checkbutton); + +    /* Programmation de la tâche */ + +    entry = GTK_ENTRY(g_object_get_data(ref, "filename")); +    filename = gtk_entry_get_text(entry); + +    export = g_delayed_export_new(filename, binary, options); + +    queue = get_work_queue(); +    g_work_queue_schedule_work(queue, G_DELAYED_WORK(export)); + +    gtk_widget_destroy(GTK_WIDGET(assistant)); + +} + + + +/* ---------------------------------------------------------------------------------- */ +/*                      DEFINITION DES REGLAGES DE L'EXPORTATION                      */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : assistant = fenêtre à compléter et référencement global.     * +*                                                                             * +*  Description : Ajoute le panneau de choix du type de sortie.                * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void register_output_panel(GtkAssistant *assistant) +{ +    GtkWidget *alignment;                   /* Disposition sur le support  */ +    GtkWidget *vbox;                        /* Support principal #1        */ +    GtkWidget *hbox;                        /* Support principal #2        */ +    GtkWidget *label;                       /* Etiquette d'indication      */ +    GtkWidget *combobox;                    /* Sélection du format         */ +    GtkWidget *entry;                       /* Zone de saisie de texte     */ +    GtkWidget *button;                      /* Sélection de fichier        */ +    GOpenidaBinary *binary;                 /* Binaire chargé à parcourir  */ +    const char *filename;                   /* Chemin d'accès par défaut   */ + +    alignment = qck_create_padded_alignment(8, 8, 8, 8); + +    vbox = gtk_vbox_new(TRUE, 0); +    gtk_widget_show(vbox); +    gtk_container_add(GTK_CONTAINER(alignment), vbox); + +    /* Format de sortie */ + +    hbox = gtk_hbox_new(FALSE, 0); +    gtk_widget_show(hbox); +    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + +    label = qck_create_label(NULL, NULL, _("Format : ")); +    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + +    combobox = qck_create_combobox(NULL, NULL, G_CALLBACK(NULL), NULL); +    gtk_box_pack_start(GTK_BOX(hbox), combobox, TRUE, TRUE, 0); + +    gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), _("Simple text")); + +    gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0); + +    /* Fichier de sortie */ + +    hbox = gtk_hbox_new(FALSE, 0); +    gtk_widget_show(hbox); +    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + +    label = qck_create_label(NULL, NULL, _("File : ")); +    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + +    entry = qck_create_entry(G_OBJECT(assistant), "filename", NULL); +    gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); + +    button = qck_create_button(NULL, NULL, "...", G_CALLBACK(on_filename_browsing_clicked), assistant); +    gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + +    /* Intégration */ + +    gtk_assistant_append_page(assistant, alignment); +    gtk_assistant_set_page_title(assistant, alignment, _("Output")); +    gtk_assistant_set_page_type(assistant, alignment, GTK_ASSISTANT_PAGE_INTRO); + +    gtk_assistant_set_page_complete(assistant, alignment, TRUE); + +    /* Choix par défaut */ + +    binary = G_OPENIDA_BINARY(g_object_get_data(G_OBJECT(assistant), "binary")); +    filename = g_openida_binary_get_filename(binary); + +    gtk_entry_set_text(GTK_ENTRY(entry), filename); +    gtk_entry_append_text(GTK_ENTRY(entry), ".txt"); + +    g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(on_export_filename_changed), assistant); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : entry     = zone de texte dont le contenu vient de changer.  * +*                assistant = fenêtre affichée et référencement global.        * +*                                                                             * +*  Description : Réagit un changement du nom de fichier pour l'exportation.   * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void on_export_filename_changed(GtkEntry *entry, GtkAssistant *assistant) +{ +    const gchar *text;                      /* Texte saisi dans la zone    */ +    gint num;                               /* Etape courante              */ +    GtkWidget *page;                        /* Support de cette étape      */ + +    text = gtk_entry_get_text(entry); + +    num = gtk_assistant_get_current_page(assistant); +    page = gtk_assistant_get_nth_page(assistant, num); + +    gtk_assistant_set_page_complete(assistant, page, (strlen(text) > 0)); + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : button = bouton d'édition de la sélection.                   * +*                ref    = espace de référencement principal.                  * +*                                                                             * +*  Description : Sélectionne ou non un nouveau fichier de sortie.             * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void on_filename_browsing_clicked(GtkButton *button, GObject *ref) +{ +    GtkWidget *dialog;                      /* Boîte à afficher            */ +    gchar *filename;                        /* Nom du fichier à intégrer   */ +    GtkEntry *entry;                        /* Zone de saisie à maj.       */ + +    dialog = gtk_file_chooser_dialog_new(_("Choose an output filename"), GTK_WINDOW(ref), +                                         GTK_FILE_CHOOSER_ACTION_SAVE, +                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, +                                         GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, +                                         NULL); + +    entry = GTK_ENTRY(g_object_get_data(ref, "filename")); +    gtk_file_chooser_set_filename(dialog, gtk_entry_get_text(entry)); + +    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) +    { +        filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + +        gtk_entry_set_text(GTK_ENTRY(entry), filename); + +        g_free(filename); + +    } + +    gtk_widget_destroy(dialog); + +} + + + +/* ---------------------------------------------------------------------------------- */ +/*                           SELECTION DU CONTENU A TRAITER                           */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : assistant = fenêtre à compléter et référencement global.     * +*                                                                             * +*  Description : Ajoute le panneau de sélection du contenu à exporter.        * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void register_content_panel(GtkAssistant *assistant) +{ +    GtkWidget *alignment;                   /* Disposition sur le support  */ +    GtkWidget *vbox;                        /* Support principal           */ +    GtkWidget *frame;                       /* Support avec encadrement    */ +    GtkWidget *subalign;                    /* Disposition des options     */ + +    GtkWidget *vbox3; +    GtkWidget *checkbutton;                 /* Coche pour une option       */ +    GtkWidget *vbox4; + +    alignment = qck_create_padded_alignment(8, 8, 8, 8); + +    vbox = gtk_vbox_new(TRUE, 0); +    gtk_widget_show(vbox); +    gtk_container_add(GTK_CONTAINER(alignment), vbox); + +    /* Lignes à traiter */ + +    frame = qck_create_frame(_("<b>Lines to process</b>"), &subalign, 0, 0, 12, 0); +    gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + +    vbox3 = gtk_vbox_new(FALSE, 0); +    gtk_widget_show(vbox3); +    gtk_container_add(GTK_CONTAINER(subalign), vbox3); + +    checkbutton = qck_create_check_button(G_OBJECT(assistant), "prologue", _("Prologue"), NULL, NULL); +    gtk_box_pack_start(GTK_BOX(vbox3), checkbutton, FALSE, FALSE, 0); +    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + +    checkbutton = qck_create_check_button(G_OBJECT(assistant), "code", _("Code"), NULL, NULL); +    gtk_box_pack_start(GTK_BOX(vbox3), checkbutton, FALSE, FALSE, 0); +    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + +    checkbutton = qck_create_check_button(G_OBJECT(assistant), "comments", _("Comments"), NULL, NULL); +    gtk_box_pack_start(GTK_BOX(vbox3), checkbutton, FALSE, FALSE, 0); +    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + +    /* Eléments à afficher */ + +    frame = qck_create_frame(_("<b>Items to display</b>"), &subalign, 0, 0, 12, 0); +    gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + +    vbox4 = gtk_vbox_new(FALSE, 0); +    gtk_widget_show(vbox4); +    gtk_container_add(GTK_CONTAINER(subalign), vbox4); + +    checkbutton = qck_create_check_button(G_OBJECT(assistant), "virtual_addr", _("Virtual address"), NULL, NULL); +    gtk_box_pack_start(GTK_BOX(vbox4), checkbutton, FALSE, FALSE, 0); +    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + +    checkbutton = qck_create_check_button(G_OBJECT(assistant), "binary_code", _("Binary code"), NULL, NULL); +    gtk_box_pack_start(GTK_BOX(vbox4), checkbutton, FALSE, FALSE, 0); +    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + +    checkbutton = qck_create_check_button(G_OBJECT(assistant), "assembly_code", _("Assembly code"), NULL, NULL); +    gtk_box_pack_start(GTK_BOX(vbox4), checkbutton, FALSE, FALSE, 0); +    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), TRUE); + +    /* Intégration */ + +    gtk_assistant_append_page(assistant, alignment); +    gtk_assistant_set_page_title(assistant, alignment, _("Exported content")); +    gtk_assistant_set_page_type(assistant, alignment, GTK_ASSISTANT_PAGE_CONFIRM); + +    gtk_assistant_set_page_complete(assistant, alignment, TRUE); + +} + + + +/* ---------------------------------------------------------------------------------- */ +/*                           EXPORTATION DE BINAIRE DIFFERE                           */ +/* ---------------------------------------------------------------------------------- */ + + +/* Indique le type défini pour les tâches d'exportation différée. */ +G_DEFINE_TYPE(GDelayedExport, g_delayed_export, G_TYPE_DELAYED_WORK); + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : klass = classe à initialiser.                                * +*                                                                             * +*  Description : Initialise la classe des tâches d'exportation différée.      * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void g_delayed_export_class_init(GDelayedExportClass *klass) +{ + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : disass = instance à initialiser.                             * +*                                                                             * +*  Description : Initialise une tâche d'exportation différée.                 * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void g_delayed_export_init(GDelayedExport *disass) +{ +    G_DELAYED_WORK(disass)->run = (run_task_fc)g_delayed_export_process; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : filename = chemin d'accès au fichier à remplir.              * +*                binary   = binaire chargé dont le contenu est à exporter.    * +*                options  = options d'exportation à respecter.                * +*                                                                             * +*  Description : Crée une tâche d'exportation différée.                       * +*                                                                             * +*  Retour      : Tâche créée.                                                 * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static GDelayedExport *g_delayed_export_new(const char *filename, GOpenidaBinary *binary, GRenderingOptions *options) +{ +    GDelayedExport *result;            /* Tâche à retourner           */ + +    result = g_object_new(G_TYPE_DELAYED_EXPORT, NULL); + +    result->filename = strdup(filename); + +    result->binary = binary; +    result->options = options; + +    return result; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : export    = analyse à mener.                                 * +*                statusbar = barre de statut à tenir informée.                * +*                                                                             * +*  Description : Assure l'exportation en différé.                             * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void g_delayed_export_process(GDelayedExport *export, GtkExtStatusBar *statusbar) +{ +    FILE *stream;                           /* Flux ouvert en écriture     */ +    GRenderingLine *lines;                  /* Liste de lignes à intégrer  */ +    vmpa_t start;                           /* Adresse de début de parcours*/ +    GRenderingLine *iter;                   /* Boucle de parcours          */ +    vmpa_t end;                             /* Adresse de fin de parcours  */ +    guint id;                               /* Identifiant de statut       */ +    size_t ret;                             /* Quantité d'octets écrite    */ +    vmpa_t done;                            /* Quantité déjà parcourue     */ + +    stream = fopen(export->filename, "w"); +    if (stream == NULL) +    { +        perror("fopen"); +        return; +    } + +    lines = g_openida_binary_get_lines(export->binary); +    if (lines == NULL) return;  /* FIXME ? */ + +    start = get_rendering_line_address(lines); + +    iter = g_rendering_line_get_last_iter(lines, NULL); +    end = get_rendering_line_address(iter) + get_rendering_line_length(iter) - start; + +    id = gtk_extended_status_bar_push(statusbar, _("Exporting binary lines..."), true); + +    for (iter = lines; +         iter != NULL; +         iter = g_rendering_line_get_next_iter(lines, iter, NULL)) +    { +        /* TODO : filtre... */ + +        g_content_exporter_add_text(G_CONTENT_EXPORTER(iter), export->options, MRD_BLOCK, stream); + +        ret = fwrite("\n", 1, sizeof(char), stream); +        if (ret != 1) perror("fwrite"); + +        done = get_rendering_line_address(iter) + get_rendering_line_length(iter) - start; +        gtk_extended_status_bar_update_activity(statusbar, id, done * 1.0 / end); + +    } + +    gtk_extended_status_bar_remove(statusbar, id); + +    fclose(stream); + +} diff --git a/src/dialogs/export.h b/src/dialogs/export.h new file mode 100644 index 0000000..c14d05d --- /dev/null +++ b/src/dialogs/export.h @@ -0,0 +1,37 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * export.h - prototypes pour l'assistant d'exportation de contenu binaire + * + * Copyright (C) 2010 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 <http://www.gnu.org/licenses/>. + */ + + +#ifndef _DIALOGS_EXPORT_H +#define _DIALOGS_EXPORT_H + + +#include "../analysis/binary.h" + + + +/* Crée et affiche un assistant d'aide à l'exportation. */ +void run_export_assistant(GOpenidaBinary *, GtkWindow *); + + + +#endif  /* _DIALOGS_EXPORT_H */ | 
