xref: /aosp_15_r20/external/libcups/cups/testdest.c (revision 5e7646d21f1134fb0638875d812ef646c12ab91e)
1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker  * CUPS destination API test program for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker  *
4*5e7646d2SAndroid Build Coastguard Worker  * Copyright © 2012-2018 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker  *
6*5e7646d2SAndroid Build Coastguard Worker  * Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
7*5e7646d2SAndroid Build Coastguard Worker  */
8*5e7646d2SAndroid Build Coastguard Worker 
9*5e7646d2SAndroid Build Coastguard Worker /*
10*5e7646d2SAndroid Build Coastguard Worker  * Include necessary headers...
11*5e7646d2SAndroid Build Coastguard Worker  */
12*5e7646d2SAndroid Build Coastguard Worker 
13*5e7646d2SAndroid Build Coastguard Worker #include <stdio.h>
14*5e7646d2SAndroid Build Coastguard Worker #include <errno.h>
15*5e7646d2SAndroid Build Coastguard Worker #include "cups.h"
16*5e7646d2SAndroid Build Coastguard Worker 
17*5e7646d2SAndroid Build Coastguard Worker 
18*5e7646d2SAndroid Build Coastguard Worker /*
19*5e7646d2SAndroid Build Coastguard Worker  * Local functions...
20*5e7646d2SAndroid Build Coastguard Worker  */
21*5e7646d2SAndroid Build Coastguard Worker 
22*5e7646d2SAndroid Build Coastguard Worker static int	enum_cb(void *user_data, unsigned flags, cups_dest_t *dest);
23*5e7646d2SAndroid Build Coastguard Worker static void	localize(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option, const char *value);
24*5e7646d2SAndroid Build Coastguard Worker static void	print_file(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *filename, int num_options, cups_option_t *options);
25*5e7646d2SAndroid Build Coastguard Worker static void	show_conflicts(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, int num_options, cups_option_t *options);
26*5e7646d2SAndroid Build Coastguard Worker static void	show_default(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option);
27*5e7646d2SAndroid Build Coastguard Worker static void	show_media(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, unsigned flags, const char *name);
28*5e7646d2SAndroid Build Coastguard Worker static void	show_supported(http_t *http, cups_dest_t *dest, cups_dinfo_t *dinfo, const char *option, const char *value);
29*5e7646d2SAndroid Build Coastguard Worker static void	usage(const char *arg) _CUPS_NORETURN;
30*5e7646d2SAndroid Build Coastguard Worker 
31*5e7646d2SAndroid Build Coastguard Worker 
32*5e7646d2SAndroid Build Coastguard Worker /*
33*5e7646d2SAndroid Build Coastguard Worker  * 'main()' - Main entry.
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 arguments */
38*5e7646d2SAndroid Build Coastguard Worker      char *argv[])			/* I - Command-line arguments */
39*5e7646d2SAndroid Build Coastguard Worker {
40*5e7646d2SAndroid Build Coastguard Worker   int		i;			/* Looping var */
41*5e7646d2SAndroid Build Coastguard Worker   http_t	*http;			/* Connection to destination */
42*5e7646d2SAndroid Build Coastguard Worker   cups_dest_t	*dest = NULL;		/* Destination */
43*5e7646d2SAndroid Build Coastguard Worker   cups_dinfo_t	*dinfo;			/* Destination info */
44*5e7646d2SAndroid Build Coastguard Worker   unsigned	dflags = CUPS_DEST_FLAGS_NONE;
45*5e7646d2SAndroid Build Coastguard Worker 					/* Destination flags */
46*5e7646d2SAndroid Build Coastguard Worker 
47*5e7646d2SAndroid Build Coastguard Worker 
48*5e7646d2SAndroid Build Coastguard Worker   if (argc < 2)
49*5e7646d2SAndroid Build Coastguard Worker     return (0);
50*5e7646d2SAndroid Build Coastguard Worker 
51*5e7646d2SAndroid Build Coastguard Worker   if (!strcmp(argv[1], "--get"))
52*5e7646d2SAndroid Build Coastguard Worker   {
53*5e7646d2SAndroid Build Coastguard Worker     cups_dest_t	*dests;			/* Destinations */
54*5e7646d2SAndroid Build Coastguard Worker     int		num_dests = cupsGetDests2(CUPS_HTTP_DEFAULT, &dests);
55*5e7646d2SAndroid Build Coastguard Worker 					/* Number of destinations */
56*5e7646d2SAndroid Build Coastguard Worker 
57*5e7646d2SAndroid Build Coastguard Worker     for (i = 0; i < num_dests; i ++)
58*5e7646d2SAndroid Build Coastguard Worker       enum_cb(NULL, 0, dests + i);
59*5e7646d2SAndroid Build Coastguard Worker 
60*5e7646d2SAndroid Build Coastguard Worker     cupsFreeDests(num_dests, dests);
61*5e7646d2SAndroid Build Coastguard Worker     return (0);
62*5e7646d2SAndroid Build Coastguard Worker   }
63*5e7646d2SAndroid Build Coastguard Worker   else if (!strcmp(argv[1], "--enum"))
64*5e7646d2SAndroid Build Coastguard Worker   {
65*5e7646d2SAndroid Build Coastguard Worker     cups_ptype_t	type = 0,	/* Printer type filter */
66*5e7646d2SAndroid Build Coastguard Worker 			mask = 0;	/* Printer type mask */
67*5e7646d2SAndroid Build Coastguard Worker 
68*5e7646d2SAndroid Build Coastguard Worker 
69*5e7646d2SAndroid Build Coastguard Worker     for (i = 2; i < argc; i ++)
70*5e7646d2SAndroid Build Coastguard Worker     {
71*5e7646d2SAndroid Build Coastguard Worker       if (!strcmp(argv[i], "grayscale"))
72*5e7646d2SAndroid Build Coastguard Worker       {
73*5e7646d2SAndroid Build Coastguard Worker         type |= CUPS_PRINTER_BW;
74*5e7646d2SAndroid Build Coastguard Worker 	mask |= CUPS_PRINTER_BW;
75*5e7646d2SAndroid Build Coastguard Worker       }
76*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(argv[i], "color"))
77*5e7646d2SAndroid Build Coastguard Worker       {
78*5e7646d2SAndroid Build Coastguard Worker         type |= CUPS_PRINTER_COLOR;
79*5e7646d2SAndroid Build Coastguard Worker 	mask |= CUPS_PRINTER_COLOR;
80*5e7646d2SAndroid Build Coastguard Worker       }
81*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(argv[i], "duplex"))
82*5e7646d2SAndroid Build Coastguard Worker       {
83*5e7646d2SAndroid Build Coastguard Worker         type |= CUPS_PRINTER_DUPLEX;
84*5e7646d2SAndroid Build Coastguard Worker 	mask |= CUPS_PRINTER_DUPLEX;
85*5e7646d2SAndroid Build Coastguard Worker       }
86*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(argv[i], "staple"))
87*5e7646d2SAndroid Build Coastguard Worker       {
88*5e7646d2SAndroid Build Coastguard Worker         type |= CUPS_PRINTER_STAPLE;
89*5e7646d2SAndroid Build Coastguard Worker 	mask |= CUPS_PRINTER_STAPLE;
90*5e7646d2SAndroid Build Coastguard Worker       }
91*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(argv[i], "small"))
92*5e7646d2SAndroid Build Coastguard Worker       {
93*5e7646d2SAndroid Build Coastguard Worker         type |= CUPS_PRINTER_SMALL;
94*5e7646d2SAndroid Build Coastguard Worker 	mask |= CUPS_PRINTER_SMALL;
95*5e7646d2SAndroid Build Coastguard Worker       }
96*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(argv[i], "medium"))
97*5e7646d2SAndroid Build Coastguard Worker       {
98*5e7646d2SAndroid Build Coastguard Worker         type |= CUPS_PRINTER_MEDIUM;
99*5e7646d2SAndroid Build Coastguard Worker 	mask |= CUPS_PRINTER_MEDIUM;
100*5e7646d2SAndroid Build Coastguard Worker       }
101*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(argv[i], "large"))
102*5e7646d2SAndroid Build Coastguard Worker       {
103*5e7646d2SAndroid Build Coastguard Worker         type |= CUPS_PRINTER_LARGE;
104*5e7646d2SAndroid Build Coastguard Worker 	mask |= CUPS_PRINTER_LARGE;
105*5e7646d2SAndroid Build Coastguard Worker       }
106*5e7646d2SAndroid Build Coastguard Worker       else
107*5e7646d2SAndroid Build Coastguard Worker         usage(argv[i]);
108*5e7646d2SAndroid Build Coastguard Worker     }
109*5e7646d2SAndroid Build Coastguard Worker 
110*5e7646d2SAndroid Build Coastguard Worker     cupsEnumDests(CUPS_DEST_FLAGS_NONE, 5000, NULL, type, mask, enum_cb, NULL);
111*5e7646d2SAndroid Build Coastguard Worker 
112*5e7646d2SAndroid Build Coastguard Worker     return (0);
113*5e7646d2SAndroid Build Coastguard Worker   }
114*5e7646d2SAndroid Build Coastguard Worker 
115*5e7646d2SAndroid Build Coastguard Worker   i = 1;
116*5e7646d2SAndroid Build Coastguard Worker   if (!strcmp(argv[i], "--device"))
117*5e7646d2SAndroid Build Coastguard Worker   {
118*5e7646d2SAndroid Build Coastguard Worker     dflags = CUPS_DEST_FLAGS_DEVICE;
119*5e7646d2SAndroid Build Coastguard Worker     i ++;
120*5e7646d2SAndroid Build Coastguard Worker   }
121*5e7646d2SAndroid Build Coastguard Worker 
122*5e7646d2SAndroid Build Coastguard Worker   if (!strncmp(argv[i], "ipp://", 6) || !strncmp(argv[i], "ipps://", 7))
123*5e7646d2SAndroid Build Coastguard Worker     dest = cupsGetDestWithURI(NULL, argv[i]);
124*5e7646d2SAndroid Build Coastguard Worker   else if (!strcmp(argv[i], "default"))
125*5e7646d2SAndroid Build Coastguard Worker   {
126*5e7646d2SAndroid Build Coastguard Worker     dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL);
127*5e7646d2SAndroid Build Coastguard Worker     if (dest && dest->instance)
128*5e7646d2SAndroid Build Coastguard Worker       printf("default is \"%s/%s\".\n", dest->name, dest->instance);
129*5e7646d2SAndroid Build Coastguard Worker     else if (dest)
130*5e7646d2SAndroid Build Coastguard Worker       printf("default is \"%s\".\n", dest->name);
131*5e7646d2SAndroid Build Coastguard Worker     else
132*5e7646d2SAndroid Build Coastguard Worker       puts("no default destination.");
133*5e7646d2SAndroid Build Coastguard Worker   }
134*5e7646d2SAndroid Build Coastguard Worker   else
135*5e7646d2SAndroid Build Coastguard Worker     dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, argv[i], NULL);
136*5e7646d2SAndroid Build Coastguard Worker 
137*5e7646d2SAndroid Build Coastguard Worker   if (!dest)
138*5e7646d2SAndroid Build Coastguard Worker   {
139*5e7646d2SAndroid Build Coastguard Worker     printf("testdest: Unable to get destination \"%s\": %s\n", argv[i], cupsLastErrorString());
140*5e7646d2SAndroid Build Coastguard Worker     return (1);
141*5e7646d2SAndroid Build Coastguard Worker   }
142*5e7646d2SAndroid Build Coastguard Worker 
143*5e7646d2SAndroid Build Coastguard Worker   i ++;
144*5e7646d2SAndroid Build Coastguard Worker 
145*5e7646d2SAndroid Build Coastguard Worker   if ((http = cupsConnectDest(dest, dflags, 30000, NULL, NULL, 0, NULL, NULL)) == NULL)
146*5e7646d2SAndroid Build Coastguard Worker   {
147*5e7646d2SAndroid Build Coastguard Worker     printf("testdest: Unable to connect to destination \"%s\": %s\n", dest->name, cupsLastErrorString());
148*5e7646d2SAndroid Build Coastguard Worker     return (1);
149*5e7646d2SAndroid Build Coastguard Worker   }
150*5e7646d2SAndroid Build Coastguard Worker 
151*5e7646d2SAndroid Build Coastguard Worker   if ((dinfo = cupsCopyDestInfo(http, dest)) == NULL)
152*5e7646d2SAndroid Build Coastguard Worker   {
153*5e7646d2SAndroid Build Coastguard Worker     printf("testdest: Unable to get information for destination \"%s\": %s\n", dest->name, cupsLastErrorString());
154*5e7646d2SAndroid Build Coastguard Worker     return (1);
155*5e7646d2SAndroid Build Coastguard Worker   }
156*5e7646d2SAndroid Build Coastguard Worker 
157*5e7646d2SAndroid Build Coastguard Worker   if (i == argc || !strcmp(argv[i], "supported"))
158*5e7646d2SAndroid Build Coastguard Worker   {
159*5e7646d2SAndroid Build Coastguard Worker     i ++;
160*5e7646d2SAndroid Build Coastguard Worker 
161*5e7646d2SAndroid Build Coastguard Worker     if ((i + 1) < argc)
162*5e7646d2SAndroid Build Coastguard Worker       show_supported(http, dest, dinfo, argv[i], argv[i + 1]);
163*5e7646d2SAndroid Build Coastguard Worker     else if (argc > 2)
164*5e7646d2SAndroid Build Coastguard Worker       show_supported(http, dest, dinfo, argv[i], NULL);
165*5e7646d2SAndroid Build Coastguard Worker     else
166*5e7646d2SAndroid Build Coastguard Worker       show_supported(http, dest, dinfo, NULL, NULL);
167*5e7646d2SAndroid Build Coastguard Worker   }
168*5e7646d2SAndroid Build Coastguard Worker   else if (!strcmp(argv[i], "conflicts") && (i + 1) < argc)
169*5e7646d2SAndroid Build Coastguard Worker   {
170*5e7646d2SAndroid Build Coastguard Worker     int			num_options = 0;/* Number of options */
171*5e7646d2SAndroid Build Coastguard Worker     cups_option_t	*options = NULL;/* Options */
172*5e7646d2SAndroid Build Coastguard Worker 
173*5e7646d2SAndroid Build Coastguard Worker     for (i ++; i < argc; i ++)
174*5e7646d2SAndroid Build Coastguard Worker       num_options = cupsParseOptions(argv[i], num_options, &options);
175*5e7646d2SAndroid Build Coastguard Worker 
176*5e7646d2SAndroid Build Coastguard Worker     show_conflicts(http, dest, dinfo, num_options, options);
177*5e7646d2SAndroid Build Coastguard Worker   }
178*5e7646d2SAndroid Build Coastguard Worker   else if (!strcmp(argv[i], "default") && (i + 1) < argc)
179*5e7646d2SAndroid Build Coastguard Worker   {
180*5e7646d2SAndroid Build Coastguard Worker     show_default(http, dest, dinfo, argv[i + 1]);
181*5e7646d2SAndroid Build Coastguard Worker   }
182*5e7646d2SAndroid Build Coastguard Worker   else if (!strcmp(argv[i], "localize"))
183*5e7646d2SAndroid Build Coastguard Worker   {
184*5e7646d2SAndroid Build Coastguard Worker     i ++;
185*5e7646d2SAndroid Build Coastguard Worker     if ((i + 1) < argc)
186*5e7646d2SAndroid Build Coastguard Worker       localize(http, dest, dinfo, argv[i], argv[i + 1]);
187*5e7646d2SAndroid Build Coastguard Worker     else if (argc > 2)
188*5e7646d2SAndroid Build Coastguard Worker       localize(http, dest, dinfo, argv[i], NULL);
189*5e7646d2SAndroid Build Coastguard Worker     else
190*5e7646d2SAndroid Build Coastguard Worker       localize(http, dest, dinfo, NULL, NULL);
191*5e7646d2SAndroid Build Coastguard Worker   }
192*5e7646d2SAndroid Build Coastguard Worker   else if (!strcmp(argv[i], "media"))
193*5e7646d2SAndroid Build Coastguard Worker   {
194*5e7646d2SAndroid Build Coastguard Worker     const char	*name = NULL;		/* Media name, if any */
195*5e7646d2SAndroid Build Coastguard Worker     unsigned	flags = CUPS_MEDIA_FLAGS_DEFAULT;
196*5e7646d2SAndroid Build Coastguard Worker 					/* Media selection flags */
197*5e7646d2SAndroid Build Coastguard Worker 
198*5e7646d2SAndroid Build Coastguard Worker     for (i ++; i < argc; i ++)
199*5e7646d2SAndroid Build Coastguard Worker     {
200*5e7646d2SAndroid Build Coastguard Worker       if (!strcmp(argv[i], "borderless"))
201*5e7646d2SAndroid Build Coastguard Worker 	flags = CUPS_MEDIA_FLAGS_BORDERLESS;
202*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(argv[i], "duplex"))
203*5e7646d2SAndroid Build Coastguard Worker 	flags = CUPS_MEDIA_FLAGS_DUPLEX;
204*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(argv[i], "exact"))
205*5e7646d2SAndroid Build Coastguard Worker 	flags = CUPS_MEDIA_FLAGS_EXACT;
206*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(argv[i], "ready"))
207*5e7646d2SAndroid Build Coastguard Worker 	flags = CUPS_MEDIA_FLAGS_READY;
208*5e7646d2SAndroid Build Coastguard Worker       else if (name)
209*5e7646d2SAndroid Build Coastguard Worker         usage(argv[i]);
210*5e7646d2SAndroid Build Coastguard Worker       else
211*5e7646d2SAndroid Build Coastguard Worker         name = argv[i];
212*5e7646d2SAndroid Build Coastguard Worker     }
213*5e7646d2SAndroid Build Coastguard Worker 
214*5e7646d2SAndroid Build Coastguard Worker     show_media(http, dest, dinfo, flags, name);
215*5e7646d2SAndroid Build Coastguard Worker   }
216*5e7646d2SAndroid Build Coastguard Worker   else if (!strcmp(argv[i], "print") && (i + 1) < argc)
217*5e7646d2SAndroid Build Coastguard Worker   {
218*5e7646d2SAndroid Build Coastguard Worker     int			num_options = 0;/* Number of options */
219*5e7646d2SAndroid Build Coastguard Worker     cups_option_t	*options = NULL;/* Options */
220*5e7646d2SAndroid Build Coastguard Worker     const char		*filename = argv[i + 1];
221*5e7646d2SAndroid Build Coastguard Worker 
222*5e7646d2SAndroid Build Coastguard Worker     for (i += 2; i < argc; i ++)
223*5e7646d2SAndroid Build Coastguard Worker       num_options = cupsParseOptions(argv[i], num_options, &options);
224*5e7646d2SAndroid Build Coastguard Worker 
225*5e7646d2SAndroid Build Coastguard Worker     print_file(http, dest, dinfo, filename, num_options, options);
226*5e7646d2SAndroid Build Coastguard Worker   }
227*5e7646d2SAndroid Build Coastguard Worker   else
228*5e7646d2SAndroid Build Coastguard Worker     usage(argv[i]);
229*5e7646d2SAndroid Build Coastguard Worker 
230*5e7646d2SAndroid Build Coastguard Worker   return (0);
231*5e7646d2SAndroid Build Coastguard Worker }
232*5e7646d2SAndroid Build Coastguard Worker 
233*5e7646d2SAndroid Build Coastguard Worker 
234*5e7646d2SAndroid Build Coastguard Worker /*
235*5e7646d2SAndroid Build Coastguard Worker  * 'enum_cb()' - Print the results from the enumeration of destinations.
236*5e7646d2SAndroid Build Coastguard Worker  */
237*5e7646d2SAndroid Build Coastguard Worker 
238*5e7646d2SAndroid Build Coastguard Worker static int				/* O - 1 to continue */
enum_cb(void * user_data,unsigned flags,cups_dest_t * dest)239*5e7646d2SAndroid Build Coastguard Worker enum_cb(void        *user_data,		/* I - User data (unused) */
240*5e7646d2SAndroid Build Coastguard Worker         unsigned    flags,		/* I - Flags */
241*5e7646d2SAndroid Build Coastguard Worker 	cups_dest_t *dest)		/* I - Destination */
242*5e7646d2SAndroid Build Coastguard Worker {
243*5e7646d2SAndroid Build Coastguard Worker   int	i;				/* Looping var */
244*5e7646d2SAndroid Build Coastguard Worker 
245*5e7646d2SAndroid Build Coastguard Worker 
246*5e7646d2SAndroid Build Coastguard Worker   (void)user_data;
247*5e7646d2SAndroid Build Coastguard Worker   (void)flags;
248*5e7646d2SAndroid Build Coastguard Worker 
249*5e7646d2SAndroid Build Coastguard Worker   if (dest->instance)
250*5e7646d2SAndroid Build Coastguard Worker     printf("%s%s/%s%s:\n", (flags & CUPS_DEST_FLAGS_REMOVED) ? "REMOVE " : "", dest->name, dest->instance, dest->is_default ? " (Default)" : "");
251*5e7646d2SAndroid Build Coastguard Worker   else
252*5e7646d2SAndroid Build Coastguard Worker     printf("%s%s%s:\n", (flags & CUPS_DEST_FLAGS_REMOVED) ? "REMOVE " : "", dest->name, dest->is_default ? " (Default)" : "");
253*5e7646d2SAndroid Build Coastguard Worker 
254*5e7646d2SAndroid Build Coastguard Worker   for (i = 0; i < dest->num_options; i ++)
255*5e7646d2SAndroid Build Coastguard Worker     printf("    %s=\"%s\"\n", dest->options[i].name, dest->options[i].value);
256*5e7646d2SAndroid Build Coastguard Worker 
257*5e7646d2SAndroid Build Coastguard Worker   puts("");
258*5e7646d2SAndroid Build Coastguard Worker 
259*5e7646d2SAndroid Build Coastguard Worker   return (1);
260*5e7646d2SAndroid Build Coastguard Worker }
261*5e7646d2SAndroid Build Coastguard Worker 
262*5e7646d2SAndroid Build Coastguard Worker 
263*5e7646d2SAndroid Build Coastguard Worker /*
264*5e7646d2SAndroid Build Coastguard Worker  * 'localize()' - Localize an option and value.
265*5e7646d2SAndroid Build Coastguard Worker  */
266*5e7646d2SAndroid Build Coastguard Worker 
267*5e7646d2SAndroid Build Coastguard Worker static void
localize(http_t * http,cups_dest_t * dest,cups_dinfo_t * dinfo,const char * option,const char * value)268*5e7646d2SAndroid Build Coastguard Worker localize(http_t       *http,		/* I - Connection to destination */
269*5e7646d2SAndroid Build Coastguard Worker          cups_dest_t  *dest,		/* I - Destination */
270*5e7646d2SAndroid Build Coastguard Worker 	 cups_dinfo_t *dinfo,		/* I - Destination information */
271*5e7646d2SAndroid Build Coastguard Worker          const char   *option,		/* I - Option */
272*5e7646d2SAndroid Build Coastguard Worker 	 const char   *value)		/* I - Value, if any */
273*5e7646d2SAndroid Build Coastguard Worker {
274*5e7646d2SAndroid Build Coastguard Worker   ipp_attribute_t	*attr;		/* Attribute */
275*5e7646d2SAndroid Build Coastguard Worker   int			i,		/* Looping var */
276*5e7646d2SAndroid Build Coastguard Worker 			count;		/* Number of values */
277*5e7646d2SAndroid Build Coastguard Worker 
278*5e7646d2SAndroid Build Coastguard Worker 
279*5e7646d2SAndroid Build Coastguard Worker   if (!option)
280*5e7646d2SAndroid Build Coastguard Worker   {
281*5e7646d2SAndroid Build Coastguard Worker     attr = cupsFindDestSupported(http, dest, dinfo, "job-creation-attributes");
282*5e7646d2SAndroid Build Coastguard Worker     if (attr)
283*5e7646d2SAndroid Build Coastguard Worker     {
284*5e7646d2SAndroid Build Coastguard Worker       count = ippGetCount(attr);
285*5e7646d2SAndroid Build Coastguard Worker       for (i = 0; i < count; i ++)
286*5e7646d2SAndroid Build Coastguard Worker         localize(http, dest, dinfo, ippGetString(attr, i, NULL), NULL);
287*5e7646d2SAndroid Build Coastguard Worker     }
288*5e7646d2SAndroid Build Coastguard Worker     else
289*5e7646d2SAndroid Build Coastguard Worker     {
290*5e7646d2SAndroid Build Coastguard Worker       static const char * const options[] =
291*5e7646d2SAndroid Build Coastguard Worker       {					/* List of standard options */
292*5e7646d2SAndroid Build Coastguard Worker         CUPS_COPIES,
293*5e7646d2SAndroid Build Coastguard Worker 	CUPS_FINISHINGS,
294*5e7646d2SAndroid Build Coastguard Worker 	CUPS_MEDIA,
295*5e7646d2SAndroid Build Coastguard Worker 	CUPS_NUMBER_UP,
296*5e7646d2SAndroid Build Coastguard Worker 	CUPS_ORIENTATION,
297*5e7646d2SAndroid Build Coastguard Worker 	CUPS_PRINT_COLOR_MODE,
298*5e7646d2SAndroid Build Coastguard Worker 	CUPS_PRINT_QUALITY,
299*5e7646d2SAndroid Build Coastguard Worker 	CUPS_SIDES
300*5e7646d2SAndroid Build Coastguard Worker       };
301*5e7646d2SAndroid Build Coastguard Worker 
302*5e7646d2SAndroid Build Coastguard Worker       puts("No job-creation-attributes-supported attribute, probing instead.");
303*5e7646d2SAndroid Build Coastguard Worker 
304*5e7646d2SAndroid Build Coastguard Worker       for (i = 0; i < (int)(sizeof(options) / sizeof(options[0])); i ++)
305*5e7646d2SAndroid Build Coastguard Worker         if (cupsCheckDestSupported(http, dest, dinfo, options[i], NULL))
306*5e7646d2SAndroid Build Coastguard Worker 	  localize(http, dest, dinfo, options[i], NULL);
307*5e7646d2SAndroid Build Coastguard Worker     }
308*5e7646d2SAndroid Build Coastguard Worker   }
309*5e7646d2SAndroid Build Coastguard Worker   else if (!value)
310*5e7646d2SAndroid Build Coastguard Worker   {
311*5e7646d2SAndroid Build Coastguard Worker     printf("%s (%s)\n", option, cupsLocalizeDestOption(http, dest, dinfo, option));
312*5e7646d2SAndroid Build Coastguard Worker 
313*5e7646d2SAndroid Build Coastguard Worker     if ((attr = cupsFindDestSupported(http, dest, dinfo, option)) != NULL)
314*5e7646d2SAndroid Build Coastguard Worker     {
315*5e7646d2SAndroid Build Coastguard Worker       count = ippGetCount(attr);
316*5e7646d2SAndroid Build Coastguard Worker 
317*5e7646d2SAndroid Build Coastguard Worker       switch (ippGetValueTag(attr))
318*5e7646d2SAndroid Build Coastguard Worker       {
319*5e7646d2SAndroid Build Coastguard Worker         case IPP_TAG_INTEGER :
320*5e7646d2SAndroid Build Coastguard Worker 	    for (i = 0; i < count; i ++)
321*5e7646d2SAndroid Build Coastguard Worker               printf("  %d\n", ippGetInteger(attr, i));
322*5e7646d2SAndroid Build Coastguard Worker 	    break;
323*5e7646d2SAndroid Build Coastguard Worker 
324*5e7646d2SAndroid Build Coastguard Worker         case IPP_TAG_ENUM :
325*5e7646d2SAndroid Build Coastguard Worker 	    for (i = 0; i < count; i ++)
326*5e7646d2SAndroid Build Coastguard Worker               printf("  %s\n", ippEnumString(option, ippGetInteger(attr, i)));
327*5e7646d2SAndroid Build Coastguard Worker 	    break;
328*5e7646d2SAndroid Build Coastguard Worker 
329*5e7646d2SAndroid Build Coastguard Worker         case IPP_TAG_RANGE :
330*5e7646d2SAndroid Build Coastguard Worker 	    for (i = 0; i < count; i ++)
331*5e7646d2SAndroid Build Coastguard Worker 	    {
332*5e7646d2SAndroid Build Coastguard Worker 	      int upper, lower = ippGetRange(attr, i, &upper);
333*5e7646d2SAndroid Build Coastguard Worker 
334*5e7646d2SAndroid Build Coastguard Worker               printf("  %d-%d\n", lower, upper);
335*5e7646d2SAndroid Build Coastguard Worker 	    }
336*5e7646d2SAndroid Build Coastguard Worker 	    break;
337*5e7646d2SAndroid Build Coastguard Worker 
338*5e7646d2SAndroid Build Coastguard Worker         case IPP_TAG_RESOLUTION :
339*5e7646d2SAndroid Build Coastguard Worker 	    for (i = 0; i < count; i ++)
340*5e7646d2SAndroid Build Coastguard Worker 	    {
341*5e7646d2SAndroid Build Coastguard Worker 	      int xres, yres;
342*5e7646d2SAndroid Build Coastguard Worker 	      ipp_res_t units;
343*5e7646d2SAndroid Build Coastguard Worker 	      xres = ippGetResolution(attr, i, &yres, &units);
344*5e7646d2SAndroid Build Coastguard Worker 
345*5e7646d2SAndroid Build Coastguard Worker               if (xres == yres)
346*5e7646d2SAndroid Build Coastguard Worker                 printf("  %d%s\n", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
347*5e7646d2SAndroid Build Coastguard Worker 	      else
348*5e7646d2SAndroid Build Coastguard Worker                 printf("  %dx%d%s\n", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
349*5e7646d2SAndroid Build Coastguard Worker 	    }
350*5e7646d2SAndroid Build Coastguard Worker 	    break;
351*5e7646d2SAndroid Build Coastguard Worker 
352*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_TEXTLANG :
353*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_NAMELANG :
354*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_TEXT :
355*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_NAME :
356*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_KEYWORD :
357*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_URI :
358*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_URISCHEME :
359*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_CHARSET :
360*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_LANGUAGE :
361*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_MIMETYPE :
362*5e7646d2SAndroid Build Coastguard Worker 	    for (i = 0; i < count; i ++)
363*5e7646d2SAndroid Build Coastguard Worker               printf("  %s (%s)\n", ippGetString(attr, i, NULL), cupsLocalizeDestValue(http, dest, dinfo, option, ippGetString(attr, i, NULL)));
364*5e7646d2SAndroid Build Coastguard Worker 	    break;
365*5e7646d2SAndroid Build Coastguard Worker 
366*5e7646d2SAndroid Build Coastguard Worker         case IPP_TAG_STRING :
367*5e7646d2SAndroid Build Coastguard Worker 	    for (i = 0; i < count; i ++)
368*5e7646d2SAndroid Build Coastguard Worker 	    {
369*5e7646d2SAndroid Build Coastguard Worker 	      int j, len;
370*5e7646d2SAndroid Build Coastguard Worker 	      unsigned char *data = ippGetOctetString(attr, i, &len);
371*5e7646d2SAndroid Build Coastguard Worker 
372*5e7646d2SAndroid Build Coastguard Worker               fputs("  ", stdout);
373*5e7646d2SAndroid Build Coastguard Worker 	      for (j = 0; j < len; j ++)
374*5e7646d2SAndroid Build Coastguard Worker 	      {
375*5e7646d2SAndroid Build Coastguard Worker 	        if (data[j] < ' ' || data[j] >= 0x7f)
376*5e7646d2SAndroid Build Coastguard Worker 		  printf("<%02X>", data[j]);
377*5e7646d2SAndroid Build Coastguard Worker 		else
378*5e7646d2SAndroid Build Coastguard Worker 		  putchar(data[j]);
379*5e7646d2SAndroid Build Coastguard Worker               }
380*5e7646d2SAndroid Build Coastguard Worker               putchar('\n');
381*5e7646d2SAndroid Build Coastguard Worker 	    }
382*5e7646d2SAndroid Build Coastguard Worker 	    break;
383*5e7646d2SAndroid Build Coastguard Worker 
384*5e7646d2SAndroid Build Coastguard Worker         case IPP_TAG_BOOLEAN :
385*5e7646d2SAndroid Build Coastguard Worker 	    break;
386*5e7646d2SAndroid Build Coastguard Worker 
387*5e7646d2SAndroid Build Coastguard Worker         default :
388*5e7646d2SAndroid Build Coastguard Worker 	    printf("  %s\n", ippTagString(ippGetValueTag(attr)));
389*5e7646d2SAndroid Build Coastguard Worker 	    break;
390*5e7646d2SAndroid Build Coastguard Worker       }
391*5e7646d2SAndroid Build Coastguard Worker     }
392*5e7646d2SAndroid Build Coastguard Worker 
393*5e7646d2SAndroid Build Coastguard Worker   }
394*5e7646d2SAndroid Build Coastguard Worker   else
395*5e7646d2SAndroid Build Coastguard Worker     puts(cupsLocalizeDestValue(http, dest, dinfo, option, value));
396*5e7646d2SAndroid Build Coastguard Worker }
397*5e7646d2SAndroid Build Coastguard Worker 
398*5e7646d2SAndroid Build Coastguard Worker 
399*5e7646d2SAndroid Build Coastguard Worker /*
400*5e7646d2SAndroid Build Coastguard Worker  * 'print_file()' - Print a file.
401*5e7646d2SAndroid Build Coastguard Worker  */
402*5e7646d2SAndroid Build Coastguard Worker 
403*5e7646d2SAndroid Build Coastguard Worker static void
print_file(http_t * http,cups_dest_t * dest,cups_dinfo_t * dinfo,const char * filename,int num_options,cups_option_t * options)404*5e7646d2SAndroid Build Coastguard Worker print_file(http_t        *http,		/* I - Connection to destination */
405*5e7646d2SAndroid Build Coastguard Worker            cups_dest_t   *dest,		/* I - Destination */
406*5e7646d2SAndroid Build Coastguard Worker 	   cups_dinfo_t  *dinfo,	/* I - Destination information */
407*5e7646d2SAndroid Build Coastguard Worker            const char    *filename,	/* I - File to print */
408*5e7646d2SAndroid Build Coastguard Worker 	   int           num_options,	/* I - Number of options */
409*5e7646d2SAndroid Build Coastguard Worker 	   cups_option_t *options)	/* I - Options */
410*5e7646d2SAndroid Build Coastguard Worker {
411*5e7646d2SAndroid Build Coastguard Worker   cups_file_t	*fp;			/* File to print */
412*5e7646d2SAndroid Build Coastguard Worker   int		job_id;			/* Job ID */
413*5e7646d2SAndroid Build Coastguard Worker   const char	*title;			/* Title of job */
414*5e7646d2SAndroid Build Coastguard Worker   char		buffer[32768];		/* File buffer */
415*5e7646d2SAndroid Build Coastguard Worker   ssize_t	bytes;			/* Bytes read/to write */
416*5e7646d2SAndroid Build Coastguard Worker 
417*5e7646d2SAndroid Build Coastguard Worker 
418*5e7646d2SAndroid Build Coastguard Worker   if ((fp = cupsFileOpen(filename, "r")) == NULL)
419*5e7646d2SAndroid Build Coastguard Worker   {
420*5e7646d2SAndroid Build Coastguard Worker     printf("Unable to open \"%s\": %s\n", filename, strerror(errno));
421*5e7646d2SAndroid Build Coastguard Worker     return;
422*5e7646d2SAndroid Build Coastguard Worker   }
423*5e7646d2SAndroid Build Coastguard Worker 
424*5e7646d2SAndroid Build Coastguard Worker   if ((title = strrchr(filename, '/')) != NULL)
425*5e7646d2SAndroid Build Coastguard Worker     title ++;
426*5e7646d2SAndroid Build Coastguard Worker   else
427*5e7646d2SAndroid Build Coastguard Worker     title = filename;
428*5e7646d2SAndroid Build Coastguard Worker 
429*5e7646d2SAndroid Build Coastguard Worker   if (cupsCreateDestJob(http, dest, dinfo, &job_id, title, num_options, options) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
430*5e7646d2SAndroid Build Coastguard Worker   {
431*5e7646d2SAndroid Build Coastguard Worker     printf("Unable to create job: %s\n", cupsLastErrorString());
432*5e7646d2SAndroid Build Coastguard Worker     cupsFileClose(fp);
433*5e7646d2SAndroid Build Coastguard Worker     return;
434*5e7646d2SAndroid Build Coastguard Worker   }
435*5e7646d2SAndroid Build Coastguard Worker 
436*5e7646d2SAndroid Build Coastguard Worker   printf("Created job ID: %d\n", job_id);
437*5e7646d2SAndroid Build Coastguard Worker 
438*5e7646d2SAndroid Build Coastguard Worker   if (cupsStartDestDocument(http, dest, dinfo, job_id, title, CUPS_FORMAT_AUTO, 0, NULL, 1) != HTTP_STATUS_CONTINUE)
439*5e7646d2SAndroid Build Coastguard Worker   {
440*5e7646d2SAndroid Build Coastguard Worker     printf("Unable to send document: %s\n", cupsLastErrorString());
441*5e7646d2SAndroid Build Coastguard Worker     cupsFileClose(fp);
442*5e7646d2SAndroid Build Coastguard Worker     return;
443*5e7646d2SAndroid Build Coastguard Worker   }
444*5e7646d2SAndroid Build Coastguard Worker 
445*5e7646d2SAndroid Build Coastguard Worker   while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0)
446*5e7646d2SAndroid Build Coastguard Worker   {
447*5e7646d2SAndroid Build Coastguard Worker     if (cupsWriteRequestData(http, buffer, (size_t)bytes) != HTTP_STATUS_CONTINUE)
448*5e7646d2SAndroid Build Coastguard Worker     {
449*5e7646d2SAndroid Build Coastguard Worker       printf("Unable to write document data: %s\n", cupsLastErrorString());
450*5e7646d2SAndroid Build Coastguard Worker       break;
451*5e7646d2SAndroid Build Coastguard Worker     }
452*5e7646d2SAndroid Build Coastguard Worker   }
453*5e7646d2SAndroid Build Coastguard Worker 
454*5e7646d2SAndroid Build Coastguard Worker   cupsFileClose(fp);
455*5e7646d2SAndroid Build Coastguard Worker 
456*5e7646d2SAndroid Build Coastguard Worker   if (cupsFinishDestDocument(http, dest, dinfo) > IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED)
457*5e7646d2SAndroid Build Coastguard Worker   {
458*5e7646d2SAndroid Build Coastguard Worker     printf("Unable to send document: %s\n", cupsLastErrorString());
459*5e7646d2SAndroid Build Coastguard Worker     return;
460*5e7646d2SAndroid Build Coastguard Worker   }
461*5e7646d2SAndroid Build Coastguard Worker 
462*5e7646d2SAndroid Build Coastguard Worker   puts("Job queued.");
463*5e7646d2SAndroid Build Coastguard Worker }
464*5e7646d2SAndroid Build Coastguard Worker 
465*5e7646d2SAndroid Build Coastguard Worker 
466*5e7646d2SAndroid Build Coastguard Worker /*
467*5e7646d2SAndroid Build Coastguard Worker  * 'show_conflicts()' - Show conflicts for selected options.
468*5e7646d2SAndroid Build Coastguard Worker  */
469*5e7646d2SAndroid Build Coastguard Worker 
470*5e7646d2SAndroid Build Coastguard Worker static void
show_conflicts(http_t * http,cups_dest_t * dest,cups_dinfo_t * dinfo,int num_options,cups_option_t * options)471*5e7646d2SAndroid Build Coastguard Worker show_conflicts(
472*5e7646d2SAndroid Build Coastguard Worker     http_t        *http,		/* I - Connection to destination */
473*5e7646d2SAndroid Build Coastguard Worker     cups_dest_t   *dest,		/* I - Destination */
474*5e7646d2SAndroid Build Coastguard Worker     cups_dinfo_t  *dinfo,		/* I - Destination information */
475*5e7646d2SAndroid Build Coastguard Worker     int           num_options,		/* I - Number of options */
476*5e7646d2SAndroid Build Coastguard Worker     cups_option_t *options)		/* I - Options */
477*5e7646d2SAndroid Build Coastguard Worker {
478*5e7646d2SAndroid Build Coastguard Worker   (void)http;
479*5e7646d2SAndroid Build Coastguard Worker   (void)dest;
480*5e7646d2SAndroid Build Coastguard Worker   (void)dinfo;
481*5e7646d2SAndroid Build Coastguard Worker   (void)num_options;
482*5e7646d2SAndroid Build Coastguard Worker   (void)options;
483*5e7646d2SAndroid Build Coastguard Worker }
484*5e7646d2SAndroid Build Coastguard Worker 
485*5e7646d2SAndroid Build Coastguard Worker 
486*5e7646d2SAndroid Build Coastguard Worker /*
487*5e7646d2SAndroid Build Coastguard Worker  * 'show_default()' - Show default value for option.
488*5e7646d2SAndroid Build Coastguard Worker  */
489*5e7646d2SAndroid Build Coastguard Worker 
490*5e7646d2SAndroid Build Coastguard Worker static void
show_default(http_t * http,cups_dest_t * dest,cups_dinfo_t * dinfo,const char * option)491*5e7646d2SAndroid Build Coastguard Worker show_default(http_t       *http,	/* I - Connection to destination */
492*5e7646d2SAndroid Build Coastguard Worker 	     cups_dest_t  *dest,	/* I - Destination */
493*5e7646d2SAndroid Build Coastguard Worker 	     cups_dinfo_t *dinfo,	/* I - Destination information */
494*5e7646d2SAndroid Build Coastguard Worker 	     const char  *option)	/* I - Option */
495*5e7646d2SAndroid Build Coastguard Worker {
496*5e7646d2SAndroid Build Coastguard Worker   if (!strcmp(option, "media"))
497*5e7646d2SAndroid Build Coastguard Worker   {
498*5e7646d2SAndroid Build Coastguard Worker    /*
499*5e7646d2SAndroid Build Coastguard Worker     * Show default media option...
500*5e7646d2SAndroid Build Coastguard Worker     */
501*5e7646d2SAndroid Build Coastguard Worker 
502*5e7646d2SAndroid Build Coastguard Worker     cups_size_t size;                   /* Media size information */
503*5e7646d2SAndroid Build Coastguard Worker 
504*5e7646d2SAndroid Build Coastguard Worker     if (cupsGetDestMediaDefault(http, dest, dinfo, CUPS_MEDIA_FLAGS_DEFAULT, &size))
505*5e7646d2SAndroid Build Coastguard Worker       printf("%s (%.2fx%.2fmm, margins=[%.2f %.2f %.2f %.2f])\n", size.media, size.width * 0.01, size.length * 0.01, size.left * 0.01, size.bottom * 0.01, size.right * 0.01, size.top * 0.01);
506*5e7646d2SAndroid Build Coastguard Worker      else
507*5e7646d2SAndroid Build Coastguard Worker        puts("FAILED");
508*5e7646d2SAndroid Build Coastguard Worker   }
509*5e7646d2SAndroid Build Coastguard Worker   else
510*5e7646d2SAndroid Build Coastguard Worker   {
511*5e7646d2SAndroid Build Coastguard Worker    /*
512*5e7646d2SAndroid Build Coastguard Worker     * Show default other option...
513*5e7646d2SAndroid Build Coastguard Worker     */
514*5e7646d2SAndroid Build Coastguard Worker 
515*5e7646d2SAndroid Build Coastguard Worker     ipp_attribute_t *defattr;           /* Default attribute */
516*5e7646d2SAndroid Build Coastguard Worker 
517*5e7646d2SAndroid Build Coastguard Worker     if ((defattr = cupsFindDestDefault(http, dest, dinfo, option)) != NULL)
518*5e7646d2SAndroid Build Coastguard Worker     {
519*5e7646d2SAndroid Build Coastguard Worker       char value[1024];                 /* Value of default attribute */
520*5e7646d2SAndroid Build Coastguard Worker 
521*5e7646d2SAndroid Build Coastguard Worker       ippAttributeString(defattr, value, sizeof(value));
522*5e7646d2SAndroid Build Coastguard Worker       puts(value);
523*5e7646d2SAndroid Build Coastguard Worker     }
524*5e7646d2SAndroid Build Coastguard Worker     else
525*5e7646d2SAndroid Build Coastguard Worker       puts("FAILED");
526*5e7646d2SAndroid Build Coastguard Worker   }
527*5e7646d2SAndroid Build Coastguard Worker }
528*5e7646d2SAndroid Build Coastguard Worker 
529*5e7646d2SAndroid Build Coastguard Worker 
530*5e7646d2SAndroid Build Coastguard Worker /*
531*5e7646d2SAndroid Build Coastguard Worker  * 'show_media()' - Show available media.
532*5e7646d2SAndroid Build Coastguard Worker  */
533*5e7646d2SAndroid Build Coastguard Worker 
534*5e7646d2SAndroid Build Coastguard Worker static void
show_media(http_t * http,cups_dest_t * dest,cups_dinfo_t * dinfo,unsigned flags,const char * name)535*5e7646d2SAndroid Build Coastguard Worker show_media(http_t       *http,		/* I - Connection to destination */
536*5e7646d2SAndroid Build Coastguard Worker 	   cups_dest_t  *dest,		/* I - Destination */
537*5e7646d2SAndroid Build Coastguard Worker 	   cups_dinfo_t *dinfo,		/* I - Destination information */
538*5e7646d2SAndroid Build Coastguard Worker 	   unsigned     flags,		/* I - Media flags */
539*5e7646d2SAndroid Build Coastguard Worker 	   const char   *name)		/* I - Size name */
540*5e7646d2SAndroid Build Coastguard Worker {
541*5e7646d2SAndroid Build Coastguard Worker   int		i,			/* Looping var */
542*5e7646d2SAndroid Build Coastguard Worker 		count;			/* Number of sizes */
543*5e7646d2SAndroid Build Coastguard Worker   cups_size_t	size;			/* Media size info */
544*5e7646d2SAndroid Build Coastguard Worker 
545*5e7646d2SAndroid Build Coastguard Worker 
546*5e7646d2SAndroid Build Coastguard Worker   if (name)
547*5e7646d2SAndroid Build Coastguard Worker   {
548*5e7646d2SAndroid Build Coastguard Worker     double	dw, dl;			/* Width and length from name */
549*5e7646d2SAndroid Build Coastguard Worker     char	units[32];		/* Units */
550*5e7646d2SAndroid Build Coastguard Worker     int		width,			/* Width in 100ths of millimeters */
551*5e7646d2SAndroid Build Coastguard Worker 		length;			/* Length in 100ths of millimeters */
552*5e7646d2SAndroid Build Coastguard Worker 
553*5e7646d2SAndroid Build Coastguard Worker 
554*5e7646d2SAndroid Build Coastguard Worker     if (sscanf(name, "%lfx%lf%31s", &dw, &dl, units) == 3)
555*5e7646d2SAndroid Build Coastguard Worker     {
556*5e7646d2SAndroid Build Coastguard Worker       if (!strcmp(units, "in"))
557*5e7646d2SAndroid Build Coastguard Worker       {
558*5e7646d2SAndroid Build Coastguard Worker         width  = (int)(dw * 2540.0);
559*5e7646d2SAndroid Build Coastguard Worker 	length = (int)(dl * 2540.0);
560*5e7646d2SAndroid Build Coastguard Worker       }
561*5e7646d2SAndroid Build Coastguard Worker       else if (!strcmp(units, "mm"))
562*5e7646d2SAndroid Build Coastguard Worker       {
563*5e7646d2SAndroid Build Coastguard Worker         width  = (int)(dw * 100.0);
564*5e7646d2SAndroid Build Coastguard Worker         length = (int)(dl * 100.0);
565*5e7646d2SAndroid Build Coastguard Worker       }
566*5e7646d2SAndroid Build Coastguard Worker       else
567*5e7646d2SAndroid Build Coastguard Worker       {
568*5e7646d2SAndroid Build Coastguard Worker         puts("  bad units in size");
569*5e7646d2SAndroid Build Coastguard Worker 	return;
570*5e7646d2SAndroid Build Coastguard Worker       }
571*5e7646d2SAndroid Build Coastguard Worker 
572*5e7646d2SAndroid Build Coastguard Worker       if (cupsGetDestMediaBySize(http, dest, dinfo, width, length, flags, &size))
573*5e7646d2SAndroid Build Coastguard Worker       {
574*5e7646d2SAndroid Build Coastguard Worker 	printf("  %s (%s) %dx%d B%d L%d R%d T%d\n", size.media, cupsLocalizeDestMedia(http, dest, dinfo, flags, &size), size.width, size.length, size.bottom, size.left, size.right, size.top);
575*5e7646d2SAndroid Build Coastguard Worker       }
576*5e7646d2SAndroid Build Coastguard Worker       else
577*5e7646d2SAndroid Build Coastguard Worker       {
578*5e7646d2SAndroid Build Coastguard Worker 	puts("  not supported");
579*5e7646d2SAndroid Build Coastguard Worker       }
580*5e7646d2SAndroid Build Coastguard Worker     }
581*5e7646d2SAndroid Build Coastguard Worker     else if (cupsGetDestMediaByName(http, dest, dinfo, name, flags, &size))
582*5e7646d2SAndroid Build Coastguard Worker     {
583*5e7646d2SAndroid Build Coastguard Worker       printf("  %s (%s) %dx%d B%d L%d R%d T%d\n", size.media, cupsLocalizeDestMedia(http, dest, dinfo, flags, &size), size.width, size.length, size.bottom, size.left, size.right, size.top);
584*5e7646d2SAndroid Build Coastguard Worker     }
585*5e7646d2SAndroid Build Coastguard Worker     else
586*5e7646d2SAndroid Build Coastguard Worker     {
587*5e7646d2SAndroid Build Coastguard Worker       puts("  not supported");
588*5e7646d2SAndroid Build Coastguard Worker     }
589*5e7646d2SAndroid Build Coastguard Worker   }
590*5e7646d2SAndroid Build Coastguard Worker   else
591*5e7646d2SAndroid Build Coastguard Worker   {
592*5e7646d2SAndroid Build Coastguard Worker     count = cupsGetDestMediaCount(http, dest, dinfo, flags);
593*5e7646d2SAndroid Build Coastguard Worker     printf("%d size%s:\n", count, count == 1 ? "" : "s");
594*5e7646d2SAndroid Build Coastguard Worker 
595*5e7646d2SAndroid Build Coastguard Worker     for (i = 0; i < count; i ++)
596*5e7646d2SAndroid Build Coastguard Worker     {
597*5e7646d2SAndroid Build Coastguard Worker       if (cupsGetDestMediaByIndex(http, dest, dinfo, i, flags, &size))
598*5e7646d2SAndroid Build Coastguard Worker         printf("  %s (%s) %dx%d B%d L%d R%d T%d\n", size.media, cupsLocalizeDestMedia(http, dest, dinfo, flags, &size), size.width, size.length, size.bottom, size.left, size.right, size.top);
599*5e7646d2SAndroid Build Coastguard Worker       else
600*5e7646d2SAndroid Build Coastguard Worker         puts("  error");
601*5e7646d2SAndroid Build Coastguard Worker     }
602*5e7646d2SAndroid Build Coastguard Worker   }
603*5e7646d2SAndroid Build Coastguard Worker }
604*5e7646d2SAndroid Build Coastguard Worker 
605*5e7646d2SAndroid Build Coastguard Worker 
606*5e7646d2SAndroid Build Coastguard Worker /*
607*5e7646d2SAndroid Build Coastguard Worker  * 'show_supported()' - Show supported options, values, etc.
608*5e7646d2SAndroid Build Coastguard Worker  */
609*5e7646d2SAndroid Build Coastguard Worker 
610*5e7646d2SAndroid Build Coastguard Worker static void
show_supported(http_t * http,cups_dest_t * dest,cups_dinfo_t * dinfo,const char * option,const char * value)611*5e7646d2SAndroid Build Coastguard Worker show_supported(http_t       *http,	/* I - Connection to destination */
612*5e7646d2SAndroid Build Coastguard Worker 	       cups_dest_t  *dest,	/* I - Destination */
613*5e7646d2SAndroid Build Coastguard Worker 	       cups_dinfo_t *dinfo,	/* I - Destination information */
614*5e7646d2SAndroid Build Coastguard Worker 	       const char   *option,	/* I - Option, if any */
615*5e7646d2SAndroid Build Coastguard Worker 	       const char   *value)	/* I - Value, if any */
616*5e7646d2SAndroid Build Coastguard Worker {
617*5e7646d2SAndroid Build Coastguard Worker   ipp_attribute_t	*attr;		/* Attribute */
618*5e7646d2SAndroid Build Coastguard Worker   int			i,		/* Looping var */
619*5e7646d2SAndroid Build Coastguard Worker 			count;		/* Number of values */
620*5e7646d2SAndroid Build Coastguard Worker 
621*5e7646d2SAndroid Build Coastguard Worker 
622*5e7646d2SAndroid Build Coastguard Worker   if (!option)
623*5e7646d2SAndroid Build Coastguard Worker   {
624*5e7646d2SAndroid Build Coastguard Worker     attr = cupsFindDestSupported(http, dest, dinfo, "job-creation-attributes");
625*5e7646d2SAndroid Build Coastguard Worker     if (attr)
626*5e7646d2SAndroid Build Coastguard Worker     {
627*5e7646d2SAndroid Build Coastguard Worker       count = ippGetCount(attr);
628*5e7646d2SAndroid Build Coastguard Worker       for (i = 0; i < count; i ++)
629*5e7646d2SAndroid Build Coastguard Worker         show_supported(http, dest, dinfo, ippGetString(attr, i, NULL), NULL);
630*5e7646d2SAndroid Build Coastguard Worker     }
631*5e7646d2SAndroid Build Coastguard Worker     else
632*5e7646d2SAndroid Build Coastguard Worker     {
633*5e7646d2SAndroid Build Coastguard Worker       static const char * const options[] =
634*5e7646d2SAndroid Build Coastguard Worker       {					/* List of standard options */
635*5e7646d2SAndroid Build Coastguard Worker         CUPS_COPIES,
636*5e7646d2SAndroid Build Coastguard Worker 	CUPS_FINISHINGS,
637*5e7646d2SAndroid Build Coastguard Worker 	CUPS_MEDIA,
638*5e7646d2SAndroid Build Coastguard Worker 	CUPS_NUMBER_UP,
639*5e7646d2SAndroid Build Coastguard Worker 	CUPS_ORIENTATION,
640*5e7646d2SAndroid Build Coastguard Worker 	CUPS_PRINT_COLOR_MODE,
641*5e7646d2SAndroid Build Coastguard Worker 	CUPS_PRINT_QUALITY,
642*5e7646d2SAndroid Build Coastguard Worker 	CUPS_SIDES
643*5e7646d2SAndroid Build Coastguard Worker       };
644*5e7646d2SAndroid Build Coastguard Worker 
645*5e7646d2SAndroid Build Coastguard Worker       puts("No job-creation-attributes-supported attribute, probing instead.");
646*5e7646d2SAndroid Build Coastguard Worker 
647*5e7646d2SAndroid Build Coastguard Worker       for (i = 0; i < (int)(sizeof(options) / sizeof(options[0])); i ++)
648*5e7646d2SAndroid Build Coastguard Worker         if (cupsCheckDestSupported(http, dest, dinfo, options[i], NULL))
649*5e7646d2SAndroid Build Coastguard Worker 	  show_supported(http, dest, dinfo, options[i], NULL);
650*5e7646d2SAndroid Build Coastguard Worker     }
651*5e7646d2SAndroid Build Coastguard Worker   }
652*5e7646d2SAndroid Build Coastguard Worker   else if (!value)
653*5e7646d2SAndroid Build Coastguard Worker   {
654*5e7646d2SAndroid Build Coastguard Worker     printf("%s (%s - %s)\n", option, cupsLocalizeDestOption(http, dest, dinfo, option), cupsCheckDestSupported(http, dest, dinfo, option, NULL) ? "supported" : "not-supported");
655*5e7646d2SAndroid Build Coastguard Worker 
656*5e7646d2SAndroid Build Coastguard Worker     if ((attr = cupsFindDestSupported(http, dest, dinfo, option)) != NULL)
657*5e7646d2SAndroid Build Coastguard Worker     {
658*5e7646d2SAndroid Build Coastguard Worker       count = ippGetCount(attr);
659*5e7646d2SAndroid Build Coastguard Worker 
660*5e7646d2SAndroid Build Coastguard Worker       switch (ippGetValueTag(attr))
661*5e7646d2SAndroid Build Coastguard Worker       {
662*5e7646d2SAndroid Build Coastguard Worker         case IPP_TAG_INTEGER :
663*5e7646d2SAndroid Build Coastguard Worker 	    for (i = 0; i < count; i ++)
664*5e7646d2SAndroid Build Coastguard Worker               printf("  %d\n", ippGetInteger(attr, i));
665*5e7646d2SAndroid Build Coastguard Worker 	    break;
666*5e7646d2SAndroid Build Coastguard Worker 
667*5e7646d2SAndroid Build Coastguard Worker         case IPP_TAG_ENUM :
668*5e7646d2SAndroid Build Coastguard Worker 	    for (i = 0; i < count; i ++)
669*5e7646d2SAndroid Build Coastguard Worker 	    {
670*5e7646d2SAndroid Build Coastguard Worker 	      int val = ippGetInteger(attr, i);
671*5e7646d2SAndroid Build Coastguard Worker 	      char valstr[256];
672*5e7646d2SAndroid Build Coastguard Worker 
673*5e7646d2SAndroid Build Coastguard Worker               snprintf(valstr, sizeof(valstr), "%d", val);
674*5e7646d2SAndroid Build Coastguard Worker               printf("  %s (%s)\n", ippEnumString(option, ippGetInteger(attr, i)), cupsLocalizeDestValue(http, dest, dinfo, option, valstr));
675*5e7646d2SAndroid Build Coastguard Worker             }
676*5e7646d2SAndroid Build Coastguard Worker 	    break;
677*5e7646d2SAndroid Build Coastguard Worker 
678*5e7646d2SAndroid Build Coastguard Worker         case IPP_TAG_RANGE :
679*5e7646d2SAndroid Build Coastguard Worker 	    for (i = 0; i < count; i ++)
680*5e7646d2SAndroid Build Coastguard Worker 	    {
681*5e7646d2SAndroid Build Coastguard Worker 	      int upper, lower = ippGetRange(attr, i, &upper);
682*5e7646d2SAndroid Build Coastguard Worker 
683*5e7646d2SAndroid Build Coastguard Worker               printf("  %d-%d\n", lower, upper);
684*5e7646d2SAndroid Build Coastguard Worker 	    }
685*5e7646d2SAndroid Build Coastguard Worker 	    break;
686*5e7646d2SAndroid Build Coastguard Worker 
687*5e7646d2SAndroid Build Coastguard Worker         case IPP_TAG_RESOLUTION :
688*5e7646d2SAndroid Build Coastguard Worker 	    for (i = 0; i < count; i ++)
689*5e7646d2SAndroid Build Coastguard Worker 	    {
690*5e7646d2SAndroid Build Coastguard Worker 	      int xres, yres;
691*5e7646d2SAndroid Build Coastguard Worker 	      ipp_res_t units;
692*5e7646d2SAndroid Build Coastguard Worker 	      xres = ippGetResolution(attr, i, &yres, &units);
693*5e7646d2SAndroid Build Coastguard Worker 
694*5e7646d2SAndroid Build Coastguard Worker               if (xres == yres)
695*5e7646d2SAndroid Build Coastguard Worker                 printf("  %d%s\n", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
696*5e7646d2SAndroid Build Coastguard Worker 	      else
697*5e7646d2SAndroid Build Coastguard Worker                 printf("  %dx%d%s\n", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm");
698*5e7646d2SAndroid Build Coastguard Worker 	    }
699*5e7646d2SAndroid Build Coastguard Worker 	    break;
700*5e7646d2SAndroid Build Coastguard Worker 
701*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_KEYWORD :
702*5e7646d2SAndroid Build Coastguard Worker 	    for (i = 0; i < count; i ++)
703*5e7646d2SAndroid Build Coastguard Worker               printf("  %s (%s)\n", ippGetString(attr, i, NULL), cupsLocalizeDestValue(http, dest, dinfo, option, ippGetString(attr, i, NULL)));
704*5e7646d2SAndroid Build Coastguard Worker 	    break;
705*5e7646d2SAndroid Build Coastguard Worker 
706*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_TEXTLANG :
707*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_NAMELANG :
708*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_TEXT :
709*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_NAME :
710*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_URI :
711*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_URISCHEME :
712*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_CHARSET :
713*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_LANGUAGE :
714*5e7646d2SAndroid Build Coastguard Worker 	case IPP_TAG_MIMETYPE :
715*5e7646d2SAndroid Build Coastguard Worker 	    for (i = 0; i < count; i ++)
716*5e7646d2SAndroid Build Coastguard Worker               printf("  %s\n", ippGetString(attr, i, NULL));
717*5e7646d2SAndroid Build Coastguard Worker 	    break;
718*5e7646d2SAndroid Build Coastguard Worker 
719*5e7646d2SAndroid Build Coastguard Worker         case IPP_TAG_STRING :
720*5e7646d2SAndroid Build Coastguard Worker 	    for (i = 0; i < count; i ++)
721*5e7646d2SAndroid Build Coastguard Worker 	    {
722*5e7646d2SAndroid Build Coastguard Worker 	      int j, len;
723*5e7646d2SAndroid Build Coastguard Worker 	      unsigned char *data = ippGetOctetString(attr, i, &len);
724*5e7646d2SAndroid Build Coastguard Worker 
725*5e7646d2SAndroid Build Coastguard Worker               fputs("  ", stdout);
726*5e7646d2SAndroid Build Coastguard Worker 	      for (j = 0; j < len; j ++)
727*5e7646d2SAndroid Build Coastguard Worker 	      {
728*5e7646d2SAndroid Build Coastguard Worker 	        if (data[j] < ' ' || data[j] >= 0x7f)
729*5e7646d2SAndroid Build Coastguard Worker 		  printf("<%02X>", data[j]);
730*5e7646d2SAndroid Build Coastguard Worker 		else
731*5e7646d2SAndroid Build Coastguard Worker 		  putchar(data[j]);
732*5e7646d2SAndroid Build Coastguard Worker               }
733*5e7646d2SAndroid Build Coastguard Worker               putchar('\n');
734*5e7646d2SAndroid Build Coastguard Worker 	    }
735*5e7646d2SAndroid Build Coastguard Worker 	    break;
736*5e7646d2SAndroid Build Coastguard Worker 
737*5e7646d2SAndroid Build Coastguard Worker         case IPP_TAG_BOOLEAN :
738*5e7646d2SAndroid Build Coastguard Worker 	    break;
739*5e7646d2SAndroid Build Coastguard Worker 
740*5e7646d2SAndroid Build Coastguard Worker         default :
741*5e7646d2SAndroid Build Coastguard Worker 	    printf("  %s\n", ippTagString(ippGetValueTag(attr)));
742*5e7646d2SAndroid Build Coastguard Worker 	    break;
743*5e7646d2SAndroid Build Coastguard Worker       }
744*5e7646d2SAndroid Build Coastguard Worker     }
745*5e7646d2SAndroid Build Coastguard Worker 
746*5e7646d2SAndroid Build Coastguard Worker   }
747*5e7646d2SAndroid Build Coastguard Worker   else if (cupsCheckDestSupported(http, dest, dinfo, option, value))
748*5e7646d2SAndroid Build Coastguard Worker     puts("YES");
749*5e7646d2SAndroid Build Coastguard Worker   else
750*5e7646d2SAndroid Build Coastguard Worker     puts("NO");
751*5e7646d2SAndroid Build Coastguard Worker }
752*5e7646d2SAndroid Build Coastguard Worker 
753*5e7646d2SAndroid Build Coastguard Worker 
754*5e7646d2SAndroid Build Coastguard Worker /*
755*5e7646d2SAndroid Build Coastguard Worker  * 'usage()' - Show program usage.
756*5e7646d2SAndroid Build Coastguard Worker  */
757*5e7646d2SAndroid Build Coastguard Worker 
758*5e7646d2SAndroid Build Coastguard Worker static void
usage(const char * arg)759*5e7646d2SAndroid Build Coastguard Worker usage(const char *arg)			/* I - Argument for usage message */
760*5e7646d2SAndroid Build Coastguard Worker {
761*5e7646d2SAndroid Build Coastguard Worker   if (arg)
762*5e7646d2SAndroid Build Coastguard Worker     printf("testdest: Unknown option \"%s\".\n", arg);
763*5e7646d2SAndroid Build Coastguard Worker 
764*5e7646d2SAndroid Build Coastguard Worker   puts("Usage:");
765*5e7646d2SAndroid Build Coastguard Worker   puts("  ./testdest [--device] name [operation ...]");
766*5e7646d2SAndroid Build Coastguard Worker   puts("  ./testdest [--device] ipp://... [operation ...]");
767*5e7646d2SAndroid Build Coastguard Worker   puts("  ./testdest [--device] ipps://... [operation ...]");
768*5e7646d2SAndroid Build Coastguard Worker   puts("  ./testdest --get");
769*5e7646d2SAndroid Build Coastguard Worker   puts("  ./testdest --enum [grayscale] [color] [duplex] [staple] [small]\n"
770*5e7646d2SAndroid Build Coastguard Worker        "                    [medium] [large]");
771*5e7646d2SAndroid Build Coastguard Worker   puts("");
772*5e7646d2SAndroid Build Coastguard Worker   puts("Operations:");
773*5e7646d2SAndroid Build Coastguard Worker   puts("  conflicts options");
774*5e7646d2SAndroid Build Coastguard Worker   puts("  default option");
775*5e7646d2SAndroid Build Coastguard Worker   puts("  localize option [value]");
776*5e7646d2SAndroid Build Coastguard Worker   puts("  media [borderless] [duplex] [exact] [ready] [name or size]");
777*5e7646d2SAndroid Build Coastguard Worker   puts("  print filename [options]");
778*5e7646d2SAndroid Build Coastguard Worker   puts("  supported [option [value]]");
779*5e7646d2SAndroid Build Coastguard Worker 
780*5e7646d2SAndroid Build Coastguard Worker   exit(arg != NULL);
781*5e7646d2SAndroid Build Coastguard Worker }
782