From 9b7dfd449b08637c4b4fc6d95acf3a8fcb5fd58d Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sat, 9 Apr 2016 13:36:09 +0200 Subject: Built interfaces using Glade and GLib resources. --- .gitignore | 1 + ChangeLog | 21 ++ src/analysis/binary.c | 91 +++++-- src/analysis/binary.h | 10 +- src/gui/dialogs/Makefile.am | 16 ++ src/gui/dialogs/binadmin.ui | 183 +++++++++++++ src/gui/dialogs/gresource.xml | 6 + src/gui/dialogs/storage.c | 612 +++++------------------------------------- src/gui/dialogs/storage.h | 2 +- src/gui/menus/binary.c | 19 +- 10 files changed, 376 insertions(+), 585 deletions(-) create mode 100644 src/gui/dialogs/binadmin.ui create mode 100644 src/gui/dialogs/gresource.xml diff --git a/.gitignore b/.gitignore index 7581b5f..8005598 100644 --- a/.gitignore +++ b/.gitignore @@ -62,6 +62,7 @@ src/arch/dalvik/opcodes/ # GLib src/glibext/chrysamarshal.* +resources.[ch] # Binaries src/chrysalide diff --git a/ChangeLog b/ChangeLog index bdc5d43..4b98bdc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +16-04-09 Cyrille Bagard + + * .gitignore: + Hide resources built by glib-compile-resources. + + * src/analysis/binary.c: + * src/analysis/binary.h: + Update all information about the storage configuration. + + * src/gui/dialogs/Makefile.am: + Add the built 'resources.[ch]' files to libguidialogs_la_SOURCES + + * src/gui/dialogs/binadmin.ui: + * src/gui/dialogs/gresource.xml: + New entries: build interfaces using Glade and GLib resources. + + * src/gui/dialogs/storage.c: + * src/gui/dialogs/storage.h: + * src/gui/menus/binary.c: + Update code. + 16-04-04 Cyrille Bagard * src/analysis/disass/output.c: diff --git a/src/analysis/binary.c b/src/analysis/binary.c index e617767..d934c76 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -60,9 +60,10 @@ struct _GLoadedBinary char *username; /* Identifiant de l'utilisateur*/ bool username_changed; /* Mémorise les changements */ + + bool local_storage; /* Enregistrements locaux ? */ char *remote_host; /* Nom du serveur distant */ unsigned short remote_port; /* Port du serveur distant */ - bool use_remote_server; /* Indique une utilisation */ GDbClient *local; /* Enregistrements locaux */ GDbClient *remote; /* Enregistrements distants */ @@ -195,9 +196,9 @@ static void g_loaded_binary_init(GLoadedBinary *binary) { binary->username = strdup("default"); + binary->local_storage = true; binary->remote_host = strdup("localhost"); - binary->remote_port = 9999; - binary->use_remote_server = false; + binary->remote_port = 1337; binary->storages[DBF_COMMENTS] = DBS_ALL_LOCAL; binary->storages[DBF_DISPLAY_SWITCHERS] = DBS_ALL_LOCAL; @@ -611,8 +612,8 @@ static bool g_loaded_binary_load_storage(GLoadedBinary *binary, xmlXPathContextP { bool result; /* Bilan à faire remonter */ char *storage_path; /* Partie "Enregistrement" */ - char *access; /* Chemin d'accès à un élément */ char *value; /* Valeur lue à partie du XML */ + char *access; /* Chemin d'accès à un élément */ unsigned short port; /* Port de communication */ bool use; /* Usage d'un serveur distant */ DBFeatures i; /* Boucle de parcours */ @@ -622,6 +623,13 @@ static bool g_loaded_binary_load_storage(GLoadedBinary *binary, xmlXPathContextP storage_path = strdup(path); storage_path = stradd(storage_path, "/Storage"); + value = get_node_prop_value(context, storage_path, "local"); + if (value == NULL) goto glbls_features; + + binary->local_storage = (strcmp(value, "true") == 0); + + free(value); + /* Nom d'utilisateur */ access = strdup(storage_path); @@ -649,17 +657,10 @@ static bool g_loaded_binary_load_storage(GLoadedBinary *binary, xmlXPathContextP free(value); - value = get_node_prop_value(context, access, "use"); - if (value == NULL) goto glbls_features; - - use = (strcmp(value, "true") == 0); - - free(value); - value = get_node_prop_value(context, access, "host"); if (value == NULL) goto glbls_features; - g_loaded_binary_set_remote_server(binary, value, port, use); + g_loaded_binary_set_remote_server(binary, value, port); free(value); @@ -738,6 +739,9 @@ static bool g_loaded_binary_save_storage(const GLoadedBinary *binary, xmlDocPtr storage_path = strdup(path); storage_path = stradd(storage_path, "/Storage"); + result &= add_string_attribute_to_node(xdoc, context, storage_path, "local", + binary->local_storage ? "true" : "false"); + /* Nom d'utilisateur */ access = strdup(storage_path); @@ -757,9 +761,6 @@ static bool g_loaded_binary_save_storage(const GLoadedBinary *binary, xmlDocPtr sprintf(port_str, "%hu", binary->remote_port); result &= add_string_attribute_to_node(xdoc, context, access, "port", port_str); - result &= add_string_attribute_to_node(xdoc, context, access, "use", - binary->use_remote_server ? "true" : "false"); - free(access); /* Fonctionnalités */ @@ -847,24 +848,66 @@ void g_loaded_binary_set_username(GLoadedBinary *binary, const char *username) /****************************************************************************** * * * Paramètres : binary = élément binaire à consulter. * +* * +* Description : Détermine si tous les enregistrements sont locaux ou non. * +* * +* Retour : Statut de l'utilisation du serveur local. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_loaded_binary_get_local_storage(const GLoadedBinary *binary) +{ + return binary->local_storage; + +} + + +/****************************************************************************** +* * +* Paramètres : binary = élément binaire à consulter. * +* local = statut de l'utilisation du serveur local. * +* * +* Description : Définit si tous les enregistrements sont locaux ou non. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_loaded_binary_set_local_storage(GLoadedBinary *binary, bool local) +{ + binary->local_storage = local; + + if (local) + /* TODO : reload conn ! */; + else + /* TODO : stop conn ! */; + +} + + +/****************************************************************************** +* * +* Paramètres : binary = élément binaire à consulter. * * host = nom du serveur distant à contacter. [OUT] * * port = port de communication avec le serveur distant. [OUT]* * * * Description : Identifie le serveur distant associé au binaire courant. * * * -* Retour : Statut de l'utilisation du serveur distant. * +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -bool g_loaded_binary_get_remote_server(const GLoadedBinary *binary, const char **host, unsigned short *port) +void g_loaded_binary_get_remote_server(const GLoadedBinary *binary, const char **host, unsigned short *port) { *host = binary->remote_host; *port = binary->remote_port; - return binary->use_remote_server; - } @@ -873,7 +916,6 @@ bool g_loaded_binary_get_remote_server(const GLoadedBinary *binary, const char * * Paramètres : binary = élément binaire à consulter. * * host = nom du serveur distant à contacter. * * port = port de communication avec le serveur distant. * -* use = statut de l'utilisation du serveur distant. * * * * Description : Définit le serveur distant associé au binaire courant. * * * @@ -883,20 +925,13 @@ bool g_loaded_binary_get_remote_server(const GLoadedBinary *binary, const char * * * ******************************************************************************/ -void g_loaded_binary_set_remote_server(GLoadedBinary *binary, const char *host, unsigned short port, bool use) +void g_loaded_binary_set_remote_server(GLoadedBinary *binary, const char *host, unsigned short port) { free(binary->remote_host); binary->remote_host = strdup(host); binary->remote_port = port; - binary->use_remote_server = use; - - if (use) - /* TODO : reload conn ! */; - else - /* TODO : stop conn ! */; - } diff --git a/src/analysis/binary.h b/src/analysis/binary.h index a725110..9447d17 100644 --- a/src/analysis/binary.h +++ b/src/analysis/binary.h @@ -109,11 +109,17 @@ const char *g_loaded_binary_get_username(const GLoadedBinary *); /* Définit l'utilisateur analysant le binaire courant. */ void g_loaded_binary_set_username(GLoadedBinary *, const char *); +/* Détermine si tous les enregistrements sont locaux ou non. */ +bool g_loaded_binary_get_local_storage(const GLoadedBinary *); + +/* Définit si tous les enregistrements sont locaux ou non. */ +void g_loaded_binary_set_local_storage(GLoadedBinary *, bool); + /* Identifie le serveur distant associé au binaire courant. */ -bool g_loaded_binary_get_remote_server(const GLoadedBinary *, const char **, unsigned short *); +void g_loaded_binary_get_remote_server(const GLoadedBinary *, const char **, unsigned short *); /* Définit le serveur distant associé au binaire courant. */ -void g_loaded_binary_set_remote_server(GLoadedBinary *, const char *, unsigned short, bool); +void g_loaded_binary_set_remote_server(GLoadedBinary *, const char *, unsigned short); /* Indique la forme d'enregistrement d'une fonctionnalité. */ DBStorage g_loaded_binary_get_storage(const GLoadedBinary *, DBFeatures); diff --git a/src/gui/dialogs/Makefile.am b/src/gui/dialogs/Makefile.am index a75701f..5a60f25 100644 --- a/src/gui/dialogs/Makefile.am +++ b/src/gui/dialogs/Makefile.am @@ -1,6 +1,11 @@ +BUILT_SOURCES = resources.h resources.c + noinst_LTLIBRARIES = libguidialogs.la +UI_FILES = \ + binadmin.ui + libguidialogs_la_SOURCES = \ about.h about.c \ bookmark.h bookmark.c \ @@ -8,6 +13,7 @@ libguidialogs_la_SOURCES = \ goto.h goto.c \ gotox.h gotox.c \ plugins.h plugins.c \ + resources.h resources.c \ shellcode.h shellcode.c \ storage.h storage.c @@ -19,3 +25,13 @@ AM_CPPFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) SUBDIRS = + + +resources.c: gresource.xml $(UI_FILES) + glib-compile-resources --target=$@ --sourcedir=$(srcdir) --generate-source --c-name gui_dialogs gresource.xml + +resources.h: gresource.xml + glib-compile-resources --target=$@ --sourcedir=$(srcdir) --generate-header --c-name gui_dialogs gresource.xml + + +CLEANFILES = resources.h resources.c diff --git a/src/gui/dialogs/binadmin.ui b/src/gui/dialogs/binadmin.ui new file mode 100644 index 0000000..0f68228 --- /dev/null +++ b/src/gui/dialogs/binadmin.ui @@ -0,0 +1,183 @@ + + + + + + 1 + 65535 + 1337 + 1 + 10 + + + False + Storage + False + True + 700 + 300 + dialog + + + False + 8 + 8 + 8 + 8 + vertical + 8 + + + False + 8 + end + + + Cancel + True + True + True + + + True + True + 0 + + + + + Apply + True + True + True + + + True + True + 1 + + + + + False + False + 0 + + + + + True + False + vertical + 8 + + + Use the internal local server. + True + True + False + 0 + True + True + + + False + True + 0 + + + + + Use a remote shared server: + True + True + False + 0 + True + True + local_storage + + + + False + True + 1 + + + + + True + False + 16 + 8 + + + True + False + Server: + + + False + True + 0 + + + + + True + True + localhost + + + True + True + 1 + + + + + True + False + Port: + + + False + True + 2 + + + + + True + True + adjustment1 + 1337 + + + False + True + 3 + + + + + True + True + 2 + + + + + False + True + 1 + + + + + + button1 + button2 + + + diff --git a/src/gui/dialogs/gresource.xml b/src/gui/dialogs/gresource.xml new file mode 100644 index 0000000..913b830 --- /dev/null +++ b/src/gui/dialogs/gresource.xml @@ -0,0 +1,6 @@ + + + + binadmin.ui + + diff --git a/src/gui/dialogs/storage.c b/src/gui/dialogs/storage.c index 2e97ca2..c6376d4 100644 --- a/src/gui/dialogs/storage.c +++ b/src/gui/dialogs/storage.c @@ -24,153 +24,20 @@ #include "storage.h" -#include +/* Réagit à un changement dans le choix du type de serveur. */ +static void on_server_use_toggled(GtkToggleButton *, GtkBuilder *); -#include "../../analysis/db/protocol.h" -#include "../../common/cpp.h" -#include "../../gtkext/easygtk.h" +/* Applique les paramètres d'enregistrement pour un binaire. */ +static void update_binary_storage(GtkButton *, GtkBuilder *); -/* --------------------------- CORPS PRINCIPAL DU CONTENU --------------------------- */ - - -/* Enumération des colonnes de la liste affichée */ -typedef enum StorageColumnTypes -{ - SCT_FEATURE_ID, /* Désignation interne */ - SCT_FEATURE_NAME, /* Désignation humaine */ - SCT_FEATURE_STORAGE, /* Type d'enregistrement */ - SCT_COMBO_COLUMN, /* Fonctionnement du combo */ - - SCT_COUNT - -} StorageColumnTypes; - - -/* Construit l'affichage en liste des enregistrements. */ -static GtkWidget *build_features_list(void); - -/* Sauvegarde l'état des enregistrements et clôt la fenêtre. */ -static void save_storage_params(GtkButton *, GObject *); - - - -/* ---------------------- NOM D'UTILISATEUR ASSOCIE AU BINAIRE ---------------------- */ - - -/* Charge le nom de l'utilisateur associé au binaire. */ -static void load_storage_username(GLoadedBinary *, GObject *); - -/* Sauvegarde le nom de l'utilisateur associé au binaire. */ -static void save_storage_username(GLoadedBinary *, GObject *); - - - -/* ----------------------- SERVEUR DISTANT ASSOCIE AU BINAIRE ----------------------- */ - - -/* Charge la définition du serveur distant associé au binaire. */ -static void load_storage_remote_server(GLoadedBinary *, GObject *); - -/* Sauvegarde la définition du serveur distant du binaire. */ -static void save_storage_remote_server(GLoadedBinary *, GObject *); - -/* Met à jour l'accès aux paramètres du serveur distant. */ -static void on_server_usage_toggle(GtkToggleButton *, GObject *); - - - -/* ------------------------- TRAITEMENT DES FONCTIONNALITES ------------------------- */ - - -/* Remplit la vue présentant les fonctionnalités à traiter. */ -static void fill_storage_features(GtkTreeView *, GLoadedBinary *); - -/* Sauvegarde les statuts d'enregistrement des fonctionnalités. */ -static void save_storage_features(GLoadedBinary *, GObject *); - -/* Met à jour un type d'enregistrement. */ -static void storage_combo_edited_cb(GtkCellRendererText *, const gchar *, const gchar *, GtkListStore *); - - - -/* ---------------------------------------------------------------------------------- */ -/* CORPS PRINCIPAL DU CONTENU */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Construit l'affichage en liste des enregistrements. * -* * -* Retour : Composant graphique prêt à emploi. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static GtkWidget *build_features_list(void) -{ - GtkListStore *store; - GtkWidget *view; - GtkCellRenderer *renderer; - GtkListStore *combo_store; - GtkTreeIter iter; - - store = gtk_list_store_new(SCT_COUNT, - G_TYPE_UINT, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_UINT); - - view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); - - g_object_unref(store); - - /* Intitulé des fonctionnalités */ - - renderer = gtk_cell_renderer_text_new(); - - gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, - _("Features"), renderer, - "text", SCT_FEATURE_NAME, - NULL); - - /* Type d'enregistrement associé */ - - renderer = gtk_cell_renderer_combo_new(); - - combo_store = gtk_list_store_new(1, G_TYPE_STRING); - gtk_list_store_append(combo_store, &iter); - gtk_list_store_set(combo_store, &iter, 0, _("Local storage"), -1); - gtk_list_store_append(combo_store, &iter); - gtk_list_store_set(combo_store, &iter, 0, _("Remote storage"), -1); - gtk_list_store_append(combo_store, &iter); - gtk_list_store_set(combo_store, &iter, 0, _("Local storage with remote access"), -1); - - g_object_set(G_OBJECT(renderer), "model", combo_store, - "editable", TRUE, "has-entry", FALSE, NULL); - g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK(storage_combo_edited_cb), store); - - gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1, - _("Storage"), renderer, - "text", SCT_FEATURE_STORAGE, - "text-column", SCT_COMBO_COLUMN, - NULL); - - return view; - -} - - /****************************************************************************** * * * Paramètres : binary = binaire chargé en mémoire à traiter. * * parent = fenêtre principale de l'éditeur. * +* outb = constructeur à détruire après usage. [OUT] * * * * Description : Propose une définition des propriétés d'enregistrement. * * * @@ -180,110 +47,53 @@ static GtkWidget *build_features_list(void) * * ******************************************************************************/ -GtkWidget *create_storage_dialog(GLoadedBinary *binary, GtkWindow *parent) +GtkWidget *create_storage_dialog(GLoadedBinary *binary, GtkWindow *parent, GtkBuilder **outb) { GtkWidget *result; /* Fenêtre à renvoyer */ - GtkWidget *content; /* Zone principale de la boîte */ - GtkWidget *vbox; /* Support à construire #1 */ - GtkWidget *frame; /* Support avec encadrement */ - GtkWidget *hbox; /* Support à construire #2 */ - GtkWidget *label; /* Etiquette d'indication */ - GtkWidget *entry; /* Zone de saisie de texte */ - GtkWidget *checkbutton; /* Activation de la distance */ - GtkWidget *subvbox; /* Support à construire #3 */ - GtkWidget *scrolledwindow; /* Zone de défilement */ - GtkWidget *treeview; /* Liste des fonctionnalités */ - - result = gtk_dialog_new(); - gtk_window_set_title(GTK_WINDOW(result), _("Storage")); - gtk_widget_set_size_request(result, 400, 360); - gtk_window_set_position(GTK_WINDOW(result), GTK_WIN_POS_CENTER); - gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_DIALOG); - - gtk_window_set_modal(GTK_WINDOW(result), TRUE); - gtk_window_set_transient_for(GTK_WINDOW(result), parent); - - g_object_ref(G_OBJECT(binary)); - g_object_set_data_full(G_OBJECT(result), "binary", binary, g_object_unref); - - content = gtk_dialog_get_content_area(GTK_DIALOG(result)); - gtk_widget_show(content); - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); - gtk_widget_show(vbox); - gtk_box_pack_start(GTK_BOX(content), vbox, TRUE, TRUE, 0); - gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); - - /* Définition de l'identité de l'utilisateur */ + GtkBuilder *builder; /* Constructeur utilisé */ + GtkToggleButton *local_button; /* Choix du serveur local */ + GtkToggleButton *remote_button; /* Choix du serveur distant */ + const char *host; /* Serveur distant à contacter */ + unsigned short port; /* Port d'écoute du serveur */ + GObject *widget; /* Composant à mettre à jour */ - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); - gtk_widget_show(hbox); + builder = gtk_builder_new_from_resource("/org/chrysalide/gui/dialogs/binadmin.ui"); + *outb = builder; - frame = qck_create_frame(_("Identity"), hbox, 0, 0, 12, 0); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, TRUE, 0); + g_object_set_data(G_OBJECT(builder), "binary", binary); - label = qck_create_label(NULL, NULL, _("Username: ")); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + result = GTK_WIDGET(gtk_builder_get_object(builder, "window")); - entry = qck_create_entry(G_OBJECT(result), "username", NULL); - gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); + //gtk_window_set_transient_for(GTK_WINDOW(result), parent); - /* Définition du serveur distant */ + /* Mise à jour de l'interface */ - subvbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_widget_show(subvbox); + local_button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "local_storage")); + remote_button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "remote_storage")); - frame = qck_create_frame(_("Server to contact"), subvbox, 0, 0, 12, 0); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, TRUE, 0); + if (g_loaded_binary_get_local_storage(binary)) + gtk_toggle_button_set_active(local_button, TRUE); + else + gtk_toggle_button_set_active(remote_button, TRUE); - checkbutton = qck_create_check_button(G_OBJECT(result), "use_remote", - _("Use a remote server:"), - G_CALLBACK(on_server_usage_toggle), result); - gtk_widget_show(checkbutton); - gtk_box_pack_start(GTK_BOX(subvbox), checkbutton, FALSE, FALSE, 0); + g_loaded_binary_get_remote_server(binary, &host, &port); - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); - gtk_widget_show(hbox); - gtk_box_pack_start(GTK_BOX(subvbox), hbox, TRUE, TRUE, 0); + widget = gtk_builder_get_object(builder, "server"); + gtk_entry_set_text(GTK_ENTRY(widget), host); - label = qck_create_label(G_OBJECT(result), "host", _("Host: ")); - gtk_widget_show(label); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + widget = gtk_builder_get_object(builder, "port"); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), port); - entry = qck_create_entry(G_OBJECT(result), "remote_host", NULL); - gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); + on_server_use_toggled(remote_button, builder); - label = qck_create_label(G_OBJECT(result), "port", _("Port:")); - gtk_widget_show(label); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + /* Connexion des signaux */ - entry = qck_create_entry(G_OBJECT(result), "remote_port", NULL); - gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, TRUE, 0); + gtk_builder_add_callback_symbols(builder, + "on_server_use_toggled", G_CALLBACK(on_server_use_toggled), + "update_binary_storage", G_CALLBACK(update_binary_storage), + NULL); - /* Affichage des propriétés */ - - scrolledwindow = gtk_scrolled_window_new(NULL, NULL); - gtk_widget_show(scrolledwindow); - gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_IN); - - treeview = build_features_list(); - g_object_set_data(G_OBJECT(result), "treeview", treeview); - gtk_widget_show(treeview); - gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview); - - /* Zone de contrôle */ - - gtk_dialog_add_button(GTK_DIALOG(result), _("_Cancel"), GTK_RESPONSE_CANCEL); - gtk_dialog_add_button(GTK_DIALOG(result), _("_Ok"), GTK_RESPONSE_OK); - - /* Chargement des données actuelles */ - - load_storage_username(binary, G_OBJECT(result)); - - load_storage_remote_server(binary, G_OBJECT(result)); - - fill_storage_features(GTK_TREE_VIEW(treeview), binary); + gtk_builder_connect_signals(builder, builder); return result; @@ -292,10 +102,10 @@ GtkWidget *create_storage_dialog(GLoadedBinary *binary, GtkWindow *parent) /****************************************************************************** * * -* Paramètres : button = bouton 'OK'. * -* ref = espace de référencement principal. * +* Paramètres : button = bouton à l'origine de la procédure. * +* builder = espace de référencement global. * * * -* Description : Sauvegarde l'état des enregistrements et clôt la fenêtre. * +* Description : Réagit à un changement dans le choix du type de serveur. * * * * Retour : - * * * @@ -303,57 +113,34 @@ GtkWidget *create_storage_dialog(GLoadedBinary *binary, GtkWindow *parent) * * ******************************************************************************/ -static void save_storage_params(GtkButton *button, GObject *ref) +static void on_server_use_toggled(GtkToggleButton *button, GtkBuilder *builder) { - GLoadedBinary *binary; /* Binaire en cours d'édition */ - - binary = G_LOADED_BINARY(g_object_get_data(ref, "binary")); - - save_storage_username(binary, ref); + gboolean active; /* Etat du choix du distant */ + GtkWidget *widget; /* Composant à modifier */ - save_storage_remote_server(binary, ref); - - save_storage_features(binary, ref); - -} + active = gtk_toggle_button_get_active(button); + widget = GTK_WIDGET(gtk_builder_get_object(builder, "server_label")); + gtk_widget_set_sensitive(widget, active); + widget = GTK_WIDGET(gtk_builder_get_object(builder, "server")); + gtk_widget_set_sensitive(widget, active); -/* ---------------------------------------------------------------------------------- */ -/* NOM D'UTILISATEUR ASSOCIE AU BINAIRE */ -/* ---------------------------------------------------------------------------------- */ + widget = GTK_WIDGET(gtk_builder_get_object(builder, "port_label")); + gtk_widget_set_sensitive(widget, active); - -/****************************************************************************** -* * -* Paramètres : binary = binaire chargé en mémoire à traiter. * -* ref = espace de référencement global. * -* * -* Description : Charge le nom de l'utilisateur associé au binaire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void load_storage_username(GLoadedBinary *binary, GObject *ref) -{ - GtkEntry *entry; /* Zone de saisie de texte */ - - entry = GTK_ENTRY(g_object_get_data(ref, "username")); - - gtk_entry_set_text(entry, g_loaded_binary_get_username(binary)); + widget = GTK_WIDGET(gtk_builder_get_object(builder, "port")); + gtk_widget_set_sensitive(widget, active); } /****************************************************************************** * * -* Paramètres : binary = binaire chargé en mémoire à traiter. * -* ref = espace de référencement global. * +* Paramètres : button = bouton à l'origine de la procédure. * +* builder = espace de référencement global. * * * -* Description : Sauvegarde le nom de l'utilisateur associé au binaire. * +* Description : Applique les paramètres d'enregistrement pour un binaire. * * * * Retour : - * * * @@ -361,288 +148,33 @@ static void load_storage_username(GLoadedBinary *binary, GObject *ref) * * ******************************************************************************/ -static void save_storage_username(GLoadedBinary *binary, GObject *ref) +static void update_binary_storage(GtkButton *button, GtkBuilder *builder) { - GtkEntry *entry; /* Zone de saisie de texte */ - const gchar *text; /* Texte à récupérer */ + GLoadedBinary *binary; /* Binaire à mettre à jour */ + GObject *widget; /* Composant à mettre à jour */ + const gchar *host; /* Serveur distant à contacter */ + gint port; /* Port d'écoute du serveur */ + GtkToggleButton *local_button; /* Choix du serveur local */ + gboolean active; /* Etat du choix du local */ - entry = GTK_ENTRY(g_object_get_data(ref, "username")); - text = gtk_entry_get_text(entry); - - g_loaded_binary_set_username(binary, text); - -} + binary = G_LOADED_BINARY(g_object_get_data(G_OBJECT(builder), "binary")); + /* Infos de connexions à distance */ + widget = gtk_builder_get_object(builder, "server"); + host = gtk_entry_get_text(GTK_ENTRY(widget)); -/* ---------------------------------------------------------------------------------- */ -/* SERVEUR DISTANT ASSOCIE AU BINAIRE */ -/* ---------------------------------------------------------------------------------- */ + widget = gtk_builder_get_object(builder, "port"); + port = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); + g_loaded_binary_set_remote_server(binary, host, port); -/****************************************************************************** -* * -* Paramètres : binary = binaire chargé en mémoire à traiter. * -* ref = espace de référencement global. * -* * -* Description : Charge la définition du serveur distant associé au binaire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void load_storage_remote_server(GLoadedBinary *binary, GObject *ref) -{ - const char *host; /* Hôte à contacter */ - unsigned short port; /* Port de connexion */ - char port_str[sizeof(XSTR(USHRT_MAX)) + 1]; /* Version chaînée */ - bool use_remote; /* Utilisation du serveur ? */ - GtkEntry *entry; /* Zone de saisie de texte */ - GtkToggleButton *checkbutton; /* Activation de la distance */ - - use_remote = g_loaded_binary_get_remote_server(binary, &host, &port); - sprintf(port_str, "%hu", port); - - entry = GTK_ENTRY(g_object_get_data(ref, "remote_host")); - - gtk_entry_set_text(entry, host); - - entry = GTK_ENTRY(g_object_get_data(ref, "remote_port")); - - gtk_entry_set_text(entry, port_str); - - checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "use_remote")); - - gtk_toggle_button_set_active(checkbutton, !use_remote); - gtk_toggle_button_set_active(checkbutton, use_remote); - -} - - -/****************************************************************************** -* * -* Paramètres : binary = binaire chargé en mémoire à traiter. * -* ref = espace de référencement global. * -* * -* Description : Sauvegarde la définition du serveur distant du binaire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void save_storage_remote_server(GLoadedBinary *binary, GObject *ref) -{ - GtkEntry *entry; /* Zone de saisie de texte */ - const gchar *text; /* Texte à récupérer */ - unsigned short port; /* Port de connexion */ - GtkToggleButton *checkbutton; /* Activation de la distance */ - - entry = GTK_ENTRY(g_object_get_data(ref, "remote_port")); - text = gtk_entry_get_text(entry); - port = atoi(text); - - entry = GTK_ENTRY(g_object_get_data(ref, "remote_host")); - text = gtk_entry_get_text(entry); - - checkbutton = GTK_TOGGLE_BUTTON(g_object_get_data(ref, "use_remote")); - - g_loaded_binary_set_remote_server(binary, text, port, - gtk_toggle_button_get_active(checkbutton)); - -} - - -/****************************************************************************** -* * -* Paramètres : button = oche dont le status vient de changer. * -* ref = espace de référencement global. * -* * -* Description : Met à jour l'accès aux paramètres du serveur distant. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void on_server_usage_toggle(GtkToggleButton *button, GObject *ref) -{ - gboolean state; /* Etat du bouton courant */ - GtkWidget *widget; /* Element dont l'accès change */ - - state = gtk_toggle_button_get_active(button); - - widget = GTK_WIDGET(g_object_get_data(ref, "host")); - if (widget != NULL) - gtk_widget_set_sensitive(widget, state); - - widget = GTK_WIDGET(g_object_get_data(ref, "remote_host")); - if (widget != NULL) - gtk_widget_set_sensitive(widget, state); - - widget = GTK_WIDGET(g_object_get_data(ref, "port")); - if (widget != NULL) - gtk_widget_set_sensitive(widget, state); - - widget = GTK_WIDGET(g_object_get_data(ref, "remote_port")); - if (widget != NULL) - gtk_widget_set_sensitive(widget, state); - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* TRAITEMENT DES FONCTIONNALITES */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : treeview = vue à compléter. * -* binary = binaire à manipuler. * -* * -* Description : Remplit la vue présentant les fonctionnalités à traiter. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void fill_storage_features(GtkTreeView *treeview, GLoadedBinary *binary) -{ - GtkListStore *store; /* Gestionnaire de liste */ - DBFeatures i; /* Boucle de parcours */ - DBStorage storage; /* Type d'enregistrement */ - char *human_feature; /* Description humaine #1 */ - char *human_value; /* Description humaine #2 */ - GtkTreeIter iter; /* Point d'insertion */ - - store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview)); - - for (i = 0; i < DBF_COUNT; i++) - { - storage = g_loaded_binary_get_storage(binary, i); - - switch (i) - { - case DBF_COMMENTS: - human_feature = _("Comments"); - break; - case DBF_DISPLAY_SWITCHERS: - human_feature = _("Segments display"); - break; - case DBF_BOOKMARKS: - human_feature = _("Bookmarks"); - break; - default: /* Pour GCC... */ - break; - } - - switch (storage) - { - case DBS_ALL_LOCAL: - human_value = _("Local storage"); - break; - case DBS_ALL_REMOTE: - human_value = _("Remote storage"); - break; - case DBS_LOCAL_AND_REMOTE: - human_value = _("Local storage with remote access"); - break; - } - - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, - SCT_FEATURE_ID, i, - SCT_FEATURE_NAME, human_feature, - SCT_FEATURE_STORAGE, human_value, - -1); - - } - -} - - -/****************************************************************************** -* * -* Paramètres : binary = binaire chargé en mémoire à traiter. * -* ref = espace de référencement global. * -* * -* Description : Sauvegarde les statuts d'enregistrement des fonctionnalités. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void save_storage_features(GLoadedBinary *binary, GObject *ref) -{ - GtkTreeView *treeview; /* Liste des fonctionnalités */ - GtkTreeModel *store; /* Gestionnaire de liste */ - GtkTreeIter iter; /* Point de lecture */ - gboolean valid; /* Point courant valide ? */ - DBFeatures feature; /* Fonctionnalité traitée */ - char *human_value; /* Description humaine */ - DBStorage storage; /* Type d'enregistrement */ - - treeview = GTK_TREE_VIEW(g_object_get_data(ref, "treeview")); - store = GTK_TREE_MODEL(gtk_tree_view_get_model(treeview)); - - for (valid = gtk_tree_model_get_iter_first(store, &iter); - valid; - valid = gtk_tree_model_iter_next(store, &iter)) - { - gtk_tree_model_get(store, &iter, - SCT_FEATURE_ID, &feature, - SCT_FEATURE_STORAGE, &human_value, - -1); - - if (g_strcmp0(human_value, _("Remote storage")) == 0) - storage = DBS_ALL_REMOTE; - else if (g_strcmp0(human_value, _("Local storage with remote access")) == 0) - storage = DBS_LOCAL_AND_REMOTE; - else - storage = DBS_ALL_LOCAL; - - g_loaded_binary_set_storage(binary, feature, storage); - - } - -} - - -/****************************************************************************** -* * -* Paramètres : cell = cellule du tableau à mettre à jour. * -* path = chemin d'accès à l'élément concerné. * -* value = nouvelle valeur à prendre en compte. * -* store = gestionnaire de liste sur lequel s'appuyer. * -* * -* Description : Met à jour un type d'enregistrement. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void storage_combo_edited_cb(GtkCellRendererText *cell, const gchar *path, const gchar *value, GtkListStore *store) -{ - GtkTreePath *tpath; /* Chemin instancié */ - GtkTreeIter iter; /* Point d'accès pour la maj */ + /* Choix final du serveur */ - tpath = gtk_tree_path_new_from_string(path); + local_button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "local_storage")); - if (gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, tpath)) - gtk_list_store_set(store, &iter, SCT_FEATURE_STORAGE, value, -1); + active = gtk_toggle_button_get_active(local_button); - gtk_tree_path_free(tpath); + g_loaded_binary_set_local_storage(binary, active); } diff --git a/src/gui/dialogs/storage.h b/src/gui/dialogs/storage.h index 5cca73b..16dc2dd 100644 --- a/src/gui/dialogs/storage.h +++ b/src/gui/dialogs/storage.h @@ -33,7 +33,7 @@ /* Propose une définition des propriétés d'enregistrement. */ -GtkWidget *create_storage_dialog(GLoadedBinary *, GtkWindow *); +GtkWidget *create_storage_dialog(GLoadedBinary *, GtkWindow *, GtkBuilder **); diff --git a/src/gui/menus/binary.c b/src/gui/menus/binary.c index cf9a9b7..2c349e4 100644 --- a/src/gui/menus/binary.c +++ b/src/gui/menus/binary.c @@ -156,29 +156,20 @@ static void mcb_binary_storage(GtkMenuItem *menuitem, GMenuBar *bar) { GLoadedBinary *binary; /* Edition courante */ GObject *ref; /* Espace de référencements */ + GtkBuilder *builder; /* Constructeur utilisé */ GtkWidget *dialog; /* Boîte de dialogue à montrer */ binary = g_editor_item_get_current_binary(G_EDITOR_ITEM(bar)); ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar)); - dialog = create_storage_dialog(binary, GTK_WINDOW(ref)); - - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) - { - /* TODO */ + dialog = create_storage_dialog(binary, GTK_WINDOW(ref), &builder); - - /* - addr = get_address_from_goto_dialog(dialog); - - vpanel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); - gtk_view_panel_scroll_to_address(vpanel, addr); - */ - - } + gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); + g_object_unref(G_OBJECT(builder)); + } -- cgit v0.11.2-87-g4458