comparison src/gtk/delete_dialog.c @ 1:8b1883341c6f

Initial revision
author masneyb
date Mon, 05 Aug 2002 19:46:57 +0000
parents
children 3b2dcdefc7e9
comparison
equal deleted inserted replaced
0:674ed97069fd 1:8b1883341c6f
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