/* * gncpmount.c * * This file is part of gncpmount. * * gncpmount 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. * * gncpmount 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 gncpmount. If not, see . * * Author: Jan Lipovsky * */ #include "globals.h" #include "keyfile.h" #include "ncpwrapper.h" #include "dialogs.h" #include "logo.xpm.h" #define WIDTH -1 #define HEIGHT -1 /** * Load saved options to GUI */ static void set_gui_from_cmdparams () { if(cmd_params.username != NULL) gtk_entry_set_text(GTK_ENTRY(gui.entry_username), g_shell_unquote(cmd_params.username, NULL)); else gtk_entry_set_text(GTK_ENTRY(gui.entry_username), ""); if(cmd_params.password != NULL) gtk_entry_set_text(GTK_ENTRY(gui.entry_password), g_shell_unquote(cmd_params.password, NULL)); else gtk_entry_set_text(GTK_ENTRY(gui.entry_password), ""); if(cmd_params.server != NULL) gtk_entry_set_text(GTK_ENTRY(gui.entry_server), g_shell_unquote(cmd_params.server, NULL)); else gtk_entry_set_text(GTK_ENTRY(gui.entry_server), ""); if(cmd_params.dns_name != NULL) gtk_entry_set_text(GTK_ENTRY(gui.entry_dns_server), g_shell_unquote(cmd_params.dns_name, NULL)); else gtk_entry_set_text(GTK_ENTRY(gui.entry_dns_server), ""); if(cmd_params.mount_point != NULL) gtk_entry_set_text(GTK_ENTRY(gui.entry_mount_point), g_shell_unquote(cmd_params.mount_point, NULL)); else gtk_entry_set_text(GTK_ENTRY(gui.entry_mount_point), ""); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gui.check_n), cmd_params.n); } /** * Save options set in GUI by user to cmd_params */ static void save_gui_to_cmdparams() { set_parameter_text ((gui.entry_dns_server), &cmd_params.dns_name); set_parameter_text ((gui.entry_mount_point), &cmd_params.mount_point); set_parameter_text ((gui.entry_password), &cmd_params.password); set_parameter_text ((gui.entry_server), &cmd_params.server); set_parameter_text ((gui.entry_username), &cmd_params.username); /* Checkboxes */ set_parameter_bool ((gui.check_n), &cmd_params.n); } /** * Check length of all entry and if they are filled enables mount button */ static void enable_mount_button () { gint tmp = ( gtk_entry_get_text_length (GTK_ENTRY(gui.entry_username)) * gtk_entry_get_text_length (GTK_ENTRY(gui.entry_password)) * gtk_entry_get_text_length (GTK_ENTRY(gui.entry_mount_point))); if ( (tmp * gtk_entry_get_text_length (GTK_ENTRY(gui.entry_server)) != 0) || (tmp * gtk_entry_get_text_length (GTK_ENTRY(gui.entry_dns_server))) != 0) { if(!gui.btn_mount_enable) { gui.btn_mount_enable = TRUE; gtk_widget_set_sensitive (gui.btn_mount, TRUE); } } else { if(gui.btn_mount_enable) { gui.btn_mount_enable = FALSE; gtk_widget_set_sensitive (gui.btn_mount, FALSE); } } } /** * Create Open folder dialog and let user select folder * for mount point */ static void open_folder () { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new (_("Select folder - mount point"), GTK_WINDOW (gui.win), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { gchar *folder; folder = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); gtk_entry_set_text (GTK_ENTRY (gui.entry_mount_point), folder); g_free (folder); } gtk_widget_destroy (dialog); } /** * Create Open file dialog * and load cmd_params from file */ static void open_file () { GtkWidget *dialog; GtkFileFilter *fgnc, *fall; dialog = gtk_file_chooser_dialog_new (_("Load options from file"), GTK_WINDOW (gui.win), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); fgnc = gtk_file_filter_new(); gtk_file_filter_set_name(fgnc,"gncpmout (*.gnc)"); gtk_file_filter_add_pattern(fgnc,"*.gnc"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),fgnc); fall = gtk_file_filter_new(); gtk_file_filter_set_name(fall,"All files (*.*)"); gtk_file_filter_add_pattern(fall,"*"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),fall); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); load_cmdparams_from_file (filename); /* Set gui */ set_gui_from_cmdparams(); g_free (filename); } gtk_widget_destroy (dialog); } /** * Save cmd_params to default file */ static void set_default () { gchar *path = g_strconcat(g_get_home_dir(),"/.gncpmount", NULL); gchar *filename = g_strconcat(path, "/default", NULL); if (g_mkdir_with_parents(path,448) < 0) /* Octal - 700*/ { show_message(GTK_MESSAGE_ERROR,_("ERROR: Set as default"),"",_("Can't create directory: ~/.gncpmount"),""); } save_gui_to_cmdparams(); save_cmdparams_to_file (filename); show_message(GTK_MESSAGE_INFO,_("Set as default"),"",_("Current state of GUI was set as default."),""); g_free (path); g_free (filename); } /** * Create Save file dialog * and save cmd_params to file */ static void save_file () { GtkWidget *dialog; GtkFileFilter *fgnc, *fall; dialog = gtk_file_chooser_dialog_new (_("Save options to file"), GTK_WINDOW (gui.win), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE); /* if (user_edited_a_new_document) { gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), default_folder_for_saving); gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), "Untitled document"); } else gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), filename_for_existing_document); */ fgnc = gtk_file_filter_new(); gtk_file_filter_set_name(fgnc,"gncpmout (*.gnc)"); gtk_file_filter_add_pattern(fgnc,"*.gnc"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),fgnc); fall = gtk_file_filter_new(); gtk_file_filter_set_name(fall,"All files (*.*)"); gtk_file_filter_add_pattern(fall,"*"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),fall); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); save_gui_to_cmdparams(); save_cmdparams_to_file (filename); g_free (filename); } gtk_widget_destroy (dialog); } /** * Call ncpmount command */ static void call_ncpmount () { save_gui_to_cmdparams(); run_ncpmount(); } /** * Set true if -P (password) is used or not */ static void passwd_usage () { cmd_params.n = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gui.check_n)); gtk_editable_set_editable (GTK_EDITABLE(gui.entry_password), !cmd_params.n); if(cmd_params.n) { gtk_entry_set_visibility (GTK_ENTRY(gui.entry_password), TRUE); set_parameter_text (gui.entry_password, &(cmd_params.password)); gtk_entry_set_text (GTK_ENTRY(gui.entry_password), _("no password will be used")); } else { gtk_entry_set_visibility (GTK_ENTRY(gui.entry_password), FALSE); if(cmd_params.password != NULL) gtk_entry_set_text (GTK_ENTRY(gui.entry_password), cmd_params.password); else gtk_entry_set_text (GTK_ENTRY(gui.entry_password), ""); } } /** * Open Options dialog */ static void run_options_dialog () { show_options_dialog(); } /** * Open Show command dialog */ static void run_command_dialog () { save_gui_to_cmdparams(); show_ncpmount_command(); } /** * Clear cmd_params and set gui to default */ static void clear_gui () { clear_cmdparams(); set_gui_from_cmdparams(); } int main (int argc, char *argv[]) { GtkWidget *label = NULL; GtkWidget *tmp = NULL; GtkWidget *hbox = NULL; GtkWidget *halign = NULL; GtkWidget *logo = NULL; GtkWidget *menu = NULL; GtkWidget *submenu = NULL; GtkWidget *menuitem = NULL; gint i; //for GdkPixbuf *xpm = NULL; GList *icon_list = NULL; gchar *keyfile_default = g_strconcat(g_get_home_dir(),"/.gncpmount/default", NULL); setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, GNOMELOCALEDIR); textdomain(PACKAGE); bind_textdomain_codeset (PACKAGE, "UTF-8"); /* Initialize GTK+ */ g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL); gtk_init (&argc, &argv); g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL); /* Create the main window */ gui.win = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (gui.win), GUI_TITLE ); gtk_window_set_position (GTK_WINDOW (gui.win), GTK_WIN_POS_CENTER); gtk_window_set_default_size (GTK_WINDOW (gui.win), WIDTH, HEIGHT); gtk_window_set_resizable (GTK_WINDOW (gui.win), FALSE); gchar *icon_names[5] = {"/usr/share/icons/hicolor/24x24/apps/gncpmount.png", "/usr/share/icons/hicolor/32x32/apps/gncpmount.png", "/usr/share/icons/hicolor/48x48/apps/gncpmount.png", "/usr/share/icons/hicolor/64x64/apps/gncpmount.png", "/usr/share/icons/hicolor/96x96/apps/gncpmount.png"}; for(i = 0; i < 5; i++) { GdkPixbuf *tmp = gdk_pixbuf_new_from_file(icon_names[i], NULL); icon_list = g_list_append (icon_list, tmp); } gtk_window_set_icon_list (GTK_WINDOW(gui.win), icon_list); gtk_widget_realize (gui.win); g_signal_connect (gui.win, "destroy", gtk_main_quit, NULL); tmp = gtk_vbox_new (FALSE, 1); gtk_container_add (GTK_CONTAINER (gui.win), tmp); /* Create menu bar*/ gui.menu = gtk_menu_bar_new(); gtk_box_pack_start (GTK_BOX (tmp), gui.menu, FALSE, TRUE, 0); /* File menu */ menu = gtk_menu_item_new_with_mnemonic (_("_File")); gtk_menu_shell_append (GTK_MENU_SHELL(gui.menu), menu); gtk_widget_show(menu); /*-- Create File submenu --*/ submenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu), submenu); menuitem = gtk_menu_item_new_with_mnemonic (_("_New")); gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); g_signal_connect ( (menuitem), "activate", clear_gui, NULL); gtk_widget_show (menuitem); menuitem = gtk_menu_item_new_with_mnemonic (_("_Load from file")); gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); g_signal_connect ( (menuitem), "activate", open_file, NULL); gtk_widget_show (menuitem); menuitem = gtk_menu_item_new_with_mnemonic (_("_Save as...")); gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); g_signal_connect ( (menuitem), "activate", save_file, NULL); gtk_widget_show (menuitem); menuitem = gtk_menu_item_new_with_mnemonic (_("_Set as default")); gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); g_signal_connect ( (menuitem), "activate", set_default, NULL); gtk_widget_show (menuitem); menuitem = gtk_separator_menu_item_new (); gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); gtk_widget_show (menuitem); menuitem = gtk_menu_item_new_with_mnemonic (_("_Quit")); gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); g_signal_connect ( (menuitem), "activate", gtk_main_quit, NULL); //GTK_OBJECT gtk_widget_show (menuitem); /* Tools menu */ menu = gtk_menu_item_new_with_mnemonic (_("_Tools")); gtk_menu_shell_append (GTK_MENU_SHELL(gui.menu), menu); gtk_widget_show(menu); submenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu), submenu); menuitem = gtk_menu_item_new_with_mnemonic (_("_Options")); gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); g_signal_connect ( (menuitem), "activate", run_options_dialog, NULL); gtk_widget_show (menuitem); menuitem = gtk_menu_item_new_with_mnemonic (_("Show _command")); gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); g_signal_connect ( (menuitem), "activate", run_command_dialog, NULL); gtk_widget_show (menuitem); /* Help menu */ menu = gtk_menu_item_new_with_mnemonic (_("_Help")); gtk_menu_shell_append (GTK_MENU_SHELL(gui.menu), menu); gtk_widget_show(menu); submenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu), submenu); menuitem = gtk_menu_item_new_with_mnemonic (_("_About...")); gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem); g_signal_connect ( (menuitem), "activate", show_about, NULL); gtk_widget_show (menuitem); /* Create a vertical box */ gui.vbox = gtk_vbox_new (FALSE, 6); gtk_box_pack_start (GTK_BOX (tmp), gui.vbox, FALSE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (gui.vbox), 10); xpm = gdk_pixbuf_new_from_xpm_data(gncpmount_xpm); logo = gtk_image_new_from_pixbuf(xpm); gtk_box_pack_start (GTK_BOX (gui.vbox), logo, TRUE, TRUE, 0); /* Create a notebook */ gui.notebook = gtk_notebook_new (); gtk_notebook_set_tab_pos (GTK_NOTEBOOK (gui.notebook), GTK_POS_TOP); gtk_box_pack_start (GTK_BOX (gui.vbox), gui.notebook, TRUE, TRUE, 0); gtk_widget_set_size_request(gui.notebook, WIDTH,-1); /* Page Login */ /* Create table */ gui.table = gtk_table_new (3, 2, FALSE); label = gtk_label_new (_("Login")); gtk_notebook_prepend_page (GTK_NOTEBOOK (gui.notebook), gui.table, label); /* Labels */ halign = gtk_alignment_new(0, 0, 0, 1); label = gtk_label_new (_("Username [-U]:")); gtk_container_add(GTK_CONTAINER(halign), label); gtk_table_attach(GTK_TABLE(gui.table), halign, 0, 1, 0, 1, GTK_FILL , GTK_FILL | GTK_EXPAND, 4, 0); gui.entry_username = gtk_entry_new (); g_signal_connect (G_OBJECT (gui.entry_username), "changed", G_CALLBACK (enable_mount_button), NULL); gtk_table_attach_defaults (GTK_TABLE (gui.table), gui.entry_username, 1, 2, 0, 1); halign = gtk_alignment_new(0, 0, 0, 1); label = gtk_label_new (_("Password [-P]:")); gtk_container_add(GTK_CONTAINER(halign), label); gtk_table_attach(GTK_TABLE(gui.table), halign, 0, 1, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 4, 0); gui.entry_password = gtk_entry_new (); gtk_entry_set_visibility (GTK_ENTRY(gui.entry_password), FALSE); g_signal_connect (G_OBJECT (gui.entry_password), "changed", G_CALLBACK (enable_mount_button), NULL); gtk_table_attach_defaults (GTK_TABLE (gui.table), gui.entry_password, 1, 2, 1, 2); /* Chcekbox */ gui.check_n = gtk_check_button_new_with_label (_("Do not use any password [-n]")); g_signal_connect (G_OBJECT (gui.check_n), "toggled", G_CALLBACK (passwd_usage), NULL); gtk_table_attach_defaults (GTK_TABLE (gui.table), gui.check_n, 1, 2, 2, 3); /* Page SERVER */ gui.table = gtk_table_new (4, 2, FALSE); label = gtk_label_new (_("Server")); gtk_notebook_append_page (GTK_NOTEBOOK (gui.notebook), gui.table, label); halign = gtk_alignment_new(0, 0, 0, 1); label = gtk_label_new (_("Mount point:")); gtk_container_add(GTK_CONTAINER(halign), label); gtk_table_attach(GTK_TABLE(gui.table), halign, 0, 1, 0, 1, GTK_FILL , GTK_FILL | GTK_EXPAND, 6, 0); hbox = gtk_hbox_new (FALSE, 2); gtk_table_attach_defaults (GTK_TABLE (gui.table), hbox, 1, 2, 0, 1); gui.entry_mount_point = gtk_entry_new (); g_signal_connect (G_OBJECT (gui.entry_mount_point), "changed", G_CALLBACK (enable_mount_button), NULL); gtk_container_add(GTK_CONTAINER(hbox), gui.entry_mount_point); gui.btn_browse = gtk_button_new_from_stock (GTK_STOCK_OPEN); gtk_button_set_use_stock (GTK_BUTTON (gui.btn_browse), TRUE); g_signal_connect (gui.btn_browse, "clicked", G_CALLBACK (open_folder), NULL); gtk_container_add(GTK_CONTAINER(hbox), gui.btn_browse); tmp = gtk_hseparator_new(); gtk_table_attach (GTK_TABLE(gui.table), tmp, 0, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 6, 6); halign = gtk_alignment_new(0, 0, 0, 1); label = gtk_label_new (_("Server [-S]:")); gtk_container_add(GTK_CONTAINER(halign), label); gtk_table_attach(GTK_TABLE(gui.table), halign, 0, 1, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 6, 0); gui.entry_server = gtk_entry_new (); g_signal_connect (G_OBJECT (gui.entry_server), "changed", G_CALLBACK (enable_mount_button), NULL); gtk_table_attach_defaults (GTK_TABLE (gui.table), gui.entry_server, 1, 2, 2, 3); halign = gtk_alignment_new(0, 0, 0, 1); label = gtk_label_new (_("DNS name [-A]:")); gtk_container_add(GTK_CONTAINER(halign), label); gtk_table_attach(GTK_TABLE(gui.table), halign, 0, 1, 3, 4, GTK_FILL, GTK_FILL | GTK_EXPAND, 6, 0); gui.entry_dns_server = gtk_entry_new (); g_signal_connect (G_OBJECT (gui.entry_dns_server), "changed", G_CALLBACK (enable_mount_button), NULL); gtk_table_attach_defaults (GTK_TABLE (gui.table), gui.entry_dns_server, 1, 2, 3, 4); /* Button box */ gui.btnbox = gtk_hbutton_box_new(); gtk_button_box_set_layout (GTK_BUTTON_BOX(gui.btnbox), GTK_BUTTONBOX_END); gtk_box_pack_start (GTK_BOX (gui.vbox), gui.btnbox, TRUE, TRUE, 0); /* Buttons */ gui.btn_mount = gtk_button_new_with_label (_("Mount")); g_signal_connect (gui.btn_mount, "clicked", G_CALLBACK(call_ncpmount), NULL); gtk_box_pack_start (GTK_BOX (gui.btnbox), gui.btn_mount, TRUE, TRUE, 0); gui.btn_mount_enable = FALSE; gtk_widget_set_sensitive (gui.btn_mount, FALSE); gui.btn_close = gtk_button_new_from_stock (GTK_STOCK_CLOSE); g_signal_connect (gui.btn_close, "clicked", gtk_main_quit, NULL); gtk_box_pack_start (GTK_BOX (gui.btnbox), gui.btn_close, TRUE, TRUE, 0); /* Fill in informations from cmd_params to widgets */ clear_cmdparams (); /* Try to load default settings */ if (g_file_test(keyfile_default, G_FILE_TEST_EXISTS)) load_cmdparams_from_file (keyfile_default); /* Set gui */ set_gui_from_cmdparams(); /* Enter the main loop */ gtk_widget_show_all (gui.win); gtk_main (); g_free(keyfile_default); return 0; }