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

Ftp客户端

开发平台:

Visual C++

  1. /*****************************************************************************/
  2. /*  delete_dialog.c - the delete dialog                                      */
  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., 59 Temple Place - Suite 330, Boston, MA 02111 USA      */
  18. /*****************************************************************************/
  19. #include "gftp-gtk.h"
  20. static const char cvsid[] = "$Id: delete_dialog.c,v 1.11 2002/11/23 13:45:05 masneyb Exp $";
  21. static void
  22. delete_purge_cache (gpointer key, gpointer value, gpointer user_data)
  23. {
  24.   gftp_request * request;
  25.   char *olddir;
  26.   request = user_data;
  27.   olddir = request->directory;
  28.   request->directory = key;
  29.   gftp_delete_cache_entry (request, 0);
  30.   request->directory = olddir;
  31.   g_free (key);
  32. }
  33. static void *
  34. do_delete_thread (void *data)
  35. {
  36.   gftp_transfer * transfer;
  37.   char *pos, *tempstr;
  38.   gftp_file * tempfle;
  39.   GHashTable * rmhash;
  40.   GList * templist;
  41.   int success, sj;
  42.   transfer = data;
  43.   if (transfer->fromreq->use_threads)
  44.     {
  45.       sj = sigsetjmp (jmp_environment, 1);
  46.       use_jmp_environment = 1;
  47.     }
  48.   else
  49.     sj = 0;
  50.   if (sj == 0)
  51.     {
  52.       for (templist = transfer->files; templist->next != NULL; 
  53.            templist = templist->next);
  54.       rmhash = g_hash_table_new (string_hash_function, string_hash_compare);
  55.       while (1)
  56.         {
  57.           tempfle = templist->data;
  58.           if (tempfle->isdir)
  59.             success = gftp_remove_directory (transfer->fromreq, tempfle->file);
  60.           else
  61.             success = gftp_remove_file (transfer->fromreq, tempfle->file);
  62.           if (success == 0 && (pos = strrchr (tempfle->file, '/')))
  63.             {
  64.               *pos = '';
  65.               if (g_hash_table_lookup (rmhash, tempfle->file) == NULL)
  66.                 {
  67.                   tempstr = g_strconcat (tempfle->file, NULL);
  68.                   g_hash_table_insert (rmhash, tempstr, NULL);
  69.                 }
  70.               *pos = '/';
  71.             }
  72.           if (templist == transfer->files || 
  73.               !GFTP_IS_CONNECTED (transfer->fromreq))
  74.             break;
  75.           templist = templist->prev;
  76.         }
  77.       g_hash_table_foreach (rmhash, delete_purge_cache, transfer->fromreq);
  78.       g_hash_table_destroy (rmhash);
  79.     }
  80.   else
  81.     {
  82.       gftp_disconnect (transfer->fromreq);
  83.       transfer->fromreq->logging_function (gftp_logging_error,
  84.                                         transfer->fromreq->user_data,
  85.                                         _("Operation canceledn"));
  86.     }
  87.   transfer->fromreq->stopable = 0;
  88.   if (transfer->fromreq->use_threads)
  89.     use_jmp_environment = 0;
  90.   return (NULL);
  91. }
  92. static void
  93. yesCB (gftp_transfer * transfer, gftp_dialog_data * ddata)
  94. {
  95.   gftp_window_data * wdata;
  96.   void * ret;
  97.   g_return_if_fail (transfer != NULL);
  98.   g_return_if_fail (transfer->files != NULL);
  99.   wdata = transfer->fromwdata;
  100.   if (check_reconnect (wdata) < 0)
  101.     return;
  102.   gtk_clist_freeze (GTK_CLIST (wdata->listbox));
  103.   gftp_swap_socks (transfer->fromreq, wdata->request);
  104.   if (wdata->request->use_threads)
  105.     {
  106.       wdata->request->stopable = 1;
  107.       transfer->fromreq->stopable = 1;
  108.       gtk_widget_set_sensitive (stop_btn, 1);
  109.       pthread_create (&wdata->tid, NULL, do_delete_thread, transfer);
  110.       while (transfer->fromreq->stopable)
  111.         {
  112.           GDK_THREADS_LEAVE ();
  113. #if GTK_MAJOR_VERSION == 1
  114.           g_main_iteration (TRUE);
  115. #else
  116.           g_main_context_iteration (NULL, TRUE);
  117. #endif
  118.         }
  119.       gtk_widget_set_sensitive (stop_btn, 0);
  120.       pthread_join (wdata->tid, &ret);
  121.       wdata->request->stopable = 0;
  122.     }
  123.   else
  124.     ret = do_delete_thread (transfer);
  125.   gftp_swap_socks (wdata->request, transfer->fromreq);
  126.   free_tdata (transfer);
  127.   if (!GFTP_IS_CONNECTED (wdata->request))
  128.     disconnect (wdata);
  129.   else
  130.     refresh (wdata);
  131.   gtk_clist_thaw (GTK_CLIST (wdata->listbox));
  132. }
  133. static void
  134. askdel (gftp_transfer * transfer)
  135. {
  136.   char *tempstr;
  137.   tempstr = g_strdup_printf (_("Are you sure you want to delete these %ld files and %ld directories"), transfer->numfiles, transfer->numdirs);
  138.   MakeYesNoDialog (_("Delete Files/Directories"), tempstr, 
  139.                    yesCB, transfer, NULL, NULL);
  140.   g_free (tempstr);
  141. }
  142. void
  143. delete_dialog (gpointer data)
  144. {
  145.   gftp_file * tempfle, * newfle;
  146.   GList * templist, * filelist;
  147.   gftp_transfer * transfer;
  148.   gftp_window_data * wdata;
  149.   long numfiles, numdirs;
  150.   int num, timeout_num;
  151.   void *ret;
  152.   wdata = data;
  153.   if (!check_status (_("Delete"), wdata, wdata->request->use_threads, 0, 1, 1))
  154.     return;
  155.   transfer = g_malloc0 (sizeof (*transfer));
  156.   transfer->fromreq = copy_request (wdata->request);
  157.   transfer->fromwdata = wdata;
  158.   transfer->transfer_direction = GFTP_DIRECTION_DOWNLOAD;
  159.   num = 0;
  160.   templist = GTK_CLIST (wdata->listbox)->selection;
  161.   filelist = wdata->files;
  162.   while (templist != NULL)
  163.     {
  164.       templist = get_next_selection (templist, &filelist, &num);
  165.       tempfle = filelist->data;
  166.       if (strcmp (tempfle->file, "..") == 0 ||
  167.           strcmp (tempfle->file, ".") == 0)
  168.         continue;
  169.       newfle = copy_fdata (tempfle);
  170.       transfer->files = g_list_append (transfer->files, newfle);
  171.     }
  172.   if (transfer->files == NULL)
  173.     {
  174.       free_tdata (transfer);
  175.       return;
  176.     }
  177.   gftp_swap_socks (transfer->fromreq, wdata->request);
  178.   if (transfer->fromreq->use_threads)
  179.     {
  180.       wdata->request->stopable = 1;
  181.       transfer->fromreq->stopable = 1;
  182.       gtk_widget_set_sensitive (stop_btn, 1);
  183.       pthread_create (&wdata->tid, NULL, do_getdir_thread, transfer);
  184.       timeout_num = gtk_timeout_add (100, progress_timeout, transfer);
  185.       while (transfer->fromreq->stopable)
  186.         {
  187.           GDK_THREADS_LEAVE ();
  188. #if GTK_MAJOR_VERSION == 1
  189.           g_main_iteration (TRUE);
  190. #else
  191.           g_main_context_iteration (NULL, TRUE);
  192. #endif
  193.         }
  194.       gtk_widget_set_sensitive (stop_btn, 0);
  195.       gtk_timeout_remove (timeout_num);
  196.       numfiles = transfer->numfiles;
  197.       numdirs = transfer->numdirs;
  198.       transfer->numfiles = transfer->numdirs = -1;
  199.       update_directory_download_progress (transfer);
  200.       transfer->numfiles = numfiles;
  201.       transfer->numdirs = numdirs;
  202.       pthread_join (wdata->tid, &ret);
  203.       wdata->request->stopable = 0;
  204.     }
  205.   else
  206.     ret = do_getdir_thread (transfer);
  207.   if (!GFTP_IS_CONNECTED (transfer->fromreq))
  208.     {
  209.       disconnect (wdata);
  210.       return;
  211.     }
  212.   gftp_swap_socks (wdata->request, transfer->fromreq);
  213.   askdel (transfer);
  214. }