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