1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * MIME test program for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright 2007-2014 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright 1997-2006 by Easy Software Products, all rights reserved.
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 <cups/string-private.h>
15*5e7646d2SAndroid Build Coastguard Worker #include <cups/dir.h>
16*5e7646d2SAndroid Build Coastguard Worker #include <cups/debug-private.h>
17*5e7646d2SAndroid Build Coastguard Worker #include <cups/ppd-private.h>
18*5e7646d2SAndroid Build Coastguard Worker #include "mime.h"
19*5e7646d2SAndroid Build Coastguard Worker
20*5e7646d2SAndroid Build Coastguard Worker
21*5e7646d2SAndroid Build Coastguard Worker /*
22*5e7646d2SAndroid Build Coastguard Worker * Local functions...
23*5e7646d2SAndroid Build Coastguard Worker */
24*5e7646d2SAndroid Build Coastguard Worker
25*5e7646d2SAndroid Build Coastguard Worker static void add_ppd_filter(mime_t *mime, mime_type_t *filtertype,
26*5e7646d2SAndroid Build Coastguard Worker const char *filter);
27*5e7646d2SAndroid Build Coastguard Worker static void add_ppd_filters(mime_t *mime, ppd_file_t *ppd);
28*5e7646d2SAndroid Build Coastguard Worker static void print_rules(mime_magic_t *rules);
29*5e7646d2SAndroid Build Coastguard Worker static void type_dir(mime_t *mime, const char *dirname);
30*5e7646d2SAndroid Build Coastguard Worker
31*5e7646d2SAndroid Build Coastguard Worker
32*5e7646d2SAndroid Build Coastguard Worker /*
33*5e7646d2SAndroid Build Coastguard Worker * 'main()' - Main entry for the test program.
34*5e7646d2SAndroid Build Coastguard Worker */
35*5e7646d2SAndroid Build Coastguard Worker
36*5e7646d2SAndroid Build Coastguard Worker int /* O - Exit status */
main(int argc,char * argv[])37*5e7646d2SAndroid Build Coastguard Worker main(int argc, /* I - Number of command-line args */
38*5e7646d2SAndroid Build Coastguard Worker char *argv[]) /* I - Command-line arguments */
39*5e7646d2SAndroid Build Coastguard Worker {
40*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping vars */
41*5e7646d2SAndroid Build Coastguard Worker const char *filter_path; /* Filter path */
42*5e7646d2SAndroid Build Coastguard Worker char super[MIME_MAX_SUPER], /* Super-type name */
43*5e7646d2SAndroid Build Coastguard Worker type[MIME_MAX_TYPE]; /* Type name */
44*5e7646d2SAndroid Build Coastguard Worker int compression; /* Compression of file */
45*5e7646d2SAndroid Build Coastguard Worker int cost; /* Cost of filters */
46*5e7646d2SAndroid Build Coastguard Worker mime_t *mime; /* MIME database */
47*5e7646d2SAndroid Build Coastguard Worker mime_type_t *src, /* Source type */
48*5e7646d2SAndroid Build Coastguard Worker *dst; /* Destination type */
49*5e7646d2SAndroid Build Coastguard Worker struct stat srcinfo; /* Source information */
50*5e7646d2SAndroid Build Coastguard Worker ppd_file_t *ppd; /* PPD file */
51*5e7646d2SAndroid Build Coastguard Worker cups_array_t *filters; /* Filters for the file */
52*5e7646d2SAndroid Build Coastguard Worker mime_filter_t *filter; /* Current filter */
53*5e7646d2SAndroid Build Coastguard Worker
54*5e7646d2SAndroid Build Coastguard Worker
55*5e7646d2SAndroid Build Coastguard Worker mime = NULL;
56*5e7646d2SAndroid Build Coastguard Worker src = NULL;
57*5e7646d2SAndroid Build Coastguard Worker dst = NULL;
58*5e7646d2SAndroid Build Coastguard Worker ppd = NULL;
59*5e7646d2SAndroid Build Coastguard Worker filter_path = "../filter:" CUPS_SERVERBIN "/filter";
60*5e7646d2SAndroid Build Coastguard Worker
61*5e7646d2SAndroid Build Coastguard Worker srcinfo.st_size = 0;
62*5e7646d2SAndroid Build Coastguard Worker
63*5e7646d2SAndroid Build Coastguard Worker for (i = 1; i < argc; i ++)
64*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(argv[i], "-d"))
65*5e7646d2SAndroid Build Coastguard Worker {
66*5e7646d2SAndroid Build Coastguard Worker i ++;
67*5e7646d2SAndroid Build Coastguard Worker
68*5e7646d2SAndroid Build Coastguard Worker if (i < argc)
69*5e7646d2SAndroid Build Coastguard Worker {
70*5e7646d2SAndroid Build Coastguard Worker mime = mimeLoad(argv[i], filter_path);
71*5e7646d2SAndroid Build Coastguard Worker
72*5e7646d2SAndroid Build Coastguard Worker if (ppd)
73*5e7646d2SAndroid Build Coastguard Worker add_ppd_filters(mime, ppd);
74*5e7646d2SAndroid Build Coastguard Worker }
75*5e7646d2SAndroid Build Coastguard Worker }
76*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[i], "-f"))
77*5e7646d2SAndroid Build Coastguard Worker {
78*5e7646d2SAndroid Build Coastguard Worker i ++;
79*5e7646d2SAndroid Build Coastguard Worker
80*5e7646d2SAndroid Build Coastguard Worker if (i < argc)
81*5e7646d2SAndroid Build Coastguard Worker filter_path = argv[i];
82*5e7646d2SAndroid Build Coastguard Worker }
83*5e7646d2SAndroid Build Coastguard Worker else if (!strcmp(argv[i], "-p"))
84*5e7646d2SAndroid Build Coastguard Worker {
85*5e7646d2SAndroid Build Coastguard Worker i ++;
86*5e7646d2SAndroid Build Coastguard Worker
87*5e7646d2SAndroid Build Coastguard Worker if (i < argc)
88*5e7646d2SAndroid Build Coastguard Worker {
89*5e7646d2SAndroid Build Coastguard Worker ppd = ppdOpenFile(argv[i]);
90*5e7646d2SAndroid Build Coastguard Worker
91*5e7646d2SAndroid Build Coastguard Worker if (mime)
92*5e7646d2SAndroid Build Coastguard Worker add_ppd_filters(mime, ppd);
93*5e7646d2SAndroid Build Coastguard Worker }
94*5e7646d2SAndroid Build Coastguard Worker }
95*5e7646d2SAndroid Build Coastguard Worker else if (!src)
96*5e7646d2SAndroid Build Coastguard Worker {
97*5e7646d2SAndroid Build Coastguard Worker if (!mime)
98*5e7646d2SAndroid Build Coastguard Worker mime = mimeLoad("../conf", filter_path);
99*5e7646d2SAndroid Build Coastguard Worker
100*5e7646d2SAndroid Build Coastguard Worker if (ppd)
101*5e7646d2SAndroid Build Coastguard Worker add_ppd_filters(mime, ppd);
102*5e7646d2SAndroid Build Coastguard Worker
103*5e7646d2SAndroid Build Coastguard Worker src = mimeFileType(mime, argv[i], NULL, &compression);
104*5e7646d2SAndroid Build Coastguard Worker stat(argv[i], &srcinfo);
105*5e7646d2SAndroid Build Coastguard Worker
106*5e7646d2SAndroid Build Coastguard Worker if (src)
107*5e7646d2SAndroid Build Coastguard Worker printf("%s: %s/%s%s\n", argv[i], src->super, src->type,
108*5e7646d2SAndroid Build Coastguard Worker compression ? " (gzipped)" : "");
109*5e7646d2SAndroid Build Coastguard Worker else if ((src = mimeType(mime, "application", "octet-stream")) != NULL)
110*5e7646d2SAndroid Build Coastguard Worker printf("%s: application/octet-stream\n", argv[i]);
111*5e7646d2SAndroid Build Coastguard Worker else
112*5e7646d2SAndroid Build Coastguard Worker {
113*5e7646d2SAndroid Build Coastguard Worker printf("%s: unknown\n", argv[i]);
114*5e7646d2SAndroid Build Coastguard Worker if (mime)
115*5e7646d2SAndroid Build Coastguard Worker mimeDelete(mime);
116*5e7646d2SAndroid Build Coastguard Worker return (1);
117*5e7646d2SAndroid Build Coastguard Worker }
118*5e7646d2SAndroid Build Coastguard Worker }
119*5e7646d2SAndroid Build Coastguard Worker else
120*5e7646d2SAndroid Build Coastguard Worker {
121*5e7646d2SAndroid Build Coastguard Worker sscanf(argv[i], "%15[^/]/%255s", super, type);
122*5e7646d2SAndroid Build Coastguard Worker dst = mimeType(mime, super, type);
123*5e7646d2SAndroid Build Coastguard Worker
124*5e7646d2SAndroid Build Coastguard Worker filters = mimeFilter2(mime, src, (size_t)srcinfo.st_size, dst, &cost);
125*5e7646d2SAndroid Build Coastguard Worker
126*5e7646d2SAndroid Build Coastguard Worker if (!filters)
127*5e7646d2SAndroid Build Coastguard Worker {
128*5e7646d2SAndroid Build Coastguard Worker printf("No filters to convert from %s/%s to %s.\n", src->super,
129*5e7646d2SAndroid Build Coastguard Worker src->type, argv[i]);
130*5e7646d2SAndroid Build Coastguard Worker }
131*5e7646d2SAndroid Build Coastguard Worker else
132*5e7646d2SAndroid Build Coastguard Worker {
133*5e7646d2SAndroid Build Coastguard Worker int first = 1; /* First filter shown? */
134*5e7646d2SAndroid Build Coastguard Worker
135*5e7646d2SAndroid Build Coastguard Worker printf("Filter cost = %d\n", cost);
136*5e7646d2SAndroid Build Coastguard Worker
137*5e7646d2SAndroid Build Coastguard Worker for (filter = (mime_filter_t *)cupsArrayFirst(filters);
138*5e7646d2SAndroid Build Coastguard Worker filter;
139*5e7646d2SAndroid Build Coastguard Worker filter = (mime_filter_t *)cupsArrayNext(filters))
140*5e7646d2SAndroid Build Coastguard Worker {
141*5e7646d2SAndroid Build Coastguard Worker if (!strcmp(filter->filter, "-"))
142*5e7646d2SAndroid Build Coastguard Worker continue;
143*5e7646d2SAndroid Build Coastguard Worker
144*5e7646d2SAndroid Build Coastguard Worker if (first)
145*5e7646d2SAndroid Build Coastguard Worker {
146*5e7646d2SAndroid Build Coastguard Worker first = 0;
147*5e7646d2SAndroid Build Coastguard Worker fputs(filter->filter, stdout);
148*5e7646d2SAndroid Build Coastguard Worker }
149*5e7646d2SAndroid Build Coastguard Worker else
150*5e7646d2SAndroid Build Coastguard Worker printf(" | %s", filter->filter);
151*5e7646d2SAndroid Build Coastguard Worker }
152*5e7646d2SAndroid Build Coastguard Worker
153*5e7646d2SAndroid Build Coastguard Worker putchar('\n');
154*5e7646d2SAndroid Build Coastguard Worker
155*5e7646d2SAndroid Build Coastguard Worker cupsArrayDelete(filters);
156*5e7646d2SAndroid Build Coastguard Worker }
157*5e7646d2SAndroid Build Coastguard Worker }
158*5e7646d2SAndroid Build Coastguard Worker
159*5e7646d2SAndroid Build Coastguard Worker if (!mime)
160*5e7646d2SAndroid Build Coastguard Worker {
161*5e7646d2SAndroid Build Coastguard Worker mime = mimeLoad("../conf", filter_path);
162*5e7646d2SAndroid Build Coastguard Worker if (ppd)
163*5e7646d2SAndroid Build Coastguard Worker add_ppd_filters(mime, ppd);
164*5e7646d2SAndroid Build Coastguard Worker }
165*5e7646d2SAndroid Build Coastguard Worker
166*5e7646d2SAndroid Build Coastguard Worker if (!src)
167*5e7646d2SAndroid Build Coastguard Worker {
168*5e7646d2SAndroid Build Coastguard Worker puts("MIME database types:");
169*5e7646d2SAndroid Build Coastguard Worker for (src = mimeFirstType(mime); src; src = mimeNextType(mime))
170*5e7646d2SAndroid Build Coastguard Worker {
171*5e7646d2SAndroid Build Coastguard Worker printf("\t%s/%s (%d):\n", src->super, src->type, src->priority);
172*5e7646d2SAndroid Build Coastguard Worker print_rules(src->rules);
173*5e7646d2SAndroid Build Coastguard Worker puts("");
174*5e7646d2SAndroid Build Coastguard Worker }
175*5e7646d2SAndroid Build Coastguard Worker
176*5e7646d2SAndroid Build Coastguard Worker puts("");
177*5e7646d2SAndroid Build Coastguard Worker
178*5e7646d2SAndroid Build Coastguard Worker puts("MIME database filters:");
179*5e7646d2SAndroid Build Coastguard Worker for (filter = mimeFirstFilter(mime); filter; filter = mimeNextFilter(mime))
180*5e7646d2SAndroid Build Coastguard Worker printf("\t%s/%s to %s/%s: %s (%d)\n",
181*5e7646d2SAndroid Build Coastguard Worker filter->src->super, filter->src->type,
182*5e7646d2SAndroid Build Coastguard Worker filter->dst->super, filter->dst->type,
183*5e7646d2SAndroid Build Coastguard Worker filter->filter, filter->cost);
184*5e7646d2SAndroid Build Coastguard Worker
185*5e7646d2SAndroid Build Coastguard Worker type_dir(mime, "../doc");
186*5e7646d2SAndroid Build Coastguard Worker }
187*5e7646d2SAndroid Build Coastguard Worker
188*5e7646d2SAndroid Build Coastguard Worker return (0);
189*5e7646d2SAndroid Build Coastguard Worker }
190*5e7646d2SAndroid Build Coastguard Worker
191*5e7646d2SAndroid Build Coastguard Worker
192*5e7646d2SAndroid Build Coastguard Worker /*
193*5e7646d2SAndroid Build Coastguard Worker * 'add_printer_filter()' - Add a printer filter from a PPD.
194*5e7646d2SAndroid Build Coastguard Worker */
195*5e7646d2SAndroid Build Coastguard Worker
196*5e7646d2SAndroid Build Coastguard Worker static void
add_ppd_filter(mime_t * mime,mime_type_t * filtertype,const char * filter)197*5e7646d2SAndroid Build Coastguard Worker add_ppd_filter(mime_t *mime, /* I - MIME database */
198*5e7646d2SAndroid Build Coastguard Worker mime_type_t *filtertype, /* I - Filter or prefilter MIME type */
199*5e7646d2SAndroid Build Coastguard Worker const char *filter) /* I - Filter to add */
200*5e7646d2SAndroid Build Coastguard Worker {
201*5e7646d2SAndroid Build Coastguard Worker char super[MIME_MAX_SUPER], /* Super-type for filter */
202*5e7646d2SAndroid Build Coastguard Worker type[MIME_MAX_TYPE], /* Type for filter */
203*5e7646d2SAndroid Build Coastguard Worker dsuper[MIME_MAX_SUPER], /* Destination super-type for filter */
204*5e7646d2SAndroid Build Coastguard Worker dtype[MIME_MAX_TYPE], /* Destination type for filter */
205*5e7646d2SAndroid Build Coastguard Worker dest[MIME_MAX_SUPER + MIME_MAX_TYPE + 2],
206*5e7646d2SAndroid Build Coastguard Worker /* Destination super/type */
207*5e7646d2SAndroid Build Coastguard Worker program[1024]; /* Program/filter name */
208*5e7646d2SAndroid Build Coastguard Worker int cost; /* Cost of filter */
209*5e7646d2SAndroid Build Coastguard Worker size_t maxsize = 0; /* Maximum supported file size */
210*5e7646d2SAndroid Build Coastguard Worker mime_type_t *temptype, /* MIME type looping var */
211*5e7646d2SAndroid Build Coastguard Worker *desttype; /* Destination MIME type */
212*5e7646d2SAndroid Build Coastguard Worker mime_filter_t *filterptr; /* MIME filter */
213*5e7646d2SAndroid Build Coastguard Worker
214*5e7646d2SAndroid Build Coastguard Worker
215*5e7646d2SAndroid Build Coastguard Worker /*
216*5e7646d2SAndroid Build Coastguard Worker * Parse the filter string; it should be in one of the following formats:
217*5e7646d2SAndroid Build Coastguard Worker *
218*5e7646d2SAndroid Build Coastguard Worker * source/type cost program
219*5e7646d2SAndroid Build Coastguard Worker * source/type cost maxsize(nnnn) program
220*5e7646d2SAndroid Build Coastguard Worker * source/type dest/type cost program
221*5e7646d2SAndroid Build Coastguard Worker * source/type dest/type cost maxsize(nnnn) program
222*5e7646d2SAndroid Build Coastguard Worker */
223*5e7646d2SAndroid Build Coastguard Worker
224*5e7646d2SAndroid Build Coastguard Worker if (sscanf(filter, "%15[^/]/%255s%*[ \t]%15[^/]/%255s%d%*[ \t]%1023[^\n]",
225*5e7646d2SAndroid Build Coastguard Worker super, type, dsuper, dtype, &cost, program) == 6)
226*5e7646d2SAndroid Build Coastguard Worker {
227*5e7646d2SAndroid Build Coastguard Worker snprintf(dest, sizeof(dest), "test/%s/%s", dsuper, dtype);
228*5e7646d2SAndroid Build Coastguard Worker
229*5e7646d2SAndroid Build Coastguard Worker if ((desttype = mimeType(mime, "printer", dest)) == NULL)
230*5e7646d2SAndroid Build Coastguard Worker desttype = mimeAddType(mime, "printer", dest);
231*5e7646d2SAndroid Build Coastguard Worker }
232*5e7646d2SAndroid Build Coastguard Worker else
233*5e7646d2SAndroid Build Coastguard Worker {
234*5e7646d2SAndroid Build Coastguard Worker if (sscanf(filter, "%15[^/]/%255s%d%*[ \t]%1023[^\n]", super, type, &cost,
235*5e7646d2SAndroid Build Coastguard Worker program) == 4)
236*5e7646d2SAndroid Build Coastguard Worker {
237*5e7646d2SAndroid Build Coastguard Worker desttype = filtertype;
238*5e7646d2SAndroid Build Coastguard Worker }
239*5e7646d2SAndroid Build Coastguard Worker else
240*5e7646d2SAndroid Build Coastguard Worker {
241*5e7646d2SAndroid Build Coastguard Worker printf("testmime: Invalid filter string \"%s\".\n", filter);
242*5e7646d2SAndroid Build Coastguard Worker return;
243*5e7646d2SAndroid Build Coastguard Worker }
244*5e7646d2SAndroid Build Coastguard Worker }
245*5e7646d2SAndroid Build Coastguard Worker
246*5e7646d2SAndroid Build Coastguard Worker if (!strncmp(program, "maxsize(", 8))
247*5e7646d2SAndroid Build Coastguard Worker {
248*5e7646d2SAndroid Build Coastguard Worker char *ptr; /* Pointer into maxsize(nnnn) program */
249*5e7646d2SAndroid Build Coastguard Worker
250*5e7646d2SAndroid Build Coastguard Worker maxsize = (size_t)strtoll(program + 8, &ptr, 10);
251*5e7646d2SAndroid Build Coastguard Worker
252*5e7646d2SAndroid Build Coastguard Worker if (*ptr != ')')
253*5e7646d2SAndroid Build Coastguard Worker {
254*5e7646d2SAndroid Build Coastguard Worker printf("testmime: Invalid filter string \"%s\".\n", filter);
255*5e7646d2SAndroid Build Coastguard Worker return;
256*5e7646d2SAndroid Build Coastguard Worker }
257*5e7646d2SAndroid Build Coastguard Worker
258*5e7646d2SAndroid Build Coastguard Worker ptr ++;
259*5e7646d2SAndroid Build Coastguard Worker while (_cups_isspace(*ptr))
260*5e7646d2SAndroid Build Coastguard Worker ptr ++;
261*5e7646d2SAndroid Build Coastguard Worker
262*5e7646d2SAndroid Build Coastguard Worker _cups_strcpy(program, ptr);
263*5e7646d2SAndroid Build Coastguard Worker }
264*5e7646d2SAndroid Build Coastguard Worker
265*5e7646d2SAndroid Build Coastguard Worker /*
266*5e7646d2SAndroid Build Coastguard Worker * Add the filter to the MIME database, supporting wildcards as needed...
267*5e7646d2SAndroid Build Coastguard Worker */
268*5e7646d2SAndroid Build Coastguard Worker
269*5e7646d2SAndroid Build Coastguard Worker for (temptype = mimeFirstType(mime);
270*5e7646d2SAndroid Build Coastguard Worker temptype;
271*5e7646d2SAndroid Build Coastguard Worker temptype = mimeNextType(mime))
272*5e7646d2SAndroid Build Coastguard Worker if (((super[0] == '*' && _cups_strcasecmp(temptype->super, "printer")) ||
273*5e7646d2SAndroid Build Coastguard Worker !_cups_strcasecmp(temptype->super, super)) &&
274*5e7646d2SAndroid Build Coastguard Worker (type[0] == '*' || !_cups_strcasecmp(temptype->type, type)))
275*5e7646d2SAndroid Build Coastguard Worker {
276*5e7646d2SAndroid Build Coastguard Worker if (desttype != filtertype)
277*5e7646d2SAndroid Build Coastguard Worker {
278*5e7646d2SAndroid Build Coastguard Worker filterptr = mimeAddFilter(mime, temptype, desttype, cost, program);
279*5e7646d2SAndroid Build Coastguard Worker
280*5e7646d2SAndroid Build Coastguard Worker if (!mimeFilterLookup(mime, desttype, filtertype))
281*5e7646d2SAndroid Build Coastguard Worker mimeAddFilter(mime, desttype, filtertype, 0, "-");
282*5e7646d2SAndroid Build Coastguard Worker }
283*5e7646d2SAndroid Build Coastguard Worker else
284*5e7646d2SAndroid Build Coastguard Worker filterptr = mimeAddFilter(mime, temptype, filtertype, cost, program);
285*5e7646d2SAndroid Build Coastguard Worker
286*5e7646d2SAndroid Build Coastguard Worker if (filterptr)
287*5e7646d2SAndroid Build Coastguard Worker filterptr->maxsize = maxsize;
288*5e7646d2SAndroid Build Coastguard Worker }
289*5e7646d2SAndroid Build Coastguard Worker }
290*5e7646d2SAndroid Build Coastguard Worker
291*5e7646d2SAndroid Build Coastguard Worker
292*5e7646d2SAndroid Build Coastguard Worker /*
293*5e7646d2SAndroid Build Coastguard Worker * 'add_ppd_filters()' - Add all filters from a PPD.
294*5e7646d2SAndroid Build Coastguard Worker */
295*5e7646d2SAndroid Build Coastguard Worker
296*5e7646d2SAndroid Build Coastguard Worker static void
add_ppd_filters(mime_t * mime,ppd_file_t * ppd)297*5e7646d2SAndroid Build Coastguard Worker add_ppd_filters(mime_t *mime, /* I - MIME database */
298*5e7646d2SAndroid Build Coastguard Worker ppd_file_t *ppd) /* I - PPD file */
299*5e7646d2SAndroid Build Coastguard Worker {
300*5e7646d2SAndroid Build Coastguard Worker _ppd_cache_t *pc; /* Cache data for PPD */
301*5e7646d2SAndroid Build Coastguard Worker const char *value; /* Filter definition value */
302*5e7646d2SAndroid Build Coastguard Worker mime_type_t *filter, /* Filter type */
303*5e7646d2SAndroid Build Coastguard Worker *prefilter; /* Pre-filter type */
304*5e7646d2SAndroid Build Coastguard Worker
305*5e7646d2SAndroid Build Coastguard Worker
306*5e7646d2SAndroid Build Coastguard Worker pc = _ppdCacheCreateWithPPD(ppd);
307*5e7646d2SAndroid Build Coastguard Worker if (!pc)
308*5e7646d2SAndroid Build Coastguard Worker return;
309*5e7646d2SAndroid Build Coastguard Worker
310*5e7646d2SAndroid Build Coastguard Worker filter = mimeAddType(mime, "printer", "test");
311*5e7646d2SAndroid Build Coastguard Worker
312*5e7646d2SAndroid Build Coastguard Worker if (pc->filters)
313*5e7646d2SAndroid Build Coastguard Worker {
314*5e7646d2SAndroid Build Coastguard Worker for (value = (const char *)cupsArrayFirst(pc->filters);
315*5e7646d2SAndroid Build Coastguard Worker value;
316*5e7646d2SAndroid Build Coastguard Worker value = (const char *)cupsArrayNext(pc->filters))
317*5e7646d2SAndroid Build Coastguard Worker add_ppd_filter(mime, filter, value);
318*5e7646d2SAndroid Build Coastguard Worker }
319*5e7646d2SAndroid Build Coastguard Worker else
320*5e7646d2SAndroid Build Coastguard Worker {
321*5e7646d2SAndroid Build Coastguard Worker add_ppd_filter(mime, filter, "application/vnd.cups-raw 0 -");
322*5e7646d2SAndroid Build Coastguard Worker add_ppd_filter(mime, filter, "application/vnd.cups-postscript 0 -");
323*5e7646d2SAndroid Build Coastguard Worker }
324*5e7646d2SAndroid Build Coastguard Worker
325*5e7646d2SAndroid Build Coastguard Worker if (pc->prefilters)
326*5e7646d2SAndroid Build Coastguard Worker {
327*5e7646d2SAndroid Build Coastguard Worker prefilter = mimeAddType(mime, "prefilter", "test");
328*5e7646d2SAndroid Build Coastguard Worker
329*5e7646d2SAndroid Build Coastguard Worker for (value = (const char *)cupsArrayFirst(pc->prefilters);
330*5e7646d2SAndroid Build Coastguard Worker value;
331*5e7646d2SAndroid Build Coastguard Worker value = (const char *)cupsArrayNext(pc->prefilters))
332*5e7646d2SAndroid Build Coastguard Worker add_ppd_filter(mime, prefilter, value);
333*5e7646d2SAndroid Build Coastguard Worker }
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 * 'print_rules()' - Print the rules for a file type...
339*5e7646d2SAndroid Build Coastguard Worker */
340*5e7646d2SAndroid Build Coastguard Worker
341*5e7646d2SAndroid Build Coastguard Worker static void
print_rules(mime_magic_t * rules)342*5e7646d2SAndroid Build Coastguard Worker print_rules(mime_magic_t *rules) /* I - Rules to print */
343*5e7646d2SAndroid Build Coastguard Worker {
344*5e7646d2SAndroid Build Coastguard Worker int i; /* Looping var */
345*5e7646d2SAndroid Build Coastguard Worker static char indent[255] = "\t"; /* Indentation for rules */
346*5e7646d2SAndroid Build Coastguard Worker
347*5e7646d2SAndroid Build Coastguard Worker
348*5e7646d2SAndroid Build Coastguard Worker if (rules == NULL)
349*5e7646d2SAndroid Build Coastguard Worker return;
350*5e7646d2SAndroid Build Coastguard Worker
351*5e7646d2SAndroid Build Coastguard Worker while (rules != NULL)
352*5e7646d2SAndroid Build Coastguard Worker {
353*5e7646d2SAndroid Build Coastguard Worker printf("%s[%p] ", indent, rules);
354*5e7646d2SAndroid Build Coastguard Worker
355*5e7646d2SAndroid Build Coastguard Worker if (rules->invert)
356*5e7646d2SAndroid Build Coastguard Worker printf("NOT ");
357*5e7646d2SAndroid Build Coastguard Worker
358*5e7646d2SAndroid Build Coastguard Worker switch (rules->op)
359*5e7646d2SAndroid Build Coastguard Worker {
360*5e7646d2SAndroid Build Coastguard Worker case MIME_MAGIC_MATCH :
361*5e7646d2SAndroid Build Coastguard Worker printf("match(%s)", rules->value.matchv);
362*5e7646d2SAndroid Build Coastguard Worker break;
363*5e7646d2SAndroid Build Coastguard Worker case MIME_MAGIC_LOCALE :
364*5e7646d2SAndroid Build Coastguard Worker printf("locale(%s)", rules->value.localev);
365*5e7646d2SAndroid Build Coastguard Worker break;
366*5e7646d2SAndroid Build Coastguard Worker case MIME_MAGIC_ASCII :
367*5e7646d2SAndroid Build Coastguard Worker printf("ascii(%d,%d)", rules->offset, rules->length);
368*5e7646d2SAndroid Build Coastguard Worker break;
369*5e7646d2SAndroid Build Coastguard Worker case MIME_MAGIC_PRINTABLE :
370*5e7646d2SAndroid Build Coastguard Worker printf("printable(%d,%d)", rules->offset, rules->length);
371*5e7646d2SAndroid Build Coastguard Worker break;
372*5e7646d2SAndroid Build Coastguard Worker case MIME_MAGIC_STRING :
373*5e7646d2SAndroid Build Coastguard Worker printf("string(%d,", rules->offset);
374*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < rules->length; i ++)
375*5e7646d2SAndroid Build Coastguard Worker if (rules->value.stringv[i] < ' ' ||
376*5e7646d2SAndroid Build Coastguard Worker rules->value.stringv[i] > 126)
377*5e7646d2SAndroid Build Coastguard Worker printf("<%02X>", rules->value.stringv[i]);
378*5e7646d2SAndroid Build Coastguard Worker else
379*5e7646d2SAndroid Build Coastguard Worker putchar(rules->value.stringv[i]);
380*5e7646d2SAndroid Build Coastguard Worker putchar(')');
381*5e7646d2SAndroid Build Coastguard Worker break;
382*5e7646d2SAndroid Build Coastguard Worker case MIME_MAGIC_CHAR :
383*5e7646d2SAndroid Build Coastguard Worker printf("char(%d,%d)", rules->offset, rules->value.charv);
384*5e7646d2SAndroid Build Coastguard Worker break;
385*5e7646d2SAndroid Build Coastguard Worker case MIME_MAGIC_SHORT :
386*5e7646d2SAndroid Build Coastguard Worker printf("short(%d,%d)", rules->offset, rules->value.shortv);
387*5e7646d2SAndroid Build Coastguard Worker break;
388*5e7646d2SAndroid Build Coastguard Worker case MIME_MAGIC_INT :
389*5e7646d2SAndroid Build Coastguard Worker printf("int(%d,%d)", rules->offset, rules->value.intv);
390*5e7646d2SAndroid Build Coastguard Worker break;
391*5e7646d2SAndroid Build Coastguard Worker case MIME_MAGIC_CONTAINS :
392*5e7646d2SAndroid Build Coastguard Worker printf("contains(%d,%d,", rules->offset, rules->region);
393*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < rules->length; i ++)
394*5e7646d2SAndroid Build Coastguard Worker if (rules->value.stringv[i] < ' ' ||
395*5e7646d2SAndroid Build Coastguard Worker rules->value.stringv[i] > 126)
396*5e7646d2SAndroid Build Coastguard Worker printf("<%02X>", rules->value.stringv[i]);
397*5e7646d2SAndroid Build Coastguard Worker else
398*5e7646d2SAndroid Build Coastguard Worker putchar(rules->value.stringv[i]);
399*5e7646d2SAndroid Build Coastguard Worker putchar(')');
400*5e7646d2SAndroid Build Coastguard Worker break;
401*5e7646d2SAndroid Build Coastguard Worker default :
402*5e7646d2SAndroid Build Coastguard Worker break;
403*5e7646d2SAndroid Build Coastguard Worker }
404*5e7646d2SAndroid Build Coastguard Worker
405*5e7646d2SAndroid Build Coastguard Worker if (rules->child != NULL)
406*5e7646d2SAndroid Build Coastguard Worker {
407*5e7646d2SAndroid Build Coastguard Worker if (rules->op == MIME_MAGIC_OR)
408*5e7646d2SAndroid Build Coastguard Worker puts("OR (");
409*5e7646d2SAndroid Build Coastguard Worker else
410*5e7646d2SAndroid Build Coastguard Worker puts("AND (");
411*5e7646d2SAndroid Build Coastguard Worker
412*5e7646d2SAndroid Build Coastguard Worker strcat(indent, "\t");
413*5e7646d2SAndroid Build Coastguard Worker print_rules(rules->child);
414*5e7646d2SAndroid Build Coastguard Worker indent[strlen(indent) - 1] = '\0';
415*5e7646d2SAndroid Build Coastguard Worker printf("%s)\n", indent);
416*5e7646d2SAndroid Build Coastguard Worker }
417*5e7646d2SAndroid Build Coastguard Worker else
418*5e7646d2SAndroid Build Coastguard Worker putchar('\n');
419*5e7646d2SAndroid Build Coastguard Worker
420*5e7646d2SAndroid Build Coastguard Worker rules = rules->next;
421*5e7646d2SAndroid Build Coastguard Worker }
422*5e7646d2SAndroid Build Coastguard Worker }
423*5e7646d2SAndroid Build Coastguard Worker
424*5e7646d2SAndroid Build Coastguard Worker
425*5e7646d2SAndroid Build Coastguard Worker /*
426*5e7646d2SAndroid Build Coastguard Worker * 'type_dir()' - Show the MIME types for a given directory.
427*5e7646d2SAndroid Build Coastguard Worker */
428*5e7646d2SAndroid Build Coastguard Worker
429*5e7646d2SAndroid Build Coastguard Worker static void
type_dir(mime_t * mime,const char * dirname)430*5e7646d2SAndroid Build Coastguard Worker type_dir(mime_t *mime, /* I - MIME database */
431*5e7646d2SAndroid Build Coastguard Worker const char *dirname) /* I - Directory */
432*5e7646d2SAndroid Build Coastguard Worker {
433*5e7646d2SAndroid Build Coastguard Worker cups_dir_t *dir; /* Directory */
434*5e7646d2SAndroid Build Coastguard Worker cups_dentry_t *dent; /* Directory entry */
435*5e7646d2SAndroid Build Coastguard Worker char filename[1024]; /* File to type */
436*5e7646d2SAndroid Build Coastguard Worker mime_type_t *filetype; /* File type */
437*5e7646d2SAndroid Build Coastguard Worker int compression; /* Compressed file? */
438*5e7646d2SAndroid Build Coastguard Worker mime_type_t *pstype; /* application/vnd.cups-postscript */
439*5e7646d2SAndroid Build Coastguard Worker cups_array_t *filters; /* Filters to pstype */
440*5e7646d2SAndroid Build Coastguard Worker mime_filter_t *filter; /* Current filter */
441*5e7646d2SAndroid Build Coastguard Worker int cost; /* Filter cost */
442*5e7646d2SAndroid Build Coastguard Worker
443*5e7646d2SAndroid Build Coastguard Worker
444*5e7646d2SAndroid Build Coastguard Worker dir = cupsDirOpen(dirname);
445*5e7646d2SAndroid Build Coastguard Worker if (!dir)
446*5e7646d2SAndroid Build Coastguard Worker return;
447*5e7646d2SAndroid Build Coastguard Worker
448*5e7646d2SAndroid Build Coastguard Worker pstype = mimeType(mime, "application", "vnd.cups-postscript");
449*5e7646d2SAndroid Build Coastguard Worker
450*5e7646d2SAndroid Build Coastguard Worker while ((dent = cupsDirRead(dir)) != NULL)
451*5e7646d2SAndroid Build Coastguard Worker {
452*5e7646d2SAndroid Build Coastguard Worker if (dent->filename[0] == '.')
453*5e7646d2SAndroid Build Coastguard Worker continue;
454*5e7646d2SAndroid Build Coastguard Worker
455*5e7646d2SAndroid Build Coastguard Worker snprintf(filename, sizeof(filename), "%s/%s", dirname, dent->filename);
456*5e7646d2SAndroid Build Coastguard Worker
457*5e7646d2SAndroid Build Coastguard Worker if (S_ISDIR(dent->fileinfo.st_mode))
458*5e7646d2SAndroid Build Coastguard Worker type_dir(mime, filename);
459*5e7646d2SAndroid Build Coastguard Worker
460*5e7646d2SAndroid Build Coastguard Worker if (!S_ISREG(dent->fileinfo.st_mode))
461*5e7646d2SAndroid Build Coastguard Worker continue;
462*5e7646d2SAndroid Build Coastguard Worker
463*5e7646d2SAndroid Build Coastguard Worker filetype = mimeFileType(mime, filename, NULL, &compression);
464*5e7646d2SAndroid Build Coastguard Worker
465*5e7646d2SAndroid Build Coastguard Worker if (filetype)
466*5e7646d2SAndroid Build Coastguard Worker {
467*5e7646d2SAndroid Build Coastguard Worker printf("%s: %s/%s%s\n", filename, filetype->super, filetype->type,
468*5e7646d2SAndroid Build Coastguard Worker compression ? " (compressed)" : "");
469*5e7646d2SAndroid Build Coastguard Worker
470*5e7646d2SAndroid Build Coastguard Worker filters = mimeFilter(mime, filetype, pstype, &cost);
471*5e7646d2SAndroid Build Coastguard Worker
472*5e7646d2SAndroid Build Coastguard Worker if (!filters)
473*5e7646d2SAndroid Build Coastguard Worker puts(" No filters to convert application/vnd.cups-postscript.");
474*5e7646d2SAndroid Build Coastguard Worker else
475*5e7646d2SAndroid Build Coastguard Worker {
476*5e7646d2SAndroid Build Coastguard Worker printf(" Filter cost = %d\n", cost);
477*5e7646d2SAndroid Build Coastguard Worker
478*5e7646d2SAndroid Build Coastguard Worker filter = (mime_filter_t *)cupsArrayFirst(filters);
479*5e7646d2SAndroid Build Coastguard Worker printf(" %s", filter->filter);
480*5e7646d2SAndroid Build Coastguard Worker
481*5e7646d2SAndroid Build Coastguard Worker for (filter = (mime_filter_t *)cupsArrayNext(filters);
482*5e7646d2SAndroid Build Coastguard Worker filter;
483*5e7646d2SAndroid Build Coastguard Worker filter = (mime_filter_t *)cupsArrayNext(filters))
484*5e7646d2SAndroid Build Coastguard Worker printf(" | %s", filter->filter);
485*5e7646d2SAndroid Build Coastguard Worker
486*5e7646d2SAndroid Build Coastguard Worker putchar('\n');
487*5e7646d2SAndroid Build Coastguard Worker
488*5e7646d2SAndroid Build Coastguard Worker cupsArrayDelete(filters);
489*5e7646d2SAndroid Build Coastguard Worker }
490*5e7646d2SAndroid Build Coastguard Worker }
491*5e7646d2SAndroid Build Coastguard Worker else
492*5e7646d2SAndroid Build Coastguard Worker printf("%s: unknown%s\n", filename, compression ? " (compressed)" : "");
493*5e7646d2SAndroid Build Coastguard Worker }
494*5e7646d2SAndroid Build Coastguard Worker
495*5e7646d2SAndroid Build Coastguard Worker cupsDirClose(dir);
496*5e7646d2SAndroid Build Coastguard Worker }
497