xref: /aosp_15_r20/external/libcups/ppdc/ppdc-driver.cxx (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker //
2*5e7646d2SAndroid Build Coastguard Worker // PPD file compiler definitions for the CUPS PPD Compiler.
3*5e7646d2SAndroid Build Coastguard Worker //
4*5e7646d2SAndroid Build Coastguard Worker // Copyright © 2007-2019 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker // Copyright © 2002-2006 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker //
7*5e7646d2SAndroid Build Coastguard Worker // Licensed under Apache License v2.0.  See the file "LICENSE" for more
8*5e7646d2SAndroid Build Coastguard Worker // information.
9*5e7646d2SAndroid Build Coastguard Worker //
10*5e7646d2SAndroid Build Coastguard Worker 
11*5e7646d2SAndroid Build Coastguard Worker //
12*5e7646d2SAndroid Build Coastguard Worker // Include necessary headers...
13*5e7646d2SAndroid Build Coastguard Worker //
14*5e7646d2SAndroid Build Coastguard Worker 
15*5e7646d2SAndroid Build Coastguard Worker #include "ppdc-private.h"
16*5e7646d2SAndroid Build Coastguard Worker 
17*5e7646d2SAndroid Build Coastguard Worker 
18*5e7646d2SAndroid Build Coastguard Worker //
19*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::ppdcDriver()' - Create a new printer driver.
20*5e7646d2SAndroid Build Coastguard Worker //
21*5e7646d2SAndroid Build Coastguard Worker 
ppdcDriver(ppdcDriver * d)22*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::ppdcDriver(ppdcDriver *d)	// I - Printer driver template
23*5e7646d2SAndroid Build Coastguard Worker   : ppdcShared()
24*5e7646d2SAndroid Build Coastguard Worker {
25*5e7646d2SAndroid Build Coastguard Worker   ppdcGroup	*g;			// Current group
26*5e7646d2SAndroid Build Coastguard Worker 
27*5e7646d2SAndroid Build Coastguard Worker 
28*5e7646d2SAndroid Build Coastguard Worker   PPDC_NEW;
29*5e7646d2SAndroid Build Coastguard Worker 
30*5e7646d2SAndroid Build Coastguard Worker   if (d)
31*5e7646d2SAndroid Build Coastguard Worker   {
32*5e7646d2SAndroid Build Coastguard Worker     // Bump the use count of any strings we inherit...
33*5e7646d2SAndroid Build Coastguard Worker     if (d->manufacturer)
34*5e7646d2SAndroid Build Coastguard Worker       d->manufacturer->retain();
35*5e7646d2SAndroid Build Coastguard Worker     if (d->version)
36*5e7646d2SAndroid Build Coastguard Worker       d->version->retain();
37*5e7646d2SAndroid Build Coastguard Worker     if (d->default_font)
38*5e7646d2SAndroid Build Coastguard Worker       d->default_font->retain();
39*5e7646d2SAndroid Build Coastguard Worker     if (d->default_size)
40*5e7646d2SAndroid Build Coastguard Worker       d->default_size->retain();
41*5e7646d2SAndroid Build Coastguard Worker     if (d->custom_size_code)
42*5e7646d2SAndroid Build Coastguard Worker       d->custom_size_code->retain();
43*5e7646d2SAndroid Build Coastguard Worker 
44*5e7646d2SAndroid Build Coastguard Worker     // Copy all of the data from the driver template...
45*5e7646d2SAndroid Build Coastguard Worker     copyright           = new ppdcArray(d->copyright);
46*5e7646d2SAndroid Build Coastguard Worker     manufacturer        = d->manufacturer;
47*5e7646d2SAndroid Build Coastguard Worker     model_name          = 0;
48*5e7646d2SAndroid Build Coastguard Worker     file_name           = 0;
49*5e7646d2SAndroid Build Coastguard Worker     pc_file_name        = 0;
50*5e7646d2SAndroid Build Coastguard Worker     type                = d->type;
51*5e7646d2SAndroid Build Coastguard Worker     version             = d->version;
52*5e7646d2SAndroid Build Coastguard Worker     model_number        = d->model_number;
53*5e7646d2SAndroid Build Coastguard Worker     manual_copies       = d->manual_copies;
54*5e7646d2SAndroid Build Coastguard Worker     color_device        = d->color_device;
55*5e7646d2SAndroid Build Coastguard Worker     throughput          = d->throughput;
56*5e7646d2SAndroid Build Coastguard Worker     attrs               = new ppdcArray(d->attrs);
57*5e7646d2SAndroid Build Coastguard Worker     constraints         = new ppdcArray(d->constraints);
58*5e7646d2SAndroid Build Coastguard Worker     filters             = new ppdcArray(d->filters);
59*5e7646d2SAndroid Build Coastguard Worker     fonts               = new ppdcArray(d->fonts);
60*5e7646d2SAndroid Build Coastguard Worker     profiles            = new ppdcArray(d->profiles);
61*5e7646d2SAndroid Build Coastguard Worker     sizes               = new ppdcArray(d->sizes);
62*5e7646d2SAndroid Build Coastguard Worker     default_font        = d->default_font;
63*5e7646d2SAndroid Build Coastguard Worker     default_size        = d->default_size;
64*5e7646d2SAndroid Build Coastguard Worker     variable_paper_size = d->variable_paper_size;
65*5e7646d2SAndroid Build Coastguard Worker     custom_size_code    = d->custom_size_code;
66*5e7646d2SAndroid Build Coastguard Worker     left_margin         = d->left_margin;
67*5e7646d2SAndroid Build Coastguard Worker     bottom_margin       = d->bottom_margin;
68*5e7646d2SAndroid Build Coastguard Worker     right_margin        = d->right_margin;
69*5e7646d2SAndroid Build Coastguard Worker     top_margin          = d->top_margin;
70*5e7646d2SAndroid Build Coastguard Worker     max_width           = d->max_width;
71*5e7646d2SAndroid Build Coastguard Worker     max_length          = d->max_length;
72*5e7646d2SAndroid Build Coastguard Worker     min_width           = d->min_width;
73*5e7646d2SAndroid Build Coastguard Worker     min_length          = d->min_length;
74*5e7646d2SAndroid Build Coastguard Worker 
75*5e7646d2SAndroid Build Coastguard Worker     // Then copy the groups manually, since we want separate copies
76*5e7646d2SAndroid Build Coastguard Worker     // of the groups and options...
77*5e7646d2SAndroid Build Coastguard Worker     groups = new ppdcArray();
78*5e7646d2SAndroid Build Coastguard Worker 
79*5e7646d2SAndroid Build Coastguard Worker     for (g = (ppdcGroup *)d->groups->first(); g; g = (ppdcGroup *)d->groups->next())
80*5e7646d2SAndroid Build Coastguard Worker       groups->add(new ppdcGroup(g));
81*5e7646d2SAndroid Build Coastguard Worker   }
82*5e7646d2SAndroid Build Coastguard Worker   else
83*5e7646d2SAndroid Build Coastguard Worker   {
84*5e7646d2SAndroid Build Coastguard Worker     // Zero all of the data in the driver...
85*5e7646d2SAndroid Build Coastguard Worker     copyright           = new ppdcArray();
86*5e7646d2SAndroid Build Coastguard Worker     manufacturer        = 0;
87*5e7646d2SAndroid Build Coastguard Worker     model_name          = 0;
88*5e7646d2SAndroid Build Coastguard Worker     file_name           = 0;
89*5e7646d2SAndroid Build Coastguard Worker     pc_file_name        = 0;
90*5e7646d2SAndroid Build Coastguard Worker     version             = 0;
91*5e7646d2SAndroid Build Coastguard Worker     type                = PPDC_DRIVER_CUSTOM;
92*5e7646d2SAndroid Build Coastguard Worker     model_number        = 0;
93*5e7646d2SAndroid Build Coastguard Worker     manual_copies       = 0;
94*5e7646d2SAndroid Build Coastguard Worker     color_device        = 0;
95*5e7646d2SAndroid Build Coastguard Worker     throughput          = 1;
96*5e7646d2SAndroid Build Coastguard Worker     attrs               = new ppdcArray();
97*5e7646d2SAndroid Build Coastguard Worker     constraints         = new ppdcArray();
98*5e7646d2SAndroid Build Coastguard Worker     fonts               = new ppdcArray();
99*5e7646d2SAndroid Build Coastguard Worker     filters             = new ppdcArray();
100*5e7646d2SAndroid Build Coastguard Worker     groups              = new ppdcArray();
101*5e7646d2SAndroid Build Coastguard Worker     profiles            = new ppdcArray();
102*5e7646d2SAndroid Build Coastguard Worker     sizes               = new ppdcArray();
103*5e7646d2SAndroid Build Coastguard Worker     default_font        = 0;
104*5e7646d2SAndroid Build Coastguard Worker     default_size        = 0;
105*5e7646d2SAndroid Build Coastguard Worker     variable_paper_size = 0;
106*5e7646d2SAndroid Build Coastguard Worker     custom_size_code    = 0;
107*5e7646d2SAndroid Build Coastguard Worker     left_margin         = 0;
108*5e7646d2SAndroid Build Coastguard Worker     bottom_margin       = 0;
109*5e7646d2SAndroid Build Coastguard Worker     right_margin        = 0;
110*5e7646d2SAndroid Build Coastguard Worker     top_margin          = 0;
111*5e7646d2SAndroid Build Coastguard Worker     max_width           = 0;
112*5e7646d2SAndroid Build Coastguard Worker     max_length          = 0;
113*5e7646d2SAndroid Build Coastguard Worker     min_width           = 0;
114*5e7646d2SAndroid Build Coastguard Worker     min_length          = 0;
115*5e7646d2SAndroid Build Coastguard Worker   }
116*5e7646d2SAndroid Build Coastguard Worker }
117*5e7646d2SAndroid Build Coastguard Worker 
118*5e7646d2SAndroid Build Coastguard Worker 
119*5e7646d2SAndroid Build Coastguard Worker //
120*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::~ppdcDriver()' - Destroy a printer driver.
121*5e7646d2SAndroid Build Coastguard Worker //
122*5e7646d2SAndroid Build Coastguard Worker 
~ppdcDriver()123*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::~ppdcDriver()
124*5e7646d2SAndroid Build Coastguard Worker {
125*5e7646d2SAndroid Build Coastguard Worker   PPDC_DELETE;
126*5e7646d2SAndroid Build Coastguard Worker 
127*5e7646d2SAndroid Build Coastguard Worker   copyright->release();
128*5e7646d2SAndroid Build Coastguard Worker 
129*5e7646d2SAndroid Build Coastguard Worker   if (manufacturer)
130*5e7646d2SAndroid Build Coastguard Worker     manufacturer->release();
131*5e7646d2SAndroid Build Coastguard Worker   if (model_name)
132*5e7646d2SAndroid Build Coastguard Worker     model_name->release();
133*5e7646d2SAndroid Build Coastguard Worker   if (file_name)
134*5e7646d2SAndroid Build Coastguard Worker     file_name->release();
135*5e7646d2SAndroid Build Coastguard Worker   if (pc_file_name)
136*5e7646d2SAndroid Build Coastguard Worker     pc_file_name->release();
137*5e7646d2SAndroid Build Coastguard Worker   if (version)
138*5e7646d2SAndroid Build Coastguard Worker     version->release();
139*5e7646d2SAndroid Build Coastguard Worker   if (default_font)
140*5e7646d2SAndroid Build Coastguard Worker     default_font->release();
141*5e7646d2SAndroid Build Coastguard Worker   if (default_size)
142*5e7646d2SAndroid Build Coastguard Worker     default_size->release();
143*5e7646d2SAndroid Build Coastguard Worker   if (custom_size_code)
144*5e7646d2SAndroid Build Coastguard Worker     custom_size_code->release();
145*5e7646d2SAndroid Build Coastguard Worker 
146*5e7646d2SAndroid Build Coastguard Worker   attrs->release();
147*5e7646d2SAndroid Build Coastguard Worker   constraints->release();
148*5e7646d2SAndroid Build Coastguard Worker   filters->release();
149*5e7646d2SAndroid Build Coastguard Worker   fonts->release();
150*5e7646d2SAndroid Build Coastguard Worker   groups->release();
151*5e7646d2SAndroid Build Coastguard Worker   profiles->release();
152*5e7646d2SAndroid Build Coastguard Worker   sizes->release();
153*5e7646d2SAndroid Build Coastguard Worker }
154*5e7646d2SAndroid Build Coastguard Worker 
155*5e7646d2SAndroid Build Coastguard Worker 
156*5e7646d2SAndroid Build Coastguard Worker //
157*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::find_attr()' - Find an attribute.
158*5e7646d2SAndroid Build Coastguard Worker //
159*5e7646d2SAndroid Build Coastguard Worker 
160*5e7646d2SAndroid Build Coastguard Worker ppdcAttr *				// O - Attribute or NULL
find_attr(const char * k,const char * s)161*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::find_attr(const char *k,	// I - Keyword string
162*5e7646d2SAndroid Build Coastguard Worker                       const char *s)	// I - Spec string
163*5e7646d2SAndroid Build Coastguard Worker {
164*5e7646d2SAndroid Build Coastguard Worker   ppdcAttr	*a;			// Current attribute
165*5e7646d2SAndroid Build Coastguard Worker 
166*5e7646d2SAndroid Build Coastguard Worker 
167*5e7646d2SAndroid Build Coastguard Worker   for (a = (ppdcAttr *)attrs->first(); a; a = (ppdcAttr *)attrs->next())
168*5e7646d2SAndroid Build Coastguard Worker     if (!strcmp(a->name->value, k) &&
169*5e7646d2SAndroid Build Coastguard Worker         ((!s && (!a->selector->value || !a->selector->value[0])) ||
170*5e7646d2SAndroid Build Coastguard Worker 	 (s && a->selector->value && !strcmp(a->selector->value, s))))
171*5e7646d2SAndroid Build Coastguard Worker       return (a);
172*5e7646d2SAndroid Build Coastguard Worker 
173*5e7646d2SAndroid Build Coastguard Worker   return (NULL);
174*5e7646d2SAndroid Build Coastguard Worker }
175*5e7646d2SAndroid Build Coastguard Worker 
176*5e7646d2SAndroid Build Coastguard Worker 
177*5e7646d2SAndroid Build Coastguard Worker //
178*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::find_group()' - Find a group.
179*5e7646d2SAndroid Build Coastguard Worker //
180*5e7646d2SAndroid Build Coastguard Worker 
181*5e7646d2SAndroid Build Coastguard Worker ppdcGroup *				// O - Matching group or NULL
find_group(const char * n)182*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::find_group(const char *n)	// I - Group name
183*5e7646d2SAndroid Build Coastguard Worker {
184*5e7646d2SAndroid Build Coastguard Worker   ppdcGroup	*g;			// Current group
185*5e7646d2SAndroid Build Coastguard Worker 
186*5e7646d2SAndroid Build Coastguard Worker 
187*5e7646d2SAndroid Build Coastguard Worker   for (g = (ppdcGroup *)groups->first(); g; g = (ppdcGroup *)groups->next())
188*5e7646d2SAndroid Build Coastguard Worker     if (!_cups_strcasecmp(n, g->name->value))
189*5e7646d2SAndroid Build Coastguard Worker       return (g);
190*5e7646d2SAndroid Build Coastguard Worker 
191*5e7646d2SAndroid Build Coastguard Worker   return (0);
192*5e7646d2SAndroid Build Coastguard Worker }
193*5e7646d2SAndroid Build Coastguard Worker 
194*5e7646d2SAndroid Build Coastguard Worker 
195*5e7646d2SAndroid Build Coastguard Worker //
196*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::find_option()' - Find an option.
197*5e7646d2SAndroid Build Coastguard Worker //
198*5e7646d2SAndroid Build Coastguard Worker 
199*5e7646d2SAndroid Build Coastguard Worker ppdcOption *				// O - Matching option or NULL
find_option(const char * n)200*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::find_option(const char *n)	// I - Option name
201*5e7646d2SAndroid Build Coastguard Worker {
202*5e7646d2SAndroid Build Coastguard Worker   return (find_option_group(n, (ppdcGroup **)0));
203*5e7646d2SAndroid Build Coastguard Worker }
204*5e7646d2SAndroid Build Coastguard Worker 
205*5e7646d2SAndroid Build Coastguard Worker 
206*5e7646d2SAndroid Build Coastguard Worker //
207*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::find_option_group()' - Find an option and its group.
208*5e7646d2SAndroid Build Coastguard Worker //
209*5e7646d2SAndroid Build Coastguard Worker 
210*5e7646d2SAndroid Build Coastguard Worker ppdcOption *				// O - Matching option or NULL
find_option_group(const char * n,ppdcGroup ** mg)211*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::find_option_group(
212*5e7646d2SAndroid Build Coastguard Worker     const char *n,			// I - Option name
213*5e7646d2SAndroid Build Coastguard Worker     ppdcGroup  **mg)			// O - Matching group or NULL
214*5e7646d2SAndroid Build Coastguard Worker {
215*5e7646d2SAndroid Build Coastguard Worker   ppdcGroup	*g;			// Current group
216*5e7646d2SAndroid Build Coastguard Worker   ppdcOption	*o;			// Current option
217*5e7646d2SAndroid Build Coastguard Worker 
218*5e7646d2SAndroid Build Coastguard Worker 
219*5e7646d2SAndroid Build Coastguard Worker   for (g = (ppdcGroup *)groups->first(); g; g = (ppdcGroup *)groups->next())
220*5e7646d2SAndroid Build Coastguard Worker     for (o = (ppdcOption *)g->options->first(); o; o = (ppdcOption *)g->options->next())
221*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_strcasecmp(n, o->name->value))
222*5e7646d2SAndroid Build Coastguard Worker       {
223*5e7646d2SAndroid Build Coastguard Worker         if (mg)
224*5e7646d2SAndroid Build Coastguard Worker 	  *mg = g;
225*5e7646d2SAndroid Build Coastguard Worker 
226*5e7646d2SAndroid Build Coastguard Worker         return (o);
227*5e7646d2SAndroid Build Coastguard Worker       }
228*5e7646d2SAndroid Build Coastguard Worker 
229*5e7646d2SAndroid Build Coastguard Worker   if (mg)
230*5e7646d2SAndroid Build Coastguard Worker     *mg = (ppdcGroup *)0;
231*5e7646d2SAndroid Build Coastguard Worker 
232*5e7646d2SAndroid Build Coastguard Worker   return (0);
233*5e7646d2SAndroid Build Coastguard Worker }
234*5e7646d2SAndroid Build Coastguard Worker 
235*5e7646d2SAndroid Build Coastguard Worker 
236*5e7646d2SAndroid Build Coastguard Worker //
237*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::set_custom_size_code()' - Set the custom page size code.
238*5e7646d2SAndroid Build Coastguard Worker //
239*5e7646d2SAndroid Build Coastguard Worker 
240*5e7646d2SAndroid Build Coastguard Worker void
set_custom_size_code(const char * c)241*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::set_custom_size_code(
242*5e7646d2SAndroid Build Coastguard Worker     const char *c)			// I - CustomPageSize code
243*5e7646d2SAndroid Build Coastguard Worker {
244*5e7646d2SAndroid Build Coastguard Worker   if (custom_size_code)
245*5e7646d2SAndroid Build Coastguard Worker     custom_size_code->release();
246*5e7646d2SAndroid Build Coastguard Worker 
247*5e7646d2SAndroid Build Coastguard Worker   custom_size_code = new ppdcString(c);
248*5e7646d2SAndroid Build Coastguard Worker }
249*5e7646d2SAndroid Build Coastguard Worker 
250*5e7646d2SAndroid Build Coastguard Worker 
251*5e7646d2SAndroid Build Coastguard Worker //
252*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::set_default_font()' - Set the default font name.
253*5e7646d2SAndroid Build Coastguard Worker //
254*5e7646d2SAndroid Build Coastguard Worker 
255*5e7646d2SAndroid Build Coastguard Worker void
set_default_font(ppdcFont * f)256*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::set_default_font(
257*5e7646d2SAndroid Build Coastguard Worker     ppdcFont *f)			// I - Font
258*5e7646d2SAndroid Build Coastguard Worker {
259*5e7646d2SAndroid Build Coastguard Worker   if (default_font)
260*5e7646d2SAndroid Build Coastguard Worker     default_font->release();
261*5e7646d2SAndroid Build Coastguard Worker 
262*5e7646d2SAndroid Build Coastguard Worker   if (f)
263*5e7646d2SAndroid Build Coastguard Worker   {
264*5e7646d2SAndroid Build Coastguard Worker     f->name->retain();
265*5e7646d2SAndroid Build Coastguard Worker     default_font = f->name;
266*5e7646d2SAndroid Build Coastguard Worker   }
267*5e7646d2SAndroid Build Coastguard Worker   else
268*5e7646d2SAndroid Build Coastguard Worker     default_font = 0;
269*5e7646d2SAndroid Build Coastguard Worker }
270*5e7646d2SAndroid Build Coastguard Worker 
271*5e7646d2SAndroid Build Coastguard Worker 
272*5e7646d2SAndroid Build Coastguard Worker //
273*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::set_default_size()' - Set the default size name.
274*5e7646d2SAndroid Build Coastguard Worker //
275*5e7646d2SAndroid Build Coastguard Worker 
276*5e7646d2SAndroid Build Coastguard Worker void
set_default_size(ppdcMediaSize * m)277*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::set_default_size(
278*5e7646d2SAndroid Build Coastguard Worker     ppdcMediaSize *m)			// I - Media size
279*5e7646d2SAndroid Build Coastguard Worker {
280*5e7646d2SAndroid Build Coastguard Worker   if (default_size)
281*5e7646d2SAndroid Build Coastguard Worker     default_size->release();
282*5e7646d2SAndroid Build Coastguard Worker 
283*5e7646d2SAndroid Build Coastguard Worker   if (m)
284*5e7646d2SAndroid Build Coastguard Worker   {
285*5e7646d2SAndroid Build Coastguard Worker     m->name->retain();
286*5e7646d2SAndroid Build Coastguard Worker     default_size = m->name;
287*5e7646d2SAndroid Build Coastguard Worker   }
288*5e7646d2SAndroid Build Coastguard Worker   else
289*5e7646d2SAndroid Build Coastguard Worker     default_size = 0;
290*5e7646d2SAndroid Build Coastguard Worker }
291*5e7646d2SAndroid Build Coastguard Worker 
292*5e7646d2SAndroid Build Coastguard Worker 
293*5e7646d2SAndroid Build Coastguard Worker //
294*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::set_file_name()' - Set the full filename.
295*5e7646d2SAndroid Build Coastguard Worker //
296*5e7646d2SAndroid Build Coastguard Worker 
297*5e7646d2SAndroid Build Coastguard Worker void
set_file_name(const char * f)298*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::set_file_name(const char *f)// I - Filename
299*5e7646d2SAndroid Build Coastguard Worker {
300*5e7646d2SAndroid Build Coastguard Worker   if (file_name)
301*5e7646d2SAndroid Build Coastguard Worker     file_name->release();
302*5e7646d2SAndroid Build Coastguard Worker 
303*5e7646d2SAndroid Build Coastguard Worker   file_name = new ppdcString(f);
304*5e7646d2SAndroid Build Coastguard Worker }
305*5e7646d2SAndroid Build Coastguard Worker 
306*5e7646d2SAndroid Build Coastguard Worker 
307*5e7646d2SAndroid Build Coastguard Worker //
308*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::set_manufacturer()' - Set the manufacturer name.
309*5e7646d2SAndroid Build Coastguard Worker //
310*5e7646d2SAndroid Build Coastguard Worker 
311*5e7646d2SAndroid Build Coastguard Worker void
set_manufacturer(const char * m)312*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::set_manufacturer(
313*5e7646d2SAndroid Build Coastguard Worker     const char *m)			// I - Model name
314*5e7646d2SAndroid Build Coastguard Worker {
315*5e7646d2SAndroid Build Coastguard Worker   if (manufacturer)
316*5e7646d2SAndroid Build Coastguard Worker     manufacturer->release();
317*5e7646d2SAndroid Build Coastguard Worker 
318*5e7646d2SAndroid Build Coastguard Worker   manufacturer = new ppdcString(m);
319*5e7646d2SAndroid Build Coastguard Worker }
320*5e7646d2SAndroid Build Coastguard Worker 
321*5e7646d2SAndroid Build Coastguard Worker 
322*5e7646d2SAndroid Build Coastguard Worker //
323*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::set_model_name()' - Set the model name.
324*5e7646d2SAndroid Build Coastguard Worker //
325*5e7646d2SAndroid Build Coastguard Worker 
326*5e7646d2SAndroid Build Coastguard Worker void
set_model_name(const char * m)327*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::set_model_name(
328*5e7646d2SAndroid Build Coastguard Worker     const char *m)			// I - Model name
329*5e7646d2SAndroid Build Coastguard Worker {
330*5e7646d2SAndroid Build Coastguard Worker   if (model_name)
331*5e7646d2SAndroid Build Coastguard Worker     model_name->release();
332*5e7646d2SAndroid Build Coastguard Worker 
333*5e7646d2SAndroid Build Coastguard Worker   model_name = new ppdcString(m);
334*5e7646d2SAndroid Build Coastguard Worker }
335*5e7646d2SAndroid Build Coastguard Worker 
336*5e7646d2SAndroid Build Coastguard Worker 
337*5e7646d2SAndroid Build Coastguard Worker //
338*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::set_pc_file_name()' - Set the PC filename.
339*5e7646d2SAndroid Build Coastguard Worker //
340*5e7646d2SAndroid Build Coastguard Worker 
341*5e7646d2SAndroid Build Coastguard Worker void
set_pc_file_name(const char * f)342*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::set_pc_file_name(
343*5e7646d2SAndroid Build Coastguard Worker     const char *f)			// I - Filename
344*5e7646d2SAndroid Build Coastguard Worker {
345*5e7646d2SAndroid Build Coastguard Worker   if (pc_file_name)
346*5e7646d2SAndroid Build Coastguard Worker     pc_file_name->release();
347*5e7646d2SAndroid Build Coastguard Worker 
348*5e7646d2SAndroid Build Coastguard Worker   pc_file_name = new ppdcString(f);
349*5e7646d2SAndroid Build Coastguard Worker }
350*5e7646d2SAndroid Build Coastguard Worker 
351*5e7646d2SAndroid Build Coastguard Worker 
352*5e7646d2SAndroid Build Coastguard Worker //
353*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::set_version()' - Set the version string.
354*5e7646d2SAndroid Build Coastguard Worker //
355*5e7646d2SAndroid Build Coastguard Worker 
356*5e7646d2SAndroid Build Coastguard Worker void
set_version(const char * v)357*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::set_version(const char *v)	// I - Version
358*5e7646d2SAndroid Build Coastguard Worker {
359*5e7646d2SAndroid Build Coastguard Worker   if (version)
360*5e7646d2SAndroid Build Coastguard Worker     version->release();
361*5e7646d2SAndroid Build Coastguard Worker 
362*5e7646d2SAndroid Build Coastguard Worker   version = new ppdcString(v);
363*5e7646d2SAndroid Build Coastguard Worker }
364*5e7646d2SAndroid Build Coastguard Worker 
365*5e7646d2SAndroid Build Coastguard Worker 
366*5e7646d2SAndroid Build Coastguard Worker //
367*5e7646d2SAndroid Build Coastguard Worker // 'ppdcDriver::write_ppd_file()' - Write a PPD file...
368*5e7646d2SAndroid Build Coastguard Worker //
369*5e7646d2SAndroid Build Coastguard Worker 
370*5e7646d2SAndroid Build Coastguard Worker int					// O - 0 on success, -1 on failure
write_ppd_file(cups_file_t * fp,ppdcCatalog * catalog,ppdcArray * locales,ppdcSource * src,ppdcLineEnding le)371*5e7646d2SAndroid Build Coastguard Worker ppdcDriver::write_ppd_file(
372*5e7646d2SAndroid Build Coastguard Worker     cups_file_t    *fp,			// I - PPD file
373*5e7646d2SAndroid Build Coastguard Worker     ppdcCatalog    *catalog,		// I - Message catalog
374*5e7646d2SAndroid Build Coastguard Worker     ppdcArray      *locales,		// I - Additional languages to add
375*5e7646d2SAndroid Build Coastguard Worker     ppdcSource     *src,		// I - Driver source
376*5e7646d2SAndroid Build Coastguard Worker     ppdcLineEnding le)			// I - Line endings to use
377*5e7646d2SAndroid Build Coastguard Worker {
378*5e7646d2SAndroid Build Coastguard Worker   bool			delete_cat;	// Delete the catalog when we are done?
379*5e7646d2SAndroid Build Coastguard Worker   char			query[42],	// Query attribute
380*5e7646d2SAndroid Build Coastguard Worker 			custom[42];	// Custom attribute
381*5e7646d2SAndroid Build Coastguard Worker   ppdcString		*s;		// Copyright string
382*5e7646d2SAndroid Build Coastguard Worker   ppdcGroup		*g;		// Current group
383*5e7646d2SAndroid Build Coastguard Worker   ppdcOption		*o;		// Current option
384*5e7646d2SAndroid Build Coastguard Worker   ppdcChoice		*c;		// Current choice
385*5e7646d2SAndroid Build Coastguard Worker   ppdcMediaSize		*m;		// Current media size
386*5e7646d2SAndroid Build Coastguard Worker   ppdcProfile		*p;		// Current color profile
387*5e7646d2SAndroid Build Coastguard Worker   ppdcFilter		*f;		// Current filter
388*5e7646d2SAndroid Build Coastguard Worker   ppdcFont		*fn,		// Current font
389*5e7646d2SAndroid Build Coastguard Worker 			*bfn;		// Current base font
390*5e7646d2SAndroid Build Coastguard Worker   ppdcConstraint	*cn;		// Current constraint
391*5e7646d2SAndroid Build Coastguard Worker   ppdcAttr		*a;		// Current attribute
392*5e7646d2SAndroid Build Coastguard Worker   const char		*lf;		// Linefeed character to use
393*5e7646d2SAndroid Build Coastguard Worker 
394*5e7646d2SAndroid Build Coastguard Worker 
395*5e7646d2SAndroid Build Coastguard Worker   // If we don't have a message catalog, use an empty (English) one...
396*5e7646d2SAndroid Build Coastguard Worker   if (!catalog)
397*5e7646d2SAndroid Build Coastguard Worker   {
398*5e7646d2SAndroid Build Coastguard Worker     catalog    = new ppdcCatalog(NULL);
399*5e7646d2SAndroid Build Coastguard Worker     delete_cat = true;
400*5e7646d2SAndroid Build Coastguard Worker   }
401*5e7646d2SAndroid Build Coastguard Worker   else
402*5e7646d2SAndroid Build Coastguard Worker     delete_cat = false;
403*5e7646d2SAndroid Build Coastguard Worker 
404*5e7646d2SAndroid Build Coastguard Worker   // Figure out the end-of-line string...
405*5e7646d2SAndroid Build Coastguard Worker   if (le == PPDC_LFONLY)
406*5e7646d2SAndroid Build Coastguard Worker     lf = "\n";
407*5e7646d2SAndroid Build Coastguard Worker   else if (le == PPDC_CRONLY)
408*5e7646d2SAndroid Build Coastguard Worker     lf = "\r";
409*5e7646d2SAndroid Build Coastguard Worker   else
410*5e7646d2SAndroid Build Coastguard Worker     lf = "\r\n";
411*5e7646d2SAndroid Build Coastguard Worker 
412*5e7646d2SAndroid Build Coastguard Worker   // Write the standard header stuff...
413*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*PPD-Adobe: \"4.3\"%s", lf);
414*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*%%%%%%%% PPD file for %s with CUPS.%s",
415*5e7646d2SAndroid Build Coastguard Worker                  model_name->value, lf);
416*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp,
417*5e7646d2SAndroid Build Coastguard Worker                  "*%%%%%%%% Created by the CUPS PPD Compiler " CUPS_SVERSION
418*5e7646d2SAndroid Build Coastguard Worker 		 ".%s", lf);
419*5e7646d2SAndroid Build Coastguard Worker   for (s = (ppdcString *)copyright->first();
420*5e7646d2SAndroid Build Coastguard Worker        s;
421*5e7646d2SAndroid Build Coastguard Worker        s = (ppdcString *)copyright->next())
422*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*%% %s%s", catalog->find_message(s->value), lf);
423*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*FormatVersion: \"4.3\"%s", lf);
424*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*FileVersion: \"%s\"%s", version->value, lf);
425*5e7646d2SAndroid Build Coastguard Worker 
426*5e7646d2SAndroid Build Coastguard Worker   a = find_attr("LanguageVersion", NULL);
427*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*LanguageVersion: %s%s",
428*5e7646d2SAndroid Build Coastguard Worker         	 catalog->find_message(a ? a->value->value : "English"), lf);
429*5e7646d2SAndroid Build Coastguard Worker 
430*5e7646d2SAndroid Build Coastguard Worker   a = find_attr("LanguageEncoding", NULL);
431*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*LanguageEncoding: %s%s",
432*5e7646d2SAndroid Build Coastguard Worker         	 catalog->find_message(a ? a->value->value : "ISOLatin1"), lf);
433*5e7646d2SAndroid Build Coastguard Worker 
434*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*PCFileName: \"%s\"%s", pc_file_name->value, lf);
435*5e7646d2SAndroid Build Coastguard Worker 
436*5e7646d2SAndroid Build Coastguard Worker   for (a = (ppdcAttr *)attrs->first(); a; a = (ppdcAttr *)attrs->next())
437*5e7646d2SAndroid Build Coastguard Worker     if (!strcmp(a->name->value, "Product"))
438*5e7646d2SAndroid Build Coastguard Worker       break;
439*5e7646d2SAndroid Build Coastguard Worker 
440*5e7646d2SAndroid Build Coastguard Worker   if (a)
441*5e7646d2SAndroid Build Coastguard Worker   {
442*5e7646d2SAndroid Build Coastguard Worker     for (; a; a = (ppdcAttr *)attrs->next())
443*5e7646d2SAndroid Build Coastguard Worker       if (!strcmp(a->name->value, "Product"))
444*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*Product: \"%s\"%s", a->value->value, lf);
445*5e7646d2SAndroid Build Coastguard Worker   }
446*5e7646d2SAndroid Build Coastguard Worker   else
447*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*Product: \"(%s)\"%s", model_name->value, lf);
448*5e7646d2SAndroid Build Coastguard Worker 
449*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*Manufacturer: \"%s\"%s",
450*5e7646d2SAndroid Build Coastguard Worker         	 catalog->find_message(manufacturer->value), lf);
451*5e7646d2SAndroid Build Coastguard Worker 
452*5e7646d2SAndroid Build Coastguard Worker   if ((a = find_attr("ModelName", NULL)) != NULL)
453*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*ModelName: \"%s\"%s",
454*5e7646d2SAndroid Build Coastguard Worker         	   catalog->find_message(a->value->value), lf);
455*5e7646d2SAndroid Build Coastguard Worker   else if (_cups_strncasecmp(model_name->value, manufacturer->value,
456*5e7646d2SAndroid Build Coastguard Worker                        strlen(manufacturer->value)))
457*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*ModelName: \"%s %s\"%s",
458*5e7646d2SAndroid Build Coastguard Worker         	   catalog->find_message(manufacturer->value),
459*5e7646d2SAndroid Build Coastguard Worker         	   catalog->find_message(model_name->value), lf);
460*5e7646d2SAndroid Build Coastguard Worker   else
461*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*ModelName: \"%s\"%s",
462*5e7646d2SAndroid Build Coastguard Worker         	   catalog->find_message(model_name->value), lf);
463*5e7646d2SAndroid Build Coastguard Worker 
464*5e7646d2SAndroid Build Coastguard Worker   if ((a = find_attr("ShortNickName", NULL)) != NULL)
465*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*ShortNickName: \"%s\"%s",
466*5e7646d2SAndroid Build Coastguard Worker         	   catalog->find_message(a->value->value), lf);
467*5e7646d2SAndroid Build Coastguard Worker   else if (_cups_strncasecmp(model_name->value, manufacturer->value,
468*5e7646d2SAndroid Build Coastguard Worker                        strlen(manufacturer->value)))
469*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*ShortNickName: \"%s %s\"%s",
470*5e7646d2SAndroid Build Coastguard Worker         	   catalog->find_message(manufacturer->value),
471*5e7646d2SAndroid Build Coastguard Worker         	   catalog->find_message(model_name->value), lf);
472*5e7646d2SAndroid Build Coastguard Worker   else
473*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*ShortNickName: \"%s\"%s",
474*5e7646d2SAndroid Build Coastguard Worker         	   catalog->find_message(model_name->value), lf);
475*5e7646d2SAndroid Build Coastguard Worker 
476*5e7646d2SAndroid Build Coastguard Worker   if ((a = find_attr("NickName", NULL)) != NULL)
477*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*NickName: \"%s\"%s",
478*5e7646d2SAndroid Build Coastguard Worker         	   catalog->find_message(a->value->value), lf);
479*5e7646d2SAndroid Build Coastguard Worker   else if (_cups_strncasecmp(model_name->value, manufacturer->value,
480*5e7646d2SAndroid Build Coastguard Worker                        strlen(manufacturer->value)))
481*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*NickName: \"%s %s, %s\"%s",
482*5e7646d2SAndroid Build Coastguard Worker         	   catalog->find_message(manufacturer->value),
483*5e7646d2SAndroid Build Coastguard Worker         	   catalog->find_message(model_name->value), version->value,
484*5e7646d2SAndroid Build Coastguard Worker 		   lf);
485*5e7646d2SAndroid Build Coastguard Worker   else
486*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*NickName: \"%s, %s\"%s",
487*5e7646d2SAndroid Build Coastguard Worker         	   catalog->find_message(model_name->value), version->value,
488*5e7646d2SAndroid Build Coastguard Worker 		   lf);
489*5e7646d2SAndroid Build Coastguard Worker 
490*5e7646d2SAndroid Build Coastguard Worker   for (a = (ppdcAttr *)attrs->first(); a; a = (ppdcAttr *)attrs->next())
491*5e7646d2SAndroid Build Coastguard Worker     if (!strcmp(a->name->value, "PSVersion"))
492*5e7646d2SAndroid Build Coastguard Worker       break;
493*5e7646d2SAndroid Build Coastguard Worker 
494*5e7646d2SAndroid Build Coastguard Worker   if (a)
495*5e7646d2SAndroid Build Coastguard Worker   {
496*5e7646d2SAndroid Build Coastguard Worker     for (; a; a = (ppdcAttr *)attrs->next())
497*5e7646d2SAndroid Build Coastguard Worker       if (!strcmp(a->name->value, "PSVersion"))
498*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*PSVersion: \"%s\"%s", a->value->value, lf);
499*5e7646d2SAndroid Build Coastguard Worker   }
500*5e7646d2SAndroid Build Coastguard Worker   else
501*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*PSVersion: \"(3010.000) 0\"%s", lf);
502*5e7646d2SAndroid Build Coastguard Worker 
503*5e7646d2SAndroid Build Coastguard Worker   if ((a = find_attr("LanguageLevel", NULL)) != NULL)
504*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*LanguageLevel: \"%s\"%s", a->value->value, lf);
505*5e7646d2SAndroid Build Coastguard Worker   else
506*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*LanguageLevel: \"3\"%s", lf);
507*5e7646d2SAndroid Build Coastguard Worker 
508*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*ColorDevice: %s%s", color_device ? "True" : "False", lf);
509*5e7646d2SAndroid Build Coastguard Worker 
510*5e7646d2SAndroid Build Coastguard Worker   if ((a = find_attr("DefaultColorSpace", NULL)) != NULL)
511*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*DefaultColorSpace: %s%s", a->value->value, lf);
512*5e7646d2SAndroid Build Coastguard Worker   else
513*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*DefaultColorSpace: %s%s",
514*5e7646d2SAndroid Build Coastguard Worker                    color_device ? "RGB" : "Gray", lf);
515*5e7646d2SAndroid Build Coastguard Worker 
516*5e7646d2SAndroid Build Coastguard Worker   if ((a = find_attr("FileSystem", NULL)) != NULL)
517*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*FileSystem: %s%s", a->value->value, lf);
518*5e7646d2SAndroid Build Coastguard Worker   else
519*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*FileSystem: False%s", lf);
520*5e7646d2SAndroid Build Coastguard Worker 
521*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*Throughput: \"%d\"%s", throughput, lf);
522*5e7646d2SAndroid Build Coastguard Worker 
523*5e7646d2SAndroid Build Coastguard Worker   if ((a = find_attr("LandscapeOrientation", NULL)) != NULL)
524*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*LandscapeOrientation: %s%s", a->value->value, lf);
525*5e7646d2SAndroid Build Coastguard Worker   else
526*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*LandscapeOrientation: Plus90%s", lf);
527*5e7646d2SAndroid Build Coastguard Worker 
528*5e7646d2SAndroid Build Coastguard Worker   if ((a = find_attr("TTRasterizer", NULL)) != NULL)
529*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*TTRasterizer: %s%s", a->value->value, lf);
530*5e7646d2SAndroid Build Coastguard Worker   else if (type != PPDC_DRIVER_PS)
531*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*TTRasterizer: Type42%s", lf);
532*5e7646d2SAndroid Build Coastguard Worker 
533*5e7646d2SAndroid Build Coastguard Worker   struct lconv *loc = localeconv();
534*5e7646d2SAndroid Build Coastguard Worker 
535*5e7646d2SAndroid Build Coastguard Worker   if (attrs->count)
536*5e7646d2SAndroid Build Coastguard Worker   {
537*5e7646d2SAndroid Build Coastguard Worker     // Write driver-defined attributes...
538*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*%% Driver-defined attributes...%s", lf);
539*5e7646d2SAndroid Build Coastguard Worker     for (a = (ppdcAttr *)attrs->first(); a; a = (ppdcAttr *)attrs->next())
540*5e7646d2SAndroid Build Coastguard Worker     {
541*5e7646d2SAndroid Build Coastguard Worker       if (!strcmp(a->name->value, "Product") ||
542*5e7646d2SAndroid Build Coastguard Worker           !strcmp(a->name->value, "PSVersion") ||
543*5e7646d2SAndroid Build Coastguard Worker           !strcmp(a->name->value, "LanguageLevel") ||
544*5e7646d2SAndroid Build Coastguard Worker           !strcmp(a->name->value, "DefaultColorSpace") ||
545*5e7646d2SAndroid Build Coastguard Worker           !strcmp(a->name->value, "FileSystem") ||
546*5e7646d2SAndroid Build Coastguard Worker           !strcmp(a->name->value, "LandscapeOrientation") ||
547*5e7646d2SAndroid Build Coastguard Worker           !strcmp(a->name->value, "TTRasterizer") ||
548*5e7646d2SAndroid Build Coastguard Worker           !strcmp(a->name->value, "LanguageVersion") ||
549*5e7646d2SAndroid Build Coastguard Worker           !strcmp(a->name->value, "LanguageEncoding") ||
550*5e7646d2SAndroid Build Coastguard Worker           !strcmp(a->name->value, "ModelName") ||
551*5e7646d2SAndroid Build Coastguard Worker           !strcmp(a->name->value, "NickName") ||
552*5e7646d2SAndroid Build Coastguard Worker           !strcmp(a->name->value, "ShortNickName") ||
553*5e7646d2SAndroid Build Coastguard Worker 	  !strcmp(a->name->value, "cupsVersion"))
554*5e7646d2SAndroid Build Coastguard Worker 	continue;
555*5e7646d2SAndroid Build Coastguard Worker 
556*5e7646d2SAndroid Build Coastguard Worker       if (a->name->value[0] == '?' &&
557*5e7646d2SAndroid Build Coastguard Worker           (find_option(a->name->value + 1) ||
558*5e7646d2SAndroid Build Coastguard Worker 	   !strcmp(a->name->value, "?ImageableArea") ||
559*5e7646d2SAndroid Build Coastguard Worker 	   !strcmp(a->name->value, "?PageRegion") ||
560*5e7646d2SAndroid Build Coastguard Worker 	   !strcmp(a->name->value, "?PageSize") ||
561*5e7646d2SAndroid Build Coastguard Worker 	   !strcmp(a->name->value, "?PaperDimension")))
562*5e7646d2SAndroid Build Coastguard Worker         continue;
563*5e7646d2SAndroid Build Coastguard Worker 
564*5e7646d2SAndroid Build Coastguard Worker       if (!strncmp(a->name->value, "Custom", 6) &&
565*5e7646d2SAndroid Build Coastguard Worker           find_option(a->name->value + 6))
566*5e7646d2SAndroid Build Coastguard Worker 	continue;
567*5e7646d2SAndroid Build Coastguard Worker 
568*5e7646d2SAndroid Build Coastguard Worker       if (!strncmp(a->name->value, "ParamCustom", 11) &&
569*5e7646d2SAndroid Build Coastguard Worker           find_option(a->name->value + 11))
570*5e7646d2SAndroid Build Coastguard Worker 	continue;
571*5e7646d2SAndroid Build Coastguard Worker 
572*5e7646d2SAndroid Build Coastguard Worker       if (!a->selector->value || !a->selector->value[0])
573*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*%s", a->name->value);
574*5e7646d2SAndroid Build Coastguard Worker       else if (!a->text->value || !a->text->value[0])
575*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*%s %s", a->name->value, a->selector->value);
576*5e7646d2SAndroid Build Coastguard Worker       else
577*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*%s %s/%s", a->name->value, a->selector->value,
578*5e7646d2SAndroid Build Coastguard Worker         	       a->text->value);
579*5e7646d2SAndroid Build Coastguard Worker 
580*5e7646d2SAndroid Build Coastguard Worker       if (strcmp(a->value->value, "False") &&
581*5e7646d2SAndroid Build Coastguard Worker           strcmp(a->value->value, "True") &&
582*5e7646d2SAndroid Build Coastguard Worker 	  strcmp(a->name->value, "1284Modes") &&
583*5e7646d2SAndroid Build Coastguard Worker 	  strcmp(a->name->value, "InkName") &&
584*5e7646d2SAndroid Build Coastguard Worker 	  strcmp(a->name->value, "PageStackOrder") &&
585*5e7646d2SAndroid Build Coastguard Worker 	  strncmp(a->name->value, "ParamCustom", 11) &&
586*5e7646d2SAndroid Build Coastguard Worker 	  strcmp(a->name->value, "Protocols") &&
587*5e7646d2SAndroid Build Coastguard Worker 	  strcmp(a->name->value, "ReferencePunch") &&
588*5e7646d2SAndroid Build Coastguard Worker 	  strncmp(a->name->value, "Default", 7))
589*5e7646d2SAndroid Build Coastguard Worker       {
590*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, ": \"%s\"%s", a->value->value, lf);
591*5e7646d2SAndroid Build Coastguard Worker 
592*5e7646d2SAndroid Build Coastguard Worker 	if (strchr(a->value->value, '\n') || strchr(a->value->value, '\r'))
593*5e7646d2SAndroid Build Coastguard Worker           cupsFilePrintf(fp, "*End%s", lf);
594*5e7646d2SAndroid Build Coastguard Worker       }
595*5e7646d2SAndroid Build Coastguard Worker       else
596*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, ": %s%s", a->value->value, lf);
597*5e7646d2SAndroid Build Coastguard Worker     }
598*5e7646d2SAndroid Build Coastguard Worker   }
599*5e7646d2SAndroid Build Coastguard Worker 
600*5e7646d2SAndroid Build Coastguard Worker   if (type != PPDC_DRIVER_PS || filters->count)
601*5e7646d2SAndroid Build Coastguard Worker   {
602*5e7646d2SAndroid Build Coastguard Worker     if ((a = find_attr("cupsVersion", NULL)) != NULL)
603*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*cupsVersion: %s%s", a->value->value, lf);
604*5e7646d2SAndroid Build Coastguard Worker     else
605*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*cupsVersion: %d.%d%s", CUPS_VERSION_MAJOR,
606*5e7646d2SAndroid Build Coastguard Worker 		     CUPS_VERSION_MINOR, lf);
607*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*cupsModelNumber: %d%s", model_number, lf);
608*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*cupsManualCopies: %s%s",
609*5e7646d2SAndroid Build Coastguard Worker                    manual_copies ? "True" : "False", lf);
610*5e7646d2SAndroid Build Coastguard Worker 
611*5e7646d2SAndroid Build Coastguard Worker     if (filters->count)
612*5e7646d2SAndroid Build Coastguard Worker     {
613*5e7646d2SAndroid Build Coastguard Worker       for (f = (ppdcFilter *)filters->first();
614*5e7646d2SAndroid Build Coastguard Worker            f;
615*5e7646d2SAndroid Build Coastguard Worker 	   f = (ppdcFilter *)filters->next())
616*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*cupsFilter: \"%s %d %s\"%s", f->mime_type->value,
617*5e7646d2SAndroid Build Coastguard Worker 	               f->cost, f->program->value, lf);
618*5e7646d2SAndroid Build Coastguard Worker     }
619*5e7646d2SAndroid Build Coastguard Worker     else
620*5e7646d2SAndroid Build Coastguard Worker     {
621*5e7646d2SAndroid Build Coastguard Worker       switch (type)
622*5e7646d2SAndroid Build Coastguard Worker       {
623*5e7646d2SAndroid Build Coastguard Worker         case PPDC_DRIVER_LABEL :
624*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "*cupsFilter: \"application/vnd.cups-raster 50 "
625*5e7646d2SAndroid Build Coastguard Worker 	        	     "rastertolabel\"%s", lf);
626*5e7646d2SAndroid Build Coastguard Worker 	    break;
627*5e7646d2SAndroid Build Coastguard Worker 
628*5e7646d2SAndroid Build Coastguard Worker         case PPDC_DRIVER_EPSON :
629*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "*cupsFilter: \"application/vnd.cups-raster 50 "
630*5e7646d2SAndroid Build Coastguard Worker 	        	     "rastertoepson\"%s", lf);
631*5e7646d2SAndroid Build Coastguard Worker 	    break;
632*5e7646d2SAndroid Build Coastguard Worker 
633*5e7646d2SAndroid Build Coastguard Worker         case PPDC_DRIVER_ESCP :
634*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "*cupsFilter: \"application/vnd.cups-command 50 "
635*5e7646d2SAndroid Build Coastguard Worker 	        	     "commandtoescpx\"%s", lf);
636*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "*cupsFilter: \"application/vnd.cups-raster 50 "
637*5e7646d2SAndroid Build Coastguard Worker 	        	     "rastertoescpx\"%s", lf);
638*5e7646d2SAndroid Build Coastguard Worker 	    break;
639*5e7646d2SAndroid Build Coastguard Worker 
640*5e7646d2SAndroid Build Coastguard Worker         case PPDC_DRIVER_HP :
641*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "*cupsFilter: \"application/vnd.cups-raster 50 "
642*5e7646d2SAndroid Build Coastguard Worker 	        	     "rastertohp\"%s", lf);
643*5e7646d2SAndroid Build Coastguard Worker 	    break;
644*5e7646d2SAndroid Build Coastguard Worker 
645*5e7646d2SAndroid Build Coastguard Worker         case PPDC_DRIVER_PCL :
646*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "*cupsFilter: \"application/vnd.cups-command 50 "
647*5e7646d2SAndroid Build Coastguard Worker 	        	     "commandtopclx\"%s", lf);
648*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "*cupsFilter: \"application/vnd.cups-raster 50 "
649*5e7646d2SAndroid Build Coastguard Worker 	        	     "rastertopclx\"%s", lf);
650*5e7646d2SAndroid Build Coastguard Worker 	    break;
651*5e7646d2SAndroid Build Coastguard Worker 
652*5e7646d2SAndroid Build Coastguard Worker 	default :
653*5e7646d2SAndroid Build Coastguard Worker 	    break;
654*5e7646d2SAndroid Build Coastguard Worker       }
655*5e7646d2SAndroid Build Coastguard Worker     }
656*5e7646d2SAndroid Build Coastguard Worker 
657*5e7646d2SAndroid Build Coastguard Worker     for (p = (ppdcProfile *)profiles->first();
658*5e7646d2SAndroid Build Coastguard Worker          p;
659*5e7646d2SAndroid Build Coastguard Worker 	 p = (ppdcProfile *)profiles->next())
660*5e7646d2SAndroid Build Coastguard Worker     {
661*5e7646d2SAndroid Build Coastguard Worker       char density[255], gamma[255], profile[9][255];
662*5e7646d2SAndroid Build Coastguard Worker 
663*5e7646d2SAndroid Build Coastguard Worker       _cupsStrFormatd(density, density + sizeof(density), p->density, loc);
664*5e7646d2SAndroid Build Coastguard Worker       _cupsStrFormatd(gamma, gamma + sizeof(gamma), p->gamma, loc);
665*5e7646d2SAndroid Build Coastguard Worker 
666*5e7646d2SAndroid Build Coastguard Worker       for (int i = 0; i < 9; i ++)
667*5e7646d2SAndroid Build Coastguard Worker 	_cupsStrFormatd(profile[i], profile[i] + sizeof(profile[0]),
668*5e7646d2SAndroid Build Coastguard Worker 	                p->profile[i], loc);
669*5e7646d2SAndroid Build Coastguard Worker 
670*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp,
671*5e7646d2SAndroid Build Coastguard Worker                      "*cupsColorProfile %s/%s: \"%s %s %s %s %s %s %s %s %s %s "
672*5e7646d2SAndroid Build Coastguard Worker 		     "%s\"%s", p->resolution->value, p->media_type->value,
673*5e7646d2SAndroid Build Coastguard Worker 		     density, gamma, profile[0], profile[1], profile[2],
674*5e7646d2SAndroid Build Coastguard Worker 		     profile[3], profile[4], profile[5], profile[6], profile[7],
675*5e7646d2SAndroid Build Coastguard Worker 		     profile[8], lf);
676*5e7646d2SAndroid Build Coastguard Worker     }
677*5e7646d2SAndroid Build Coastguard Worker   }
678*5e7646d2SAndroid Build Coastguard Worker 
679*5e7646d2SAndroid Build Coastguard Worker   if (locales)
680*5e7646d2SAndroid Build Coastguard Worker   {
681*5e7646d2SAndroid Build Coastguard Worker     // Add localizations for additional languages...
682*5e7646d2SAndroid Build Coastguard Worker     ppdcString	*locale;		// Locale name
683*5e7646d2SAndroid Build Coastguard Worker     ppdcCatalog	*locatalog;		// Message catalog for locale
684*5e7646d2SAndroid Build Coastguard Worker 
685*5e7646d2SAndroid Build Coastguard Worker 
686*5e7646d2SAndroid Build Coastguard Worker     // Write the list of languages...
687*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*cupsLanguages: \"en");
688*5e7646d2SAndroid Build Coastguard Worker 
689*5e7646d2SAndroid Build Coastguard Worker     for (locale = (ppdcString *)locales->first();
690*5e7646d2SAndroid Build Coastguard Worker          locale;
691*5e7646d2SAndroid Build Coastguard Worker 	 locale = (ppdcString *)locales->next())
692*5e7646d2SAndroid Build Coastguard Worker     {
693*5e7646d2SAndroid Build Coastguard Worker       // Skip (US) English...
694*5e7646d2SAndroid Build Coastguard Worker       if (!strcmp(locale->value, "en") || !strcmp(locale->value, "en_US"))
695*5e7646d2SAndroid Build Coastguard Worker         continue;
696*5e7646d2SAndroid Build Coastguard Worker 
697*5e7646d2SAndroid Build Coastguard Worker       // See if we have a po file for this language...
698*5e7646d2SAndroid Build Coastguard Worker       if (!src->find_po(locale->value))
699*5e7646d2SAndroid Build Coastguard Worker       {
700*5e7646d2SAndroid Build Coastguard Worker         // No, see if we can use the base file?
701*5e7646d2SAndroid Build Coastguard Worker         locatalog = new ppdcCatalog(locale->value);
702*5e7646d2SAndroid Build Coastguard Worker 
703*5e7646d2SAndroid Build Coastguard Worker 	if (locatalog->messages->count == 0)
704*5e7646d2SAndroid Build Coastguard Worker 	{
705*5e7646d2SAndroid Build Coastguard Worker 	  // No, skip this one...
706*5e7646d2SAndroid Build Coastguard Worker           _cupsLangPrintf(stderr,
707*5e7646d2SAndroid Build Coastguard Worker 	                  _("ppdc: No message catalog provided for locale "
708*5e7646d2SAndroid Build Coastguard Worker 			    "%s."), locale->value);
709*5e7646d2SAndroid Build Coastguard Worker           delete locatalog;
710*5e7646d2SAndroid Build Coastguard Worker           continue;
711*5e7646d2SAndroid Build Coastguard Worker 	}
712*5e7646d2SAndroid Build Coastguard Worker 
713*5e7646d2SAndroid Build Coastguard Worker         // Add the base file to the list...
714*5e7646d2SAndroid Build Coastguard Worker 	src->po_files->add(locatalog);
715*5e7646d2SAndroid Build Coastguard Worker       }
716*5e7646d2SAndroid Build Coastguard Worker 
717*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, " %s", locale->value);
718*5e7646d2SAndroid Build Coastguard Worker     }
719*5e7646d2SAndroid Build Coastguard Worker 
720*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "\"%s", lf);
721*5e7646d2SAndroid Build Coastguard Worker   }
722*5e7646d2SAndroid Build Coastguard Worker 
723*5e7646d2SAndroid Build Coastguard Worker   for (cn = (ppdcConstraint *)constraints->first();
724*5e7646d2SAndroid Build Coastguard Worker        cn;
725*5e7646d2SAndroid Build Coastguard Worker        cn = (ppdcConstraint *)constraints->next())
726*5e7646d2SAndroid Build Coastguard Worker   {
727*5e7646d2SAndroid Build Coastguard Worker     // First constrain 1 against 2...
728*5e7646d2SAndroid Build Coastguard Worker     if (!strncmp(cn->option1->value, "*Custom", 7) ||
729*5e7646d2SAndroid Build Coastguard Worker         !strncmp(cn->option2->value, "*Custom", 7))
730*5e7646d2SAndroid Build Coastguard Worker       cupsFilePuts(fp, "*NonUIConstraints: ");
731*5e7646d2SAndroid Build Coastguard Worker     else
732*5e7646d2SAndroid Build Coastguard Worker       cupsFilePuts(fp, "*UIConstraints: ");
733*5e7646d2SAndroid Build Coastguard Worker 
734*5e7646d2SAndroid Build Coastguard Worker     if (cn->option1->value[0] != '*')
735*5e7646d2SAndroid Build Coastguard Worker       cupsFilePutChar(fp, '*');
736*5e7646d2SAndroid Build Coastguard Worker 
737*5e7646d2SAndroid Build Coastguard Worker     cupsFilePuts(fp, cn->option1->value);
738*5e7646d2SAndroid Build Coastguard Worker 
739*5e7646d2SAndroid Build Coastguard Worker     if (cn->choice1->value)
740*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, " %s", cn->choice1->value);
741*5e7646d2SAndroid Build Coastguard Worker 
742*5e7646d2SAndroid Build Coastguard Worker     cupsFilePutChar(fp, ' ');
743*5e7646d2SAndroid Build Coastguard Worker 
744*5e7646d2SAndroid Build Coastguard Worker     if (cn->option2->value[0] != '*')
745*5e7646d2SAndroid Build Coastguard Worker       cupsFilePutChar(fp, '*');
746*5e7646d2SAndroid Build Coastguard Worker 
747*5e7646d2SAndroid Build Coastguard Worker     cupsFilePuts(fp, cn->option2->value);
748*5e7646d2SAndroid Build Coastguard Worker 
749*5e7646d2SAndroid Build Coastguard Worker     if (cn->choice2->value)
750*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, " %s", cn->choice2->value);
751*5e7646d2SAndroid Build Coastguard Worker 
752*5e7646d2SAndroid Build Coastguard Worker     cupsFilePuts(fp, lf);
753*5e7646d2SAndroid Build Coastguard Worker 
754*5e7646d2SAndroid Build Coastguard Worker     // Then constrain 2 against 1...
755*5e7646d2SAndroid Build Coastguard Worker     if (!strncmp(cn->option1->value, "*Custom", 7) ||
756*5e7646d2SAndroid Build Coastguard Worker         !strncmp(cn->option2->value, "*Custom", 7))
757*5e7646d2SAndroid Build Coastguard Worker       cupsFilePuts(fp, "*NonUIConstraints: ");
758*5e7646d2SAndroid Build Coastguard Worker     else
759*5e7646d2SAndroid Build Coastguard Worker       cupsFilePuts(fp, "*UIConstraints: ");
760*5e7646d2SAndroid Build Coastguard Worker 
761*5e7646d2SAndroid Build Coastguard Worker     if (cn->option2->value[0] != '*')
762*5e7646d2SAndroid Build Coastguard Worker       cupsFilePutChar(fp, '*');
763*5e7646d2SAndroid Build Coastguard Worker 
764*5e7646d2SAndroid Build Coastguard Worker     cupsFilePuts(fp, cn->option2->value);
765*5e7646d2SAndroid Build Coastguard Worker 
766*5e7646d2SAndroid Build Coastguard Worker     if (cn->choice2->value)
767*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, " %s", cn->choice2->value);
768*5e7646d2SAndroid Build Coastguard Worker 
769*5e7646d2SAndroid Build Coastguard Worker     cupsFilePutChar(fp, ' ');
770*5e7646d2SAndroid Build Coastguard Worker 
771*5e7646d2SAndroid Build Coastguard Worker     if (cn->option1->value[0] != '*')
772*5e7646d2SAndroid Build Coastguard Worker       cupsFilePutChar(fp, '*');
773*5e7646d2SAndroid Build Coastguard Worker 
774*5e7646d2SAndroid Build Coastguard Worker     cupsFilePuts(fp, cn->option1->value);
775*5e7646d2SAndroid Build Coastguard Worker 
776*5e7646d2SAndroid Build Coastguard Worker     if (cn->choice1->value)
777*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, " %s", cn->choice1->value);
778*5e7646d2SAndroid Build Coastguard Worker 
779*5e7646d2SAndroid Build Coastguard Worker     cupsFilePuts(fp, lf);
780*5e7646d2SAndroid Build Coastguard Worker   }
781*5e7646d2SAndroid Build Coastguard Worker 
782*5e7646d2SAndroid Build Coastguard Worker   // PageSize option...
783*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*OpenUI *PageSize/Media Size: PickOne%s", lf);
784*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*OrderDependency: 10 AnySetup *PageSize%s", lf);
785*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*DefaultPageSize: %s%s",
786*5e7646d2SAndroid Build Coastguard Worker                  default_size ? default_size->value : "Letter", lf);
787*5e7646d2SAndroid Build Coastguard Worker 
788*5e7646d2SAndroid Build Coastguard Worker   for (m = (ppdcMediaSize *)sizes->first();
789*5e7646d2SAndroid Build Coastguard Worker        m;
790*5e7646d2SAndroid Build Coastguard Worker        m = (ppdcMediaSize *)sizes->next())
791*5e7646d2SAndroid Build Coastguard Worker     if (m->size_code->value)
792*5e7646d2SAndroid Build Coastguard Worker     {
793*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*PageSize %s/%s: \"%s\"%s",
794*5e7646d2SAndroid Build Coastguard Worker         	     m->name->value, catalog->find_message(m->text->value),
795*5e7646d2SAndroid Build Coastguard Worker 		     m->size_code->value, lf);
796*5e7646d2SAndroid Build Coastguard Worker 
797*5e7646d2SAndroid Build Coastguard Worker       if (strchr(m->size_code->value, '\n') ||
798*5e7646d2SAndroid Build Coastguard Worker           strchr(m->size_code->value, '\r'))
799*5e7646d2SAndroid Build Coastguard Worker         cupsFilePrintf(fp, "*End%s", lf);
800*5e7646d2SAndroid Build Coastguard Worker     }
801*5e7646d2SAndroid Build Coastguard Worker     else
802*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp,
803*5e7646d2SAndroid Build Coastguard Worker                      "*PageSize %s/%s: \"<</PageSize[%.0f %.0f]"
804*5e7646d2SAndroid Build Coastguard Worker 		     "/ImagingBBox null>>setpagedevice\"%s",
805*5e7646d2SAndroid Build Coastguard Worker         	     m->name->value, catalog->find_message(m->text->value),
806*5e7646d2SAndroid Build Coastguard Worker 		     m->width, m->length, lf);
807*5e7646d2SAndroid Build Coastguard Worker 
808*5e7646d2SAndroid Build Coastguard Worker   if ((a = find_attr("?PageSize", NULL)) != NULL)
809*5e7646d2SAndroid Build Coastguard Worker   {
810*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*?PageSize: \"%s\"%s", a->value->value, lf);
811*5e7646d2SAndroid Build Coastguard Worker 
812*5e7646d2SAndroid Build Coastguard Worker     if (strchr(a->value->value, '\n') ||
813*5e7646d2SAndroid Build Coastguard Worker         strchr(a->value->value, '\r'))
814*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*End%s", lf);
815*5e7646d2SAndroid Build Coastguard Worker   }
816*5e7646d2SAndroid Build Coastguard Worker 
817*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*CloseUI: *PageSize%s", lf);
818*5e7646d2SAndroid Build Coastguard Worker 
819*5e7646d2SAndroid Build Coastguard Worker   // PageRegion option...
820*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*OpenUI *PageRegion/Media Size: PickOne%s", lf);
821*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*OrderDependency: 10 AnySetup *PageRegion%s", lf);
822*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*DefaultPageRegion: %s%s",
823*5e7646d2SAndroid Build Coastguard Worker                  default_size ? default_size->value : "Letter", lf);
824*5e7646d2SAndroid Build Coastguard Worker 
825*5e7646d2SAndroid Build Coastguard Worker   for (m = (ppdcMediaSize *)sizes->first();
826*5e7646d2SAndroid Build Coastguard Worker        m;
827*5e7646d2SAndroid Build Coastguard Worker        m = (ppdcMediaSize *)sizes->next())
828*5e7646d2SAndroid Build Coastguard Worker     if (m->region_code->value)
829*5e7646d2SAndroid Build Coastguard Worker     {
830*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*PageRegion %s/%s: \"%s\"%s",
831*5e7646d2SAndroid Build Coastguard Worker         	     m->name->value, catalog->find_message(m->text->value),
832*5e7646d2SAndroid Build Coastguard Worker 		     m->region_code->value, lf);
833*5e7646d2SAndroid Build Coastguard Worker 
834*5e7646d2SAndroid Build Coastguard Worker       if (strchr(m->region_code->value, '\n') ||
835*5e7646d2SAndroid Build Coastguard Worker           strchr(m->region_code->value, '\r'))
836*5e7646d2SAndroid Build Coastguard Worker         cupsFilePrintf(fp, "*End%s", lf);
837*5e7646d2SAndroid Build Coastguard Worker     }
838*5e7646d2SAndroid Build Coastguard Worker     else
839*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp,
840*5e7646d2SAndroid Build Coastguard Worker                      "*PageRegion %s/%s: \"<</PageSize[%.0f %.0f]"
841*5e7646d2SAndroid Build Coastguard Worker 		     "/ImagingBBox null>>setpagedevice\"%s",
842*5e7646d2SAndroid Build Coastguard Worker         	     m->name->value, catalog->find_message(m->text->value),
843*5e7646d2SAndroid Build Coastguard Worker 		     m->width, m->length, lf);
844*5e7646d2SAndroid Build Coastguard Worker 
845*5e7646d2SAndroid Build Coastguard Worker   if ((a = find_attr("?PageRegion", NULL)) != NULL)
846*5e7646d2SAndroid Build Coastguard Worker   {
847*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*?PageRegion: \"%s\"%s", a->value->value, lf);
848*5e7646d2SAndroid Build Coastguard Worker 
849*5e7646d2SAndroid Build Coastguard Worker     if (strchr(a->value->value, '\n') ||
850*5e7646d2SAndroid Build Coastguard Worker         strchr(a->value->value, '\r'))
851*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*End%s", lf);
852*5e7646d2SAndroid Build Coastguard Worker   }
853*5e7646d2SAndroid Build Coastguard Worker 
854*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*CloseUI: *PageRegion%s", lf);
855*5e7646d2SAndroid Build Coastguard Worker 
856*5e7646d2SAndroid Build Coastguard Worker   // ImageableArea info...
857*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*DefaultImageableArea: %s%s",
858*5e7646d2SAndroid Build Coastguard Worker                  default_size ? default_size->value : "Letter", lf);
859*5e7646d2SAndroid Build Coastguard Worker 
860*5e7646d2SAndroid Build Coastguard Worker   char left[255], right[255], bottom[255], top[255];
861*5e7646d2SAndroid Build Coastguard Worker 
862*5e7646d2SAndroid Build Coastguard Worker   for (m = (ppdcMediaSize *)sizes->first();
863*5e7646d2SAndroid Build Coastguard Worker        m;
864*5e7646d2SAndroid Build Coastguard Worker        m = (ppdcMediaSize *)sizes->next())
865*5e7646d2SAndroid Build Coastguard Worker   {
866*5e7646d2SAndroid Build Coastguard Worker     _cupsStrFormatd(left, left + sizeof(left), m->left, loc);
867*5e7646d2SAndroid Build Coastguard Worker     _cupsStrFormatd(bottom, bottom + sizeof(bottom), m->bottom, loc);
868*5e7646d2SAndroid Build Coastguard Worker     _cupsStrFormatd(right, right + sizeof(right), m->width - m->right, loc);
869*5e7646d2SAndroid Build Coastguard Worker     _cupsStrFormatd(top, top + sizeof(top), m->length - m->top, loc);
870*5e7646d2SAndroid Build Coastguard Worker 
871*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*ImageableArea %s/%s: \"%s %s %s %s\"%s",
872*5e7646d2SAndroid Build Coastguard Worker                    m->name->value, catalog->find_message(m->text->value),
873*5e7646d2SAndroid Build Coastguard Worker 		   left, bottom, right, top, lf);
874*5e7646d2SAndroid Build Coastguard Worker   }
875*5e7646d2SAndroid Build Coastguard Worker 
876*5e7646d2SAndroid Build Coastguard Worker   if ((a = find_attr("?ImageableArea", NULL)) != NULL)
877*5e7646d2SAndroid Build Coastguard Worker   {
878*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*?ImageableArea: \"%s\"%s", a->value->value, lf);
879*5e7646d2SAndroid Build Coastguard Worker 
880*5e7646d2SAndroid Build Coastguard Worker     if (strchr(a->value->value, '\n') ||
881*5e7646d2SAndroid Build Coastguard Worker         strchr(a->value->value, '\r'))
882*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*End%s", lf);
883*5e7646d2SAndroid Build Coastguard Worker   }
884*5e7646d2SAndroid Build Coastguard Worker 
885*5e7646d2SAndroid Build Coastguard Worker   // PaperDimension info...
886*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*DefaultPaperDimension: %s%s",
887*5e7646d2SAndroid Build Coastguard Worker                  default_size ? default_size->value : "Letter", lf);
888*5e7646d2SAndroid Build Coastguard Worker 
889*5e7646d2SAndroid Build Coastguard Worker   char width[255], length[255];
890*5e7646d2SAndroid Build Coastguard Worker 
891*5e7646d2SAndroid Build Coastguard Worker   for (m = (ppdcMediaSize *)sizes->first();
892*5e7646d2SAndroid Build Coastguard Worker        m;
893*5e7646d2SAndroid Build Coastguard Worker        m = (ppdcMediaSize *)sizes->next())
894*5e7646d2SAndroid Build Coastguard Worker   {
895*5e7646d2SAndroid Build Coastguard Worker     _cupsStrFormatd(width, width + sizeof(width), m->width, loc);
896*5e7646d2SAndroid Build Coastguard Worker     _cupsStrFormatd(length, length + sizeof(length), m->length, loc);
897*5e7646d2SAndroid Build Coastguard Worker 
898*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*PaperDimension %s/%s: \"%s %s\"%s",
899*5e7646d2SAndroid Build Coastguard Worker                    m->name->value, catalog->find_message(m->text->value),
900*5e7646d2SAndroid Build Coastguard Worker 		   width, length, lf);
901*5e7646d2SAndroid Build Coastguard Worker   }
902*5e7646d2SAndroid Build Coastguard Worker 
903*5e7646d2SAndroid Build Coastguard Worker   if ((a = find_attr("?PaperDimension", NULL)) != NULL)
904*5e7646d2SAndroid Build Coastguard Worker   {
905*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*?PaperDimension: \"%s\"%s", a->value->value, lf);
906*5e7646d2SAndroid Build Coastguard Worker 
907*5e7646d2SAndroid Build Coastguard Worker     if (strchr(a->value->value, '\n') ||
908*5e7646d2SAndroid Build Coastguard Worker         strchr(a->value->value, '\r'))
909*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*End%s", lf);
910*5e7646d2SAndroid Build Coastguard Worker   }
911*5e7646d2SAndroid Build Coastguard Worker 
912*5e7646d2SAndroid Build Coastguard Worker   // Custom size support...
913*5e7646d2SAndroid Build Coastguard Worker   if (variable_paper_size)
914*5e7646d2SAndroid Build Coastguard Worker   {
915*5e7646d2SAndroid Build Coastguard Worker     _cupsStrFormatd(width, width + sizeof(width), max_width, loc);
916*5e7646d2SAndroid Build Coastguard Worker     _cupsStrFormatd(length, length + sizeof(length), max_length, loc);
917*5e7646d2SAndroid Build Coastguard Worker 
918*5e7646d2SAndroid Build Coastguard Worker     _cupsStrFormatd(left, left + sizeof(left), left_margin, loc);
919*5e7646d2SAndroid Build Coastguard Worker     _cupsStrFormatd(bottom, bottom + sizeof(bottom), bottom_margin, loc);
920*5e7646d2SAndroid Build Coastguard Worker     _cupsStrFormatd(right, right + sizeof(right), right_margin, loc);
921*5e7646d2SAndroid Build Coastguard Worker     _cupsStrFormatd(top, top + sizeof(top), top_margin, loc);
922*5e7646d2SAndroid Build Coastguard Worker 
923*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*MaxMediaWidth: \"%s\"%s", width, lf);
924*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*MaxMediaHeight: \"%s\"%s", length, lf);
925*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*HWMargins: %s %s %s %s%s", left, bottom, right, top,
926*5e7646d2SAndroid Build Coastguard Worker                    lf);
927*5e7646d2SAndroid Build Coastguard Worker 
928*5e7646d2SAndroid Build Coastguard Worker     if (custom_size_code && custom_size_code->value)
929*5e7646d2SAndroid Build Coastguard Worker     {
930*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*CustomPageSize True: \"%s\"%s",
931*5e7646d2SAndroid Build Coastguard Worker                      custom_size_code->value, lf);
932*5e7646d2SAndroid Build Coastguard Worker 
933*5e7646d2SAndroid Build Coastguard Worker       if (strchr(custom_size_code->value, '\n') ||
934*5e7646d2SAndroid Build Coastguard Worker           strchr(custom_size_code->value, '\r'))
935*5e7646d2SAndroid Build Coastguard Worker         cupsFilePrintf(fp, "*End%s", lf);
936*5e7646d2SAndroid Build Coastguard Worker     }
937*5e7646d2SAndroid Build Coastguard Worker     else
938*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp,
939*5e7646d2SAndroid Build Coastguard Worker 		     "*CustomPageSize True: \"pop pop pop <</PageSize[5 -2 roll]"
940*5e7646d2SAndroid Build Coastguard Worker 		     "/ImagingBBox null>>setpagedevice\"%s", lf);
941*5e7646d2SAndroid Build Coastguard Worker 
942*5e7646d2SAndroid Build Coastguard Worker     if ((a = find_attr("ParamCustomPageSize", "Width")) != NULL)
943*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*ParamCustomPageSize Width: %s%s", a->value->value,
944*5e7646d2SAndroid Build Coastguard Worker 		     lf);
945*5e7646d2SAndroid Build Coastguard Worker     else
946*5e7646d2SAndroid Build Coastguard Worker     {
947*5e7646d2SAndroid Build Coastguard Worker       char width0[255];
948*5e7646d2SAndroid Build Coastguard Worker 
949*5e7646d2SAndroid Build Coastguard Worker       _cupsStrFormatd(width0, width0 + sizeof(width0), min_width, loc);
950*5e7646d2SAndroid Build Coastguard Worker       _cupsStrFormatd(width, width + sizeof(width), max_width, loc);
951*5e7646d2SAndroid Build Coastguard Worker 
952*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*ParamCustomPageSize Width: 1 points %s %s%s",
953*5e7646d2SAndroid Build Coastguard Worker                      width0, width, lf);
954*5e7646d2SAndroid Build Coastguard Worker     }
955*5e7646d2SAndroid Build Coastguard Worker 
956*5e7646d2SAndroid Build Coastguard Worker     if ((a = find_attr("ParamCustomPageSize", "Height")) != NULL)
957*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*ParamCustomPageSize Height: %s%s", a->value->value,
958*5e7646d2SAndroid Build Coastguard Worker 		     lf);
959*5e7646d2SAndroid Build Coastguard Worker     else
960*5e7646d2SAndroid Build Coastguard Worker     {
961*5e7646d2SAndroid Build Coastguard Worker       char length0[255];
962*5e7646d2SAndroid Build Coastguard Worker 
963*5e7646d2SAndroid Build Coastguard Worker       _cupsStrFormatd(length0, length0 + sizeof(length0), min_length, loc);
964*5e7646d2SAndroid Build Coastguard Worker       _cupsStrFormatd(length, length + sizeof(length), max_length, loc);
965*5e7646d2SAndroid Build Coastguard Worker 
966*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*ParamCustomPageSize Height: 2 points %s %s%s",
967*5e7646d2SAndroid Build Coastguard Worker                      length0, length, lf);
968*5e7646d2SAndroid Build Coastguard Worker     }
969*5e7646d2SAndroid Build Coastguard Worker 
970*5e7646d2SAndroid Build Coastguard Worker     if ((a = find_attr("ParamCustomPageSize", "WidthOffset")) != NULL)
971*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*ParamCustomPageSize WidthOffset: %s%s",
972*5e7646d2SAndroid Build Coastguard Worker                      a->value->value, lf);
973*5e7646d2SAndroid Build Coastguard Worker     else
974*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*ParamCustomPageSize WidthOffset: 3 points 0 0%s", lf);
975*5e7646d2SAndroid Build Coastguard Worker 
976*5e7646d2SAndroid Build Coastguard Worker     if ((a = find_attr("ParamCustomPageSize", "HeightOffset")) != NULL)
977*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*ParamCustomPageSize HeightOffset: %s%s",
978*5e7646d2SAndroid Build Coastguard Worker                      a->value->value, lf);
979*5e7646d2SAndroid Build Coastguard Worker     else
980*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*ParamCustomPageSize HeightOffset: 4 points 0 0%s", lf);
981*5e7646d2SAndroid Build Coastguard Worker 
982*5e7646d2SAndroid Build Coastguard Worker     if ((a = find_attr("ParamCustomPageSize", "Orientation")) != NULL)
983*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*ParamCustomPageSize Orientation: %s%s",
984*5e7646d2SAndroid Build Coastguard Worker                      a->value->value, lf);
985*5e7646d2SAndroid Build Coastguard Worker     else
986*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*ParamCustomPageSize Orientation: 5 int 0 0%s", lf);
987*5e7646d2SAndroid Build Coastguard Worker   }
988*5e7646d2SAndroid Build Coastguard Worker 
989*5e7646d2SAndroid Build Coastguard Worker   // All other options...
990*5e7646d2SAndroid Build Coastguard Worker   for (g = (ppdcGroup *)groups->first(); g; g = (ppdcGroup *)groups->next())
991*5e7646d2SAndroid Build Coastguard Worker   {
992*5e7646d2SAndroid Build Coastguard Worker     if (!g->options->count)
993*5e7646d2SAndroid Build Coastguard Worker       continue;
994*5e7646d2SAndroid Build Coastguard Worker 
995*5e7646d2SAndroid Build Coastguard Worker     if (_cups_strcasecmp(g->name->value, "General"))
996*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*OpenGroup: %s/%s%s", g->name->value,
997*5e7646d2SAndroid Build Coastguard Worker                      catalog->find_message(g->text->value), lf);
998*5e7646d2SAndroid Build Coastguard Worker 
999*5e7646d2SAndroid Build Coastguard Worker     for (o = (ppdcOption *)g->options->first();
1000*5e7646d2SAndroid Build Coastguard Worker          o;
1001*5e7646d2SAndroid Build Coastguard Worker 	 o = (ppdcOption *)g->options->next())
1002*5e7646d2SAndroid Build Coastguard Worker     {
1003*5e7646d2SAndroid Build Coastguard Worker       if (!o->choices->count)
1004*5e7646d2SAndroid Build Coastguard Worker         continue;
1005*5e7646d2SAndroid Build Coastguard Worker 
1006*5e7646d2SAndroid Build Coastguard Worker       if (o->section == PPDC_SECTION_JCL)
1007*5e7646d2SAndroid Build Coastguard Worker       {
1008*5e7646d2SAndroid Build Coastguard Worker 	if (!o->text->value)
1009*5e7646d2SAndroid Build Coastguard Worker 	  cupsFilePrintf(fp, "*JCLOpenUI *%s/%s: ", o->name->value,
1010*5e7646d2SAndroid Build Coastguard Worker 			 catalog->find_message(o->name->value));
1011*5e7646d2SAndroid Build Coastguard Worker 	else
1012*5e7646d2SAndroid Build Coastguard Worker 	  cupsFilePrintf(fp, "*JCLOpenUI *%s/%s: ", o->name->value,
1013*5e7646d2SAndroid Build Coastguard Worker 			 catalog->find_message(o->text->value));
1014*5e7646d2SAndroid Build Coastguard Worker       }
1015*5e7646d2SAndroid Build Coastguard Worker       else if (!o->text->value)
1016*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*OpenUI *%s/%s: ", o->name->value,
1017*5e7646d2SAndroid Build Coastguard Worker 	               catalog->find_message(o->name->value));
1018*5e7646d2SAndroid Build Coastguard Worker       else
1019*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*OpenUI *%s/%s: ", o->name->value,
1020*5e7646d2SAndroid Build Coastguard Worker 	               catalog->find_message(o->text->value));
1021*5e7646d2SAndroid Build Coastguard Worker 
1022*5e7646d2SAndroid Build Coastguard Worker       switch (o->type)
1023*5e7646d2SAndroid Build Coastguard Worker       {
1024*5e7646d2SAndroid Build Coastguard Worker         case PPDC_BOOLEAN :
1025*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "Boolean%s", lf);
1026*5e7646d2SAndroid Build Coastguard Worker 	    break;
1027*5e7646d2SAndroid Build Coastguard Worker         default :
1028*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "PickOne%s", lf);
1029*5e7646d2SAndroid Build Coastguard Worker 	    break;
1030*5e7646d2SAndroid Build Coastguard Worker         case PPDC_PICKMANY :
1031*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "PickMany%s", lf);
1032*5e7646d2SAndroid Build Coastguard Worker 	    break;
1033*5e7646d2SAndroid Build Coastguard Worker       }
1034*5e7646d2SAndroid Build Coastguard Worker 
1035*5e7646d2SAndroid Build Coastguard Worker       char order[255];
1036*5e7646d2SAndroid Build Coastguard Worker       _cupsStrFormatd(order, order + sizeof(order), o->order, loc);
1037*5e7646d2SAndroid Build Coastguard Worker 
1038*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*OrderDependency: %s ", order);
1039*5e7646d2SAndroid Build Coastguard Worker       switch (o->section)
1040*5e7646d2SAndroid Build Coastguard Worker       {
1041*5e7646d2SAndroid Build Coastguard Worker         default :
1042*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "AnySetup");
1043*5e7646d2SAndroid Build Coastguard Worker 	    break;
1044*5e7646d2SAndroid Build Coastguard Worker         case PPDC_SECTION_DOCUMENT :
1045*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "DocumentSetup");
1046*5e7646d2SAndroid Build Coastguard Worker 	    break;
1047*5e7646d2SAndroid Build Coastguard Worker         case PPDC_SECTION_EXIT :
1048*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "ExitServer");
1049*5e7646d2SAndroid Build Coastguard Worker 	    break;
1050*5e7646d2SAndroid Build Coastguard Worker         case PPDC_SECTION_JCL :
1051*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "JCLSetup");
1052*5e7646d2SAndroid Build Coastguard Worker 	    break;
1053*5e7646d2SAndroid Build Coastguard Worker         case PPDC_SECTION_PAGE :
1054*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "PageSetup");
1055*5e7646d2SAndroid Build Coastguard Worker 	    break;
1056*5e7646d2SAndroid Build Coastguard Worker         case PPDC_SECTION_PROLOG :
1057*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "Prolog");
1058*5e7646d2SAndroid Build Coastguard Worker 	    break;
1059*5e7646d2SAndroid Build Coastguard Worker       }
1060*5e7646d2SAndroid Build Coastguard Worker 
1061*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, " *%s%s", o->name->value, lf);
1062*5e7646d2SAndroid Build Coastguard Worker 
1063*5e7646d2SAndroid Build Coastguard Worker       if (o->defchoice)
1064*5e7646d2SAndroid Build Coastguard Worker       {
1065*5e7646d2SAndroid Build Coastguard Worker         // Use the programmer-supplied default...
1066*5e7646d2SAndroid Build Coastguard Worker         cupsFilePrintf(fp, "*Default%s: %s%s", o->name->value,
1067*5e7646d2SAndroid Build Coastguard Worker 	               o->defchoice->value, lf);
1068*5e7646d2SAndroid Build Coastguard Worker       }
1069*5e7646d2SAndroid Build Coastguard Worker       else
1070*5e7646d2SAndroid Build Coastguard Worker       {
1071*5e7646d2SAndroid Build Coastguard Worker         // Make the first choice the default...
1072*5e7646d2SAndroid Build Coastguard Worker         c = (ppdcChoice *)o->choices->first();
1073*5e7646d2SAndroid Build Coastguard Worker         cupsFilePrintf(fp, "*Default%s: %s%s", o->name->value, c->name->value,
1074*5e7646d2SAndroid Build Coastguard Worker 		       lf);
1075*5e7646d2SAndroid Build Coastguard Worker       }
1076*5e7646d2SAndroid Build Coastguard Worker 
1077*5e7646d2SAndroid Build Coastguard Worker       for (c = (ppdcChoice *)o->choices->first();
1078*5e7646d2SAndroid Build Coastguard Worker            c;
1079*5e7646d2SAndroid Build Coastguard Worker 	   c = (ppdcChoice *)o->choices->next())
1080*5e7646d2SAndroid Build Coastguard Worker       {
1081*5e7646d2SAndroid Build Coastguard Worker         // Write this choice...
1082*5e7646d2SAndroid Build Coastguard Worker 	if (!c->text->value)
1083*5e7646d2SAndroid Build Coastguard Worker           cupsFilePrintf(fp, "*%s %s/%s: \"%s\"%s", o->name->value,
1084*5e7646d2SAndroid Build Coastguard Worker                          c->name->value, catalog->find_message(c->name->value),
1085*5e7646d2SAndroid Build Coastguard Worker 	        	 c->code->value, lf);
1086*5e7646d2SAndroid Build Coastguard Worker         else
1087*5e7646d2SAndroid Build Coastguard Worker           cupsFilePrintf(fp, "*%s %s/%s: \"%s\"%s", o->name->value,
1088*5e7646d2SAndroid Build Coastguard Worker 	                 c->name->value, catalog->find_message(c->text->value),
1089*5e7646d2SAndroid Build Coastguard Worker 			 c->code->value, lf);
1090*5e7646d2SAndroid Build Coastguard Worker 
1091*5e7646d2SAndroid Build Coastguard Worker 	// Multi-line commands need a *End line to terminate them.
1092*5e7646d2SAndroid Build Coastguard Worker         if (strchr(c->code->value, '\n') ||
1093*5e7646d2SAndroid Build Coastguard Worker 	    strchr(c->code->value, '\r'))
1094*5e7646d2SAndroid Build Coastguard Worker 	  cupsFilePrintf(fp, "*End%s", lf);
1095*5e7646d2SAndroid Build Coastguard Worker       }
1096*5e7646d2SAndroid Build Coastguard Worker 
1097*5e7646d2SAndroid Build Coastguard Worker       snprintf(query, sizeof(query), "?%s", o->name->value);
1098*5e7646d2SAndroid Build Coastguard Worker 
1099*5e7646d2SAndroid Build Coastguard Worker       if ((a = find_attr(query, NULL)) != NULL)
1100*5e7646d2SAndroid Build Coastguard Worker       {
1101*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*%s: \"%s\"%s", query, a->value->value, lf);
1102*5e7646d2SAndroid Build Coastguard Worker 
1103*5e7646d2SAndroid Build Coastguard Worker 	if (strchr(a->value->value, '\n') ||
1104*5e7646d2SAndroid Build Coastguard Worker             strchr(a->value->value, '\r'))
1105*5e7646d2SAndroid Build Coastguard Worker 	  cupsFilePrintf(fp, "*End%s", lf);
1106*5e7646d2SAndroid Build Coastguard Worker       }
1107*5e7646d2SAndroid Build Coastguard Worker 
1108*5e7646d2SAndroid Build Coastguard Worker       if (o->section == PPDC_SECTION_JCL)
1109*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*JCLCloseUI: *%s%s", o->name->value, lf);
1110*5e7646d2SAndroid Build Coastguard Worker       else
1111*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*CloseUI: *%s%s", o->name->value, lf);
1112*5e7646d2SAndroid Build Coastguard Worker 
1113*5e7646d2SAndroid Build Coastguard Worker       snprintf(custom, sizeof(custom), "Custom%s", o->name->value);
1114*5e7646d2SAndroid Build Coastguard Worker       if ((a = find_attr(custom, "True")) != NULL)
1115*5e7646d2SAndroid Build Coastguard Worker       {
1116*5e7646d2SAndroid Build Coastguard Worker         // Output custom option information...
1117*5e7646d2SAndroid Build Coastguard Worker         cupsFilePrintf(fp, "*%s True: \"%s\"%s", custom, a->value->value, lf);
1118*5e7646d2SAndroid Build Coastguard Worker 	if (strchr(a->value->value, '\n') || strchr(a->value->value, '\r'))
1119*5e7646d2SAndroid Build Coastguard Worker 	  cupsFilePrintf(fp, "*End%s", lf);
1120*5e7646d2SAndroid Build Coastguard Worker 
1121*5e7646d2SAndroid Build Coastguard Worker         snprintf(custom, sizeof(custom), "ParamCustom%s", o->name->value);
1122*5e7646d2SAndroid Build Coastguard Worker 	for (a = (ppdcAttr *)attrs->first(); a; a = (ppdcAttr *)attrs->next())
1123*5e7646d2SAndroid Build Coastguard Worker 	{
1124*5e7646d2SAndroid Build Coastguard Worker 	  if (strcmp(a->name->value, custom))
1125*5e7646d2SAndroid Build Coastguard Worker 	    continue;
1126*5e7646d2SAndroid Build Coastguard Worker 
1127*5e7646d2SAndroid Build Coastguard Worker 	  if (!a->selector->value || !a->selector->value[0])
1128*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "*%s", a->name->value);
1129*5e7646d2SAndroid Build Coastguard Worker 	  else if (!a->text->value || !a->text->value[0])
1130*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "*%s %s/%s", a->name->value, a->selector->value,
1131*5e7646d2SAndroid Build Coastguard Worker 	                   catalog->find_message(a->selector->value));
1132*5e7646d2SAndroid Build Coastguard Worker 	  else
1133*5e7646d2SAndroid Build Coastguard Worker 	    cupsFilePrintf(fp, "*%s %s/%s", a->name->value, a->selector->value,
1134*5e7646d2SAndroid Build Coastguard Worker 			   catalog->find_message(a->text->value));
1135*5e7646d2SAndroid Build Coastguard Worker 
1136*5e7646d2SAndroid Build Coastguard Worker           cupsFilePrintf(fp, ": %s%s", a->value->value, lf);
1137*5e7646d2SAndroid Build Coastguard Worker 	}
1138*5e7646d2SAndroid Build Coastguard Worker       }
1139*5e7646d2SAndroid Build Coastguard Worker     }
1140*5e7646d2SAndroid Build Coastguard Worker 
1141*5e7646d2SAndroid Build Coastguard Worker     if (_cups_strcasecmp(g->name->value, "General"))
1142*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*CloseGroup: %s%s", g->name->value, lf);
1143*5e7646d2SAndroid Build Coastguard Worker   }
1144*5e7646d2SAndroid Build Coastguard Worker 
1145*5e7646d2SAndroid Build Coastguard Worker   if (locales)
1146*5e7646d2SAndroid Build Coastguard Worker   {
1147*5e7646d2SAndroid Build Coastguard Worker     // Add localizations for additional languages...
1148*5e7646d2SAndroid Build Coastguard Worker     ppdcString	*locale;		// Locale name
1149*5e7646d2SAndroid Build Coastguard Worker     ppdcCatalog	*locatalog;		// Message catalog for locale
1150*5e7646d2SAndroid Build Coastguard Worker 
1151*5e7646d2SAndroid Build Coastguard Worker 
1152*5e7646d2SAndroid Build Coastguard Worker     // Write the translation strings for each language...
1153*5e7646d2SAndroid Build Coastguard Worker     for (locale = (ppdcString *)locales->first();
1154*5e7646d2SAndroid Build Coastguard Worker          locale;
1155*5e7646d2SAndroid Build Coastguard Worker 	 locale = (ppdcString *)locales->next())
1156*5e7646d2SAndroid Build Coastguard Worker     {
1157*5e7646d2SAndroid Build Coastguard Worker       // Skip (US) English...
1158*5e7646d2SAndroid Build Coastguard Worker       if (!strcmp(locale->value, "en") || !strcmp(locale->value, "en_US"))
1159*5e7646d2SAndroid Build Coastguard Worker         continue;
1160*5e7646d2SAndroid Build Coastguard Worker 
1161*5e7646d2SAndroid Build Coastguard Worker       // Skip missing languages...
1162*5e7646d2SAndroid Build Coastguard Worker       if ((locatalog = src->find_po(locale->value)) == NULL)
1163*5e7646d2SAndroid Build Coastguard Worker         continue;
1164*5e7646d2SAndroid Build Coastguard Worker 
1165*5e7646d2SAndroid Build Coastguard Worker       // Do the core stuff first...
1166*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*%s.Translation Manufacturer/%s: \"\"%s",
1167*5e7646d2SAndroid Build Coastguard Worker                      locale->value,
1168*5e7646d2SAndroid Build Coastguard Worker         	     locatalog->find_message(manufacturer->value), lf);
1169*5e7646d2SAndroid Build Coastguard Worker 
1170*5e7646d2SAndroid Build Coastguard Worker       if ((a = find_attr("ModelName", NULL)) != NULL)
1171*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*%s.Translation ModelName/%s: \"\"%s",
1172*5e7646d2SAndroid Build Coastguard Worker                        locale->value,
1173*5e7646d2SAndroid Build Coastguard Worker         	       locatalog->find_message(a->value->value), lf);
1174*5e7646d2SAndroid Build Coastguard Worker       else if (_cups_strncasecmp(model_name->value, manufacturer->value,
1175*5e7646d2SAndroid Build Coastguard Worker                 	   strlen(manufacturer->value)))
1176*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*%s.Translation ModelName/%s %s: \"\"%s",
1177*5e7646d2SAndroid Build Coastguard Worker                        locale->value,
1178*5e7646d2SAndroid Build Coastguard Worker         	       locatalog->find_message(manufacturer->value),
1179*5e7646d2SAndroid Build Coastguard Worker         	       locatalog->find_message(model_name->value), lf);
1180*5e7646d2SAndroid Build Coastguard Worker       else
1181*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*%s.Translation ModelName/%s: \"\"%s",
1182*5e7646d2SAndroid Build Coastguard Worker                        locale->value,
1183*5e7646d2SAndroid Build Coastguard Worker         	       locatalog->find_message(model_name->value), lf);
1184*5e7646d2SAndroid Build Coastguard Worker 
1185*5e7646d2SAndroid Build Coastguard Worker       if ((a = find_attr("ShortNickName", NULL)) != NULL)
1186*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*%s.Translation ShortNickName/%s: \"\"%s",
1187*5e7646d2SAndroid Build Coastguard Worker                        locale->value,
1188*5e7646d2SAndroid Build Coastguard Worker         	       locatalog->find_message(a->value->value), lf);
1189*5e7646d2SAndroid Build Coastguard Worker       else if (_cups_strncasecmp(model_name->value, manufacturer->value,
1190*5e7646d2SAndroid Build Coastguard Worker                 	   strlen(manufacturer->value)))
1191*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*%s.Translation ShortNickName/%s %s: \"\"%s",
1192*5e7646d2SAndroid Build Coastguard Worker                        locale->value,
1193*5e7646d2SAndroid Build Coastguard Worker         	       locatalog->find_message(manufacturer->value),
1194*5e7646d2SAndroid Build Coastguard Worker         	       locatalog->find_message(model_name->value), lf);
1195*5e7646d2SAndroid Build Coastguard Worker       else
1196*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*%s.Translation ShortNickName/%s: \"\"%s",
1197*5e7646d2SAndroid Build Coastguard Worker                        locale->value,
1198*5e7646d2SAndroid Build Coastguard Worker         	       locatalog->find_message(model_name->value), lf);
1199*5e7646d2SAndroid Build Coastguard Worker 
1200*5e7646d2SAndroid Build Coastguard Worker       if ((a = find_attr("NickName", NULL)) != NULL)
1201*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*%s.Translation NickName/%s: \"\"%s",
1202*5e7646d2SAndroid Build Coastguard Worker                        locale->value,
1203*5e7646d2SAndroid Build Coastguard Worker         	       locatalog->find_message(a->value->value), lf);
1204*5e7646d2SAndroid Build Coastguard Worker       else if (_cups_strncasecmp(model_name->value, manufacturer->value,
1205*5e7646d2SAndroid Build Coastguard Worker                 	   strlen(manufacturer->value)))
1206*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*%s.Translation NickName/%s %s, %s: \"\"%s",
1207*5e7646d2SAndroid Build Coastguard Worker                        locale->value,
1208*5e7646d2SAndroid Build Coastguard Worker         	       locatalog->find_message(manufacturer->value),
1209*5e7646d2SAndroid Build Coastguard Worker         	       locatalog->find_message(model_name->value),
1210*5e7646d2SAndroid Build Coastguard Worker 		       version->value, lf);
1211*5e7646d2SAndroid Build Coastguard Worker       else
1212*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*%s.Translation NickName/%s, %s: \"\"%s",
1213*5e7646d2SAndroid Build Coastguard Worker                        locale->value,
1214*5e7646d2SAndroid Build Coastguard Worker         	       locatalog->find_message(model_name->value),
1215*5e7646d2SAndroid Build Coastguard Worker 		       version->value, lf);
1216*5e7646d2SAndroid Build Coastguard Worker 
1217*5e7646d2SAndroid Build Coastguard Worker       // Then the page sizes...
1218*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*%s.Translation PageSize/%s: \"\"%s", locale->value,
1219*5e7646d2SAndroid Build Coastguard Worker                      locatalog->find_message("Media Size"), lf);
1220*5e7646d2SAndroid Build Coastguard Worker 
1221*5e7646d2SAndroid Build Coastguard Worker       for (m = (ppdcMediaSize *)sizes->first();
1222*5e7646d2SAndroid Build Coastguard Worker 	   m;
1223*5e7646d2SAndroid Build Coastguard Worker 	   m = (ppdcMediaSize *)sizes->next())
1224*5e7646d2SAndroid Build Coastguard Worker       {
1225*5e7646d2SAndroid Build Coastguard Worker         cupsFilePrintf(fp, "*%s.PageSize %s/%s: \"\"%s", locale->value,
1226*5e7646d2SAndroid Build Coastguard Worker         	       m->name->value, locatalog->find_message(m->text->value),
1227*5e7646d2SAndroid Build Coastguard Worker 		       lf);
1228*5e7646d2SAndroid Build Coastguard Worker       }
1229*5e7646d2SAndroid Build Coastguard Worker 
1230*5e7646d2SAndroid Build Coastguard Worker       // Next the groups and options...
1231*5e7646d2SAndroid Build Coastguard Worker       for (g = (ppdcGroup *)groups->first(); g; g = (ppdcGroup *)groups->next())
1232*5e7646d2SAndroid Build Coastguard Worker       {
1233*5e7646d2SAndroid Build Coastguard Worker 	if (!g->options->count)
1234*5e7646d2SAndroid Build Coastguard Worker 	  continue;
1235*5e7646d2SAndroid Build Coastguard Worker 
1236*5e7646d2SAndroid Build Coastguard Worker 	if (_cups_strcasecmp(g->name->value, "General"))
1237*5e7646d2SAndroid Build Coastguard Worker 	  cupsFilePrintf(fp, "*%s.Translation %s/%s: \"\"%s", locale->value,
1238*5e7646d2SAndroid Build Coastguard Worker 	                 g->name->value,
1239*5e7646d2SAndroid Build Coastguard Worker                 	 locatalog->find_message(g->text->value), lf);
1240*5e7646d2SAndroid Build Coastguard Worker 
1241*5e7646d2SAndroid Build Coastguard Worker 	for (o = (ppdcOption *)g->options->first();
1242*5e7646d2SAndroid Build Coastguard Worker              o;
1243*5e7646d2SAndroid Build Coastguard Worker 	     o = (ppdcOption *)g->options->next())
1244*5e7646d2SAndroid Build Coastguard Worker 	{
1245*5e7646d2SAndroid Build Coastguard Worker 	  if (!o->choices->count)
1246*5e7646d2SAndroid Build Coastguard Worker             continue;
1247*5e7646d2SAndroid Build Coastguard Worker 
1248*5e7646d2SAndroid Build Coastguard Worker           cupsFilePrintf(fp, "*%s.Translation %s/%s: \"\"%s", locale->value,
1249*5e7646d2SAndroid Build Coastguard Worker 	                 o->name->value,
1250*5e7646d2SAndroid Build Coastguard Worker 			 locatalog->find_message(o->text->value ?
1251*5e7646d2SAndroid Build Coastguard Worker 			                         o->text->value :
1252*5e7646d2SAndroid Build Coastguard Worker 						 o->name->value), lf);
1253*5e7646d2SAndroid Build Coastguard Worker 
1254*5e7646d2SAndroid Build Coastguard Worker 	  for (c = (ppdcChoice *)o->choices->first();
1255*5e7646d2SAndroid Build Coastguard Worker                c;
1256*5e7646d2SAndroid Build Coastguard Worker 	       c = (ppdcChoice *)o->choices->next())
1257*5e7646d2SAndroid Build Coastguard Worker 	  {
1258*5e7646d2SAndroid Build Coastguard Worker             // Write this choice...
1259*5e7646d2SAndroid Build Coastguard Worker             cupsFilePrintf(fp, "*%s.%s %s/%s: \"\"%s", locale->value,
1260*5e7646d2SAndroid Build Coastguard Worker 	                   o->name->value, c->name->value,
1261*5e7646d2SAndroid Build Coastguard Worker 			   locatalog->find_message(c->text->value ?
1262*5e7646d2SAndroid Build Coastguard Worker 			                           c->text->value :
1263*5e7646d2SAndroid Build Coastguard Worker 						   c->name->value), lf);
1264*5e7646d2SAndroid Build Coastguard Worker 	  }
1265*5e7646d2SAndroid Build Coastguard Worker 	}
1266*5e7646d2SAndroid Build Coastguard Worker       }
1267*5e7646d2SAndroid Build Coastguard Worker 
1268*5e7646d2SAndroid Build Coastguard Worker       // Finally the localizable attributes...
1269*5e7646d2SAndroid Build Coastguard Worker       for (a = (ppdcAttr *)attrs->first(); a; a = (ppdcAttr *)attrs->next())
1270*5e7646d2SAndroid Build Coastguard Worker       {
1271*5e7646d2SAndroid Build Coastguard Worker         if (!a->localizable &&
1272*5e7646d2SAndroid Build Coastguard Worker 	    (!a->text || !a->text->value || !a->text->value[0]) &&
1273*5e7646d2SAndroid Build Coastguard Worker 	    strcmp(a->name->value, "APCustomColorMatchingName") &&
1274*5e7646d2SAndroid Build Coastguard Worker 	    strcmp(a->name->value, "APPrinterPreset") &&
1275*5e7646d2SAndroid Build Coastguard Worker 	    strcmp(a->name->value, "cupsICCProfile") &&
1276*5e7646d2SAndroid Build Coastguard Worker 	    strcmp(a->name->value, "cupsIPPReason") &&
1277*5e7646d2SAndroid Build Coastguard Worker 	    strcmp(a->name->value, "cupsMarkerName") &&
1278*5e7646d2SAndroid Build Coastguard Worker 	    strncmp(a->name->value, "Custom", 6) &&
1279*5e7646d2SAndroid Build Coastguard Worker 	    strncmp(a->name->value, "ParamCustom", 11))
1280*5e7646d2SAndroid Build Coastguard Worker 	  continue;
1281*5e7646d2SAndroid Build Coastguard Worker 
1282*5e7646d2SAndroid Build Coastguard Worker         cupsFilePrintf(fp, "*%s.%s %s/%s: \"%s\"%s", locale->value,
1283*5e7646d2SAndroid Build Coastguard Worker 	               a->name->value, a->selector->value,
1284*5e7646d2SAndroid Build Coastguard Worker 		       locatalog->find_message(a->text && a->text->value ?
1285*5e7646d2SAndroid Build Coastguard Worker 		                               a->text->value : a->name->value),
1286*5e7646d2SAndroid Build Coastguard Worker 		       ((a->localizable && a->value->value[0]) ||
1287*5e7646d2SAndroid Build Coastguard Worker 		        !strcmp(a->name->value, "cupsIPPReason")) ?
1288*5e7646d2SAndroid Build Coastguard Worker 		           locatalog->find_message(a->value->value) : "",
1289*5e7646d2SAndroid Build Coastguard Worker 		       lf);
1290*5e7646d2SAndroid Build Coastguard Worker       }
1291*5e7646d2SAndroid Build Coastguard Worker     }
1292*5e7646d2SAndroid Build Coastguard Worker   }
1293*5e7646d2SAndroid Build Coastguard Worker 
1294*5e7646d2SAndroid Build Coastguard Worker   if (default_font && default_font->value)
1295*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*DefaultFont: %s%s", default_font->value, lf);
1296*5e7646d2SAndroid Build Coastguard Worker   else
1297*5e7646d2SAndroid Build Coastguard Worker     cupsFilePrintf(fp, "*DefaultFont: Courier%s", lf);
1298*5e7646d2SAndroid Build Coastguard Worker 
1299*5e7646d2SAndroid Build Coastguard Worker   for (fn = (ppdcFont *)fonts->first(); fn; fn = (ppdcFont *)fonts->next())
1300*5e7646d2SAndroid Build Coastguard Worker     if (!strcmp(fn->name->value, "*"))
1301*5e7646d2SAndroid Build Coastguard Worker     {
1302*5e7646d2SAndroid Build Coastguard Worker       for (bfn = (ppdcFont *)src->base_fonts->first();
1303*5e7646d2SAndroid Build Coastguard Worker 	   bfn;
1304*5e7646d2SAndroid Build Coastguard Worker 	   bfn = (ppdcFont *)src->base_fonts->next())
1305*5e7646d2SAndroid Build Coastguard Worker 	cupsFilePrintf(fp, "*Font %s: %s \"%s\" %s %s%s",
1306*5e7646d2SAndroid Build Coastguard Worker 		       bfn->name->value, bfn->encoding->value,
1307*5e7646d2SAndroid Build Coastguard Worker 		       bfn->version->value, bfn->charset->value,
1308*5e7646d2SAndroid Build Coastguard Worker 		       bfn->status == PPDC_FONT_ROM ? "ROM" : "Disk", lf);
1309*5e7646d2SAndroid Build Coastguard Worker     }
1310*5e7646d2SAndroid Build Coastguard Worker     else
1311*5e7646d2SAndroid Build Coastguard Worker       cupsFilePrintf(fp, "*Font %s: %s \"%s\" %s %s%s",
1312*5e7646d2SAndroid Build Coastguard Worker         	     fn->name->value, fn->encoding->value, fn->version->value,
1313*5e7646d2SAndroid Build Coastguard Worker 		     fn->charset->value,
1314*5e7646d2SAndroid Build Coastguard Worker 		     fn->status == PPDC_FONT_ROM ? "ROM" : "Disk", lf);
1315*5e7646d2SAndroid Build Coastguard Worker 
1316*5e7646d2SAndroid Build Coastguard Worker   cupsFilePrintf(fp, "*%% End of %s, %05d bytes.%s", pc_file_name->value,
1317*5e7646d2SAndroid Build Coastguard Worker         	 (int)((size_t)cupsFileTell(fp) + 25 + strlen(pc_file_name->value)),
1318*5e7646d2SAndroid Build Coastguard Worker 		 lf);
1319*5e7646d2SAndroid Build Coastguard Worker 
1320*5e7646d2SAndroid Build Coastguard Worker   if (delete_cat)
1321*5e7646d2SAndroid Build Coastguard Worker     catalog->release();
1322*5e7646d2SAndroid Build Coastguard Worker 
1323*5e7646d2SAndroid Build Coastguard Worker   return (0);
1324*5e7646d2SAndroid Build Coastguard Worker }
1325