1 /*
2  GtkLP
3   graphical Frontends for non-administrative CUPS users.
4 
5  Copyright (C) 1998-2004 Tobias Mueller
6 
7  This program is free software; you can redistribute it and/or
8  modify it under the terms of the GNU General Public License
9  as published by the Free Software Foundation; either version 2
10  of the License, or (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program; if not, write to the Free Software
19  Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  Boston, MA 02110-1301, USA
21 
22 */
23 
24 #include <config.h>
25 
26 #include "special.h"
27 
28 #include <stdio.h>
29 #include <string.h>
30 #include <gtk/gtk.h>
31 
32 #include <gettext.h>
33 #include <libgtklp.h>
34 
35 #include "gtklp.h"
36 
37 GtkWidget *specialTab;
38 GtkWidget *bannerFrame, *bannerFrameStartCombo, *bannerFrameStopCombo;
39 GtkWidget *jobNameFrame, *jobNameField;
40 GtkWidget *specialOptFrame, *specialRawCheck;
41 GtkWidget *extraOptFrame, *extraOptField;
42 GtkWidget *passFrame, *loginEntrySpecial, *passEntrySpecial;
43 extern void getBannerList(char *);
44 GList *bannerList;
45 
46 int passWarn;
47 
48 int bannerAnz;
49 char Banners[MAX_BANNER][MAXLINE + 1];
50 
specialTabSetDefaults(void)51 void specialTabSetDefaults(void)
52 {
53 	int i1 = 0;
54 
55 	if (DEBUG)
56 		printf("Get specialDefaults\n");
57 	/* banners */
58 	if (bannerList == NULL)
59 		getBannerList(DEF_PRN);
60 	gtk_combo_set_popdown_strings(GTK_COMBO(bannerFrameStartCombo),
61 				      bannerList);
62 	gtk_combo_set_popdown_strings(GTK_COMBO(bannerFrameStopCombo),
63 				      bannerList);
64 	gtk_list_select_item(GTK_LIST(GTK_COMBO(bannerFrameStartCombo)->list),
65 			     0);
66 	gtk_list_select_item(GTK_LIST(GTK_COMBO(bannerFrameStopCombo)->list),
67 			     0);
68 	for (i1 = 0; i1 < bannerAnz; i1++) {
69 		if (strcmp
70 		    (str2str(Banners[i1]),
71 		     str2str(PrinterBannerStart[PrinterChoice])) == 0)
72 			gtk_list_select_item(GTK_LIST
73 					     (GTK_COMBO(bannerFrameStartCombo)->
74 					      list), i1);
75 		if (strcmp
76 		    (str2str(Banners[i1]),
77 		     str2str(PrinterBannerEnd[PrinterChoice])) == 0)
78 			gtk_list_select_item(GTK_LIST
79 					     (GTK_COMBO(bannerFrameStopCombo)->
80 					      list), i1);
81 	}
82 	/* Job Name */
83 	if (JobName[0] != (uintptr_t) NULL) ;
84 	gtk_entry_set_text(GTK_ENTRY(jobNameField), JobName);
85 	/* Options */
86 	if (wantraw)
87 		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(specialRawCheck),
88 					     1);
89 	else
90 		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(specialRawCheck),
91 					     0);
92 	/* Extra Options */
93 	if (ExtraOpt[0] != (uintptr_t) NULL) ;
94 	gtk_entry_set_text(GTK_ENTRY(extraOptField), ExtraOpt);
95 
96 	/* Password and login */
97 	gtk_entry_set_text(GTK_ENTRY(loginEntrySpecial),
98 			   (const gchar *)cupsUser());
99 	gtk_entry_set_text(GTK_ENTRY(passEntrySpecial), passWord);
100 	passWarn = 1;
101 	hasAskedPWD = 0;
102 }
103 
BannerFrame(GtkWidget * container)104 void BannerFrame(GtkWidget * container)
105 {
106 	GtkWidget *mainHBox, *vbox, *hbox1, *hbox2, *labelStart, *labelStop;
107 
108 	bannerList = NULL;
109 	bannerAnz = 0;
110 
111 	mainHBox = gtk_hbox_new(FALSE, INFRAME_SPACING_H);
112 	gtk_box_pack_start(GTK_BOX(container), mainHBox, FALSE, FALSE,
113 			   FRAME_SPACING_V);
114 	gtk_widget_show(mainHBox);
115 
116 	bannerFrame = gtk_frame_new(str2str(_("Banners")));
117 	gtk_box_pack_start(GTK_BOX(mainHBox), bannerFrame, TRUE, TRUE,
118 			   FRAME_SPACING_V);
119 
120 	/* vbox */
121 	vbox = gtk_vbox_new(FALSE, INFRAME_SPACING_V);
122 	gtk_container_set_border_width(GTK_CONTAINER(vbox), VBOX_BORDER);
123 	gtk_container_add(GTK_CONTAINER(bannerFrame), vbox);
124 	gtk_widget_show(vbox);
125 
126 	/* Start Box */
127 	hbox1 = gtk_hbox_new(FALSE, 0 * INFRAME_SPACING_H);
128 	gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE,
129 			   0 * INFRAME_SPACING_H);
130 	gtk_widget_show(hbox1);
131 
132 	/* Stop Box */
133 	hbox2 = gtk_hbox_new(FALSE, 0 * INFRAME_SPACING_H);
134 	gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE,
135 			   0 * INFRAME_SPACING_V);
136 	gtk_widget_show(hbox2);
137 
138 	/* Start */
139 	labelStart = gtk_label_new(str2str(_("Start:")));
140 	gtk_misc_set_alignment(GTK_MISC(labelStart), 0, 0.5);
141 	gtk_widget_set_size_request(GTK_WIDGET(labelStart),
142 				    BANNERLABELFIELD_FIELDLENGTH, -1);
143 	gtk_box_pack_start(GTK_BOX(hbox1), labelStart, FALSE, FALSE,
144 			   INFRAME_SPACING_V);
145 	gtk_widget_show(labelStart);
146 
147 	bannerFrameStartCombo = gtk_combo_new();
148 	gtk_combo_set_value_in_list(GTK_COMBO(bannerFrameStartCombo), TRUE,
149 				    FALSE);
150 	gtk_list_set_selection_mode(GTK_LIST
151 				    (GTK_COMBO(bannerFrameStartCombo)->list),
152 				    GTK_SELECTION_SINGLE);
153 
154 	gtk_entry_set_editable(GTK_ENTRY
155 			       (GTK_COMBO(bannerFrameStartCombo)->entry),
156 			       FALSE);
157 	gtk_box_pack_start(GTK_BOX(hbox1), bannerFrameStartCombo, FALSE, FALSE,
158 			   0);
159 	gtk_widget_show(bannerFrameStartCombo);
160 
161 	/* Stop */
162 	labelStop = gtk_label_new(str2str(_("End:")));
163 	gtk_misc_set_alignment(GTK_MISC(labelStop), 0, 0.5);
164 	gtk_widget_set_size_request(GTK_WIDGET(labelStop),
165 				    BANNERLABELFIELD_FIELDLENGTH, -1);
166 	gtk_box_pack_start(GTK_BOX(hbox2), labelStop, FALSE, FALSE,
167 			   INFRAME_SPACING_V);
168 	gtk_widget_show(labelStop);
169 
170 	bannerFrameStopCombo = gtk_combo_new();
171 	gtk_combo_set_value_in_list(GTK_COMBO(bannerFrameStopCombo), TRUE,
172 				    FALSE);
173 	gtk_list_set_selection_mode(GTK_LIST
174 				    (GTK_COMBO(bannerFrameStopCombo)->list),
175 				    GTK_SELECTION_SINGLE);
176 
177 	gtk_entry_set_editable(GTK_ENTRY
178 			       (GTK_COMBO(bannerFrameStopCombo)->entry), FALSE);
179 	gtk_box_pack_start(GTK_BOX(hbox2), bannerFrameStopCombo, FALSE, FALSE,
180 			   0);
181 	gtk_widget_show(bannerFrameStopCombo);
182 
183 }
184 
loginEntrySpecialNew(GtkWidget * widget,GdkEventFocus * event,gpointer user_data)185 gboolean loginEntrySpecialNew(GtkWidget * widget, GdkEventFocus * event,
186 			      gpointer user_data)
187 {
188 	cupsSetUser((const char *)
189 		    gtk_entry_get_text(GTK_ENTRY(loginEntrySpecial)));
190 	strncpy(UserName, (char *)gtk_entry_get_text(GTK_ENTRY(loginEntrySpecial)), (size_t) MAX_USERNAME);	/* no length-check, cause it's done with entrys max-length */
191 	if (DEBUG)
192 		printf("New Username: %s\n", cupsUser());
193 
194 	return (0);
195 }
196 
passEntrySpecialNew(GtkEditable * editable,gpointer data)197 gboolean passEntrySpecialNew(GtkEditable * editable, gpointer data)
198 {
199 	strncpy(passWord, (char *)gtk_entry_get_text(GTK_ENTRY(passEntrySpecial)), (size_t) MAX_PASSLEN);	/* no length-check, cause it's done with entrys max-length */
200 	if (DEBUG)
201 		printf("New Password: %s\n", passWord);
202 	if ((passWarn == 1) && (passWord[0] != (uintptr_t) NULL)) {
203 		passWarn = 0;
204 		quick_message(str2str
205 			      (_
206 			       ("You have chosen to store your password on the disk.\nThis is not secure, so I recommend against doing so.\nYou have been warned.")),
207 			      4);
208 	}
209 
210 	return (0);
211 }
212 
PassFrame(GtkWidget * container)213 void PassFrame(GtkWidget * container)
214 {
215 	GtkWidget *mainHBox, *vbox, *hbox1, *hbox2, *labelLogin, *labelPass;
216 
217 	mainHBox = gtk_hbox_new(FALSE, INFRAME_SPACING_H);
218 	gtk_box_pack_start(GTK_BOX(container), mainHBox, FALSE, FALSE,
219 			   FRAME_SPACING_V);
220 	gtk_widget_show(mainHBox);
221 
222 	passFrame = gtk_frame_new(str2str(_("Password")));
223 	gtk_box_pack_start(GTK_BOX(mainHBox), passFrame, TRUE, TRUE,
224 			   FRAME_SPACING_V);
225 
226 	/* vbox */
227 	vbox = gtk_vbox_new(FALSE, INFRAME_SPACING_V);
228 	gtk_container_set_border_width(GTK_CONTAINER(vbox), VBOX_BORDER);
229 	gtk_container_add(GTK_CONTAINER(passFrame), vbox);
230 	gtk_widget_show(vbox);
231 
232 	/* Login Box */
233 	hbox1 = gtk_hbox_new(FALSE, 0 * INFRAME_SPACING_H);
234 	gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE,
235 			   0 * INFRAME_SPACING_H);
236 	gtk_widget_show(hbox1);
237 
238 	/* Password Box */
239 	hbox2 = gtk_hbox_new(FALSE, 0 * INFRAME_SPACING_H);
240 	gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE,
241 			   0 * INFRAME_SPACING_V);
242 	gtk_widget_show(hbox2);
243 
244 	/* Login */
245 	labelLogin = gtk_label_new(str2str(_("Login:")));
246 	gtk_misc_set_alignment(GTK_MISC(labelLogin), 0, 0.5);
247 	gtk_widget_set_size_request(GTK_WIDGET(labelLogin),
248 				    LOGINLABELFIELD_FIELDLENGTH, -1);
249 	gtk_box_pack_start(GTK_BOX(hbox1), labelLogin, FALSE, FALSE,
250 			   INFRAME_SPACING_V);
251 	gtk_widget_show(labelLogin);
252 
253 	loginEntrySpecial = gtk_entry_new();
254 	gtk_entry_set_editable(GTK_ENTRY(loginEntrySpecial), TRUE);
255 	gtk_entry_set_max_length(GTK_ENTRY(loginEntrySpecial), MAX_USERNAME);
256 	gtk_entry_set_visibility(GTK_ENTRY(loginEntrySpecial), TRUE);
257 	gtk_box_pack_start(GTK_BOX(hbox1), loginEntrySpecial, FALSE, FALSE, 0);
258 	gtk_widget_show(loginEntrySpecial);
259 
260 	/* Password */
261 	labelPass = gtk_label_new(str2str(_("Password:")));
262 	gtk_misc_set_alignment(GTK_MISC(labelPass), 0, 0.5);
263 	gtk_widget_set_size_request(GTK_WIDGET(labelPass),
264 				    LOGINLABELFIELD_FIELDLENGTH, -1);
265 	gtk_box_pack_start(GTK_BOX(hbox2), labelPass, FALSE, FALSE,
266 			   INFRAME_SPACING_V);
267 	gtk_widget_show(labelPass);
268 
269 	passEntrySpecial = gtk_entry_new();
270 	gtk_entry_set_editable(GTK_ENTRY(passEntrySpecial), TRUE);
271 	gtk_entry_set_max_length(GTK_ENTRY(passEntrySpecial), MAX_PASSLEN);
272 	gtk_entry_set_visibility(GTK_ENTRY(passEntrySpecial), FALSE);
273 	gtk_box_pack_start(GTK_BOX(hbox2), passEntrySpecial, FALSE, FALSE, 0);
274 	gtk_widget_show(passEntrySpecial);
275 
276 	gtk_signal_connect(GTK_OBJECT(loginEntrySpecial), "focus-out-event",
277 			   GTK_SIGNAL_FUNC(loginEntrySpecialNew), NULL);
278 	gtk_signal_connect(GTK_OBJECT(passEntrySpecial), "focus-out-event",
279 			   GTK_SIGNAL_FUNC(passEntrySpecialNew), NULL);
280 }
281 
JobNameChanged(GtkWidget * widget,gpointer data)282 void JobNameChanged(GtkWidget * widget, gpointer data)
283 {
284 	strncpy(JobName,
285 		gtk_editable_get_chars(GTK_EDITABLE(jobNameField), 0, -1),
286 		(size_t) MAX_JOB_NAME_LENGTH);
287 	if (DEBUG)
288 		printf("Job Name changed: %s\n", JobName);
289 }
290 
JobNameFrame(GtkWidget * container)291 void JobNameFrame(GtkWidget * container)
292 {
293 	GtkWidget *mainHBox, *hbox, *vbox;
294 
295 	mainHBox = gtk_hbox_new(FALSE, INFRAME_SPACING_H);
296 	gtk_box_pack_start(GTK_BOX(container), mainHBox, FALSE, FALSE,
297 			   FRAME_SPACING_V);
298 	gtk_widget_show(mainHBox);
299 
300 	jobNameFrame = gtk_frame_new(str2str(_("Job Name")));
301 	gtk_box_pack_start(GTK_BOX(mainHBox), jobNameFrame, TRUE, TRUE,
302 			   FRAME_SPACING_V);
303 
304 	/* vbox */
305 	vbox = gtk_vbox_new(FALSE, INFRAME_SPACING_V);
306 	gtk_container_set_border_width(GTK_CONTAINER(vbox), VBOX_BORDER);
307 	gtk_container_add(GTK_CONTAINER(jobNameFrame), vbox);
308 	gtk_widget_show(vbox);
309 
310 	/* hbox */
311 	hbox = gtk_hbox_new(FALSE, INFRAME_SPACING_H);
312 	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
313 	gtk_widget_show(hbox);
314 
315 	/* TextBox */
316 	jobNameField = gtk_entry_new_with_max_length(MAX_JOB_NAME_LENGTH);
317 	gtk_widget_set_size_request(jobNameField, JOBNAME_FIELD_LENGTH, -1);
318 	gtk_entry_set_text(GTK_ENTRY(jobNameField), "");
319 	gtk_box_pack_start(GTK_BOX(hbox), jobNameField, FALSE, FALSE,
320 			   INFRAME_SPACING_V);
321 	gtk_widget_show(jobNameField);
322 
323 	/* Signals */
324 	gtk_signal_connect(GTK_OBJECT(GTK_ENTRY(jobNameField)), "changed",
325 			   GTK_SIGNAL_FUNC(JobNameChanged), NULL);
326 }
327 
specialCheckChanged(GtkWidget * widget,gpointer data)328 void specialCheckChanged(GtkWidget * widget, gpointer data)
329 {
330 	if (DEBUG)
331 		printf("specialChanged: %s\n", (char *)data);
332 	if (strcmp((char *)data, "Raw") == 0) {
333 		if (wantraw == 1)
334 			wantraw = 0;
335 		else
336 			wantraw = 1;
337 		return;
338 	}
339 	if (DEBUG)
340 		printf("PROG_ERROR: unknown special button !\n");
341 	emergency();
342 
343 }
344 
SpecialOptFrame(GtkWidget * container)345 void SpecialOptFrame(GtkWidget * container)
346 {
347 	GtkWidget *mainHBox, *hbox, *vbox;
348 
349 	mainHBox = gtk_hbox_new(FALSE, INFRAME_SPACING_H);
350 	gtk_box_pack_start(GTK_BOX(container), mainHBox, FALSE, FALSE,
351 			   FRAME_SPACING_V);
352 	gtk_widget_show(mainHBox);
353 	specialOptFrame = gtk_frame_new(str2str(_("Options")));
354 	gtk_box_pack_start(GTK_BOX(mainHBox), specialOptFrame, TRUE, TRUE,
355 			   FRAME_SPACING_V);
356 
357 	/* Box */
358 	hbox = gtk_hbox_new(FALSE, 0);
359 	gtk_container_add(GTK_CONTAINER(specialOptFrame), hbox);
360 	gtk_widget_show(hbox);
361 
362 	vbox = gtk_vbox_new(FALSE, 0);
363 	gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE,
364 			   INFRAME_SPACING_H);
365 	gtk_widget_show(vbox);
366 
367 	/* Buttons */
368 	specialRawCheck =
369 	    gtk_check_button_new_with_label(str2str(_("Raw output")));
370 	gtk_box_pack_start(GTK_BOX(vbox), specialRawCheck, FALSE, FALSE, 0);
371 	gtk_signal_connect(GTK_OBJECT(specialRawCheck), "pressed",
372 			   GTK_SIGNAL_FUNC(specialCheckChanged), "Raw");
373 	gtk_widget_show(specialRawCheck);
374 
375 }
376 
extraOptChanged(GtkWidget * widget,gpointer data)377 void extraOptChanged(GtkWidget * widget, gpointer data)
378 {
379 	strncpy(ExtraOpt,
380 		gtk_editable_get_chars(GTK_EDITABLE(extraOptField), 0, -1),
381 		(size_t) MAX_EXTRAOPT);
382 	if (DEBUG)
383 		printf("Extra Options changed: %s\n", ExtraOpt);
384 }
385 
ExtraOptFrame(GtkWidget * container)386 void ExtraOptFrame(GtkWidget * container)
387 {
388 	GtkWidget *mainHBox, *hbox, *vbox;
389 
390 	mainHBox = gtk_hbox_new(FALSE, INFRAME_SPACING_H);
391 	gtk_box_pack_start(GTK_BOX(container), mainHBox, FALSE, FALSE,
392 			   FRAME_SPACING_V);
393 	gtk_widget_show(mainHBox);
394 
395 	extraOptFrame = gtk_frame_new(str2str(_("Extra Options")));
396 	gtk_box_pack_start(GTK_BOX(mainHBox), extraOptFrame, TRUE, TRUE,
397 			   FRAME_SPACING_V);
398 
399 	/* vbox */
400 	vbox = gtk_vbox_new(FALSE, INFRAME_SPACING_V);
401 	gtk_container_set_border_width(GTK_CONTAINER(vbox), VBOX_BORDER);
402 	gtk_container_add(GTK_CONTAINER(extraOptFrame), vbox);
403 	gtk_widget_show(vbox);
404 
405 	/* hbox */
406 	hbox = gtk_hbox_new(FALSE, INFRAME_SPACING_H);
407 	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
408 	gtk_widget_show(hbox);
409 
410 	/* TextBox */
411 	extraOptField = gtk_entry_new_with_max_length(MAX_EXTRAOPT);
412 	gtk_widget_set_size_request(extraOptField, EXTRAOPT_FIELD_LENGTH, -1);
413 	gtk_entry_set_text(GTK_ENTRY(extraOptField), "");
414 	gtk_box_pack_start(GTK_BOX(hbox), extraOptField, FALSE, FALSE,
415 			   INFRAME_SPACING_V);
416 	gtk_widget_show(extraOptField);
417 
418 	/* Signals */
419 	gtk_signal_connect(GTK_OBJECT(GTK_ENTRY(extraOptField)), "changed",
420 			   GTK_SIGNAL_FUNC(extraOptChanged), NULL);
421 }
422 
SpecialTab(void)423 void SpecialTab(void)
424 {
425 	specialTab = gtk_vbox_new(FALSE, 0);
426 	gtk_container_set_border_width(GTK_CONTAINER(specialTab), FRAME_BORDER);
427 	gtk_notebook_append_page(GTK_NOTEBOOK(tabs), specialTab,
428 				 gtk_label_new(str2str(_("Special"))));
429 
430 	BannerFrame(specialTab);
431 	JobNameFrame(specialTab);
432 	SpecialOptFrame(specialTab);
433 	PassFrame(specialTab);
434 	ExtraOptFrame(specialTab);
435 }
436