1
|
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
|
|
20 #include "gftp-gtk.h"
|
|
21
|
|
22 static void askdel ( gftp_transfer * transfer );
|
|
23 static void yes_dialog_cb ( GtkWidget * widget,
|
|
24 gpointer data );
|
|
25 static void yesCB ( gftp_transfer * transfer );
|
|
26 static void * do_delete_thread ( void *data );
|
|
27 static void delete_purge_cache ( gpointer key,
|
|
28 gpointer value,
|
|
29 gpointer user_data );
|
|
30 static RETSIGTYPE sig_delquit ( int signo );
|
|
31
|
|
32 static sigjmp_buf delenvir;
|
|
33
|
|
34 void
|
|
35 delete_dialog (gpointer data)
|
|
36 {
|
|
37 gftp_file * tempfle, * newfle;
|
|
38 GList * templist, * filelist;
|
|
39 gftp_transfer * transfer;
|
|
40 gftp_window_data * wdata;
|
|
41 long numfiles, numdirs;
|
|
42 int num, timeout_num;
|
|
43 void *ret;
|
|
44
|
|
45 wdata = data;
|
|
46 if (!check_status (_("Delete"), wdata, wdata->request->use_threads, 0, 1, 1))
|
|
47 return;
|
|
48
|
|
49 transfer = g_malloc0 (sizeof (*transfer));
|
|
50 transfer->fromreq = copy_request (wdata->request);
|
|
51 transfer->fromwdata = wdata;
|
|
52 transfer->transfer_direction = GFTP_DIRECTION_DOWNLOAD;
|
|
53
|
|
54 num = 0;
|
|
55 templist = GTK_CLIST (wdata->listbox)->selection;
|
|
56 filelist = wdata->files;
|
|
57 while (templist != NULL)
|
|
58 {
|
|
59 templist = get_next_selection (templist, &filelist, &num);
|
|
60 tempfle = filelist->data;
|
|
61 if (strcmp (tempfle->file, "..") == 0 ||
|
|
62 strcmp (tempfle->file, ".") == 0)
|
|
63 continue;
|
|
64 newfle = copy_fdata (tempfle);
|
|
65 transfer->files = g_list_append (transfer->files, newfle);
|
|
66 }
|
|
67
|
|
68 if (transfer->files == NULL)
|
|
69 {
|
|
70 free_tdata (transfer);
|
|
71 return;
|
|
72 }
|
|
73
|
|
74 swap_socks (transfer->fromreq, wdata->request);
|
|
75
|
|
76 if (transfer->fromreq->use_threads)
|
|
77 {
|
|
78 wdata->request->stopable = 1;
|
|
79 transfer->fromreq->stopable = 1;
|
|
80 gtk_widget_set_sensitive (stop_btn, 1);
|
|
81 pthread_create (&wdata->tid, NULL, do_getdir_thread, transfer);
|
|
82
|
|
83 timeout_num = gtk_timeout_add (100, progress_timeout, transfer);
|
|
84 while (transfer->fromreq->stopable)
|
|
85 g_main_iteration (TRUE);
|
|
86
|
|
87 gtk_widget_set_sensitive (stop_btn, 0);
|
|
88 gtk_timeout_remove (timeout_num);
|
|
89 numfiles = transfer->numfiles;
|
|
90 numdirs = transfer->numdirs;
|
|
91 transfer->numfiles = transfer->numdirs = -1;
|
|
92 update_directory_download_progress (transfer);
|
|
93 transfer->numfiles = numfiles;
|
|
94 transfer->numdirs = numdirs;
|
|
95
|
|
96 pthread_join (wdata->tid, &ret);
|
|
97 wdata->request->stopable = 0;
|
|
98 }
|
|
99 else
|
|
100 ret = do_getdir_thread (transfer);
|
|
101
|
|
102 if (!GFTP_IS_CONNECTED (transfer->fromreq))
|
|
103 {
|
|
104 disconnect (wdata);
|
|
105 return;
|
|
106 }
|
|
107
|
|
108 swap_socks (wdata->request, transfer->fromreq);
|
|
109
|
|
110 askdel (transfer);
|
|
111 }
|
|
112
|
|
113
|
|
114 static void
|
|
115 askdel (gftp_transfer * transfer)
|
|
116 {
|
|
117 char *tempstr;
|
|
118
|
|
119 tempstr = g_strdup_printf (_("Are you sure you want to delete these %ld files and %ld directories"), transfer->numfiles, transfer->numdirs);
|
|
120
|
|
121 MakeYesNoDialog (_("Delete Files/Directories"), tempstr, 0, 2, _("Yes"),
|
|
122 yes_dialog_cb, transfer, _("No"), NULL, NULL);
|
|
123 g_free (tempstr);
|
|
124 }
|
|
125
|
|
126
|
|
127 static void
|
|
128 yes_dialog_cb (GtkWidget * widget, gpointer data)
|
|
129 {
|
|
130 gftp_dialog_data * dialog;
|
|
131
|
|
132 dialog = data;
|
|
133 gtk_widget_destroy (dialog->dialog);
|
|
134 yesCB (dialog->data);
|
|
135 }
|
|
136
|
|
137
|
|
138 static void
|
|
139 yesCB (gftp_transfer * transfer)
|
|
140 {
|
|
141 gftp_window_data * wdata;
|
|
142 void * ret;
|
|
143
|
|
144 g_return_if_fail (transfer != NULL);
|
|
145 g_return_if_fail (transfer->files != NULL);
|
|
146
|
|
147 wdata = transfer->fromwdata;
|
|
148 if (check_reconnect (wdata) < 0)
|
|
149 return;
|
|
150
|
|
151 gtk_clist_freeze (GTK_CLIST (wdata->listbox));
|
|
152 swap_socks (transfer->fromreq, wdata->request);
|
|
153 if (wdata->request->use_threads)
|
|
154 {
|
|
155 wdata->request->stopable = 1;
|
|
156 transfer->fromreq->stopable = 1;
|
|
157 gtk_widget_set_sensitive (stop_btn, 1);
|
|
158 pthread_create (&wdata->tid, NULL, do_delete_thread, transfer);
|
|
159
|
|
160 while (transfer->fromreq->stopable)
|
|
161 g_main_iteration (TRUE);
|
|
162
|
|
163 gtk_widget_set_sensitive (stop_btn, 0);
|
|
164 pthread_join (wdata->tid, &ret);
|
|
165 wdata->request->stopable = 0;
|
|
166 }
|
|
167 else
|
|
168 ret = do_delete_thread (transfer);
|
|
169 swap_socks (wdata->request, transfer->fromreq);
|
|
170 free_tdata (transfer);
|
|
171
|
|
172 if (!GFTP_IS_CONNECTED (wdata->request))
|
|
173 disconnect (wdata);
|
|
174 else
|
|
175 refresh (wdata);
|
|
176
|
|
177 gtk_clist_thaw (GTK_CLIST (wdata->listbox));
|
|
178 }
|
|
179
|
|
180
|
|
181 static void *
|
|
182 do_delete_thread (void *data)
|
|
183 {
|
|
184 gftp_transfer * transfer;
|
|
185 char *pos, *tempstr;
|
|
186 gftp_file * tempfle;
|
|
187 GHashTable * rmhash;
|
|
188 GList * templist;
|
|
189 int success, sj;
|
|
190
|
|
191 transfer = data;
|
|
192 transfer->fromreq->user_data = (void *) 0x01;
|
|
193
|
|
194 if (transfer->fromreq->use_threads)
|
|
195 {
|
|
196 sj = sigsetjmp (delenvir, 1);
|
|
197 signal (SIGINT, sig_delquit);
|
|
198 signal (SIGALRM, sig_delquit);
|
|
199 }
|
|
200 else
|
|
201 sj = 0;
|
|
202
|
|
203 if (sj == 0)
|
|
204 {
|
|
205 for (templist = transfer->files; templist->next != NULL;
|
|
206 templist = templist->next);
|
|
207
|
|
208 rmhash = g_hash_table_new (string_hash_function, string_hash_compare);
|
|
209 while (1)
|
|
210 {
|
|
211 tempfle = templist->data;
|
|
212 if (tempfle->isdir)
|
|
213 success = gftp_remove_directory (transfer->fromreq, tempfle->file);
|
|
214 else
|
|
215 success = gftp_remove_file (transfer->fromreq, tempfle->file);
|
|
216
|
|
217 if (success == 0 && (pos = strrchr (tempfle->file, '/')))
|
|
218 {
|
|
219 *pos = '\0';
|
|
220 if (g_hash_table_lookup (rmhash, tempfle->file) == NULL)
|
|
221 {
|
|
222 tempstr = g_strconcat (tempfle->file, NULL);
|
|
223 g_hash_table_insert (rmhash, tempstr, NULL);
|
|
224 }
|
|
225 *pos = '/';
|
|
226 }
|
|
227
|
|
228 if (templist == transfer->files ||
|
|
229 !GFTP_IS_CONNECTED (transfer->fromreq))
|
|
230 break;
|
|
231 templist = templist->prev;
|
|
232 }
|
|
233
|
|
234 g_hash_table_foreach (rmhash, delete_purge_cache, transfer->fromreq);
|
|
235 g_hash_table_destroy (rmhash);
|
|
236 }
|
|
237 else
|
|
238 {
|
|
239 gftp_disconnect (transfer->fromreq);
|
|
240 transfer->fromreq->logging_function (gftp_logging_error,
|
|
241 transfer->fromreq->user_data,
|
|
242 _("Operation canceled\n"));
|
|
243 }
|
|
244
|
|
245 transfer->fromreq->user_data = NULL;
|
|
246 transfer->fromreq->stopable = 0;
|
|
247
|
|
248 if (transfer->fromreq->use_threads)
|
|
249 {
|
|
250 signal (SIGINT, SIG_DFL);
|
|
251 signal (SIGALRM, SIG_IGN);
|
|
252 }
|
|
253
|
|
254 return (NULL);
|
|
255 }
|
|
256
|
|
257
|
|
258 static void
|
|
259 delete_purge_cache (gpointer key, gpointer value, gpointer user_data)
|
|
260 {
|
|
261 gftp_request * request;
|
|
262 char *olddir;
|
|
263
|
|
264 request = user_data;
|
|
265 olddir = request->directory;
|
|
266 request->directory = key;
|
|
267 gftp_delete_cache_entry (request);
|
|
268 request->directory = olddir;
|
|
269 g_free (key);
|
|
270 }
|
|
271
|
|
272
|
|
273 static RETSIGTYPE
|
|
274 sig_delquit (int signo)
|
|
275 {
|
|
276 signal (signo, sig_delquit);
|
|
277 siglongjmp (delenvir, signo == SIGINT ? 1 : 2);
|
|
278 }
|
|
279
|