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

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: menu-items.c,v 1.12 2002/11/11 23:16:12 masneyb Exp $";
  21. void
  22. change_setting (gftp_window_data * wdata, int menuitem, GtkWidget * checkmenu)
  23. {
  24.   switch (menuitem)
  25.     {
  26.     case 1:
  27.       if (wdata->request != NULL)
  28.         gftp_set_data_type (wdata->request, GFTP_TYPE_ASCII);
  29.       break;
  30.     case 2:
  31.       if (wdata->request != NULL)
  32.         gftp_set_data_type (wdata->request, GFTP_TYPE_BINARY);
  33.       break;
  34.     case 3:
  35.       current_wdata = &window1;
  36.       other_wdata = &window2;
  37.       if (wdata->request)
  38.         update_window_info ();
  39.       break;
  40.     case 4:
  41.       current_wdata = &window2;
  42.       other_wdata = &window1;
  43.       if (wdata->request)
  44.         update_window_info ();
  45.       break;
  46.     }
  47. }
  48. void
  49. tb_openurl_dialog (gpointer data)
  50. {
  51.   const char *edttxt;
  52.   if (current_wdata->request->stopable)
  53.     {
  54.       ftp_log (gftp_logging_misc, NULL,
  55.                _("%s: Please hit the stop button first to do anything elsen"),
  56.                _("OpenURL"));
  57.       return;
  58.     }
  59.   edttxt = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (hostedit)->entry));
  60.   if (*edttxt == '')
  61.     {
  62.       ftp_log (gftp_logging_misc, NULL,
  63.                _("OpenURL: Operation canceled...you must enter a stringn"));
  64.       return;
  65.     }
  66.   if (GFTP_IS_CONNECTED (current_wdata->request))
  67.     disconnect (current_wdata);
  68.   else if (edttxt != NULL && *edttxt != '')
  69.     toolbar_hostedit (NULL, NULL);
  70.   else
  71.     openurl_dialog (current_wdata);
  72. }
  73. static void
  74. do_openurl (gftp_window_data * wdata, gftp_dialog_data * ddata)
  75. {
  76.   const char *tempstr;
  77.   if (current_wdata->request->stopable)
  78.     {
  79.       ftp_log (gftp_logging_misc, NULL,
  80.                _("%s: Please hit the stop button first to do anything elsen"),
  81.                _("OpenURL"));
  82.       return;
  83.     }
  84.   tempstr = gtk_entry_get_text (GTK_ENTRY (ddata->edit));
  85.   if (*tempstr == '')
  86.     {
  87.       ftp_log (gftp_logging_misc, NULL,
  88.                _("OpenURL: Operation canceled...you must enter a stringn"));
  89.       return;
  90.     }
  91.   if (GFTP_IS_CONNECTED (wdata->request))
  92.     disconnect (wdata);
  93.   if (gftp_parse_url (wdata->request, tempstr) == 0)
  94.     {
  95.       gtk_widget_destroy (ddata->dialog);
  96.       ftp_connect (wdata, wdata->request, 1);
  97.     }
  98.   else
  99.     {
  100.       gtk_widget_destroy (ddata->dialog);
  101.       ftp_log (gftp_logging_misc, NULL, _("Could not parse URL %sn"), tempstr);    
  102.     }
  103.   ddata->dialog = NULL; 
  104. }
  105. void
  106. openurl_dialog (gpointer data)
  107. {
  108.   MakeEditDialog (_("Connect via URL"), _("Enter ftp url to connect to"),
  109.                   NULL, 1, NULL, gftp_dialog_button_connect, do_openurl, data,
  110.                   NULL, NULL);
  111. }
  112. void 
  113. disconnect (gpointer data)
  114. {
  115.   gftp_window_data * wdata;
  116.   wdata = data;
  117.   gftp_delete_cache_entry (wdata->request, 1);
  118.   gftp_disconnect (wdata->request);
  119.   remove_files_window (wdata);
  120.   update_window (wdata);
  121. }
  122. static void
  123. dochange_filespec (gftp_window_data * wdata, gftp_dialog_data * ddata)
  124. {
  125.   GList * templist, * filelist;
  126.   gftp_file * tempfle;
  127.   const char *edttext;
  128.   int num;
  129.   wdata->show_selected = 0;
  130.   edttext = gtk_entry_get_text (GTK_ENTRY (ddata->edit));
  131.   if (*edttext == '')
  132.     {
  133.       ftp_log (gftp_logging_misc, NULL,
  134.                _("Change Filespec: Operation canceled...you must enter a stringn"));
  135.       return;
  136.     }
  137.   if (wdata->filespec)
  138.     g_free (wdata->filespec);
  139.   wdata->filespec = g_malloc (strlen (edttext) + 1);
  140.   strcpy (wdata->filespec, edttext);
  141.   filelist = wdata->files;
  142.   templist = GTK_CLIST (wdata->listbox)->selection;
  143.   num = 0;
  144.   while (templist != NULL)
  145.     {
  146.       templist = get_next_selection (templist, &filelist, &num);
  147.       tempfle = filelist->data;
  148.       tempfle->was_sel = 1;
  149.     }
  150.   gtk_clist_freeze (GTK_CLIST (wdata->listbox));
  151.   gtk_clist_clear (GTK_CLIST (wdata->listbox));
  152.   templist = wdata->files;
  153.   while (templist != NULL)
  154.     {
  155.       tempfle = templist->data;
  156.       add_file_listbox (wdata, tempfle);
  157.       templist = templist->next;
  158.     }
  159.   gtk_clist_thaw (GTK_CLIST (wdata->listbox));
  160.   update_window (wdata);
  161. }
  162. void 
  163. change_filespec (gpointer data)
  164. {
  165.   gftp_window_data * wdata;
  166.   wdata = data;
  167.   if (!check_status (_("Change Filespec"), wdata, 0, 0, 0, 1))
  168.     return;
  169.   MakeEditDialog (_("Change Filespec"), _("Enter the new file specification"),
  170.                   wdata->filespec, 1, NULL, gftp_dialog_button_change, 
  171.                   dochange_filespec, wdata, NULL, NULL);
  172. }
  173. static void
  174. destroy_save_directory_listing (GtkWidget * widget, gftp_save_dir_struct * str)
  175. {
  176.   gtk_widget_destroy (str->filew);
  177.   g_free (str);
  178. }
  179. static void
  180. dosave_directory_listing (GtkWidget * widget, gftp_save_dir_struct * str)
  181. {
  182.   const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
  183.     "Aug", "Sep", "Oct", "Nov", "Dec" };
  184.   const char *filename;
  185.   struct tm *lt;
  186.   gftp_file * tempfle;
  187.   GList * templist;
  188.   FILE * fd;
  189.   time_t t;
  190.   filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (str->filew));
  191.   if ((fd = fopen (filename, "w")) == NULL)
  192.     {
  193.       ftp_log (gftp_logging_misc, NULL, 
  194.                _("Error: Cannot open %s for writing: %sn"), filename, 
  195.                g_strerror (errno));
  196.       return;
  197.     }
  198.   time (&t);
  199.   for (templist = str->wdata->files; 
  200.        templist->next != NULL;
  201.        templist = templist->next)
  202.     {
  203.       tempfle = templist->data;
  204.       fprintf (fd, "%10s %8s %8s ", tempfle->attribs, tempfle->user, 
  205.                tempfle->group);
  206.       if (tempfle->attribs && (*tempfle->attribs == 'b' || 
  207.                                *tempfle->attribs == 'c'))
  208.         fprintf (fd, "%5d, %4d", (((unsigned int) tempfle->size) >> 16) & 0xFF,
  209.                                  ((unsigned int) tempfle->size) & 0xFF);
  210.       else
  211.         {
  212. #if defined (_LARGEFILE_SOURCE)
  213.           fprintf (fd, "%11lld", tempfle->size);
  214. #else
  215.           fprintf (fd, "%11ld", tempfle->size);
  216. #endif
  217.         }
  218.       lt = localtime (&tempfle->datetime);
  219.       if (tempfle->datetime > t ||
  220.           t - 3600*24*90 > tempfle->datetime)
  221.         fprintf (fd, " %s %2d  %4d", months[lt->tm_mon], lt->tm_mday, 
  222.                  lt->tm_year + 1900);
  223.       else
  224.         fprintf (fd, " %s %2d %02d:%02d", months[lt->tm_mon], lt->tm_mday, 
  225.                  lt->tm_hour, lt->tm_min);
  226.       fprintf (fd, " %sn", tempfle->file);
  227.     }
  228.   fclose (fd);
  229. }
  230. void 
  231. save_directory_listing (gpointer data)
  232. {
  233.   gftp_save_dir_struct * str;
  234.   GtkWidget *filew;
  235.   filew = gtk_file_selection_new (_("Save Directory Listing"));
  236.   str = g_malloc (sizeof (*str));
  237.   str->filew = filew;
  238.   str->wdata = data;
  239.   gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filew)->ok_button),
  240.                       "clicked", GTK_SIGNAL_FUNC (dosave_directory_listing), 
  241.                       str);
  242.   gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filew)->ok_button),
  243.                       "clicked", 
  244.                       GTK_SIGNAL_FUNC (destroy_save_directory_listing), str);
  245.   gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filew)->cancel_button), 
  246.                       "clicked", 
  247.                       GTK_SIGNAL_FUNC (destroy_save_directory_listing), str);
  248.   gtk_window_set_wmclass (GTK_WINDOW(filew), "Save Directory Listing", "gFTP");
  249.   gtk_widget_show (filew);
  250. }
  251. void
  252. show_selected (gpointer data)
  253. {
  254.   GList * templist, * filelist;
  255.   gftp_window_data * wdata;
  256.   gftp_file * tempfle;
  257.   int num;
  258.   wdata = data;
  259.   wdata->show_selected = 1;
  260.   filelist = wdata->files;
  261.   templist = GTK_CLIST (wdata->listbox)->selection;
  262.   num = 0;
  263.   while (templist != NULL)
  264.     {
  265.       templist = get_next_selection (templist, &filelist, &num);
  266.       tempfle = filelist->data;
  267.       tempfle->was_sel = 1;
  268.     }
  269.   gtk_clist_freeze (GTK_CLIST (wdata->listbox));
  270.   gtk_clist_clear (GTK_CLIST (wdata->listbox));
  271.   templist = wdata->files;
  272.   while (templist != NULL)
  273.     {
  274.       tempfle = templist->data;
  275.       add_file_listbox (wdata, tempfle);
  276.       templist = templist->next;
  277.     }
  278.   gtk_clist_thaw (GTK_CLIST (wdata->listbox));
  279.   update_window (wdata);
  280. }
  281. void 
  282. selectall (gpointer data)
  283. {
  284.   gftp_window_data * wdata;
  285.   wdata = data;
  286.   wdata->show_selected = 0;
  287.   gtk_clist_select_all (GTK_CLIST (wdata->listbox));
  288. }
  289. void 
  290. selectallfiles (gpointer data)
  291. {
  292.   gftp_window_data * wdata;
  293.   gftp_file * tempfle;
  294.   GList *templist;
  295.   int i;
  296.   wdata = data;
  297.   wdata->show_selected = 0;
  298.   gtk_clist_freeze (GTK_CLIST (wdata->listbox));
  299.   i = 0;
  300.   templist = wdata->files;
  301.   while (templist != NULL)
  302.     {
  303.       tempfle = (gftp_file *) templist->data;
  304.       if (tempfle->shown)
  305. {
  306.   if (tempfle->isdir)
  307.     gtk_clist_unselect_row (GTK_CLIST (wdata->listbox), i, 0);
  308.   else
  309.     gtk_clist_select_row (GTK_CLIST (wdata->listbox), i, 0);
  310.           i++;
  311. }
  312.       templist = templist->next;
  313.     }
  314.   gtk_clist_thaw (GTK_CLIST (wdata->listbox));
  315. }
  316. void 
  317. deselectall (gpointer data)
  318. {
  319.   gftp_window_data * wdata;
  320.   wdata = data;
  321.   wdata->show_selected = 0;
  322.   gtk_clist_unselect_all (GTK_CLIST (wdata->listbox));
  323. }
  324. static void
  325. dosite (gftp_window_data * wdata, gftp_dialog_data * ddata)
  326. {
  327.   const char *edttext;
  328.   edttext = gtk_entry_get_text (GTK_ENTRY (ddata->edit));
  329.   if (*edttext == '')
  330.     {
  331.       ftp_log (gftp_logging_misc, NULL,
  332.                _("SITE: Operation canceled...you must enter a stringn"));
  333.       return;
  334.     }
  335.   if (check_reconnect (wdata) < 0)
  336.     return;
  337.   gftp_site_cmd (wdata->request, edttext);
  338.   if (!GFTP_IS_CONNECTED (wdata->request))
  339.     disconnect (wdata);
  340. }
  341. void
  342. site_dialog (gpointer data)
  343. {
  344.   gftp_window_data * wdata;
  345.   wdata = data;
  346.   if (!check_status (_("Site"), wdata, 0, 0, 0, wdata->request->site != NULL))
  347.     return;
  348.   MakeEditDialog (_("Site"), _("Enter site-specific command"), NULL, 1,
  349.                   NULL, gftp_dialog_button_ok, dosite, wdata, NULL, NULL);
  350. }
  351. static void *
  352. do_change_dir_thread (void * data)
  353. {
  354.   gftp_window_data * wdata;
  355.   int success, sj;
  356.   wdata = data;
  357.   if (wdata->request->use_threads)
  358.     {
  359.       sj = sigsetjmp (jmp_environment, 1);
  360.       use_jmp_environment = 1;
  361.     }
  362.   else
  363.     sj = 0;
  364.   success = 0;
  365.   if (sj == 0) 
  366.     {
  367.       if (wdata->request->network_timeout > 0)
  368.         alarm (wdata->request->network_timeout);
  369.       success = gftp_set_directory (wdata->request, wdata->request->directory);
  370.       alarm (0);
  371.     }
  372.   else
  373.     {
  374.       gftp_disconnect (wdata->request);
  375.       wdata->request->logging_function (gftp_logging_error,
  376.                                         wdata->request->user_data,
  377.                                         _("Operation canceledn"));
  378.     }
  379.   if (wdata->request->use_threads)
  380.     use_jmp_environment = 0;
  381.   wdata->request->stopable = 0;
  382.   return ((void *) success);
  383. }
  384. static int
  385. do_change_dir (gftp_window_data * wdata, char *directory)
  386. {
  387.   char *olddir;
  388.   int ret;
  389.   if (directory != wdata->request->directory)
  390.     {
  391.       olddir = wdata->request->directory;
  392.       wdata->request->directory = g_malloc (strlen (directory) + 1);
  393.       strcpy (wdata->request->directory, directory);
  394.     }
  395.   else
  396.     olddir = NULL;
  397.   ret = (int) generic_thread (do_change_dir_thread, wdata);
  398.   if (!GFTP_IS_CONNECTED (wdata->request))
  399.     {
  400.       disconnect (wdata);
  401.       if (olddir != NULL)
  402.         g_free (olddir);
  403.       return (-2);
  404.     }
  405.   if (ret != 0)
  406.     {
  407.       g_free (wdata->request->directory);
  408.       wdata->request->directory = olddir;
  409.     }
  410.   else
  411.     g_free (olddir);
  412.   return (ret);
  413. }
  414. int
  415. chdir_edit (GtkWidget * widget, gpointer data)
  416. {
  417.   gftp_window_data * wdata;
  418.   const char *edttxt; 
  419.   char *tempstr;
  420.   wdata = data;
  421.   edttxt = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (wdata->combo)->entry));
  422.   if (!GFTP_IS_CONNECTED (wdata->request) && *edttxt != '')
  423.     {
  424.       toolbar_hostedit (NULL, NULL);
  425.       return (0);
  426.     }
  427.   if (!check_status (_("Chdir"), wdata, wdata->request->use_threads, 0, 0, 
  428.                      wdata->request->chdir != NULL))
  429.     return (FALSE);
  430.   if ((tempstr = expand_path (edttxt)) == NULL)
  431.     return (FALSE);
  432.   if (check_reconnect (wdata) < 0)
  433.     return (FALSE);
  434.   if (do_change_dir (wdata, tempstr) == 0)
  435.     {
  436.       gtk_clist_freeze (GTK_CLIST (wdata->listbox));
  437.       remove_files_window (wdata);
  438.       ftp_list_files (wdata, 1);
  439.       gtk_clist_thaw (GTK_CLIST (wdata->listbox));
  440.       add_history (wdata->combo, wdata->history, wdata->histlen, tempstr);
  441.     }
  442.   g_free (tempstr);
  443.   return (FALSE);
  444. }
  445. int
  446. chdir_dialog (gpointer data)
  447. {
  448.   GList * templist, * filelist;
  449.   gftp_window_data * wdata;
  450.   char *newdir, *tempstr;
  451.   gftp_file *tempfle;
  452.   int num, ret;
  453.   wdata = data;
  454.   if (!check_status (_("Chdir"), wdata, wdata->request->use_threads, 1, 0, 
  455.                      wdata->request->chdir != NULL))
  456.     return (0);
  457.   filelist = wdata->files;
  458.   templist = GTK_CLIST (wdata->listbox)->selection;
  459.   num = 0;
  460.   templist = get_next_selection (templist, &filelist, &num);
  461.   tempfle = filelist->data;
  462.   newdir = g_strconcat (GFTP_GET_DIRECTORY (wdata->request), "/",
  463.         tempfle->file, NULL);
  464.   remove_double_slashes (newdir);
  465.   if ((tempstr = expand_path (newdir)) == NULL)
  466.     return (0);
  467.   g_free (newdir);
  468.   if (check_reconnect (wdata) < 0)
  469.     return (0);
  470.   ret = 0; 
  471.   if (do_change_dir (wdata, tempstr) == 0)
  472.     {
  473.       gtk_clist_freeze (GTK_CLIST (wdata->listbox));
  474.       remove_files_window (wdata);
  475.       ftp_list_files (wdata, 1);
  476.       gtk_clist_thaw (GTK_CLIST (wdata->listbox));
  477.       ret = 1;
  478.     }
  479.   g_free (tempstr);
  480.   return (ret);
  481. }
  482. void 
  483. clearlog (gpointer data)
  484. {
  485.   guint len;
  486. #if GTK_MAJOR_VERSION == 1
  487.   len = gtk_text_get_length (GTK_TEXT (logwdw));
  488.   gtk_text_set_point (GTK_TEXT (logwdw), len);
  489.   gtk_text_backward_delete (GTK_TEXT (logwdw), len);
  490. #else
  491.   GtkTextBuffer * textbuf;
  492.   GtkTextIter iter, iter2;
  493.   textbuf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logwdw));
  494.   len = gtk_text_buffer_get_char_count (textbuf);
  495.   gtk_text_buffer_get_iter_at_offset (textbuf, &iter, 0);
  496.   gtk_text_buffer_get_iter_at_offset (textbuf, &iter2, len - 1);
  497.   gtk_text_buffer_delete (textbuf, &iter, &iter2);
  498. #endif
  499. }
  500. void 
  501. viewlog (gpointer data)
  502. {
  503.   char *tempstr, *txt, *pos;
  504.   guint textlen;
  505.   ssize_t len;
  506.   int fd;
  507. #if GTK_MAJOR_VERSION > 1
  508.   GtkTextBuffer * textbuf;
  509.   GtkTextIter iter, iter2;
  510. #endif
  511.   tempstr = g_strconcat (g_get_tmp_dir (), "/gftp-view.XXXXXXXXXX", NULL);
  512.   if ((fd = mkstemp (tempstr)) < 0)
  513.     {
  514.       ftp_log (gftp_logging_misc, NULL, 
  515.                _("Error: Cannot open %s for writing: %sn"), tempstr, 
  516.                g_strerror (errno));
  517.       g_free (tempstr); 
  518.       return;
  519.     }
  520.   chmod (tempstr, S_IRUSR | S_IWUSR);
  521.   unlink (tempstr);
  522.   
  523. #if GTK_MAJOR_VERSION == 1
  524.   textlen = gtk_text_get_length (GTK_TEXT (logwdw));
  525.   txt = gtk_editable_get_chars (GTK_EDITABLE (logwdw), 0, -1);
  526. #else
  527.   textbuf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logwdw));
  528.   textlen = gtk_text_buffer_get_char_count (textbuf);
  529.   gtk_text_buffer_get_iter_at_offset (textbuf, &iter, 0);
  530.   gtk_text_buffer_get_iter_at_offset (textbuf, &iter2, textlen - 1);
  531.   txt = gtk_text_buffer_get_text (textbuf, &iter, &iter2, 0);
  532. #endif
  533.   pos = txt;
  534.   do 
  535.     {
  536.       if ((len = write (fd, pos, textlen)) == -1)
  537.         { 
  538.           ftp_log (gftp_logging_misc, NULL, _("Error: Error writing to %s: %sn"), tempstr, g_strerror (errno));
  539.           break;
  540.         }
  541.       textlen -= len;
  542.       pos += len;
  543.     } while (textlen > 0);
  544.   lseek (fd, 0, SEEK_SET);
  545.   view_file (tempstr, fd, 1, 0, 0, 1, NULL, NULL);
  546.   close (fd);
  547.   g_free (tempstr);
  548.   g_free (txt);
  549. }
  550. static void
  551. dosavelog (GtkWidget * widget, GtkFileSelection * fs)
  552. {
  553.   const char *filename;
  554.   char *txt, *pos;
  555.   guint textlen;
  556.   ssize_t len;
  557.   FILE *fd;
  558.   int ok;
  559. #if GTK_MAJOR_VERSION > 1
  560.   GtkTextBuffer * textbuf;
  561.   GtkTextIter iter, iter2;
  562. #endif
  563.   filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
  564.   if ((fd = fopen (filename, "w")) == NULL)
  565.     {
  566.       ftp_log (gftp_logging_misc, NULL, 
  567.                _("Error: Cannot open %s for writing: %sn"), filename, 
  568.                g_strerror (errno));
  569.       return;
  570.     }
  571. #if GTK_MAJOR_VERSION == 1
  572.   textlen = gtk_text_get_length (GTK_TEXT (logwdw));
  573.   txt = gtk_editable_get_chars (GTK_EDITABLE (logwdw), 0, -1);
  574. #else
  575.   textbuf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logwdw));
  576.   textlen = gtk_text_buffer_get_char_count (textbuf);
  577.   gtk_text_buffer_get_iter_at_offset (textbuf, &iter, 0);
  578.   gtk_text_buffer_get_iter_at_offset (textbuf, &iter2, textlen - 1);
  579.   txt = gtk_text_buffer_get_text (textbuf, &iter, &iter2, 0);
  580. #endif
  581.   ok = 1;
  582.   pos = txt;
  583.   do
  584.     {
  585.       if ((len = write (fileno (fd), pos, textlen)) == -1)
  586.         {
  587.           ok = 0;
  588.           ftp_log (gftp_logging_misc, NULL, _("Error: Error writing to %s: %sn"), filename, g_strerror (errno));
  589.           break;
  590.         }
  591.       textlen -= len;
  592.       pos += len;
  593.     } while (textlen > 0);
  594.   if (ok)
  595.     ftp_log (gftp_logging_misc, NULL,
  596.              _("Successfully wrote the log file to %sn"), filename);
  597.   fclose (fd);
  598.   g_free (txt);
  599. }
  600. void 
  601. savelog (gpointer data)
  602. {
  603.   GtkWidget *filew;
  604.   filew = gtk_file_selection_new (_("Save Log"));
  605.   gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filew)->ok_button),
  606.                       "clicked", GTK_SIGNAL_FUNC (dosavelog), filew);
  607.   gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (filew)->ok_button),
  608.                              "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy),
  609.                              GTK_OBJECT (filew));
  610.   gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (filew)->cancel_button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT (filew));
  611.   gtk_file_selection_set_filename (GTK_FILE_SELECTION (filew), "gftp.log");
  612.   gtk_window_set_wmclass (GTK_WINDOW(filew), "Save Log", "gFTP");
  613.   gtk_widget_show (filew);
  614. }
  615. void 
  616. clear_cache (gpointer data)
  617. {
  618.   gftp_clear_cache_files ();
  619. }
  620. void 
  621. about_dialog (gpointer data)
  622. {
  623.   GtkWidget * tempwid, * notebook, * box, * label, * view, * vscroll,
  624.             * dialog;
  625.   char *tempstr, *no_license_agreement, *str, buf[255];
  626.   size_t len;
  627.   FILE * fd;
  628. #if GTK_MAJOR_VERSION > 1
  629.   GtkTextBuffer * textbuf;
  630.   GtkTextIter iter;
  631.   guint textlen;
  632. #endif
  633.   no_license_agreement = g_strdup_printf (_("Cannot find the license agreement file COPYING. Please make sure it is in either %s or in %s"), BASE_CONF_DIR, SHARE_DIR);
  634. #if GTK_MAJOR_VERSION == 1
  635.   dialog = gtk_dialog_new ();
  636.   gtk_window_set_title (GTK_WINDOW (dialog), _("About gFTP"));
  637.   gtk_container_border_width (GTK_CONTAINER
  638.       (GTK_DIALOG (dialog)->action_area), 5);
  639.   gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE);
  640. #else
  641.   dialog = gtk_dialog_new_with_buttons (_("About gFTP"), NULL, 0,
  642.                                         GTK_STOCK_CLOSE,
  643.                                         GTK_RESPONSE_CLOSE,
  644.                                         NULL);
  645. #endif
  646.   gtk_window_set_wmclass (GTK_WINDOW(dialog), "about", "gFTP");
  647.   gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
  648.   gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10);
  649.   gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5);
  650.   gtk_widget_realize (dialog);
  651.   if (gftp_icon != NULL)
  652.     {
  653.       gdk_window_set_icon (dialog->window, NULL, gftp_icon->pixmap,
  654.                            gftp_icon->bitmap);
  655.       gdk_window_set_icon_name (dialog->window, _("gFTP Icon"));
  656.     }
  657.   notebook = gtk_notebook_new ();
  658.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), notebook, TRUE,
  659.       TRUE, 0);
  660.   gtk_widget_show (notebook);
  661.   box = gtk_vbox_new (TRUE, 5);
  662.   gtk_container_border_width (GTK_CONTAINER (box), 10);
  663.   gtk_widget_show (box);
  664.   tempwid = toolbar_pixmap (dialog, "gftp-logo.xpm");
  665.   gtk_box_pack_start (GTK_BOX (box), tempwid, FALSE, FALSE, 0);
  666.   gtk_widget_show (tempwid);
  667.   tempstr = g_strdup_printf (_("%snCopyright (C) 1998-2002 Brian Masney <masneyb@gftp.org>nOfficial Homepage: http://www.gftp.org/nLogo by: Aaron Worley <planet_hoth@yahoo.com>n"),
  668. version);
  669.   str = _("Translated by");
  670.   if (strcmp (str, "Translated by") != 0)
  671.     {
  672.       tempstr = g_realloc (tempstr, strlen (tempstr) + strlen (str) + 1);
  673.       strcat (tempstr, str);
  674.     }
  675.   tempwid = gtk_label_new (tempstr);
  676.   g_free (tempstr);
  677.   gtk_box_pack_start (GTK_BOX (box), tempwid, FALSE, FALSE, 0);
  678.   gtk_widget_show (tempwid);
  679.   label = gtk_label_new (_("About"));
  680.   gtk_widget_show (label);
  681.   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), box, label);
  682.   box = gtk_vbox_new (FALSE, 5);
  683.   gtk_container_border_width (GTK_CONTAINER (box), 10);
  684.   gtk_widget_show (box);
  685.   tempwid = gtk_table_new (1, 2, FALSE);
  686.   gtk_box_pack_start (GTK_BOX (box), tempwid, TRUE, TRUE, 0);
  687.   gtk_widget_show (tempwid);
  688. #if GTK_MAJOR_VERSION == 1
  689.   view = gtk_text_new (NULL, NULL);
  690.   gtk_text_set_editable (GTK_TEXT (view), FALSE);
  691.   gtk_text_set_word_wrap (GTK_TEXT (view), TRUE);
  692.   gtk_table_attach (GTK_TABLE (tempwid), view, 0, 1, 0, 1,
  693.                     GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
  694.                     0, 0);
  695.   gtk_widget_show (view);
  696.   vscroll = gtk_vscrollbar_new (GTK_TEXT (view)->vadj);
  697.   gtk_table_attach (GTK_TABLE (tempwid), vscroll, 1, 2, 0, 1,
  698.                     GTK_FILL, GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0);
  699.   gtk_widget_show (vscroll);
  700. #else
  701.   view = gtk_text_view_new ();
  702.   gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE);
  703.   gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE);
  704.   gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD);
  705.   vscroll = gtk_scrolled_window_new (NULL, NULL);
  706.   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (vscroll),
  707.                                  GTK_POLICY_AUTOMATIC,
  708.                                  GTK_POLICY_AUTOMATIC);
  709.   gtk_container_add (GTK_CONTAINER (vscroll), view);
  710.   gtk_widget_show (view);
  711.   gtk_table_attach (GTK_TABLE (tempwid), vscroll, 0, 1, 0, 1,
  712.                     GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND | GTK_SHRINK,
  713.                     0, 0);
  714.   gtk_widget_show (vscroll);
  715.   textbuf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
  716. #endif
  717.   label = gtk_label_new (_("License Agreement"));
  718.   gtk_widget_show (label);
  719.   gtk_notebook_append_page (GTK_NOTEBOOK (notebook), box, label);
  720. #if GTK_MAJOR_VERSION == 1
  721.   tempwid = gtk_button_new_with_label (_("  Close  "));
  722.   GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
  723.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
  724.       FALSE, FALSE, 0);
  725.   gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked",
  726.      GTK_SIGNAL_FUNC (gtk_widget_destroy),
  727.      GTK_OBJECT (dialog));
  728.   gtk_widget_grab_default (tempwid);
  729.   gtk_widget_show (tempwid);
  730. #else
  731.   g_signal_connect_swapped (GTK_OBJECT (dialog), "response",
  732.                             G_CALLBACK (gtk_widget_destroy),
  733.                             GTK_OBJECT (dialog));
  734. #endif
  735.   tempstr = g_strconcat ("/usr/share/common-licenses/GPL", NULL);
  736.   if (access (tempstr, F_OK) != 0)
  737.     {
  738.       g_free (tempstr);
  739.       tempstr = expand_path (SHARE_DIR "/COPYING");
  740.       if (access (tempstr, F_OK) != 0)
  741. {
  742.   g_free (tempstr);
  743.           tempstr = expand_path (BASE_CONF_DIR "/COPYING");
  744.   if (access (tempstr, F_OK) != 0)
  745.     {
  746. #if GTK_MAJOR_VERSION == 1
  747.       gtk_text_insert (GTK_TEXT (view), NULL, NULL, NULL,
  748.        no_license_agreement, -1);
  749. #else
  750.               textlen = gtk_text_buffer_get_char_count (textbuf);
  751.               gtk_text_buffer_get_iter_at_offset (textbuf, &iter, textlen - 1);
  752.               gtk_text_buffer_insert (textbuf, &iter, no_license_agreement, -1);
  753. #endif
  754.       gtk_widget_show (dialog);
  755.       return;
  756.     }
  757. }
  758.     }
  759.   if ((fd = fopen (tempstr, "r")) == NULL)
  760.     {
  761. #if GTK_MAJOR_VERSION == 1
  762.       gtk_text_insert (GTK_TEXT (view), NULL, NULL, NULL,
  763.        no_license_agreement, -1);
  764. #else
  765.       textlen = gtk_text_buffer_get_char_count (textbuf);
  766.       gtk_text_buffer_get_iter_at_offset (textbuf, &iter, textlen - 1);
  767.       gtk_text_buffer_insert (textbuf, &iter, no_license_agreement, -1);
  768. #endif
  769.       gtk_widget_show (dialog);
  770.       g_free (tempstr);
  771.       return;
  772.     }
  773.   g_free (tempstr);
  774.   memset (buf, 0, sizeof (buf));
  775.   while ((len = fread (buf, 1, sizeof (buf) - 1, fd)))
  776.     {
  777.       buf[len] = '';
  778. #if GTK_MAJOR_VERSION == 1
  779.       gtk_text_insert (GTK_TEXT (view), NULL, NULL, NULL, buf, -1);
  780. #else
  781.       textlen = gtk_text_buffer_get_char_count (textbuf);
  782.       gtk_text_buffer_get_iter_at_offset (textbuf, &iter, textlen - 1);
  783.       gtk_text_buffer_insert (textbuf, &iter, buf, -1);
  784. #endif
  785.     }
  786.   fclose (fd);
  787.   gtk_widget_show (dialog);
  788.   g_free (no_license_agreement);
  789.   gftp_free_pixmap ("gftp-logo.xpm");
  790. }
  791. void 
  792. compare_windows (gpointer data)
  793. {
  794.   gftp_file * curfle, * otherfle;
  795.   GList * curlist, * otherlist;
  796.   int row;
  797.   if (!check_status (_("Compare Windows"), &window2, 1, 0, 0, 1))
  798.     return;
  799.   deselectall (&window1);
  800.   deselectall (&window2);
  801.   row = 0;
  802.   curlist = window1.files;
  803.   while (curlist != NULL)
  804.     {
  805.       curfle = curlist->data;
  806.       if (!curfle->shown)
  807.         {
  808.           curlist = curlist->next;
  809.           continue;
  810.         }
  811.       otherlist = window2.files;
  812.       while (otherlist != NULL)
  813. {
  814.           otherfle = otherlist->data;
  815.           if (!otherfle->shown)
  816.             {
  817.               otherlist = otherlist->next;
  818.               continue;
  819.             }
  820.           if (strcmp (otherfle->file, curfle->file) == 0 &&
  821.               otherfle->isdir == curfle->isdir &&
  822.               (curfle->isdir || otherfle->size == curfle->size))
  823.     break;
  824.           otherlist = otherlist->next;
  825. }
  826.       if (otherlist == NULL)
  827. gtk_clist_select_row (GTK_CLIST (window1.listbox), row, 0);
  828.       row++;
  829.       curlist = curlist->next;
  830.     }
  831.   row = 0;
  832.   curlist = window2.files;
  833.   while (curlist != NULL)
  834.     {
  835.       curfle = curlist->data;
  836.       if (!curfle->shown)
  837.         {
  838.           curlist = curlist->next;
  839.           continue;
  840.         }
  841.       otherlist = window1.files;
  842.       while (otherlist != NULL)
  843. {
  844.           otherfle = otherlist->data;
  845.           if (!otherfle->shown)
  846.             {
  847.               otherlist = otherlist->next;
  848.               continue;
  849.             }
  850.           if (strcmp (otherfle->file, curfle->file) == 0 &&
  851.               otherfle->isdir == curfle->isdir &&
  852.               (curfle->isdir || otherfle->size == curfle->size))
  853.     break;
  854.           otherlist = otherlist->next;
  855. }
  856.       if (otherlist == NULL)
  857. gtk_clist_select_row (GTK_CLIST (window2.listbox), row, 0);
  858.       row++;
  859.       curlist = curlist->next;
  860.     }
  861. }