xref: /aosp_15_r20/external/libcups/ppdc/ppdc-import.cxx (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker //
2*5e7646d2SAndroid Build Coastguard Worker // PPD file import methods for the CUPS PPD Compiler.
3*5e7646d2SAndroid Build Coastguard Worker //
4*5e7646d2SAndroid Build Coastguard Worker // Copyright 2007-2011 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 information.
8*5e7646d2SAndroid Build Coastguard Worker //
9*5e7646d2SAndroid Build Coastguard Worker 
10*5e7646d2SAndroid Build Coastguard Worker //
11*5e7646d2SAndroid Build Coastguard Worker // Include necessary headers...
12*5e7646d2SAndroid Build Coastguard Worker //
13*5e7646d2SAndroid Build Coastguard Worker 
14*5e7646d2SAndroid Build Coastguard Worker #include "ppdc-private.h"
15*5e7646d2SAndroid Build Coastguard Worker #include <cups/ppd.h>
16*5e7646d2SAndroid Build Coastguard Worker 
17*5e7646d2SAndroid Build Coastguard Worker 
18*5e7646d2SAndroid Build Coastguard Worker //
19*5e7646d2SAndroid Build Coastguard Worker // 'ppdcSource::import_ppd()' - Import a PPD file.
20*5e7646d2SAndroid Build Coastguard Worker //
21*5e7646d2SAndroid Build Coastguard Worker 
22*5e7646d2SAndroid Build Coastguard Worker int					// O - 1 on success, 0 on failure
import_ppd(const char * f)23*5e7646d2SAndroid Build Coastguard Worker ppdcSource::import_ppd(const char *f)	// I - Filename
24*5e7646d2SAndroid Build Coastguard Worker {
25*5e7646d2SAndroid Build Coastguard Worker   int		i, j, k;		// Looping vars
26*5e7646d2SAndroid Build Coastguard Worker   cups_file_t	*fp;			// File
27*5e7646d2SAndroid Build Coastguard Worker   char		line[256],		// Comment line
28*5e7646d2SAndroid Build Coastguard Worker 		*ptr;			// Pointer into line
29*5e7646d2SAndroid Build Coastguard Worker   int		cost;			// Cost for filter
30*5e7646d2SAndroid Build Coastguard Worker   ppd_file_t	*ppd;			// PPD file data
31*5e7646d2SAndroid Build Coastguard Worker   ppd_group_t	*group;			// PPD group
32*5e7646d2SAndroid Build Coastguard Worker   ppd_option_t	*option;		// PPD option
33*5e7646d2SAndroid Build Coastguard Worker   ppd_choice_t	*choice;		// PPD choice
34*5e7646d2SAndroid Build Coastguard Worker   ppd_attr_t	*attr;			// PPD attribute
35*5e7646d2SAndroid Build Coastguard Worker   ppd_const_t	*constraint;		// PPD UI constraint
36*5e7646d2SAndroid Build Coastguard Worker   ppd_const_t	*constraint2;		// Temp PPD UI constraint
37*5e7646d2SAndroid Build Coastguard Worker   ppd_size_t	*size;			// PPD page size
38*5e7646d2SAndroid Build Coastguard Worker   ppdcDriver	*driver;		// Driver
39*5e7646d2SAndroid Build Coastguard Worker   ppdcFilter	*filter;		// Current filter
40*5e7646d2SAndroid Build Coastguard Worker   ppdcFont	*font;			// Font
41*5e7646d2SAndroid Build Coastguard Worker   ppdcGroup	*cgroup;		// UI group
42*5e7646d2SAndroid Build Coastguard Worker   ppdcOption	*coption;		// UI option
43*5e7646d2SAndroid Build Coastguard Worker   ppdcChoice	*cchoice;		// UI choice
44*5e7646d2SAndroid Build Coastguard Worker   ppdcConstraint *cconstraint;		// UI constraint
45*5e7646d2SAndroid Build Coastguard Worker   ppdcMediaSize	*csize;			// Media size
46*5e7646d2SAndroid Build Coastguard Worker 
47*5e7646d2SAndroid Build Coastguard Worker 
48*5e7646d2SAndroid Build Coastguard Worker   // Try opening the PPD file...
49*5e7646d2SAndroid Build Coastguard Worker   if ((ppd = ppdOpenFile(f)) == NULL)
50*5e7646d2SAndroid Build Coastguard Worker     return (0);
51*5e7646d2SAndroid Build Coastguard Worker 
52*5e7646d2SAndroid Build Coastguard Worker   // All PPD files need a PCFileName attribute...
53*5e7646d2SAndroid Build Coastguard Worker   if (!ppd->pcfilename)
54*5e7646d2SAndroid Build Coastguard Worker   {
55*5e7646d2SAndroid Build Coastguard Worker     ppdClose(ppd);
56*5e7646d2SAndroid Build Coastguard Worker     return (0);
57*5e7646d2SAndroid Build Coastguard Worker   }
58*5e7646d2SAndroid Build Coastguard Worker 
59*5e7646d2SAndroid Build Coastguard Worker   // See if the driver has already been imported...
60*5e7646d2SAndroid Build Coastguard Worker   if ((driver = find_driver(ppd->pcfilename)) == NULL)
61*5e7646d2SAndroid Build Coastguard Worker   {
62*5e7646d2SAndroid Build Coastguard Worker     // Create a new PPD file...
63*5e7646d2SAndroid Build Coastguard Worker     if ((fp = cupsFileOpen(f, "r")) == NULL)
64*5e7646d2SAndroid Build Coastguard Worker     {
65*5e7646d2SAndroid Build Coastguard Worker       ppdClose(ppd);
66*5e7646d2SAndroid Build Coastguard Worker       return (0);
67*5e7646d2SAndroid Build Coastguard Worker     }
68*5e7646d2SAndroid Build Coastguard Worker 
69*5e7646d2SAndroid Build Coastguard Worker     driver       = new ppdcDriver();
70*5e7646d2SAndroid Build Coastguard Worker     driver->type = PPDC_DRIVER_PS;
71*5e7646d2SAndroid Build Coastguard Worker 
72*5e7646d2SAndroid Build Coastguard Worker     drivers->add(driver);
73*5e7646d2SAndroid Build Coastguard Worker 
74*5e7646d2SAndroid Build Coastguard Worker     // Read the initial comments from the PPD file and use them as the
75*5e7646d2SAndroid Build Coastguard Worker     // copyright/license text...
76*5e7646d2SAndroid Build Coastguard Worker     cupsFileGets(fp, line, sizeof(line));
77*5e7646d2SAndroid Build Coastguard Worker 					// Skip *PPD-Adobe-M.m
78*5e7646d2SAndroid Build Coastguard Worker 
79*5e7646d2SAndroid Build Coastguard Worker     while (cupsFileGets(fp, line, sizeof(line)))
80*5e7646d2SAndroid Build Coastguard Worker       if (strncmp(line, "*%", 2))
81*5e7646d2SAndroid Build Coastguard Worker         break;
82*5e7646d2SAndroid Build Coastguard Worker       else if (strncmp(line, "*%%%% ", 6))
83*5e7646d2SAndroid Build Coastguard Worker       {
84*5e7646d2SAndroid Build Coastguard Worker         for (ptr = line + 2; isspace(*ptr); ptr ++);
85*5e7646d2SAndroid Build Coastguard Worker 
86*5e7646d2SAndroid Build Coastguard Worker         driver->add_copyright(ptr);
87*5e7646d2SAndroid Build Coastguard Worker       }
88*5e7646d2SAndroid Build Coastguard Worker 
89*5e7646d2SAndroid Build Coastguard Worker     cupsFileClose(fp);
90*5e7646d2SAndroid Build Coastguard Worker 
91*5e7646d2SAndroid Build Coastguard Worker     // Then add the stuff from the PPD file...
92*5e7646d2SAndroid Build Coastguard Worker     if (ppd->modelname && ppd->manufacturer &&
93*5e7646d2SAndroid Build Coastguard Worker         !_cups_strncasecmp(ppd->modelname, ppd->manufacturer,
94*5e7646d2SAndroid Build Coastguard Worker                      strlen(ppd->manufacturer)))
95*5e7646d2SAndroid Build Coastguard Worker     {
96*5e7646d2SAndroid Build Coastguard Worker       ptr = ppd->modelname + strlen(ppd->manufacturer);
97*5e7646d2SAndroid Build Coastguard Worker 
98*5e7646d2SAndroid Build Coastguard Worker       while (isspace(*ptr))
99*5e7646d2SAndroid Build Coastguard Worker         ptr ++;
100*5e7646d2SAndroid Build Coastguard Worker     }
101*5e7646d2SAndroid Build Coastguard Worker     else
102*5e7646d2SAndroid Build Coastguard Worker       ptr = ppd->modelname;
103*5e7646d2SAndroid Build Coastguard Worker 
104*5e7646d2SAndroid Build Coastguard Worker     if (ppd->nickname)
105*5e7646d2SAndroid Build Coastguard Worker       driver->add_attr(new ppdcAttr("NickName", NULL, NULL, ppd->nickname));
106*5e7646d2SAndroid Build Coastguard Worker 
107*5e7646d2SAndroid Build Coastguard Worker     if (ppd->shortnickname)
108*5e7646d2SAndroid Build Coastguard Worker       driver->add_attr(new ppdcAttr("ShortNickName", NULL, NULL,
109*5e7646d2SAndroid Build Coastguard Worker                                     ppd->shortnickname));
110*5e7646d2SAndroid Build Coastguard Worker 
111*5e7646d2SAndroid Build Coastguard Worker     driver->manufacturer        = new ppdcString(ppd->manufacturer);
112*5e7646d2SAndroid Build Coastguard Worker     driver->model_name          = new ppdcString(ptr);
113*5e7646d2SAndroid Build Coastguard Worker     driver->pc_file_name        = new ppdcString(ppd->pcfilename);
114*5e7646d2SAndroid Build Coastguard Worker     attr = ppdFindAttr(ppd, "FileVersion", NULL);
115*5e7646d2SAndroid Build Coastguard Worker     driver->version             = new ppdcString(attr ? attr->value : NULL);
116*5e7646d2SAndroid Build Coastguard Worker     driver->model_number        = ppd->model_number;
117*5e7646d2SAndroid Build Coastguard Worker     driver->manual_copies       = ppd->manual_copies;
118*5e7646d2SAndroid Build Coastguard Worker     driver->color_device        = ppd->color_device;
119*5e7646d2SAndroid Build Coastguard Worker     driver->throughput          = ppd->throughput;
120*5e7646d2SAndroid Build Coastguard Worker     driver->variable_paper_size = ppd->variable_sizes;
121*5e7646d2SAndroid Build Coastguard Worker     driver->max_width           = ppd->custom_max[0];
122*5e7646d2SAndroid Build Coastguard Worker     driver->max_length          = ppd->custom_max[1];
123*5e7646d2SAndroid Build Coastguard Worker     driver->min_width           = ppd->custom_min[0];
124*5e7646d2SAndroid Build Coastguard Worker     driver->min_length          = ppd->custom_min[1];
125*5e7646d2SAndroid Build Coastguard Worker     driver->left_margin         = ppd->custom_margins[0];
126*5e7646d2SAndroid Build Coastguard Worker     driver->bottom_margin       = ppd->custom_margins[1];
127*5e7646d2SAndroid Build Coastguard Worker     driver->right_margin        = ppd->custom_margins[2];
128*5e7646d2SAndroid Build Coastguard Worker     driver->top_margin          = ppd->custom_margins[3];
129*5e7646d2SAndroid Build Coastguard Worker 
130*5e7646d2SAndroid Build Coastguard Worker     for (i = 0; i < ppd->num_filters; i ++)
131*5e7646d2SAndroid Build Coastguard Worker     {
132*5e7646d2SAndroid Build Coastguard Worker       strlcpy(line, ppd->filters[i], sizeof(line));
133*5e7646d2SAndroid Build Coastguard Worker 
134*5e7646d2SAndroid Build Coastguard Worker       for (ptr = line; *ptr; ptr ++)
135*5e7646d2SAndroid Build Coastguard Worker         if (isspace(*ptr & 255))
136*5e7646d2SAndroid Build Coastguard Worker 	  break;
137*5e7646d2SAndroid Build Coastguard Worker       *ptr++ = '\0';
138*5e7646d2SAndroid Build Coastguard Worker 
139*5e7646d2SAndroid Build Coastguard Worker       cost = strtol(ptr, &ptr, 10);
140*5e7646d2SAndroid Build Coastguard Worker 
141*5e7646d2SAndroid Build Coastguard Worker       while (isspace(*ptr & 255))
142*5e7646d2SAndroid Build Coastguard Worker         ptr ++;
143*5e7646d2SAndroid Build Coastguard Worker 
144*5e7646d2SAndroid Build Coastguard Worker       filter = new ppdcFilter(line, ptr, cost);
145*5e7646d2SAndroid Build Coastguard Worker       driver->add_filter(filter);
146*5e7646d2SAndroid Build Coastguard Worker     }
147*5e7646d2SAndroid Build Coastguard Worker 
148*5e7646d2SAndroid Build Coastguard Worker     attr = ppdFindAttr(ppd, "DefaultFont", NULL);
149*5e7646d2SAndroid Build Coastguard Worker     driver->default_font  = new ppdcString(attr ? attr->value : NULL);
150*5e7646d2SAndroid Build Coastguard Worker 
151*5e7646d2SAndroid Build Coastguard Worker     // Collect media sizes...
152*5e7646d2SAndroid Build Coastguard Worker     ppd_option_t	*region_option,		// PageRegion option
153*5e7646d2SAndroid Build Coastguard Worker 			*size_option;		// PageSize option
154*5e7646d2SAndroid Build Coastguard Worker     ppd_choice_t	*region_choice,		// PageRegion choice
155*5e7646d2SAndroid Build Coastguard Worker 			*size_choice;		// PageSize choice
156*5e7646d2SAndroid Build Coastguard Worker 
157*5e7646d2SAndroid Build Coastguard Worker     region_option = ppdFindOption(ppd, "PageRegion");
158*5e7646d2SAndroid Build Coastguard Worker     size_option   = ppdFindOption(ppd, "PageSize");
159*5e7646d2SAndroid Build Coastguard Worker 
160*5e7646d2SAndroid Build Coastguard Worker     for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++)
161*5e7646d2SAndroid Build Coastguard Worker     {
162*5e7646d2SAndroid Build Coastguard Worker       // Don't do custom size here...
163*5e7646d2SAndroid Build Coastguard Worker       if (!_cups_strcasecmp(size->name, "Custom"))
164*5e7646d2SAndroid Build Coastguard Worker         continue;
165*5e7646d2SAndroid Build Coastguard Worker 
166*5e7646d2SAndroid Build Coastguard Worker       // Get the code for the PageSize and PageRegion options...
167*5e7646d2SAndroid Build Coastguard Worker       region_choice = ppdFindChoice(region_option, size->name);
168*5e7646d2SAndroid Build Coastguard Worker       size_choice   = ppdFindChoice(size_option, size->name);
169*5e7646d2SAndroid Build Coastguard Worker 
170*5e7646d2SAndroid Build Coastguard Worker       // Create a new media size record and add it to the driver...
171*5e7646d2SAndroid Build Coastguard Worker       csize = new ppdcMediaSize(size->name, size_choice->text, size->width,
172*5e7646d2SAndroid Build Coastguard Worker                                 size->length, size->left, size->bottom,
173*5e7646d2SAndroid Build Coastguard Worker 				size->width - size->right,
174*5e7646d2SAndroid Build Coastguard Worker 				size->length - size->top,
175*5e7646d2SAndroid Build Coastguard Worker 				size_choice->code, region_choice->code);
176*5e7646d2SAndroid Build Coastguard Worker 
177*5e7646d2SAndroid Build Coastguard Worker        driver->add_size(csize);
178*5e7646d2SAndroid Build Coastguard Worker 
179*5e7646d2SAndroid Build Coastguard Worker        if (!_cups_strcasecmp(size_option->defchoice, size->name))
180*5e7646d2SAndroid Build Coastguard Worker          driver->set_default_size(csize);
181*5e7646d2SAndroid Build Coastguard Worker     }
182*5e7646d2SAndroid Build Coastguard Worker 
183*5e7646d2SAndroid Build Coastguard Worker     // Now all of the options...
184*5e7646d2SAndroid Build Coastguard Worker     for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++)
185*5e7646d2SAndroid Build Coastguard Worker     {
186*5e7646d2SAndroid Build Coastguard Worker       cgroup = new ppdcGroup(group->name, group->text);
187*5e7646d2SAndroid Build Coastguard Worker       driver->add_group(cgroup);
188*5e7646d2SAndroid Build Coastguard Worker 
189*5e7646d2SAndroid Build Coastguard Worker       for (j = group->num_options, option = group->options; j > 0; j --, option ++)
190*5e7646d2SAndroid Build Coastguard Worker       {
191*5e7646d2SAndroid Build Coastguard Worker         if (!strcmp(option->keyword, "PageSize") || !strcmp(option->keyword, "PageRegion"))
192*5e7646d2SAndroid Build Coastguard Worker           continue;
193*5e7646d2SAndroid Build Coastguard Worker 
194*5e7646d2SAndroid Build Coastguard Worker         coption = new ppdcOption((ppdcOptType)option->ui, option->keyword,
195*5e7646d2SAndroid Build Coastguard Worker 	                         option->text, (ppdcOptSection)option->section,
196*5e7646d2SAndroid Build Coastguard Worker 				 option->order);
197*5e7646d2SAndroid Build Coastguard Worker         cgroup->add_option(coption);
198*5e7646d2SAndroid Build Coastguard Worker 
199*5e7646d2SAndroid Build Coastguard Worker         for (k = option->num_choices, choice = option->choices; k > 0; k --, choice ++)
200*5e7646d2SAndroid Build Coastguard Worker         {
201*5e7646d2SAndroid Build Coastguard Worker 	  if (!strcmp(choice->choice, "Custom"))
202*5e7646d2SAndroid Build Coastguard Worker 	    continue;
203*5e7646d2SAndroid Build Coastguard Worker 
204*5e7646d2SAndroid Build Coastguard Worker           cchoice = new ppdcChoice(choice->choice, choice->text, choice->code);
205*5e7646d2SAndroid Build Coastguard Worker           coption->add_choice(cchoice);
206*5e7646d2SAndroid Build Coastguard Worker 
207*5e7646d2SAndroid Build Coastguard Worker           if (!_cups_strcasecmp(option->defchoice, choice->choice))
208*5e7646d2SAndroid Build Coastguard Worker             coption->set_defchoice(cchoice);
209*5e7646d2SAndroid Build Coastguard Worker         }
210*5e7646d2SAndroid Build Coastguard Worker       }
211*5e7646d2SAndroid Build Coastguard Worker     }
212*5e7646d2SAndroid Build Coastguard Worker 
213*5e7646d2SAndroid Build Coastguard Worker     // Now the constraints...
214*5e7646d2SAndroid Build Coastguard Worker     for (i = ppd->num_consts, constraint = ppd->consts;
215*5e7646d2SAndroid Build Coastguard Worker          i > 0;
216*5e7646d2SAndroid Build Coastguard Worker 	 i --, constraint ++)
217*5e7646d2SAndroid Build Coastguard Worker     {
218*5e7646d2SAndroid Build Coastguard Worker       // Look for mirrored constraints...
219*5e7646d2SAndroid Build Coastguard Worker       for (j = i - 1, constraint2 = constraint + 1;
220*5e7646d2SAndroid Build Coastguard Worker            j > 0;
221*5e7646d2SAndroid Build Coastguard Worker 	   j --, constraint2 ++)
222*5e7646d2SAndroid Build Coastguard Worker 	if (!strcmp(constraint->option1, constraint2->option2) &&
223*5e7646d2SAndroid Build Coastguard Worker 	    !strcmp(constraint->choice1, constraint2->choice2) &&
224*5e7646d2SAndroid Build Coastguard Worker 	    !strcmp(constraint->option2, constraint2->option1) &&
225*5e7646d2SAndroid Build Coastguard Worker 	    !strcmp(constraint->choice2, constraint2->choice1))
226*5e7646d2SAndroid Build Coastguard Worker           break;
227*5e7646d2SAndroid Build Coastguard Worker 
228*5e7646d2SAndroid Build Coastguard Worker       if (j)
229*5e7646d2SAndroid Build Coastguard Worker         continue;
230*5e7646d2SAndroid Build Coastguard Worker 
231*5e7646d2SAndroid Build Coastguard Worker       cconstraint = new ppdcConstraint(constraint->option2, constraint->choice2,
232*5e7646d2SAndroid Build Coastguard Worker                                        constraint->option1, constraint->choice1);
233*5e7646d2SAndroid Build Coastguard Worker       driver->add_constraint(cconstraint);
234*5e7646d2SAndroid Build Coastguard Worker     }
235*5e7646d2SAndroid Build Coastguard Worker 
236*5e7646d2SAndroid Build Coastguard Worker     for (i = 0; i < ppd->num_attrs; i ++)
237*5e7646d2SAndroid Build Coastguard Worker     {
238*5e7646d2SAndroid Build Coastguard Worker       attr = ppd->attrs[i];
239*5e7646d2SAndroid Build Coastguard Worker 
240*5e7646d2SAndroid Build Coastguard Worker       if (!strcmp(attr->name, "Font"))
241*5e7646d2SAndroid Build Coastguard Worker       {
242*5e7646d2SAndroid Build Coastguard Worker         // Font...
243*5e7646d2SAndroid Build Coastguard Worker 	char		encoding[256],	// Encoding string
244*5e7646d2SAndroid Build Coastguard Worker 			version[256],	// Version string
245*5e7646d2SAndroid Build Coastguard Worker 			charset[256],	// Charset string
246*5e7646d2SAndroid Build Coastguard Worker 			status[256];	// Status string
247*5e7646d2SAndroid Build Coastguard Worker 	ppdcFontStatus	fstatus;	// Status enumeration
248*5e7646d2SAndroid Build Coastguard Worker 
249*5e7646d2SAndroid Build Coastguard Worker 
250*5e7646d2SAndroid Build Coastguard Worker         if (sscanf(attr->value, "%s%*[^\"]\"%[^\"]\"%s%s", encoding, version,
251*5e7646d2SAndroid Build Coastguard Worker 	           charset, status) != 4)
252*5e7646d2SAndroid Build Coastguard Worker 	{
253*5e7646d2SAndroid Build Coastguard Worker 	  _cupsLangPrintf(stderr, _("ppdc: Bad font attribute: %s"),
254*5e7646d2SAndroid Build Coastguard Worker 	                  attr->value);
255*5e7646d2SAndroid Build Coastguard Worker 	  continue;
256*5e7646d2SAndroid Build Coastguard Worker 	}
257*5e7646d2SAndroid Build Coastguard Worker 
258*5e7646d2SAndroid Build Coastguard Worker         if (!strcmp(status, "ROM"))
259*5e7646d2SAndroid Build Coastguard Worker 	  fstatus = PPDC_FONT_ROM;
260*5e7646d2SAndroid Build Coastguard Worker 	else
261*5e7646d2SAndroid Build Coastguard Worker 	  fstatus = PPDC_FONT_DISK;
262*5e7646d2SAndroid Build Coastguard Worker 
263*5e7646d2SAndroid Build Coastguard Worker         font = new ppdcFont(attr->spec, encoding, version, charset, fstatus);
264*5e7646d2SAndroid Build Coastguard Worker 
265*5e7646d2SAndroid Build Coastguard Worker 	driver->add_font(font);
266*5e7646d2SAndroid Build Coastguard Worker       }
267*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(attr->name, "CustomPageSize"))
268*5e7646d2SAndroid Build Coastguard Worker       {
269*5e7646d2SAndroid Build Coastguard Worker         driver->set_custom_size_code(attr->value);
270*5e7646d2SAndroid Build Coastguard Worker       }
271*5e7646d2SAndroid Build Coastguard Worker       else if ((strncmp(attr->name, "Default", 7) ||
272*5e7646d2SAndroid Build Coastguard Worker         	!strcmp(attr->name, "DefaultColorSpace")) &&
273*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "ColorDevice") &&
274*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "Manufacturer") &&
275*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "ModelName") &&
276*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "MaxMediaHeight") &&
277*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "MaxMediaWidth") &&
278*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "NickName") &&
279*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "ParamCustomPageSize") &&
280*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "ShortNickName") &&
281*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "Throughput") &&
282*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "PCFileName") &&
283*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "FileVersion") &&
284*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "FormatVersion") &&
285*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "HWMargins") &&
286*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "VariablePaperSize") &&
287*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "LanguageEncoding") &&
288*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "LanguageVersion") &&
289*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "cupsFilter") &&
290*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "cupsFlipDuplex") &&
291*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "cupsLanguages") &&
292*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "cupsManualCopies") &&
293*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "cupsModelNumber") &&
294*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "cupsVersion"))
295*5e7646d2SAndroid Build Coastguard Worker       {
296*5e7646d2SAndroid Build Coastguard Worker         if ((ptr = strchr(attr->name, '.')) != NULL &&
297*5e7646d2SAndroid Build Coastguard Worker 	    ((ptr - attr->name) == 2 || (ptr - attr->name) == 5))
298*5e7646d2SAndroid Build Coastguard Worker 	{
299*5e7646d2SAndroid Build Coastguard Worker 	  // Might be a localization attribute; test further...
300*5e7646d2SAndroid Build Coastguard Worker 	  if (isalpha(attr->name[0] & 255) &&
301*5e7646d2SAndroid Build Coastguard Worker 	      isalpha(attr->name[1] & 255) &&
302*5e7646d2SAndroid Build Coastguard Worker 	      (attr->name[2] == '.' ||
303*5e7646d2SAndroid Build Coastguard Worker 	       (attr->name[2] == '_' && isalpha(attr->name[3] & 255) &&
304*5e7646d2SAndroid Build Coastguard Worker 	        isalpha(attr->name[4] & 255))))
305*5e7646d2SAndroid Build Coastguard Worker             continue;
306*5e7646d2SAndroid Build Coastguard Worker 	}
307*5e7646d2SAndroid Build Coastguard Worker 
308*5e7646d2SAndroid Build Coastguard Worker         // Attribute...
309*5e7646d2SAndroid Build Coastguard Worker         driver->add_attr(new ppdcAttr(attr->name, attr->spec, attr->text,
310*5e7646d2SAndroid Build Coastguard Worker 	                              attr->value));
311*5e7646d2SAndroid Build Coastguard Worker       }
312*5e7646d2SAndroid Build Coastguard Worker       else if (!strncmp(attr->name, "Default", 7) &&
313*5e7646d2SAndroid Build Coastguard Worker                !ppdFindOption(ppd, attr->name + 7) &&
314*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "DefaultFont") &&
315*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "DefaultImageableArea") &&
316*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "DefaultPaperDimension") &&
317*5e7646d2SAndroid Build Coastguard Worker 	       strcmp(attr->name, "DefaultFont"))
318*5e7646d2SAndroid Build Coastguard Worker       {
319*5e7646d2SAndroid Build Coastguard Worker         // Default attribute...
320*5e7646d2SAndroid Build Coastguard Worker         driver->add_attr(new ppdcAttr(attr->name, attr->spec, attr->text,
321*5e7646d2SAndroid Build Coastguard Worker 	                              attr->value));
322*5e7646d2SAndroid Build Coastguard Worker       }
323*5e7646d2SAndroid Build Coastguard Worker     }
324*5e7646d2SAndroid Build Coastguard Worker   }
325*5e7646d2SAndroid Build Coastguard Worker 
326*5e7646d2SAndroid Build Coastguard Worker   if (ppd)
327*5e7646d2SAndroid Build Coastguard Worker     ppdClose(ppd);
328*5e7646d2SAndroid Build Coastguard Worker 
329*5e7646d2SAndroid Build Coastguard Worker   return (1);
330*5e7646d2SAndroid Build Coastguard Worker }
331