Mercurial > gftp.yaz
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 |