/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* share-nfs-add-hosts.c: this file is part of shares-admin, a gnome-system-tool frontend * for shared folders administration. * * Copyright (C) 2004 Carlos Garnacho * * This program 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 2 of the * License, or (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * * Authors: Carlos Garnacho Parro . */ #include #include "share-nfs-add-hosts.h" #include "shares-tool.h" #include "gst.h" extern GstTool *tool; static void share_nfs_create_size_group (void) { GtkSizeGroup *group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); GtkWidget *widget; widget = gst_dialog_get_widget (tool->main_dialog, "share_nfs_host_type_label"); gtk_size_group_add_widget (group, widget); widget = gst_dialog_get_widget (tool->main_dialog, "share_nfs_hostname_label"); gtk_size_group_add_widget (group, widget); widget = gst_dialog_get_widget (tool->main_dialog, "share_nfs_address_label"); gtk_size_group_add_widget (group, widget); widget = gst_dialog_get_widget (tool->main_dialog, "share_nfs_network_label"); gtk_size_group_add_widget (group, widget); } static void combo_add_columns (GtkComboBox *combo) { GtkCellRenderer *renderer; gtk_cell_layout_clear (GTK_CELL_LAYOUT (combo)); renderer = gtk_cell_renderer_pixbuf_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, FALSE); gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo), renderer, "pixbuf", NFS_HOST_COL_PIXBUF); g_object_unref (renderer); renderer = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE); gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo), renderer, "text", NFS_HOST_COL_NAME); g_object_unref (renderer); } static void share_nfs_create_combo (void) { GtkWidget *combo = gst_dialog_get_widget (tool->main_dialog, "share_nfs_host_type"); GtkListStore *store; store = gtk_list_store_new (NFS_HOST_COL_LAST, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING); gtk_combo_box_set_model (GTK_COMBO_BOX (combo), GTK_TREE_MODEL (store)); g_object_unref (store); combo_add_columns (GTK_COMBO_BOX (combo)); } void share_nfs_add_hosts_dialog_setup (void) { share_nfs_create_size_group (); share_nfs_create_combo (); } static void share_nfs_add_ifaces_combo_elements (GtkListStore *store) { /* FIXME: add addresses/netmasks from the active network interfaces */ } static void share_nfs_add_static_combo_elements (GtkListStore *store) { GtkTreeIter iter; GdkPixbuf *pixbuf; pixbuf = gtk_icon_theme_load_icon (gst_tool_get_icon_theme (tool), "gnome-fs-network", 16, 0, NULL); gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, pixbuf, 1, _("Specify hostname"), 2, NFS_SHARE_HOSTNAME, 3, NULL, -1); gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, pixbuf, 1, _("Specify IP address"), 2, NFS_SHARE_ADDRESS, 3, NULL, -1); gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, pixbuf, 1, _("Specify network"), 2, NFS_SHARE_NETWORK, 3, NULL, -1); g_object_unref (pixbuf); } static void populate_hosts_completion (GtkListStore *store) { OobsList *list; OobsListIter list_iter; gboolean valid; GtkTreeIter iter; GObject *static_host; GList *aliases, *alias; list = oobs_hosts_config_get_static_hosts (OOBS_HOSTS_CONFIG (GST_SHARES_TOOL (tool)->hosts_config)); valid = oobs_list_get_iter_first (list, &list_iter); while (valid) { static_host = oobs_list_get (list, &list_iter); aliases = alias = oobs_static_host_get_aliases (OOBS_STATIC_HOST (static_host)); g_object_unref (static_host); while (alias) { gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, alias->data, -1); alias = alias->next; } valid = oobs_list_iter_next (list, &list_iter); } } static void share_nfs_add_hosts_completion (void) { GtkWidget *entry = gst_dialog_get_widget (tool->main_dialog, "share_nfs_hostname"); GtkEntryCompletion *completion; GtkListStore *store; completion = gtk_entry_completion_new (); store = gtk_list_store_new (1, G_TYPE_STRING); gtk_entry_completion_set_model (completion, GTK_TREE_MODEL (store)); g_object_unref (store); gtk_entry_set_completion (GTK_ENTRY (entry), completion); g_object_unref (completion); gtk_entry_completion_set_text_column (completion, 0); populate_hosts_completion (store); } static void share_nfs_add_combo_elements (void) { GtkWidget *combo = gst_dialog_get_widget (tool->main_dialog, "share_nfs_host_type"); GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo)); gtk_list_store_clear (GTK_LIST_STORE (model)); share_nfs_add_hosts_completion (); /* FIXME share_nfs_add_ifaces_combo_elements (GTK_LIST_STORE (model), node); */ share_nfs_add_static_combo_elements (GTK_LIST_STORE (model)); gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0); } GtkWidget* share_nfs_add_hosts_dialog_prepare (void) { GtkWidget *dialog = gst_dialog_get_widget (tool->main_dialog, "share_nfs_add_dialog"); share_nfs_add_combo_elements (); return dialog; } gboolean share_nfs_add_hosts_dialog_get_data (gchar **str, gboolean *read_only) { GtkWidget *combo, *toggle, *w1, *w2; GtkTreeModel *model; GtkTreeIter iter; gint type; gchar *str1, *str2; combo = gst_dialog_get_widget (tool->main_dialog, "share_nfs_host_type"); toggle = gst_dialog_get_widget (tool->main_dialog, "share_nfs_readonly"); if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combo), &iter)) return FALSE; model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo)); gtk_tree_model_get (model, &iter, NFS_HOST_COL_TYPE, &type, -1); switch (type) { case NFS_SHARE_IFACE: gtk_tree_model_get (model, &iter, NFS_HOST_COL_NETWORK, &str1, NFS_HOST_COL_NETMASK, &str2, -1); *str = g_strdup_printf ("%s/%s", str1, str2); g_free (str1); g_free (str2); break; case NFS_SHARE_HOSTNAME: w1 = gst_dialog_get_widget (tool->main_dialog, "share_nfs_hostname"); *str = g_strdup (gtk_entry_get_text (GTK_ENTRY (w1))); break; case NFS_SHARE_ADDRESS: w1 = gst_dialog_get_widget (tool->main_dialog, "share_nfs_address"); *str = g_strdup (gtk_entry_get_text (GTK_ENTRY (w1))); break; case NFS_SHARE_NETWORK: w1 = gst_dialog_get_widget (tool->main_dialog, "share_nfs_network"); str1 = (gchar *) gtk_entry_get_text (GTK_ENTRY (w1)); w2 = gst_dialog_get_widget (tool->main_dialog, "share_nfs_netmask"); str2 = (gchar *) gtk_entry_get_text (GTK_ENTRY (w2)); *str = g_strdup_printf ("%s/%s", str1, str2); break; } *read_only = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle));; return TRUE; }