Mercurial > gftp.yaz
comparison src/gtk/chmod_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 /* chmod_dialog.c - the chmod dialog box */ | |
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 dochmod ( GtkWidget * widget, | |
23 gftp_window_data * wdata ); | |
24 static void *do_chmod_thread ( void * data ); | |
25 static RETSIGTYPE sig_chmodquit ( int signo ); | |
26 | |
27 | |
28 static GtkWidget *suid, *sgid, *sticky, *ur, *uw, *ux, *gr, *gw, *gx, *or, *ow, | |
29 *ox; | |
30 static sigjmp_buf chmodenvir; | |
31 static int mode; | |
32 | |
33 void | |
34 chmod_dialog (gpointer data) | |
35 { | |
36 GtkWidget *tempwid, *dialog, *hbox, *vbox; | |
37 GList * templist, * filelist; | |
38 gftp_window_data * wdata; | |
39 gftp_file * tempfle; | |
40 int num; | |
41 | |
42 wdata = data; | |
43 if (!check_status (_("Chmod"), wdata, wdata->request->use_threads, 1, 1, | |
44 wdata->request->chmod != NULL)) | |
45 return; | |
46 | |
47 dialog = gtk_dialog_new (); | |
48 gtk_window_set_title (GTK_WINDOW (dialog), _("Chmod")); | |
49 gtk_window_set_wmclass (GTK_WINDOW(dialog), "Chmod", "gFTP"); | |
50 gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10); | |
51 gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), | |
52 5); | |
53 gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5); | |
54 gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE); | |
55 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); | |
56 gtk_signal_connect_object (GTK_OBJECT (dialog), "delete_event", | |
57 GTK_SIGNAL_FUNC (gtk_widget_destroy), | |
58 GTK_OBJECT (dialog)); | |
59 | |
60 tempwid = gtk_label_new (_("You can now adjust the attributes of your file(s)\nNote: Not all ftp servers support the chmod feature")); | |
61 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), tempwid, FALSE, | |
62 FALSE, 0); | |
63 gtk_widget_show (tempwid); | |
64 | |
65 hbox = gtk_hbox_new (TRUE, 5); | |
66 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, | |
67 0); | |
68 gtk_widget_show (hbox); | |
69 | |
70 tempwid = gtk_frame_new (_("Special")); | |
71 gtk_box_pack_start (GTK_BOX (hbox), tempwid, FALSE, FALSE, 0); | |
72 gtk_widget_show (tempwid); | |
73 | |
74 vbox = gtk_vbox_new (TRUE, 5); | |
75 gtk_container_add (GTK_CONTAINER (tempwid), vbox); | |
76 gtk_widget_show (vbox); | |
77 | |
78 suid = gtk_check_button_new_with_label (_("SUID")); | |
79 gtk_box_pack_start (GTK_BOX (vbox), suid, FALSE, FALSE, 0); | |
80 gtk_widget_show (suid); | |
81 | |
82 sgid = gtk_check_button_new_with_label (_("SGID")); | |
83 gtk_box_pack_start (GTK_BOX (vbox), sgid, FALSE, FALSE, 0); | |
84 gtk_widget_show (sgid); | |
85 | |
86 sticky = gtk_check_button_new_with_label (_("Sticky")); | |
87 gtk_box_pack_start (GTK_BOX (vbox), sticky, FALSE, FALSE, 0); | |
88 gtk_widget_show (sticky); | |
89 | |
90 tempwid = gtk_frame_new (_("User")); | |
91 gtk_box_pack_start (GTK_BOX (hbox), tempwid, FALSE, FALSE, 0); | |
92 gtk_widget_show (tempwid); | |
93 | |
94 vbox = gtk_vbox_new (TRUE, 5); | |
95 gtk_container_add (GTK_CONTAINER (tempwid), vbox); | |
96 gtk_widget_show (vbox); | |
97 | |
98 ur = gtk_check_button_new_with_label (_("Read")); | |
99 gtk_box_pack_start (GTK_BOX (vbox), ur, FALSE, FALSE, 0); | |
100 gtk_widget_show (ur); | |
101 | |
102 uw = gtk_check_button_new_with_label (_("Write")); | |
103 gtk_box_pack_start (GTK_BOX (vbox), uw, FALSE, FALSE, 0); | |
104 gtk_widget_show (uw); | |
105 | |
106 ux = gtk_check_button_new_with_label (_("Execute")); | |
107 gtk_box_pack_start (GTK_BOX (vbox), ux, FALSE, FALSE, 0); | |
108 gtk_widget_show (ux); | |
109 | |
110 tempwid = gtk_frame_new (_("Group")); | |
111 gtk_box_pack_start (GTK_BOX (hbox), tempwid, FALSE, FALSE, 0); | |
112 gtk_widget_show (tempwid); | |
113 | |
114 vbox = gtk_vbox_new (TRUE, 5); | |
115 gtk_container_add (GTK_CONTAINER (tempwid), vbox); | |
116 gtk_widget_show (vbox); | |
117 | |
118 gr = gtk_check_button_new_with_label (_("Read")); | |
119 gtk_box_pack_start (GTK_BOX (vbox), gr, FALSE, FALSE, 0); | |
120 gtk_widget_show (gr); | |
121 | |
122 gw = gtk_check_button_new_with_label (_("Write")); | |
123 gtk_box_pack_start (GTK_BOX (vbox), gw, FALSE, FALSE, 0); | |
124 gtk_widget_show (gw); | |
125 | |
126 gx = gtk_check_button_new_with_label (_("Execute")); | |
127 gtk_box_pack_start (GTK_BOX (vbox), gx, FALSE, FALSE, 0); | |
128 gtk_widget_show (gx); | |
129 | |
130 tempwid = gtk_frame_new (_("Other")); | |
131 gtk_box_pack_start (GTK_BOX (hbox), tempwid, FALSE, FALSE, 0); | |
132 gtk_widget_show (tempwid); | |
133 | |
134 vbox = gtk_vbox_new (TRUE, 5); | |
135 gtk_container_add (GTK_CONTAINER (tempwid), vbox); | |
136 gtk_widget_show (vbox); | |
137 | |
138 or = gtk_check_button_new_with_label (_("Read")); | |
139 gtk_box_pack_start (GTK_BOX (vbox), or, FALSE, FALSE, 0); | |
140 gtk_widget_show (or); | |
141 | |
142 ow = gtk_check_button_new_with_label (_("Write")); | |
143 gtk_box_pack_start (GTK_BOX (vbox), ow, FALSE, FALSE, 0); | |
144 gtk_widget_show (ow); | |
145 | |
146 ox = gtk_check_button_new_with_label (_("Execute")); | |
147 gtk_box_pack_start (GTK_BOX (vbox), ox, FALSE, FALSE, 0); | |
148 gtk_widget_show (ox); | |
149 | |
150 tempwid = gtk_button_new_with_label (_("Change")); | |
151 GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT); | |
152 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid, | |
153 TRUE, TRUE, 0); | |
154 gtk_signal_connect (GTK_OBJECT (tempwid), "clicked", | |
155 GTK_SIGNAL_FUNC (dochmod), (gpointer) wdata); | |
156 gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked", | |
157 GTK_SIGNAL_FUNC (gtk_widget_destroy), | |
158 GTK_OBJECT (dialog)); | |
159 gtk_widget_grab_default (tempwid); | |
160 gtk_widget_show (tempwid); | |
161 | |
162 tempwid = gtk_button_new_with_label (_(" Cancel ")); | |
163 GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT); | |
164 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid, | |
165 TRUE, TRUE, 0); | |
166 gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked", | |
167 GTK_SIGNAL_FUNC (gtk_widget_destroy), | |
168 GTK_OBJECT (dialog)); | |
169 gtk_widget_show (tempwid); | |
170 | |
171 if (IS_ONE_SELECTED (wdata)) | |
172 { | |
173 filelist = wdata->files; | |
174 templist = GTK_CLIST (wdata->listbox)->selection; | |
175 num = 0; | |
176 templist = get_next_selection (templist, &filelist, &num); | |
177 tempfle = filelist->data; | |
178 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (suid), | |
179 tolower (tempfle->attribs[3]) == 's'); | |
180 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sgid), | |
181 tolower (tempfle->attribs[6]) == 's'); | |
182 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sticky), | |
183 tolower (tempfle->attribs[9]) == 't'); | |
184 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ur), | |
185 tempfle->attribs[1] == 'r'); | |
186 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (uw), | |
187 tempfle->attribs[2] == 'w'); | |
188 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ux), | |
189 tempfle->attribs[3] == 'x' || | |
190 tempfle->attribs[3] == 's'); | |
191 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gr), | |
192 tempfle->attribs[4] == 'r'); | |
193 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gw), | |
194 tempfle->attribs[5] == 'w'); | |
195 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gx), | |
196 tempfle->attribs[6] == 'x' || | |
197 tempfle->attribs[6] == 's'); | |
198 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (or), | |
199 tempfle->attribs[7] == 'r'); | |
200 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ow), | |
201 tempfle->attribs[8] == 'w'); | |
202 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ox), | |
203 tempfle->attribs[9] == 'x' || | |
204 tempfle->attribs[9] == 't'); | |
205 } | |
206 gtk_widget_show (dialog); | |
207 } | |
208 | |
209 | |
210 static void | |
211 dochmod (GtkWidget * widget, gftp_window_data * wdata) | |
212 { | |
213 int cur; | |
214 | |
215 mode = 0; | |
216 if (GTK_TOGGLE_BUTTON (suid)->active) | |
217 mode += 4; | |
218 if (GTK_TOGGLE_BUTTON (sgid)->active) | |
219 mode += 2; | |
220 if (GTK_TOGGLE_BUTTON (sticky)->active) | |
221 mode += 1; | |
222 | |
223 cur = 0; | |
224 if (GTK_TOGGLE_BUTTON (ur)->active) | |
225 cur += 4; | |
226 if (GTK_TOGGLE_BUTTON (uw)->active) | |
227 cur += 2; | |
228 if (GTK_TOGGLE_BUTTON (ux)->active) | |
229 cur += 1; | |
230 mode = mode * 10 + cur; | |
231 | |
232 cur = 0; | |
233 if (GTK_TOGGLE_BUTTON (gr)->active) | |
234 cur += 4; | |
235 if (GTK_TOGGLE_BUTTON (gw)->active) | |
236 cur += 2; | |
237 if (GTK_TOGGLE_BUTTON (gx)->active) | |
238 cur += 1; | |
239 mode = mode * 10 + cur; | |
240 | |
241 cur = 0; | |
242 if (GTK_TOGGLE_BUTTON (or)->active) | |
243 cur += 4; | |
244 if (GTK_TOGGLE_BUTTON (ow)->active) | |
245 cur += 2; | |
246 if (GTK_TOGGLE_BUTTON (ox)->active) | |
247 cur += 1; | |
248 mode = mode * 10 + cur; | |
249 | |
250 if (check_reconnect (wdata) < 0) | |
251 return; | |
252 | |
253 if ((int) generic_thread (do_chmod_thread, wdata)) | |
254 refresh (wdata); | |
255 } | |
256 | |
257 | |
258 static void * | |
259 do_chmod_thread (void * data) | |
260 { | |
261 GList * filelist, * templist; | |
262 gftp_window_data * wdata; | |
263 int success, num, sj; | |
264 gftp_file * tempfle; | |
265 | |
266 wdata = data; | |
267 wdata->request->user_data = (void *) 0x01; | |
268 | |
269 if (wdata->request->use_threads) | |
270 { | |
271 sj = sigsetjmp (chmodenvir, 1); | |
272 signal (SIGINT, sig_chmodquit); | |
273 signal (SIGALRM, sig_chmodquit); | |
274 } | |
275 else | |
276 sj = 0; | |
277 | |
278 success = 0; | |
279 if (sj == 0) | |
280 { | |
281 filelist = wdata->files; | |
282 templist = GTK_CLIST (wdata->listbox)->selection; | |
283 num = 0; | |
284 while (templist != NULL) | |
285 { | |
286 templist = get_next_selection (templist, &filelist, &num); | |
287 tempfle = filelist->data; | |
288 if (wdata->request->network_timeout > 0) | |
289 alarm (wdata->request->network_timeout); | |
290 if (gftp_chmod (wdata->request, tempfle->file, mode) == 0) | |
291 success = 1; | |
292 if (!GFTP_IS_CONNECTED (wdata->request)) | |
293 break; | |
294 } | |
295 alarm (0); | |
296 } | |
297 else | |
298 { | |
299 gftp_disconnect (wdata->request); | |
300 wdata->request->logging_function (gftp_logging_error, | |
301 wdata->request->user_data, | |
302 _("Operation canceled\n")); | |
303 } | |
304 | |
305 if (wdata->request->use_threads) | |
306 { | |
307 signal (SIGINT, SIG_DFL); | |
308 signal (SIGALRM, SIG_IGN); | |
309 } | |
310 | |
311 wdata->request->user_data = NULL; | |
312 wdata->request->stopable = 0; | |
313 return ((void *) success); | |
314 } | |
315 | |
316 | |
317 static RETSIGTYPE | |
318 sig_chmodquit (int signo) | |
319 { | |
320 signal (signo, sig_chmodquit); | |
321 siglongjmp (chmodenvir, signo == SIGINT ? 1 : 2); | |
322 } | |
323 |