/* Chrysalide - Outil d'analyse de fichiers binaires
 * storage.c - définition des modes d'enregistrement pour binaires
 *
 * Copyright (C) 2014 Cyrille Bagard
 *
 *  This file is part of Chrysalide.
 *
 *  Chrysalide is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  Chrysalide is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 */


#include "storage.h"



/* Réagit à un changement dans le choix du type de serveur. */
static void on_server_use_toggled(GtkToggleButton *, GtkBuilder *);

/* Applique les paramètres d'enregistrement pour un binaire. */
static void update_binary_storage(GtkButton *, GtkBuilder *);



/******************************************************************************
*                                                                             *
*  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.      *
*                                                                             *
*  Retour      : Adresse de la fenêtre mise en place.                         *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/

GtkWidget *create_storage_dialog(GLoadedBinary *binary, GtkWindow *parent, GtkBuilder **outb)
{
    GtkWidget *result;                      /* Fenêtre à renvoyer          */
    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   */

    builder = gtk_builder_new_from_resource("/org/chrysalide/gui/dialogs/binadmin.ui");
    *outb = builder;

    g_object_set_data(G_OBJECT(builder), "binary", binary);

    result = GTK_WIDGET(gtk_builder_get_object(builder, "window"));

    //gtk_window_set_transient_for(GTK_WINDOW(result), parent);

    /* Mise à jour de l'interface */

    local_button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "local_storage"));
    remote_button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "remote_storage"));

    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);

    g_loaded_binary_get_remote_server(binary, &host, &port);

    widget = gtk_builder_get_object(builder, "server");
    gtk_entry_set_text(GTK_ENTRY(widget), host);

    widget = gtk_builder_get_object(builder, "port");
    gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), port);

    on_server_use_toggled(remote_button, builder);

    /* Connexion des signaux */

    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);

    gtk_builder_connect_signals(builder, builder);

    return result;

}


/******************************************************************************
*                                                                             *
*  Paramètres  : button  = bouton à l'origine de la procédure.                *
*                builder = espace de référencement global.                    *
*                                                                             *
*  Description : Réagit à un changement dans le choix du type de serveur.     *
*                                                                             *
*  Retour      : -                                                            *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/

static void on_server_use_toggled(GtkToggleButton *button, GtkBuilder *builder)
{
    gboolean active;                        /* Etat du choix du distant    */
    GtkWidget *widget;                      /* Composant à modifier        */

    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);

    widget = GTK_WIDGET(gtk_builder_get_object(builder, "port_label"));
    gtk_widget_set_sensitive(widget, active);

    widget = GTK_WIDGET(gtk_builder_get_object(builder, "port"));
    gtk_widget_set_sensitive(widget, active);

}


/******************************************************************************
*                                                                             *
*  Paramètres  : button  = bouton à l'origine de la procédure.                *
*                builder = espace de référencement global.                    *
*                                                                             *
*  Description : Applique les paramètres d'enregistrement pour un binaire.    *
*                                                                             *
*  Retour      : -                                                            *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/

static void update_binary_storage(GtkButton *button, GtkBuilder *builder)
{
    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      */

    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));

    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);

    /* Choix final du serveur */

    local_button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "local_storage"));

    active = gtk_toggle_button_get_active(local_button);

    g_loaded_binary_set_local_storage(binary, active);

}