options_dialog.c
上传用户:tjfeida
上传日期:2013-03-10
资源大小:1917k
文件大小:33k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. /*****************************************************************************/
  2. /*  menu-items.c - menu callbacks                                            */
  3. /*  Copyright (C) 1998-2002 Brian Masney <masneyb@gftp.org>                  */
  4. /*                                                                           */
  5. /*  This program is free software; you can redistribute it and/or modify     */
  6. /*  it under the terms of the GNU General Public License as published by     */
  7. /*  the Free Software Foundation; either version 2 of the License, or        */
  8. /*  (at your option) any later version.                                      */
  9. /*                                                                           */
  10. /*  This program is distributed in the hope that it will be useful,          */
  11. /*  but WITHOUT ANY WARRANTY; without even the implied warranty of           */
  12. /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            */
  13. /*  GNU General Public License for more details.                             */
  14. /*                                                                           */
  15. /*  You should have received a copy of the GNU General Public License        */
  16. /*  along with this program; if not, write to the Free Software              */
  17. /*  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                */
  18. /*****************************************************************************/
  19. #include <gftp-gtk.h>
  20. static const char cvsid[] = "$Id: options_dialog.c,v 1.6 2002/11/06 02:20:25 masneyb Exp $";
  21. static GtkWidget * proxy_text, * proxy_list, * new_proxy_domain, * network1,
  22.                  * network2, * network3, * network4, * netmask1, * netmask2, 
  23.                  * netmask3, * netmask4, * domain_active, * proxy_combo,
  24.                  * def_proto_combo;
  25. static GList * new_proxy_hosts;
  26. static char *custom_proxy;
  27. static void
  28. clean_old_changes (GtkWidget * widget, gpointer data)
  29. {
  30.   gftp_proxy_hosts *hosts;
  31.   GList *templist;
  32.   templist = new_proxy_hosts;
  33.   while (templist != NULL)
  34.     {
  35.       hosts = templist->data;
  36.       if (hosts->domain)
  37.         g_free (hosts->domain);
  38.       g_free (hosts);
  39.       templist = templist->next;
  40.     }
  41.   g_list_free (new_proxy_hosts);
  42.   new_proxy_hosts = NULL;
  43.   if (custom_proxy != NULL)
  44.     {
  45.       g_free (custom_proxy);
  46.       custom_proxy = NULL;
  47.     }
  48. }
  49. static char *
  50. get_proxy_config (void)
  51. {
  52.   char *newstr, *oldstr, *pos, *endpos, *textstr;
  53.   guint len;
  54. #if GTK_MAJOR_VERSION == 1
  55.   char tmp[128];
  56. #else
  57.   GtkTextBuffer * textbuf;
  58.   GtkTextIter iter, iter2;
  59. #endif
  60.   textstr = NULL;
  61.   newstr = g_malloc (1);
  62.   *newstr = '';
  63. #if GTK_MAJOR_VERSION == 1
  64.   /*
  65.      GTK_TEXT uses wchar_t instead of char in environment of multibyte encoding
  66.      locale (ex Japanese),  so we must convert from wide character 
  67.      to multibyte charator....   Yasuyuki Furukawa (yasu@on.cs.keio.ac.jp)
  68.    */
  69.   if (GTK_TEXT (proxy_text)->use_wchar)
  70.     {
  71.       wcstombs (tmp, (wchar_t *) GTK_TEXT (proxy_text)->text.wc,
  72.                 sizeof (tmp));
  73.       pos = tmp;
  74.     }
  75.   else
  76.     {
  77.       oldstr = (char *) GTK_TEXT (proxy_text)->text.ch; 
  78.       len = gtk_text_get_length (GTK_TEXT (proxy_text));
  79.       textstr = g_malloc (len + 1);
  80.       strncpy (textstr, oldstr, len);
  81.       textstr[len] = '';
  82.       pos = textstr;
  83.     }
  84. #else
  85.   textbuf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (proxy_text));
  86.   len = gtk_text_buffer_get_char_count (textbuf);
  87.   gtk_text_buffer_get_iter_at_offset (textbuf, &iter, 0);
  88.   gtk_text_buffer_get_iter_at_offset (textbuf, &iter2, len - 1);
  89.   pos = textstr = gtk_text_buffer_get_text (textbuf, &iter, &iter2, 0);
  90. #endif
  91.   do
  92.     {
  93.       if ((endpos = strchr (pos, 'n')) != NULL)
  94.         *endpos = '';
  95.       oldstr = newstr;
  96.       if (endpos != NULL)
  97.         newstr = g_strconcat (newstr, pos, "%n", NULL);
  98.       else
  99.         newstr = g_strconcat (newstr, pos, NULL);
  100.       g_free (oldstr);
  101.       if (endpos != NULL)
  102.         {
  103.           *endpos = 'n';
  104.           pos = endpos + 1;
  105.         }
  106.     }
  107.   while (endpos != NULL);
  108. #if GTK_MAJOR_VERSION == 1
  109.   if (!GTK_TEXT (proxy_text)->use_wchar)
  110.     g_free (textstr);
  111. #else
  112.   g_free (textstr);
  113. #endif
  114.   return (newstr);
  115. }
  116. static void
  117. apply_changes (GtkWidget * widget, gpointer data)
  118. {
  119.   const char *tempstr;
  120.   int num, found, i;
  121.   GList *templist;
  122.   for (num = 0; config_file_vars[num].var != NULL; num++)
  123.     {
  124.       if (config_file_vars[num].widget != NULL)
  125.         {
  126.           switch (config_file_vars[num].type)
  127.             {
  128.               case CONFIG_CHECKBOX:
  129.                 *(int *) config_file_vars[num].var =
  130.                       GTK_TOGGLE_BUTTON (config_file_vars[num].widget)->active;
  131.                 break;
  132.               case CONFIG_INTTEXT:
  133.               case CONFIG_UINTTEXT:
  134.                 tempstr = gtk_entry_get_text ( 
  135.                                GTK_ENTRY (config_file_vars[num].widget));
  136.                 *(int *) config_file_vars[num].var = strtol (tempstr, NULL, 10);
  137.                 break;
  138.               case CONFIG_FLOATTEXT:
  139.                 tempstr = gtk_entry_get_text ( 
  140.                                GTK_ENTRY (config_file_vars[num].widget));
  141.                 *(double *) config_file_vars[num].var = strtod (tempstr, NULL);
  142.                 break;
  143.               case CONFIG_CHARTEXT:
  144.               case CONFIG_CHARPASS:
  145.                 tempstr = gtk_entry_get_text ( 
  146.                                GTK_ENTRY (config_file_vars[num].widget));
  147.                 g_free (*(char **) config_file_vars[num].var);
  148.                 *(char **) config_file_vars[num].var = 
  149.                                                 g_malloc (strlen (tempstr) + 1);
  150.                 strcpy (*(char **) config_file_vars[num].var, tempstr);
  151.                 break;
  152.             }
  153.         }
  154.     }
  155.   tempstr = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (def_proto_combo)->entry));
  156.   found = 0;
  157.   for (i = 0; gftp_protocols[i].name; i++)
  158.     {
  159.       if (strcmp (gftp_protocols[i].name, tempstr) == 0)
  160.         {
  161.           found = 1;
  162.           break;
  163.         }
  164.     }
  165.   if (found)
  166.     {
  167.       g_free (default_protocol);
  168.       default_protocol = g_strconcat (tempstr, NULL);
  169.     }
  170.   templist = proxy_hosts;
  171.   proxy_hosts = new_proxy_hosts;
  172.   new_proxy_hosts = templist;
  173.   clean_old_changes (NULL, NULL);
  174.   if (proxy_config != NULL)
  175.     g_free (proxy_config);
  176.   proxy_config = get_proxy_config ();
  177.   gftp_write_config_file ();
  178. }
  179. #if GTK_MAJOR_VERSION > 1
  180. static void
  181. options_action (GtkWidget * widget, gint response, gpointer user_data)
  182. {
  183.   switch (response)
  184.     {
  185.       case GTK_RESPONSE_APPLY:
  186.         apply_changes (widget, NULL);
  187.         break;
  188.       case GTK_RESPONSE_OK:
  189.         apply_changes (widget, NULL);
  190.         /* no break */
  191.       default:
  192.         gtk_widget_destroy (widget);
  193.     }
  194. }
  195. #endif
  196. static void
  197. proxy_toggle (GtkList * list, GtkWidget * child, gpointer data)
  198. {
  199.   int proxy_num;
  200.   char *str;
  201. #if GTK_MAJOR_VERSION > 1
  202.   GtkTextIter iter, iter2;
  203.   GtkTextBuffer * textbuf;
  204.   guint len;
  205. #endif
  206.   proxy_num = gtk_list_child_position (list, child);
  207.   if (proxy_num == GFTP_CUSTOM_PROXY_NUM)
  208.     str = custom_proxy;
  209.   else
  210.     str = proxy_type[proxy_num].description;
  211. #if GTK_MAJOR_VERSION == 1
  212.   gtk_text_set_point (GTK_TEXT (proxy_text), 0);
  213.   gtk_text_forward_delete (GTK_TEXT (proxy_text),
  214.    gtk_text_get_length (GTK_TEXT (proxy_text)));
  215.   gtk_text_insert (GTK_TEXT (proxy_text), NULL, NULL, NULL, str, -1);
  216. #else
  217.   textbuf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (proxy_text));
  218.   len = gtk_text_buffer_get_char_count (textbuf);
  219.   gtk_text_buffer_get_iter_at_offset (textbuf, &iter, 0);
  220.   gtk_text_buffer_get_iter_at_offset (textbuf, &iter2, len - 1);
  221.   gtk_text_buffer_delete (textbuf, &iter, &iter2);
  222.   len = gtk_text_buffer_get_char_count (textbuf);
  223.   gtk_text_buffer_get_iter_at_offset (textbuf, &iter, len - 1);
  224.   gtk_text_buffer_insert (textbuf, &iter, str, -1);
  225. #endif
  226. }
  227. static void
  228. add_host_to_listbox (GList * templist)
  229. {
  230.   gftp_proxy_hosts *hosts;
  231.   char *add_data[2];
  232.   int num;
  233.   hosts = templist->data;
  234.   if (hosts->domain)
  235.     {
  236.       add_data[0] = hosts->domain;
  237.       add_data[1] = NULL;
  238.       num = gtk_clist_append (GTK_CLIST (proxy_list), add_data);
  239.     }
  240.   else
  241.     {
  242.       add_data[0] = g_strdup_printf ("%d.%d.%d.%d",
  243.      hosts->ipv4_network_address >> 24 & 0xff,
  244.      hosts->ipv4_network_address >> 16 & 0xff,
  245.      hosts->ipv4_network_address >> 8 & 0xff,
  246.      hosts->ipv4_network_address & 0xff);
  247.       add_data[1] = g_strdup_printf ("%d.%d.%d.%d",
  248.      hosts->ipv4_netmask >> 24 & 0xff,
  249.      hosts->ipv4_netmask >> 16 & 0xff,
  250.      hosts->ipv4_netmask >> 8 & 0xff,
  251.      hosts->ipv4_netmask & 0xff);
  252.       num = gtk_clist_append (GTK_CLIST (proxy_list), add_data);
  253.       g_free (add_data[0]);
  254.       g_free (add_data[1]);
  255.     }
  256.   gtk_clist_set_row_data (GTK_CLIST (proxy_list), num, (gpointer) templist);
  257. }
  258. static void
  259. add_ok (GtkWidget * widget, gpointer data)
  260. {
  261.   gftp_proxy_hosts *hosts;
  262.   const char *edttxt;
  263.   GList *templist;
  264.   int num;
  265.   if ((templist = data) == NULL)
  266.     {
  267.       hosts = g_malloc0 (sizeof (*hosts));
  268.       new_proxy_hosts = g_list_append (new_proxy_hosts, hosts);
  269.       for (templist = new_proxy_hosts; templist->next != NULL;
  270.    templist = templist->next);
  271.     }
  272.   else
  273.     {
  274.       num = gtk_clist_find_row_from_data (GTK_CLIST (proxy_list), templist);
  275.       if (num != -1)
  276. gtk_clist_remove (GTK_CLIST (proxy_list), num);
  277.       hosts = templist->data;
  278.     }
  279.   if (hosts->domain)
  280.     {
  281.       g_free (hosts->domain);
  282.       hosts->domain = NULL;
  283.     }
  284.   if (GTK_TOGGLE_BUTTON (domain_active)->active)
  285.     {
  286.       edttxt = gtk_entry_get_text (GTK_ENTRY (new_proxy_domain));
  287.       hosts->domain = g_malloc (strlen (edttxt) + 1);
  288.       strcpy (hosts->domain, edttxt);
  289.       hosts->ipv4_netmask = hosts->ipv4_network_address = 0;
  290.     }
  291.   else
  292.     {
  293.       edttxt = gtk_entry_get_text (GTK_ENTRY (network1));
  294.       hosts->ipv4_network_address = (strtol (edttxt, NULL, 10) & 0xff) << 24;
  295.       edttxt = gtk_entry_get_text (GTK_ENTRY (network2));
  296.       hosts->ipv4_network_address |= (strtol (edttxt, NULL, 10) & 0xff) << 16;
  297.       edttxt = gtk_entry_get_text (GTK_ENTRY (network3));
  298.       hosts->ipv4_network_address |= (strtol (edttxt, NULL, 10) & 0xff) << 8;
  299.       edttxt = gtk_entry_get_text (GTK_ENTRY (network4));
  300.       hosts->ipv4_network_address |= strtol (edttxt, NULL, 10) & 0xff;
  301.       edttxt = gtk_entry_get_text (GTK_ENTRY (netmask1));
  302.       hosts->ipv4_netmask = (strtol (edttxt, NULL, 10) & 0xff) << 24;
  303.       edttxt = gtk_entry_get_text (GTK_ENTRY (netmask2));
  304.       hosts->ipv4_netmask |= (strtol (edttxt, NULL, 10) & 0xff) << 16;
  305.       edttxt = gtk_entry_get_text (GTK_ENTRY (netmask3));
  306.       hosts->ipv4_netmask |= (strtol (edttxt, NULL, 10) & 0xff) << 8;
  307.       edttxt = gtk_entry_get_text (GTK_ENTRY (netmask4));
  308.       hosts->ipv4_netmask |= strtol (edttxt, NULL, 10) & 0xff;
  309.     }
  310.   add_host_to_listbox (templist);
  311. }
  312. #if GTK_MAJOR_VERSION > 1
  313. static void
  314. proxyhosts_action (GtkWidget * widget, gint response, gpointer user_data)
  315. {
  316.   switch (response)
  317.     {
  318.       case GTK_RESPONSE_OK:
  319.         add_ok (widget, user_data);
  320.         /* no break */
  321.       default:
  322.         gtk_widget_destroy (widget);
  323.     }
  324. }
  325. #endif
  326. static void
  327. add_toggle (GtkWidget * widget, gpointer data)
  328. {
  329.   gtk_widget_set_sensitive (new_proxy_domain, data != NULL);
  330.   gtk_widget_set_sensitive (network1, data == NULL);
  331.   gtk_widget_set_sensitive (network2, data == NULL);
  332.   gtk_widget_set_sensitive (network3, data == NULL);
  333.   gtk_widget_set_sensitive (network4, data == NULL);
  334.   gtk_widget_set_sensitive (netmask1, data == NULL);
  335.   gtk_widget_set_sensitive (netmask2, data == NULL);
  336.   gtk_widget_set_sensitive (netmask3, data == NULL);
  337.   gtk_widget_set_sensitive (netmask4, data == NULL);
  338. }
  339. static void
  340. delete_proxy_host (GtkWidget * widget, gpointer data)
  341. {
  342.   GList *templist;
  343.   int num;
  344.   if ((templist = GTK_CLIST (proxy_list)->selection) == NULL)
  345.     return;
  346.   num = (int) templist->data;
  347.   templist = gtk_clist_get_row_data (GTK_CLIST (proxy_list), num);
  348.   new_proxy_hosts = g_list_remove_link (new_proxy_hosts, templist);
  349.   gtk_clist_remove (GTK_CLIST (proxy_list), num);
  350. }
  351. static void
  352. add_proxy_host (GtkWidget * widget, gpointer data)
  353. {
  354.   GtkWidget *tempwid, *dialog, *frame, *box, *table;
  355.   gftp_proxy_hosts *hosts;
  356.   char *tempstr, *title;
  357.   GList *templist;
  358.   if (data)
  359.     {
  360.       if ((templist = GTK_CLIST (proxy_list)->selection) == NULL)
  361. return;
  362.       templist = gtk_clist_get_row_data (GTK_CLIST (proxy_list), 
  363.                                          (int) templist->data);
  364.       hosts = templist->data;
  365.     }
  366.   else
  367.     {
  368.       hosts = NULL;
  369.       templist = NULL;
  370.     }
  371.   title = hosts ? _("Edit Host") : _("Add Host");
  372. #if GTK_MAJOR_VERSION == 1
  373.   dialog = gtk_dialog_new ();
  374.   gtk_window_set_title (GTK_WINDOW (dialog), title);
  375.   gtk_container_border_width (GTK_CONTAINER
  376.       (GTK_DIALOG (dialog)->action_area), 5);
  377.   gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->action_area), 15);
  378.   gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE);
  379.   gtk_grab_add (dialog);
  380. #else
  381.   dialog = gtk_dialog_new_with_buttons (title, NULL, 0,
  382.                                         GTK_STOCK_SAVE,
  383.                                         GTK_RESPONSE_OK,
  384.                                         GTK_STOCK_CANCEL,
  385.                                         GTK_RESPONSE_CANCEL,
  386.                                         NULL);
  387. #endif
  388.   gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10);
  389.   gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 2);
  390.   gtk_window_set_wmclass (GTK_WINDOW(dialog), "hostinfo", "Gftp");
  391.   gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
  392.   frame = gtk_frame_new (NULL);
  393.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), frame, TRUE, TRUE,
  394.       0);
  395.   gtk_widget_show (frame);
  396.   box = gtk_hbox_new (FALSE, 5);
  397.   gtk_container_border_width (GTK_CONTAINER (box), 5);
  398.   gtk_container_add (GTK_CONTAINER (frame), box);
  399.   gtk_widget_show (box);
  400.   tempwid = gtk_label_new (_("Domain"));
  401.   gtk_box_pack_start (GTK_BOX (box), tempwid, TRUE, TRUE, 0);
  402.   gtk_widget_show (tempwid);
  403.   new_proxy_domain = gtk_entry_new ();
  404.   gtk_box_pack_start (GTK_BOX (box), new_proxy_domain, TRUE, TRUE, 0);
  405.   gtk_widget_show (new_proxy_domain);
  406.   frame = gtk_frame_new (NULL);
  407.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), frame, TRUE, TRUE,
  408.       0);
  409.   gtk_widget_show (frame);
  410.   table = gtk_table_new (4, 2, FALSE);
  411.   gtk_container_border_width (GTK_CONTAINER (table), 5);
  412.   gtk_table_set_row_spacings (GTK_TABLE (table), 5);
  413.   gtk_table_set_col_spacings (GTK_TABLE (table), 5);
  414.   gtk_container_add (GTK_CONTAINER (frame), table);
  415.   gtk_widget_show (table);
  416.   tempwid = gtk_label_new (_("Network Address"));
  417.   gtk_misc_set_alignment (GTK_MISC (tempwid), 1, 0.5);
  418.   gtk_table_attach_defaults (GTK_TABLE (table), tempwid, 0, 1, 0, 1);
  419.   gtk_widget_show (tempwid);
  420.   box = gtk_hbox_new (FALSE, 5);
  421.   gtk_table_attach_defaults (GTK_TABLE (table), box, 1, 2, 0, 1);
  422.   gtk_widget_show (box);
  423.   network1 = gtk_entry_new ();
  424.   gtk_widget_set_size_request (network1, 28, -1);
  425.   gtk_box_pack_start (GTK_BOX (box), network1, TRUE, TRUE, 0);
  426.   gtk_widget_show (network1);
  427.   network2 = gtk_entry_new ();
  428.   gtk_widget_set_size_request (network2, 28, -1);
  429.   gtk_box_pack_start (GTK_BOX (box), network2, TRUE, TRUE, 0);
  430.   gtk_widget_show (network2);
  431.   network3 = gtk_entry_new ();
  432.   gtk_widget_set_size_request (network3, 28, -1);
  433.   gtk_box_pack_start (GTK_BOX (box), network3, TRUE, TRUE, 0);
  434.   gtk_widget_show (network3);
  435.   network4 = gtk_entry_new ();
  436.   gtk_widget_set_size_request (network4, 28, -1);
  437.   gtk_box_pack_start (GTK_BOX (box), network4, TRUE, TRUE, 0);
  438.   gtk_widget_show (network4);
  439.   tempwid = gtk_label_new (_("Netmask"));
  440.   gtk_misc_set_alignment (GTK_MISC (tempwid), 1, 0.5);
  441.   gtk_table_attach_defaults (GTK_TABLE (table), tempwid, 0, 1, 1, 2);
  442.   gtk_widget_show (tempwid);
  443.   box = gtk_hbox_new (FALSE, 5);
  444.   gtk_table_attach_defaults (GTK_TABLE (table), box, 1, 2, 1, 2);
  445.   gtk_widget_show (box);
  446.   netmask1 = gtk_entry_new ();
  447.   gtk_widget_set_size_request (netmask1, 28, -1);
  448.   gtk_box_pack_start (GTK_BOX (box), netmask1, TRUE, TRUE, 0);
  449.   gtk_widget_show (netmask1);
  450.   netmask2 = gtk_entry_new ();
  451.   gtk_widget_set_size_request (netmask2, 28, -1);
  452.   gtk_box_pack_start (GTK_BOX (box), netmask2, TRUE, TRUE, 0);
  453.   gtk_widget_show (netmask2);
  454.   netmask3 = gtk_entry_new ();
  455.   gtk_widget_set_size_request (netmask3, 28, -1);
  456.   gtk_box_pack_start (GTK_BOX (box), netmask3, TRUE, TRUE, 0);
  457.   gtk_widget_show (netmask3);
  458.   netmask4 = gtk_entry_new ();
  459.   gtk_widget_set_size_request (netmask4, 28, -1);
  460.   gtk_box_pack_start (GTK_BOX (box), netmask4, TRUE, TRUE, 0);
  461.   gtk_widget_show (netmask4);
  462.   box = gtk_hbox_new (FALSE, 5);
  463.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), box, TRUE, TRUE,
  464.       0);
  465.   gtk_widget_show (box);
  466.   domain_active = gtk_radio_button_new_with_label (NULL, _("Domain"));
  467.   gtk_signal_connect (GTK_OBJECT (domain_active), "toggled",
  468.       GTK_SIGNAL_FUNC (add_toggle), (gpointer) 1);
  469.   gtk_box_pack_start (GTK_BOX (box), domain_active, TRUE, TRUE, 0);
  470.   gtk_widget_show (domain_active);
  471.   tempwid = gtk_radio_button_new_with_label (gtk_radio_button_group
  472.      (GTK_RADIO_BUTTON (domain_active)),
  473.      _("Network"));
  474.   gtk_signal_connect (GTK_OBJECT (tempwid), "toggled",
  475.       GTK_SIGNAL_FUNC (add_toggle), NULL);
  476.   gtk_box_pack_start (GTK_BOX (box), tempwid, TRUE, TRUE, 0);
  477.   gtk_widget_show (tempwid);
  478.   if (!hosts || !hosts->domain)
  479.     {
  480.       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tempwid), TRUE);
  481.       add_toggle (NULL, NULL);
  482.     }
  483.   else
  484.     {
  485.       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (domain_active), TRUE);
  486.       add_toggle (NULL, (gpointer) 1);
  487.     }
  488.   if (hosts)
  489.     {
  490.       if (hosts->domain)
  491.         gtk_entry_set_text (GTK_ENTRY (new_proxy_domain), hosts->domain);
  492.       else
  493. {
  494.   tempstr = g_strdup_printf ("%d", hosts->ipv4_network_address >> 24 & 0xff);
  495.   gtk_entry_set_text (GTK_ENTRY (network1), tempstr);
  496.   g_free (tempstr);
  497.   tempstr = g_strdup_printf ("%d", hosts->ipv4_network_address >> 16 & 0xff);
  498.   gtk_entry_set_text (GTK_ENTRY (network2), tempstr);
  499.   g_free (tempstr);
  500.   tempstr = g_strdup_printf ("%d", hosts->ipv4_network_address >> 8 & 0xff);
  501.   gtk_entry_set_text (GTK_ENTRY (network3), tempstr);
  502.   g_free (tempstr);
  503.   tempstr = g_strdup_printf ("%d", hosts->ipv4_network_address & 0xff);
  504.   gtk_entry_set_text (GTK_ENTRY (network4), tempstr);
  505.   g_free (tempstr);
  506.   tempstr = g_strdup_printf ("%d", hosts->ipv4_netmask >> 24 & 0xff);
  507.   gtk_entry_set_text (GTK_ENTRY (netmask1), tempstr);
  508.   g_free (tempstr);
  509.   tempstr = g_strdup_printf ("%d", hosts->ipv4_netmask >> 16 & 0xff);
  510.   gtk_entry_set_text (GTK_ENTRY (netmask2), tempstr);
  511.   g_free (tempstr);
  512.   tempstr = g_strdup_printf ("%d", hosts->ipv4_netmask >> 8 & 0xff);
  513.   gtk_entry_set_text (GTK_ENTRY (netmask3), tempstr);
  514.   g_free (tempstr);
  515.   tempstr = g_strdup_printf ("%d", hosts->ipv4_netmask & 0xff);
  516.   gtk_entry_set_text (GTK_ENTRY (netmask4), tempstr);
  517.   g_free (tempstr);
  518. }
  519.     }
  520. #if GTK_MAJOR_VERSION == 1
  521.   tempwid = gtk_button_new_with_label (_("OK"));
  522.   GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
  523.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
  524.       TRUE, TRUE, 0);
  525.   gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
  526.       GTK_SIGNAL_FUNC (add_ok), (gpointer) templist);
  527.   gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked",
  528.      GTK_SIGNAL_FUNC (gtk_widget_destroy),
  529.      GTK_OBJECT (dialog));
  530.   gtk_widget_show (tempwid);
  531.   tempwid = gtk_button_new_with_label (_("  Cancel  "));
  532.   GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
  533.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
  534.       TRUE, TRUE, 0);
  535.   gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked",
  536.      GTK_SIGNAL_FUNC (gtk_widget_destroy),
  537.      GTK_OBJECT (dialog));
  538.   gtk_widget_show (tempwid);
  539. #else
  540.   g_signal_connect (GTK_OBJECT (dialog), "response",
  541.                     G_CALLBACK (proxyhosts_action), NULL);
  542. #endif
  543.   gtk_widget_show (dialog);
  544. }
  545. static void
  546. make_proxy_hosts_tab (GtkWidget * notebook)
  547. {
  548.   GtkWidget *tempwid, *box, *hbox, *scroll;
  549.   gftp_proxy_hosts *hosts, *newhosts;
  550.   char *add_data[2];
  551.   GList *templist;
  552.   add_data[0] = _("Network");
  553.   add_data[1] = _("Netmask");
  554.   box = gtk_vbox_new (FALSE, 5);
  555.   gtk_container_border_width (GTK_CONTAINER (box), 10);
  556.   gtk_widget_show (box);
  557.   tempwid = gtk_label_new (_("Local Hosts"));
  558.   gtk_widget_show (tempwid);
  559.   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), box, tempwid);
  560.   scroll = gtk_scrolled_window_new (NULL, NULL);
  561.   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
  562.   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
  563.   gtk_box_pack_start (GTK_BOX (box), scroll, TRUE, TRUE, 0);
  564.   proxy_list = gtk_clist_new_with_titles (2, add_data);
  565.   gtk_container_add (GTK_CONTAINER (scroll), proxy_list);
  566.   gtk_clist_set_column_auto_resize (GTK_CLIST (proxy_list), 0, TRUE);
  567.   gtk_clist_set_column_auto_resize (GTK_CLIST (proxy_list), 1, TRUE);
  568.   gtk_widget_show (proxy_list);
  569.   gtk_widget_show (scroll);
  570.   hbox = gtk_hbox_new (TRUE, 15);
  571.   gtk_box_pack_start (GTK_BOX (box), hbox, FALSE, FALSE, 0);
  572.   gtk_widget_show (hbox);
  573.   tempwid = gtk_button_new_with_label (_("Add"));
  574.   GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
  575.   gtk_box_pack_start (GTK_BOX (hbox), tempwid, TRUE, TRUE, 0);
  576.   gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
  577.       GTK_SIGNAL_FUNC (add_proxy_host), NULL);
  578.   gtk_widget_show (tempwid);
  579.   tempwid = gtk_button_new_with_label (_("Edit"));
  580.   GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
  581.   gtk_box_pack_start (GTK_BOX (hbox), tempwid, TRUE, TRUE, 0);
  582.   gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
  583.       GTK_SIGNAL_FUNC (add_proxy_host), (gpointer) 1);
  584.   gtk_widget_show (tempwid);
  585.   tempwid = gtk_button_new_with_label (_("Delete"));
  586.   GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
  587.   gtk_box_pack_start (GTK_BOX (hbox), tempwid, TRUE, TRUE, 0);
  588.   gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
  589.       GTK_SIGNAL_FUNC (delete_proxy_host), NULL);
  590.   gtk_widget_show (tempwid);
  591.   new_proxy_hosts = NULL;
  592.   for (templist = proxy_hosts; templist != NULL;
  593.        templist = templist->next)
  594.     {
  595.       hosts = templist->data;
  596.       newhosts = g_malloc (sizeof (*newhosts));
  597.       memcpy (newhosts, hosts, sizeof (*newhosts));
  598.       if (newhosts->domain)
  599. {
  600.   newhosts->domain = g_malloc (strlen (hosts->domain) + 1);
  601.   strcpy (newhosts->domain, hosts->domain);
  602. }
  603.       new_proxy_hosts = g_list_prepend (new_proxy_hosts, newhosts);
  604.       add_host_to_listbox (new_proxy_hosts);
  605.     }
  606. }
  607. void
  608. options_dialog (gpointer data)
  609. {
  610.   GtkWidget * dialog, * tempwid, * notebook, * table, * box;
  611.   char tempstr[20], *pos, *endpos, *oldstr;
  612.   int i, tbl_col, tbl_num, combo_num;
  613.   GList * combo_list;
  614. #if GTK_MAJOR_VERSION == 1
  615.   dialog = gtk_dialog_new ();
  616.   gtk_window_set_title (GTK_WINDOW (dialog), _("Options"));
  617.   gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area),
  618.                               5);
  619.   gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->action_area), 15);
  620.   gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE);
  621. #else
  622.   dialog = gtk_dialog_new_with_buttons (_("Options"), NULL, 0,
  623.                                         GTK_STOCK_SAVE,
  624.                                         GTK_RESPONSE_OK,
  625.                                         GTK_STOCK_CANCEL,
  626.                                         GTK_RESPONSE_CANCEL,
  627.                                         GTK_STOCK_APPLY,
  628.                                         GTK_RESPONSE_APPLY,
  629.                                         NULL);
  630. #endif
  631.   gtk_window_set_wmclass (GTK_WINDOW(dialog), "options", "gFTP");
  632.   gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
  633.   gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10);
  634.   gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 2);
  635.   gtk_widget_realize (dialog);
  636.   if (gftp_icon != NULL)
  637.     {
  638.       gdk_window_set_icon (dialog->window, NULL, gftp_icon->pixmap,
  639.                            gftp_icon->bitmap);
  640.       gdk_window_set_icon_name (dialog->window, _("gFTP Icon"));
  641.     }
  642.   notebook = gtk_notebook_new ();
  643.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), notebook, TRUE,
  644.                       TRUE, 0);
  645.   gtk_widget_show (notebook);
  646.   tbl_num = tbl_col = 0;
  647.   table = box = NULL;
  648.   for (i=0; config_file_vars[i].key != NULL; i++)
  649.     {
  650.       if (!(config_file_vars[i].ports_shown & GFTP_PORT_GTK))
  651.         continue;
  652.       switch (config_file_vars[i].type)
  653.         {
  654.           case CONFIG_NOTEBOOK:
  655.             box = gtk_vbox_new (FALSE, 0);
  656.             gtk_container_border_width (GTK_CONTAINER (box), 10);
  657.             gtk_widget_show (box);
  658.             tempwid = gtk_label_new (_(config_file_vars[i].description));
  659.             gtk_widget_show (tempwid);
  660.             gtk_notebook_append_page (GTK_NOTEBOOK (notebook), box, tempwid);
  661.             break;
  662.           case CONFIG_TABLE:
  663.             table = gtk_table_new (1, 2, FALSE);
  664.             gtk_table_set_row_spacings (GTK_TABLE (table), 5);
  665.             gtk_table_set_col_spacings (GTK_TABLE (table), 5);
  666.             gtk_box_pack_start (GTK_BOX (box), table, FALSE, FALSE, 0);
  667.             gtk_widget_show (table);
  668.             tbl_num = 1;
  669.             tbl_col = 0;
  670.             break;
  671.           case CONFIG_COMBO:
  672.             gtk_table_resize (GTK_TABLE (table), tbl_num, 2);
  673.             tempwid = gtk_label_new (_(config_file_vars[i].description));
  674.             gtk_misc_set_alignment (GTK_MISC (tempwid), 1, 0.5);
  675.             gtk_table_attach_defaults (GTK_TABLE (table), tempwid, 0, 1,
  676.                                        tbl_num - 1, tbl_num);
  677.             gtk_widget_show (tempwid);
  678.             tempwid = gtk_combo_new ();
  679.             gtk_table_attach_defaults (GTK_TABLE (table), tempwid, 1, 2,
  680.                                        tbl_num - 1, tbl_num);
  681.             gtk_widget_show (tempwid);
  682.             config_file_vars[i].widget = tempwid;
  683.             /* We only have Default Protocol and the Proxy type as the two
  684.                combo types. If I add more later on, I'll work on a better
  685.                interface for all this stuff */
  686.             if (strcmp (config_file_vars[i].comment, "DP") == 0)
  687.               def_proto_combo = tempwid;
  688.             else
  689.               proxy_combo = tempwid;
  690.             tbl_num++;
  691.             break;
  692.           case CONFIG_TEXT:
  693. #if GTK_MAJOR_VERSION == 1
  694.             proxy_text = gtk_text_new (NULL, NULL);
  695.             gtk_text_set_editable (GTK_TEXT (proxy_text), TRUE);
  696. #else
  697.             proxy_text = gtk_text_view_new ();
  698.             gtk_text_view_set_editable (GTK_TEXT_VIEW (proxy_text), TRUE);
  699. #endif
  700.             gtk_widget_set_size_request (proxy_text, -1, 75);
  701.             gtk_table_attach_defaults (GTK_TABLE (table), proxy_text, 0, 2, 
  702.                                        tbl_num - 1, tbl_num);
  703.             gtk_widget_show (proxy_text);
  704.             config_file_vars[i].widget = proxy_text;
  705.             tbl_num++;
  706.             break;
  707.           case CONFIG_CHARTEXT:
  708.           case CONFIG_CHARPASS:
  709.           case CONFIG_INTTEXT:
  710.           case CONFIG_UINTTEXT:
  711.           case CONFIG_FLOATTEXT:
  712.             gtk_table_resize (GTK_TABLE (table), tbl_num, 2);
  713.             tempwid = gtk_label_new (_(config_file_vars[i].description));
  714.             gtk_misc_set_alignment (GTK_MISC (tempwid), 1, 0.5);
  715.             gtk_table_attach_defaults (GTK_TABLE (table), tempwid, 0, 1,
  716.                                        tbl_num - 1, tbl_num);
  717.             gtk_widget_show (tempwid);
  718.             tempwid = gtk_entry_new ();
  719.             gtk_table_attach_defaults (GTK_TABLE (table), tempwid, 1, 2,
  720.                                        tbl_num - 1, tbl_num);
  721.             switch (config_file_vars[i].type)
  722.               {
  723.                 case CONFIG_INTTEXT:
  724.                 case CONFIG_UINTTEXT:
  725.                   g_snprintf (tempstr, sizeof (tempstr), "%d",
  726.                               *(int *) config_file_vars[i].var);
  727.                   gtk_entry_set_text (GTK_ENTRY (tempwid), tempstr);
  728.                   break;
  729.                 case CONFIG_FLOATTEXT:
  730.                   g_snprintf (tempstr, sizeof (tempstr), "%.2f",
  731.                               *(double *) config_file_vars[i].var);
  732.                   gtk_entry_set_text (GTK_ENTRY (tempwid), tempstr);
  733.                   break;
  734.                 case CONFIG_CHARTEXT:
  735.                   gtk_entry_set_text (GTK_ENTRY (tempwid),
  736.                                       *(char **) config_file_vars[i].var);
  737.                   break;
  738.                 case CONFIG_CHARPASS:
  739.                   gtk_entry_set_text (GTK_ENTRY (tempwid),
  740.                                       *(char **) config_file_vars[i].var);
  741.                   gtk_entry_set_visibility (GTK_ENTRY (tempwid), 0);
  742.                   break;
  743.               }
  744.             gtk_widget_show (tempwid);
  745.             config_file_vars[i].widget = tempwid;
  746.             tbl_num++;
  747.             break;
  748.           case CONFIG_CHECKBOX:
  749.             tempwid = gtk_check_button_new_with_label (
  750.                                     _(config_file_vars[i].description));
  751.             gtk_table_attach_defaults (GTK_TABLE (table), tempwid, 
  752.                                     tbl_col, tbl_col + 1, tbl_num, tbl_num + 1);
  753.             gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tempwid),
  754.                                     *(int *) config_file_vars[i].var);
  755.             gtk_widget_show (tempwid);
  756.             config_file_vars[i].widget = tempwid;
  757.             tbl_col++;
  758.             if (tbl_col == 2)
  759.               {
  760.                 tbl_col = 0;
  761.                 tbl_num++;
  762.                 gtk_table_resize (GTK_TABLE (table), tbl_num + 1, 2);
  763.               }
  764.             break; 
  765.           case CONFIG_LABEL:
  766.             tempwid = gtk_label_new (_(config_file_vars[i].description));
  767.             gtk_misc_set_alignment (GTK_MISC (tempwid), tbl_col, 0.5);
  768.             gtk_table_attach_defaults (GTK_TABLE (table), tempwid, 
  769.                                     tbl_col, tbl_col + 1, tbl_num, tbl_num + 1);
  770.             gtk_widget_show (tempwid);
  771.             config_file_vars[i].widget = tempwid;
  772.             tbl_col++;
  773.             if (tbl_col == 2)
  774.               {
  775.                 tbl_col = 0;
  776.                 tbl_num++;
  777.                 gtk_table_resize (GTK_TABLE (table), tbl_num + 1, 2);
  778.               }
  779.             break;
  780.         }
  781.     }
  782.   combo_num = 0;
  783.   combo_list = NULL;
  784.   for (i = 0; gftp_protocols[i].name != NULL; i++)
  785.     {
  786.       if (strcmp (default_protocol, gftp_protocols[i].name) == 0)
  787.         combo_num = i;
  788.       tempwid = gtk_list_item_new_with_label (gftp_protocols[i].name);
  789.       gtk_widget_show (tempwid);
  790.       combo_list = g_list_append (combo_list, tempwid);
  791.     }
  792.   gtk_list_prepend_items (GTK_LIST (GTK_COMBO (def_proto_combo)->list), 
  793.                           combo_list); 
  794.   gtk_list_select_item (GTK_LIST (GTK_COMBO (def_proto_combo)->list), 
  795.                         combo_num);
  796.   combo_list = NULL;
  797.   for (i = 0; proxy_type[i].key != NULL; i++)
  798.     {
  799.       tempwid = gtk_list_item_new_with_label (_(proxy_type[i].key));
  800.       gtk_widget_show (tempwid);
  801.       combo_list = g_list_append (combo_list, tempwid);
  802.     }
  803.   gtk_list_prepend_items (GTK_LIST (GTK_COMBO (proxy_combo)->list), combo_list);
  804.   combo_list = NULL;
  805.   custom_proxy = g_malloc0 (1);
  806.   if (proxy_config == NULL || *proxy_config == '')
  807.     combo_num = 0;
  808.   else
  809.     {
  810.       pos = proxy_config;
  811.       while ((endpos = strstr (pos, "%n")))
  812.         {
  813.           *endpos = '';
  814.           oldstr = custom_proxy;
  815.           custom_proxy = g_strconcat (custom_proxy, pos, "n", NULL);
  816.           g_free (oldstr);
  817.           *endpos = '%';
  818.           pos = endpos + 2;
  819.         }
  820.       for (combo_num = 1; combo_num < GFTP_CUSTOM_PROXY_NUM; combo_num++)
  821.         {
  822.           if (strcmp (proxy_type[combo_num].description, custom_proxy) == 0)
  823.             break;
  824.         }
  825.     }
  826.   gtk_signal_connect (GTK_OBJECT (GTK_COMBO (proxy_combo)->list),
  827.                       "select_child", GTK_SIGNAL_FUNC (proxy_toggle), NULL);
  828.   gtk_list_select_item (GTK_LIST (GTK_COMBO (proxy_combo)->list), combo_num);
  829.   make_proxy_hosts_tab (notebook);
  830. #if GTK_MAJOR_VERSION == 1
  831.   tempwid = gtk_button_new_with_label (_("OK"));
  832.   GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
  833.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
  834.                       TRUE, TRUE, 0);
  835.   gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
  836.                       GTK_SIGNAL_FUNC (apply_changes), NULL);
  837.   gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked",
  838.                              GTK_SIGNAL_FUNC (gtk_widget_destroy),
  839.                              GTK_OBJECT (dialog));
  840.   gtk_widget_show (tempwid);
  841.   tempwid = gtk_button_new_with_label (_("  Cancel  "));
  842.   GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
  843.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
  844.                       TRUE, TRUE, 0);
  845.   gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
  846.                       GTK_SIGNAL_FUNC (clean_old_changes), NULL);
  847.   gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked",
  848.                              GTK_SIGNAL_FUNC (gtk_widget_destroy),
  849.                              GTK_OBJECT (dialog));
  850.   gtk_widget_show (tempwid);
  851.   tempwid = gtk_button_new_with_label (_("Apply"));
  852.   GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
  853.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
  854.                       TRUE, TRUE, 0);
  855.   gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
  856.                       GTK_SIGNAL_FUNC (apply_changes), NULL);
  857.   gtk_widget_grab_default (tempwid);
  858.   gtk_widget_show (tempwid);
  859. #else
  860.   g_signal_connect (GTK_OBJECT (dialog), "response",
  861.                     G_CALLBACK (options_action), NULL);
  862. #endif
  863.   gtk_widget_show (dialog);
  864. }