2
* gprintersettings.cpp - Bridges GutenPrint's stp_vars_t and the configuration file.
3
* A subclass of ConfigSectionHandler.
5
* Copyright (c) 2004 by Alastair M. Robinson
6
* Distributed under the terms of the GNU General Public License -
7
* see the file named "COPYING" for more details.
15
#include <glib/gprintf.h>
17
#include "stpui_widgets/stputil.h"
18
#include "gprintersettings.h"
23
static void dumpstrings(const stp_parameter_t *desc)
26
stp_string_list_t *strlist=desc->bounds.str;
29
strcount=stp_string_list_count(strlist);
30
for(j=0;j<strcount;++j)
32
stp_param_string_t *p=stp_string_list_param(strlist,j);
33
fprintf(stderr," %s (%s)\n",p->text,p->name);
37
fprintf(stderr," No string list!\n");
41
static void dumpvars(stp_vars_t *v)
43
stp_parameter_list_t params = stp_get_parameter_list(v);
45
int count = stp_parameter_list_count(params);
47
for (int i = 0; i < count; i++)
49
const stp_parameter_t *p = stp_parameter_list_param(params, i);
50
// if((p->p_level<=STP_PARAMETER_LEVEL_ADVANCED4)
51
// && ((p->p_class==STP_PARAMETER_CLASS_FEATURE) || (p->p_class==STP_PARAMETER_CLASS_OUTPUT)))
54
stp_describe_parameter(v,p->name,&desc);
59
fprintf(stderr,"%s, %d, %d, %d, %d ",desc.name,desc.p_type,p->p_type,desc.p_class,desc.p_level);
63
fprintf(stderr,", Active");
67
fprintf(stderr,", Inactive");
71
case STP_PARAMETER_TYPE_STRING_LIST:
72
str=stp_get_string_parameter(v,desc.name);
73
fprintf(stderr,", StringList\n");
76
fprintf(stderr," Currently set to: %s\n",str);
79
case STP_PARAMETER_TYPE_INT:
80
ival=stp_get_int_parameter(v,desc.name);
81
fprintf(stderr,", Int\n");
82
fprintf(stderr," Currently set to: %d\n",ival);
85
case STP_PARAMETER_TYPE_BOOLEAN:
86
ival=stp_get_boolean_parameter(v,desc.name);
87
fprintf(stderr,", Boolean\n");
88
fprintf(stderr," Currently set to: %d\n",ival);
91
case STP_PARAMETER_TYPE_DOUBLE:
92
fval=stp_get_float_parameter(v,desc.name);
93
fprintf(stderr,", Double\n");
94
fprintf(stderr," Currently set to: %f\n",fval);
98
fprintf(stderr,", Other\n");
103
stp_parameter_list_destroy(params);
107
void GPrinterSettings::Dump()
113
GPrinterSettings::GPrinterSettings(PrintOutput &output,ConfigFile *inf,const char *section)
114
: ConfigSectionHandler(inf,section), stpvars(NULL), output(output), initialised(false)
116
cerr << "In GPrinterSetting constructor - about to call stp_init()" << endl;
118
cerr << "Done" << endl;
119
stpvars=stp_vars_create();
123
GPrinterSettings::~GPrinterSettings()
126
stp_vars_destroy(stpvars);
130
void GPrinterSettings::SelectSection()
132
/* Slight hack here: The printer driver is stored in the [Output] section
133
which is prior to the [Print] section. Clearing this forces the driver
134
to be set before the printer options are set */
140
void GPrinterSettings::ParseString(const char *string)
144
const char *driver=output.FindString("Driver");
145
if(!SetDriver(driver))
146
output.SetString("Driver",DEFAULT_PRINTER_DRIVER);
155
value=token=strdup(string);
156
int l=strlen(token)-1;
157
while((l>0) && ((token[l]=='\n') || (token[l]=='\r')))
174
stp_parameter_t param;
175
stp_describe_parameter(stpvars,token,¶m);
178
case STP_PARAMETER_TYPE_STRING_LIST:
179
// cerr << "Setting " << token << " to " << value << endl;
180
stp_set_string_parameter(stpvars,token,value);
183
case STP_PARAMETER_TYPE_INT:
184
// cerr << "Setting " << token << " to " << value << endl;
185
stp_set_int_parameter(stpvars,token,atoi(value));
188
case STP_PARAMETER_TYPE_BOOLEAN:
189
// cerr << "Setting " << token << " to " << value << endl;
190
stp_set_boolean_parameter(stpvars,token,atoi(value));
193
case STP_PARAMETER_TYPE_DOUBLE:
194
// cerr << "Setting " << token << " to " << value << endl;
195
stp_set_float_parameter(stpvars,token,atof(value));
201
stp_parameter_description_destroy(¶m);
212
void GPrinterSettings::SaveSection(FILE *file)
214
stp_parameter_list_t params = stp_get_parameter_list(stpvars);
216
int count = stp_parameter_list_count(params);
218
for (int i = 0; i < count; i++)
220
const stp_parameter_t *p = stp_parameter_list_param(params, i);
221
if((p->p_level<=STP_PARAMETER_LEVEL_ADVANCED4))
223
stp_parameter_t desc;
224
stp_describe_parameter(stpvars,p->name,&desc);
229
case STP_PARAMETER_TYPE_STRING_LIST:
231
if(stp_check_string_parameter(stpvars,desc.name,STP_PARAMETER_DEFAULTED))
233
const char *str=stp_get_string_parameter(stpvars,desc.name);
234
// if(!desc.is_mandatory || strcmp(str,desc.deflt.str)!=0)
235
fprintf(file,"%s=%s\n",desc.name,str);
240
case STP_PARAMETER_TYPE_INT:
242
if(stp_check_int_parameter(stpvars,desc.name,STP_PARAMETER_DEFAULTED))
244
int val=stp_get_int_parameter(stpvars,desc.name);
245
// if(!desc.is_mandatory || val!=desc.deflt.integer)
246
fprintf(file,"%s=%d\n",desc.name,val);
251
case STP_PARAMETER_TYPE_BOOLEAN:
253
if(stp_check_boolean_parameter(stpvars,desc.name,STP_PARAMETER_DEFAULTED))
255
int val=stp_get_boolean_parameter(stpvars,desc.name);
256
// if(!desc.is_mandatory || val!=desc.deflt.boolean)
257
fprintf(file,"%s=%d\n",desc.name,val);
262
case STP_PARAMETER_TYPE_DOUBLE:
264
if(stp_check_float_parameter(stpvars,desc.name,STP_PARAMETER_DEFAULTED))
266
double val=stp_get_float_parameter(stpvars,desc.name);
267
// if(!desc.is_mandatory || val!=desc.deflt.dbl)
268
fprintf(file,"%s=%f\n",desc.name,val);
277
stp_parameter_description_destroy(&desc);
280
stp_parameter_list_destroy(params);
285
// Returns false if the driver isn't recognised, true otherwise.
287
bool GPrinterSettings::SetDriver(const char *driver)
292
const char *olddriver=stp_get_driver(stpvars);
296
driver=DEFAULT_PRINTER_DRIVER;
297
if(strcmp(driver,olddriver))
299
cerr << "SetDriver(): Setting driver to " << driver << endl;
301
// Work around the non-defaulting of inactive settings...
302
const stp_vars_t *defaults=stp_default_settings();
303
stp_vars_copy(stpvars,defaults);
305
stp_set_driver(stpvars,driver);
306
output.SetString("Driver",driver);
308
const stp_printer_t *printer=stp_get_printer(stpvars);
311
cerr << "Setting defaults" << endl;
312
stp_set_printer_defaults(stpvars,printer);
316
cerr << "Unable to get printer - reverting to default driver" << endl;
317
output.SetString("Driver",DEFAULT_PRINTER_DRIVER);
318
stp_set_driver(stpvars,DEFAULT_PRINTER_DRIVER);
319
if((printer=stp_get_printer(stpvars)))
320
stp_set_printer_defaults(stpvars,printer);
322
cerr << "Still can't get printer!" << endl;
328
cerr << "No stp vars!" << endl;
333
void GPrinterSettings::SetPageSize(const char *pagesize)
337
stp_set_string_parameter(stpvars,"MediaSize",pagesize);
342
void GPrinterSettings::Validate()
344
stputil_validate_parameters(stpvars);
348
void GPrinterSettings::Reset()
350
stp_vars_destroy(stpvars);
351
stpvars=stp_vars_create();
352
cerr << "Created fresh stp_vars" << endl;
2
* gprintersettings.cpp - Bridges GutenPrint's stp_vars_t and the configuration file.
3
* A subclass of ConfigSectionHandler.
5
* Copyright (c) 2004 by Alastair M. Robinson
6
* Distributed under the terms of the GNU General Public License -
7
* see the file named "COPYING" for more details.
15
#include <glib/gprintf.h>
17
#include "stpui_widgets/stputil.h"
18
#include "gprintersettings.h"
21
#include "support/generaldialogs.h"
23
#define DEFAULT_PPD_STRING "<Default Queue PPD>"
28
static void dumpstrings(const stp_parameter_t *desc)
31
stp_string_list_t *strlist=desc->bounds.str;
34
strcount=stp_string_list_count(strlist);
35
for(j=0;j<strcount;++j)
37
stp_param_string_t *p=stp_string_list_param(strlist,j);
38
fprintf(stderr," %s (%s)\n",p->text,p->name);
42
fprintf(stderr," No string list!\n");
46
static void dumpvars(stp_vars_t *v)
48
stp_parameter_list_t params = stp_get_parameter_list(v);
50
int count = stp_parameter_list_count(params);
52
for (int i = 0; i < count; i++)
54
const stp_parameter_t *p = stp_parameter_list_param(params, i);
55
// if((p->p_level<=STP_PARAMETER_LEVEL_ADVANCED4)
56
// && ((p->p_class==STP_PARAMETER_CLASS_FEATURE) || (p->p_class==STP_PARAMETER_CLASS_OUTPUT)))
59
stp_describe_parameter(v,p->name,&desc);
64
fprintf(stderr,"%s, %d, %d, %d, %d ",desc.name,desc.p_type,p->p_type,desc.p_class,desc.p_level);
68
fprintf(stderr,", Active");
72
fprintf(stderr,", Inactive");
76
case STP_PARAMETER_TYPE_STRING_LIST:
77
str=stp_get_string_parameter(v,desc.name);
78
fprintf(stderr,", StringList\n");
81
fprintf(stderr," Currently set to: %s\n",str);
84
case STP_PARAMETER_TYPE_INT:
85
ival=stp_get_int_parameter(v,desc.name);
86
fprintf(stderr,", Int\n");
87
fprintf(stderr," Currently set to: %d\n",ival);
90
case STP_PARAMETER_TYPE_BOOLEAN:
91
ival=stp_get_boolean_parameter(v,desc.name);
92
fprintf(stderr,", Boolean\n");
93
fprintf(stderr," Currently set to: %d\n",ival);
96
case STP_PARAMETER_TYPE_DOUBLE:
97
fval=stp_get_float_parameter(v,desc.name);
98
fprintf(stderr,", Double\n");
99
fprintf(stderr," Currently set to: %f\n",fval);
103
fprintf(stderr,", Other\n");
108
stp_parameter_list_destroy(params);
112
void GPrinterSettings::Dump()
118
GPrinterSettings::GPrinterSettings(PrintOutput &output,ConfigFile *inf,const char *section)
119
: ConfigSectionHandler(inf,section), PageExtent(), stpvars(NULL), output(output), initialised(false)
122
cerr << "In GPrinterSetting constructor - about to call stp_init()" << endl;
124
cerr << "Done" << endl;
126
stpvars=stp_vars_create();
130
GPrinterSettings::~GPrinterSettings()
133
stp_vars_destroy(stpvars);
137
void GPrinterSettings::SelectSection()
139
/* Slight hack here: The printer driver is stored in the [Output] section
140
which is prior to the [Print] section. Clearing this forces the driver
141
to be set before the printer options are set */
147
void GPrinterSettings::ParseString(const char *string)
151
const char *driver=output.FindString("Driver");
152
if(!SetDriver(driver))
153
output.SetString("Driver",DEFAULT_PRINTER_DRIVER);
162
value=token=strdup(string);
163
int l=strlen(token)-1;
164
while((l>0) && ((token[l]=='\n') || (token[l]=='\r')))
181
if(strcmp("CustomWidth",token)==0)
183
cerr << "Setting custom width to: " << value << endl;
184
stp_set_page_width(stpvars,pagewidth=atoi(value));
186
else if(strcmp("CustomHeight",token)==0)
188
cerr << "Setting custom height to: " << value << endl;
189
stp_set_page_height(stpvars,pageheight=atoi(value));
193
stp_parameter_t param;
194
stp_describe_parameter(stpvars,token,¶m);
197
case STP_PARAMETER_TYPE_STRING_LIST:
198
stp_set_string_parameter(stpvars,token,value);
201
case STP_PARAMETER_TYPE_FILE:
202
// Because the queue PPD filenames returned by CUPS
203
// aren't persistent between sessions, we have to
204
// save an escape string, and substitute the current
205
// filename at preset loading time.
206
if(strcmp(value,DEFAULT_PPD_STRING)==0)
208
cerr << "*** Fetching default PPD filename" << endl;
209
char *defppd=output.GetPPD();
212
cerr << "Got default PPD filename: " << defppd << endl;
213
stp_set_file_parameter(stpvars,token,defppd);
216
stp_parameter_t desc2;
217
stp_describe_parameter(stpvars,"PageSize",&desc2);
218
cerr << "After setting PPD Default page size is now: " << desc2.deflt.str << endl;
219
stp_set_string_parameter(stpvars,"PageSize",desc2.deflt.str);
220
stp_parameter_description_destroy(&desc2);
221
ppdsizes_workaround_done=true;
224
cerr << "Couldn't get default PPD." << endl;
227
stp_set_file_parameter(stpvars,token,value);
230
case STP_PARAMETER_TYPE_INT:
231
// cerr << "Setting " << token << " to " << value << endl;
232
stp_set_int_parameter(stpvars,token,atoi(value));
235
case STP_PARAMETER_TYPE_BOOLEAN:
236
// cerr << "Setting " << token << " to " << value << endl;
237
stp_set_boolean_parameter(stpvars,token,atoi(value));
240
case STP_PARAMETER_TYPE_DOUBLE:
241
// cerr << "Setting " << token << " to " << value << endl;
242
stp_set_float_parameter(stpvars,token,atof(value));
248
stp_parameter_description_destroy(¶m);
260
void GPrinterSettings::SaveSection(FILE *file)
262
stp_parameter_list_t params = stp_get_parameter_list(stpvars);
263
stp_parameter_t desc;
265
int count = stp_parameter_list_count(params);
267
// PPDFile parameter must be saved first, because it must be restored
268
// before other parameters upon loading.
269
// Because CUPS returns a local temporary filename for a queue's PPD
270
// which is not persistent between sessions, we must save an escape
271
// string to indicate that the queue's default should be used.
273
stp_describe_parameter(stpvars,"PPDFile",&desc);
276
cerr << "Saving PPDFile parameter..." << endl;
277
const char *ppd=stp_get_file_parameter(stpvars,"PPDFile");
278
char *defppd=output.GetPPD();
279
cerr << "Current PPD: " << ppd << endl;
280
cerr << "Default PPD: " << defppd << endl;
281
if(defppd && CompareFiles(defppd,ppd))
282
ppd=DEFAULT_PPD_STRING;
285
fprintf(file,"PPDFile=%s\n",ppd);
288
for (int i = 0; i < count; i++)
290
const stp_parameter_t *p = stp_parameter_list_param(params, i);
291
if((p->p_level<=STP_PARAMETER_LEVEL_ADVANCED4))
293
stp_parameter_t desc;
294
stp_describe_parameter(stpvars,p->name,&desc);
299
case STP_PARAMETER_TYPE_STRING_LIST:
301
if(stp_check_string_parameter(stpvars,desc.name,STP_PARAMETER_DEFAULTED))
303
const char *str=stp_get_string_parameter(stpvars,desc.name);
304
// if(!desc.is_mandatory || strcmp(str,desc.deflt.str)!=0)
305
fprintf(file,"%s=%s\n",desc.name,str);
310
case STP_PARAMETER_TYPE_INT:
312
if(stp_check_int_parameter(stpvars,desc.name,STP_PARAMETER_DEFAULTED))
314
int val=stp_get_int_parameter(stpvars,desc.name);
315
// if(!desc.is_mandatory || val!=desc.deflt.integer)
316
fprintf(file,"%s=%d\n",desc.name,val);
321
case STP_PARAMETER_TYPE_BOOLEAN:
323
if(stp_check_boolean_parameter(stpvars,desc.name,STP_PARAMETER_DEFAULTED))
325
int val=stp_get_boolean_parameter(stpvars,desc.name);
326
// if(!desc.is_mandatory || val!=desc.deflt.boolean)
327
fprintf(file,"%s=%d\n",desc.name,val);
332
case STP_PARAMETER_TYPE_DOUBLE:
334
if(stp_check_float_parameter(stpvars,desc.name,STP_PARAMETER_DEFAULTED))
336
double val=stp_get_float_parameter(stpvars,desc.name);
337
// if(!desc.is_mandatory || val!=desc.deflt.dbl)
338
fprintf(file,"%s=%f\n",desc.name,val);
347
stp_parameter_description_destroy(&desc);
351
fprintf(file,"CustomWidth=%d\n",pagewidth);
352
fprintf(file,"CustomHeight=%d\n",pageheight);
354
stp_parameter_list_destroy(params);
359
// Returns false if the driver isn't recognised, true otherwise.
361
bool GPrinterSettings::SetDriver(const char *driver)
366
const char *olddriver=stp_get_driver(stpvars);
370
driver=DEFAULT_PRINTER_DRIVER;
371
if(strcmp(driver,olddriver))
373
cerr << "SetDriver(): Setting driver to " << driver << endl;
375
// Work around the non-defaulting of inactive settings...
376
const stp_vars_t *defaults=stp_default_settings();
377
stp_vars_copy(stpvars,defaults);
379
stp_set_driver(stpvars,driver);
380
output.SetString("Driver",driver);
382
const stp_printer_t *printer=stp_get_printer(stpvars);
385
cerr << "Setting defaults" << endl;
386
stp_set_printer_defaults(stpvars,printer);
390
cerr << "Unable to get printer - reverting to default driver" << endl;
391
output.SetString("Driver",DEFAULT_PRINTER_DRIVER);
392
stp_set_driver(stpvars,DEFAULT_PRINTER_DRIVER);
393
if((printer=stp_get_printer(stpvars)))
394
stp_set_printer_defaults(stpvars,printer);
396
cerr << "Still can't get printer!" << endl;
400
stp_set_page_width(stpvars,pagewidth);
401
stp_set_page_height(stpvars,pageheight);
404
stp_parameter_t desc;
405
stp_describe_parameter(stpvars,"PPDFile",&desc);
408
cerr << "Getting default PPD..." << endl;
409
char *defppd=output.GetPPD();
412
cerr << "Setting PPDFile to " << defppd << endl;
413
stp_set_file_parameter(stpvars,"PPDFile",defppd);
416
if(!ppdsizes_workaround_done)
418
stp_parameter_t desc2;
419
stp_describe_parameter(stpvars,"PageSize",&desc2);
420
cerr << "After setting PPD Default page size is now: " << desc2.deflt.str << endl;
421
stp_set_string_parameter(stpvars,"PageSize",desc2.deflt.str);
422
stp_parameter_description_destroy(&desc2);
423
ppdsizes_workaround_done=true;
427
stp_parameter_description_destroy(&desc);
430
cerr << "No stp vars!" << endl;
435
void GPrinterSettings::Validate()
437
stputil_validate_parameters(stpvars);
438
cerr << "After stputil_validate_parameters(): " << setlocale(LC_ALL,"") << endl;
442
void GPrinterSettings::Reset()
444
stp_vars_destroy(stpvars);
445
stpvars=stp_vars_create();
446
cerr << "Created fresh stp_vars" << endl;