xref: /aosp_15_r20/external/libcups/scheduler/testmime.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
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