1*5e7646d2SAndroid Build Coastguard Worker /*
2*5e7646d2SAndroid Build Coastguard Worker * IPP test program for CUPS.
3*5e7646d2SAndroid Build Coastguard Worker *
4*5e7646d2SAndroid Build Coastguard Worker * Copyright © 2007-2019 by Apple Inc.
5*5e7646d2SAndroid Build Coastguard Worker * Copyright © 1997-2005 by Easy Software Products.
6*5e7646d2SAndroid Build Coastguard Worker *
7*5e7646d2SAndroid Build Coastguard Worker * Licensed under Apache License v2.0. See the file "LICENSE" for more
8*5e7646d2SAndroid Build Coastguard Worker * information.
9*5e7646d2SAndroid Build Coastguard Worker */
10*5e7646d2SAndroid Build Coastguard Worker
11*5e7646d2SAndroid Build Coastguard Worker /*
12*5e7646d2SAndroid Build Coastguard Worker * Include necessary headers...
13*5e7646d2SAndroid Build Coastguard Worker */
14*5e7646d2SAndroid Build Coastguard Worker
15*5e7646d2SAndroid Build Coastguard Worker #include "file.h"
16*5e7646d2SAndroid Build Coastguard Worker #include "string-private.h"
17*5e7646d2SAndroid Build Coastguard Worker #include "ipp-private.h"
18*5e7646d2SAndroid Build Coastguard Worker #ifdef _WIN32
19*5e7646d2SAndroid Build Coastguard Worker # include <io.h>
20*5e7646d2SAndroid Build Coastguard Worker #else
21*5e7646d2SAndroid Build Coastguard Worker # include <unistd.h>
22*5e7646d2SAndroid Build Coastguard Worker # include <fcntl.h>
23*5e7646d2SAndroid Build Coastguard Worker #endif /* _WIN32 */
24*5e7646d2SAndroid Build Coastguard Worker
25*5e7646d2SAndroid Build Coastguard Worker
26*5e7646d2SAndroid Build Coastguard Worker /*
27*5e7646d2SAndroid Build Coastguard Worker * Local types...
28*5e7646d2SAndroid Build Coastguard Worker */
29*5e7646d2SAndroid Build Coastguard Worker
30*5e7646d2SAndroid Build Coastguard Worker typedef struct _ippdata_t
31*5e7646d2SAndroid Build Coastguard Worker {
32*5e7646d2SAndroid Build Coastguard Worker size_t rpos, /* Read position */
33*5e7646d2SAndroid Build Coastguard Worker wused, /* Bytes used */
34*5e7646d2SAndroid Build Coastguard Worker wsize; /* Max size of buffer */
35*5e7646d2SAndroid Build Coastguard Worker ipp_uchar_t *wbuffer; /* Buffer */
36*5e7646d2SAndroid Build Coastguard Worker } _ippdata_t;
37*5e7646d2SAndroid Build Coastguard Worker
38*5e7646d2SAndroid Build Coastguard Worker
39*5e7646d2SAndroid Build Coastguard Worker /*
40*5e7646d2SAndroid Build Coastguard Worker * Local globals...
41*5e7646d2SAndroid Build Coastguard Worker */
42*5e7646d2SAndroid Build Coastguard Worker
43*5e7646d2SAndroid Build Coastguard Worker static ipp_uchar_t collection[] = /* Collection buffer */
44*5e7646d2SAndroid Build Coastguard Worker {
45*5e7646d2SAndroid Build Coastguard Worker 0x01, 0x01, /* IPP version */
46*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x02, /* Print-Job operation */
47*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x01,
48*5e7646d2SAndroid Build Coastguard Worker /* Request ID */
49*5e7646d2SAndroid Build Coastguard Worker
50*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_OPERATION,
51*5e7646d2SAndroid Build Coastguard Worker
52*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_CHARSET,
53*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x12, /* Name length + name */
54*5e7646d2SAndroid Build Coastguard Worker 'a','t','t','r','i','b','u','t','e','s','-',
55*5e7646d2SAndroid Build Coastguard Worker 'c','h','a','r','s','e','t',
56*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x05, /* Value length + value */
57*5e7646d2SAndroid Build Coastguard Worker 'u','t','f','-','8',
58*5e7646d2SAndroid Build Coastguard Worker
59*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_LANGUAGE,
60*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x1b, /* Name length + name */
61*5e7646d2SAndroid Build Coastguard Worker 'a','t','t','r','i','b','u','t','e','s','-',
62*5e7646d2SAndroid Build Coastguard Worker 'n','a','t','u','r','a','l','-','l','a','n',
63*5e7646d2SAndroid Build Coastguard Worker 'g','u','a','g','e',
64*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x02, /* Value length + value */
65*5e7646d2SAndroid Build Coastguard Worker 'e','n',
66*5e7646d2SAndroid Build Coastguard Worker
67*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_URI,
68*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0b, /* Name length + name */
69*5e7646d2SAndroid Build Coastguard Worker 'p','r','i','n','t','e','r','-','u','r','i',
70*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x1c, /* Value length + value */
71*5e7646d2SAndroid Build Coastguard Worker 'i','p','p',':','/','/','l','o','c','a','l',
72*5e7646d2SAndroid Build Coastguard Worker 'h','o','s','t','/','p','r','i','n','t','e',
73*5e7646d2SAndroid Build Coastguard Worker 'r','s','/','f','o','o',
74*5e7646d2SAndroid Build Coastguard Worker
75*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_JOB, /* job group tag */
76*5e7646d2SAndroid Build Coastguard Worker
77*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_BEGIN_COLLECTION,
78*5e7646d2SAndroid Build Coastguard Worker /* begCollection tag */
79*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x09, /* Name length + name */
80*5e7646d2SAndroid Build Coastguard Worker 'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l',
81*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No value */
82*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_MEMBERNAME, /* memberAttrName tag */
83*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
84*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0a, /* Value length + value */
85*5e7646d2SAndroid Build Coastguard Worker 'm', 'e', 'd', 'i', 'a', '-', 's', 'i', 'z', 'e',
86*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_BEGIN_COLLECTION,
87*5e7646d2SAndroid Build Coastguard Worker /* begCollection tag */
88*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* Name length + name */
89*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No value */
90*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_MEMBERNAME,
91*5e7646d2SAndroid Build Coastguard Worker /* memberAttrName tag */
92*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
93*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0b, /* Value length + value */
94*5e7646d2SAndroid Build Coastguard Worker 'x', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n',
95*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_INTEGER, /* integer tag */
96*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
97*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x04, /* Value length + value */
98*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, 0x54, 0x56,
99*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_MEMBERNAME,
100*5e7646d2SAndroid Build Coastguard Worker /* memberAttrName tag */
101*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
102*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0b, /* Value length + value */
103*5e7646d2SAndroid Build Coastguard Worker 'y', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n',
104*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_INTEGER, /* integer tag */
105*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
106*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x04, /* Value length + value */
107*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, 0x6d, 0x24,
108*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_END_COLLECTION,
109*5e7646d2SAndroid Build Coastguard Worker /* endCollection tag */
110*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
111*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No value */
112*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_MEMBERNAME, /* memberAttrName tag */
113*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
114*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0b, /* Value length + value */
115*5e7646d2SAndroid Build Coastguard Worker 'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l', 'o', 'r',
116*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_KEYWORD, /* keyword tag */
117*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
118*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x04, /* Value length + value */
119*5e7646d2SAndroid Build Coastguard Worker 'b', 'l', 'u', 'e',
120*5e7646d2SAndroid Build Coastguard Worker
121*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_MEMBERNAME, /* memberAttrName tag */
122*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
123*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0a, /* Value length + value */
124*5e7646d2SAndroid Build Coastguard Worker 'm', 'e', 'd', 'i', 'a', '-', 't', 'y', 'p', 'e',
125*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_KEYWORD, /* keyword tag */
126*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
127*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x05, /* Value length + value */
128*5e7646d2SAndroid Build Coastguard Worker 'p', 'l', 'a', 'i', 'n',
129*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_END_COLLECTION,
130*5e7646d2SAndroid Build Coastguard Worker /* endCollection tag */
131*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
132*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No value */
133*5e7646d2SAndroid Build Coastguard Worker
134*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_BEGIN_COLLECTION,
135*5e7646d2SAndroid Build Coastguard Worker /* begCollection tag */
136*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
137*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No value */
138*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_MEMBERNAME, /* memberAttrName tag */
139*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
140*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0a, /* Value length + value */
141*5e7646d2SAndroid Build Coastguard Worker 'm', 'e', 'd', 'i', 'a', '-', 's', 'i', 'z', 'e',
142*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_BEGIN_COLLECTION,
143*5e7646d2SAndroid Build Coastguard Worker /* begCollection tag */
144*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* Name length + name */
145*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No value */
146*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_MEMBERNAME,
147*5e7646d2SAndroid Build Coastguard Worker /* memberAttrName tag */
148*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
149*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0b, /* Value length + value */
150*5e7646d2SAndroid Build Coastguard Worker 'x', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n',
151*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_INTEGER, /* integer tag */
152*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
153*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x04, /* Value length + value */
154*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, 0x52, 0x08,
155*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_MEMBERNAME,
156*5e7646d2SAndroid Build Coastguard Worker /* memberAttrName tag */
157*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
158*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0b, /* Value length + value */
159*5e7646d2SAndroid Build Coastguard Worker 'y', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n',
160*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_INTEGER, /* integer tag */
161*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
162*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x04, /* Value length + value */
163*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, 0x74, 0x04,
164*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_END_COLLECTION,
165*5e7646d2SAndroid Build Coastguard Worker /* endCollection tag */
166*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
167*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No value */
168*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_MEMBERNAME, /* memberAttrName tag */
169*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
170*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0b, /* Value length + value */
171*5e7646d2SAndroid Build Coastguard Worker 'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l', 'o', 'r',
172*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_KEYWORD, /* keyword tag */
173*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
174*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x05, /* Value length + value */
175*5e7646d2SAndroid Build Coastguard Worker 'p', 'l', 'a', 'i', 'd',
176*5e7646d2SAndroid Build Coastguard Worker
177*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_MEMBERNAME, /* memberAttrName tag */
178*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
179*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0a, /* Value length + value */
180*5e7646d2SAndroid Build Coastguard Worker 'm', 'e', 'd', 'i', 'a', '-', 't', 'y', 'p', 'e',
181*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_KEYWORD, /* keyword tag */
182*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
183*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x06, /* Value length + value */
184*5e7646d2SAndroid Build Coastguard Worker 'g', 'l', 'o', 's', 's', 'y',
185*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_END_COLLECTION,
186*5e7646d2SAndroid Build Coastguard Worker /* endCollection tag */
187*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
188*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No value */
189*5e7646d2SAndroid Build Coastguard Worker
190*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_END /* end tag */
191*5e7646d2SAndroid Build Coastguard Worker };
192*5e7646d2SAndroid Build Coastguard Worker static ipp_uchar_t bad_collection[] = /* Collection buffer (bad encoding) */
193*5e7646d2SAndroid Build Coastguard Worker {
194*5e7646d2SAndroid Build Coastguard Worker 0x01, 0x01, /* IPP version */
195*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x02, /* Print-Job operation */
196*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x01,
197*5e7646d2SAndroid Build Coastguard Worker /* Request ID */
198*5e7646d2SAndroid Build Coastguard Worker
199*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_OPERATION,
200*5e7646d2SAndroid Build Coastguard Worker
201*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_CHARSET,
202*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x12, /* Name length + name */
203*5e7646d2SAndroid Build Coastguard Worker 'a','t','t','r','i','b','u','t','e','s','-',
204*5e7646d2SAndroid Build Coastguard Worker 'c','h','a','r','s','e','t',
205*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x05, /* Value length + value */
206*5e7646d2SAndroid Build Coastguard Worker 'u','t','f','-','8',
207*5e7646d2SAndroid Build Coastguard Worker
208*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_LANGUAGE,
209*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x1b, /* Name length + name */
210*5e7646d2SAndroid Build Coastguard Worker 'a','t','t','r','i','b','u','t','e','s','-',
211*5e7646d2SAndroid Build Coastguard Worker 'n','a','t','u','r','a','l','-','l','a','n',
212*5e7646d2SAndroid Build Coastguard Worker 'g','u','a','g','e',
213*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x02, /* Value length + value */
214*5e7646d2SAndroid Build Coastguard Worker 'e','n',
215*5e7646d2SAndroid Build Coastguard Worker
216*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_URI,
217*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0b, /* Name length + name */
218*5e7646d2SAndroid Build Coastguard Worker 'p','r','i','n','t','e','r','-','u','r','i',
219*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x1c, /* Value length + value */
220*5e7646d2SAndroid Build Coastguard Worker 'i','p','p',':','/','/','l','o','c','a','l',
221*5e7646d2SAndroid Build Coastguard Worker 'h','o','s','t','/','p','r','i','n','t','e',
222*5e7646d2SAndroid Build Coastguard Worker 'r','s','/','f','o','o',
223*5e7646d2SAndroid Build Coastguard Worker
224*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_JOB, /* job group tag */
225*5e7646d2SAndroid Build Coastguard Worker
226*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_BEGIN_COLLECTION,
227*5e7646d2SAndroid Build Coastguard Worker /* begCollection tag */
228*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x09, /* Name length + name */
229*5e7646d2SAndroid Build Coastguard Worker 'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l',
230*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No value */
231*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_BEGIN_COLLECTION,
232*5e7646d2SAndroid Build Coastguard Worker /* begCollection tag */
233*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0a, /* Name length + name */
234*5e7646d2SAndroid Build Coastguard Worker 'm', 'e', 'd', 'i', 'a', '-', 's', 'i', 'z', 'e',
235*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No value */
236*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_INTEGER, /* integer tag */
237*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0b, /* Name length + name */
238*5e7646d2SAndroid Build Coastguard Worker 'x', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n',
239*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x04, /* Value length + value */
240*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, 0x54, 0x56,
241*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_INTEGER, /* integer tag */
242*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x0b, /* Name length + name */
243*5e7646d2SAndroid Build Coastguard Worker 'y', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n',
244*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x04, /* Value length + value */
245*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, 0x6d, 0x24,
246*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_END_COLLECTION,
247*5e7646d2SAndroid Build Coastguard Worker /* endCollection tag */
248*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
249*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No value */
250*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_END_COLLECTION,
251*5e7646d2SAndroid Build Coastguard Worker /* endCollection tag */
252*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
253*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No value */
254*5e7646d2SAndroid Build Coastguard Worker
255*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_END /* end tag */
256*5e7646d2SAndroid Build Coastguard Worker };
257*5e7646d2SAndroid Build Coastguard Worker
258*5e7646d2SAndroid Build Coastguard Worker static ipp_uchar_t mixed[] = /* Mixed value buffer */
259*5e7646d2SAndroid Build Coastguard Worker {
260*5e7646d2SAndroid Build Coastguard Worker 0x01, 0x01, /* IPP version */
261*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x02, /* Print-Job operation */
262*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x01,
263*5e7646d2SAndroid Build Coastguard Worker /* Request ID */
264*5e7646d2SAndroid Build Coastguard Worker
265*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_OPERATION,
266*5e7646d2SAndroid Build Coastguard Worker
267*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_INTEGER, /* integer tag */
268*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x1f, /* Name length + name */
269*5e7646d2SAndroid Build Coastguard Worker 'n', 'o', 't', 'i', 'f', 'y', '-', 'l', 'e', 'a', 's', 'e',
270*5e7646d2SAndroid Build Coastguard Worker '-', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '-', 's', 'u',
271*5e7646d2SAndroid Build Coastguard Worker 'p', 'p', 'o', 'r', 't', 'e', 'd',
272*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x04, /* Value length + value */
273*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x01,
274*5e7646d2SAndroid Build Coastguard Worker
275*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_RANGE, /* rangeOfInteger tag */
276*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, /* No name */
277*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x08, /* Value length + value */
278*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x10,
279*5e7646d2SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x20,
280*5e7646d2SAndroid Build Coastguard Worker
281*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_END /* end tag */
282*5e7646d2SAndroid Build Coastguard Worker };
283*5e7646d2SAndroid Build Coastguard Worker
284*5e7646d2SAndroid Build Coastguard Worker
285*5e7646d2SAndroid Build Coastguard Worker /*
286*5e7646d2SAndroid Build Coastguard Worker * Local functions...
287*5e7646d2SAndroid Build Coastguard Worker */
288*5e7646d2SAndroid Build Coastguard Worker
289*5e7646d2SAndroid Build Coastguard Worker void hex_dump(const char *title, ipp_uchar_t *buffer, size_t bytes);
290*5e7646d2SAndroid Build Coastguard Worker void print_attributes(ipp_t *ipp, int indent);
291*5e7646d2SAndroid Build Coastguard Worker ssize_t read_cb(_ippdata_t *data, ipp_uchar_t *buffer, size_t bytes);
292*5e7646d2SAndroid Build Coastguard Worker ssize_t read_hex(cups_file_t *fp, ipp_uchar_t *buffer, size_t bytes);
293*5e7646d2SAndroid Build Coastguard Worker int token_cb(_ipp_file_t *f, _ipp_vars_t *v, void *user_data, const char *token);
294*5e7646d2SAndroid Build Coastguard Worker ssize_t write_cb(_ippdata_t *data, ipp_uchar_t *buffer, size_t bytes);
295*5e7646d2SAndroid Build Coastguard Worker
296*5e7646d2SAndroid Build Coastguard Worker
297*5e7646d2SAndroid Build Coastguard Worker /*
298*5e7646d2SAndroid Build Coastguard Worker * 'main()' - Main entry.
299*5e7646d2SAndroid Build Coastguard Worker */
300*5e7646d2SAndroid Build Coastguard Worker
301*5e7646d2SAndroid Build Coastguard Worker int /* O - Exit status */
main(int argc,char * argv[])302*5e7646d2SAndroid Build Coastguard Worker main(int argc, /* I - Number of command-line arguments */
303*5e7646d2SAndroid Build Coastguard Worker char *argv[]) /* I - Command-line arguments */
304*5e7646d2SAndroid Build Coastguard Worker {
305*5e7646d2SAndroid Build Coastguard Worker _ippdata_t data; /* IPP buffer */
306*5e7646d2SAndroid Build Coastguard Worker ipp_uchar_t buffer[8192]; /* Write buffer data */
307*5e7646d2SAndroid Build Coastguard Worker ipp_t *cols[2], /* Collections */
308*5e7646d2SAndroid Build Coastguard Worker *size; /* media-size collection */
309*5e7646d2SAndroid Build Coastguard Worker ipp_t *request; /* Request */
310*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *media_col, /* media-col attribute */
311*5e7646d2SAndroid Build Coastguard Worker *media_size, /* media-size attribute */
312*5e7646d2SAndroid Build Coastguard Worker *attr; /* Other attribute */
313*5e7646d2SAndroid Build Coastguard Worker ipp_state_t state; /* State */
314*5e7646d2SAndroid Build Coastguard Worker size_t length; /* Length of data */
315*5e7646d2SAndroid Build Coastguard Worker cups_file_t *fp; /* File pointer */
316*5e7646d2SAndroid Build Coastguard Worker size_t i; /* Looping var */
317*5e7646d2SAndroid Build Coastguard Worker int status; /* Status of tests (0 = success, 1 = fail) */
318*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
319*5e7646d2SAndroid Build Coastguard Worker const char *name; /* Option name */
320*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
321*5e7646d2SAndroid Build Coastguard Worker
322*5e7646d2SAndroid Build Coastguard Worker
323*5e7646d2SAndroid Build Coastguard Worker status = 0;
324*5e7646d2SAndroid Build Coastguard Worker
325*5e7646d2SAndroid Build Coastguard Worker if (argc == 1)
326*5e7646d2SAndroid Build Coastguard Worker {
327*5e7646d2SAndroid Build Coastguard Worker /*
328*5e7646d2SAndroid Build Coastguard Worker * Test request generation code...
329*5e7646d2SAndroid Build Coastguard Worker */
330*5e7646d2SAndroid Build Coastguard Worker
331*5e7646d2SAndroid Build Coastguard Worker printf("Create Sample Request: ");
332*5e7646d2SAndroid Build Coastguard Worker
333*5e7646d2SAndroid Build Coastguard Worker request = ippNew();
334*5e7646d2SAndroid Build Coastguard Worker request->request.op.version[0] = 0x01;
335*5e7646d2SAndroid Build Coastguard Worker request->request.op.version[1] = 0x01;
336*5e7646d2SAndroid Build Coastguard Worker request->request.op.operation_id = IPP_OP_PRINT_JOB;
337*5e7646d2SAndroid Build Coastguard Worker request->request.op.request_id = 1;
338*5e7646d2SAndroid Build Coastguard Worker
339*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
340*5e7646d2SAndroid Build Coastguard Worker "attributes-charset", NULL, "utf-8");
341*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
342*5e7646d2SAndroid Build Coastguard Worker "attributes-natural-language", NULL, "en");
343*5e7646d2SAndroid Build Coastguard Worker ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
344*5e7646d2SAndroid Build Coastguard Worker "printer-uri", NULL, "ipp://localhost/printers/foo");
345*5e7646d2SAndroid Build Coastguard Worker
346*5e7646d2SAndroid Build Coastguard Worker cols[0] = ippNew();
347*5e7646d2SAndroid Build Coastguard Worker size = ippNew();
348*5e7646d2SAndroid Build Coastguard Worker ippAddInteger(size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "x-dimension", 21590);
349*5e7646d2SAndroid Build Coastguard Worker ippAddInteger(size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "y-dimension", 27940);
350*5e7646d2SAndroid Build Coastguard Worker ippAddCollection(cols[0], IPP_TAG_JOB, "media-size", size);
351*5e7646d2SAndroid Build Coastguard Worker ippDelete(size);
352*5e7646d2SAndroid Build Coastguard Worker ippAddString(cols[0], IPP_TAG_JOB, IPP_TAG_KEYWORD, "media-color", NULL,
353*5e7646d2SAndroid Build Coastguard Worker "blue");
354*5e7646d2SAndroid Build Coastguard Worker ippAddString(cols[0], IPP_TAG_JOB, IPP_TAG_KEYWORD, "media-type", NULL,
355*5e7646d2SAndroid Build Coastguard Worker "plain");
356*5e7646d2SAndroid Build Coastguard Worker
357*5e7646d2SAndroid Build Coastguard Worker cols[1] = ippNew();
358*5e7646d2SAndroid Build Coastguard Worker size = ippNew();
359*5e7646d2SAndroid Build Coastguard Worker ippAddInteger(size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "x-dimension", 21000);
360*5e7646d2SAndroid Build Coastguard Worker ippAddInteger(size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "y-dimension", 29700);
361*5e7646d2SAndroid Build Coastguard Worker ippAddCollection(cols[1], IPP_TAG_JOB, "media-size", size);
362*5e7646d2SAndroid Build Coastguard Worker ippDelete(size);
363*5e7646d2SAndroid Build Coastguard Worker ippAddString(cols[1], IPP_TAG_JOB, IPP_TAG_KEYWORD, "media-color", NULL,
364*5e7646d2SAndroid Build Coastguard Worker "plaid");
365*5e7646d2SAndroid Build Coastguard Worker ippAddString(cols[1], IPP_TAG_JOB, IPP_TAG_KEYWORD, "media-type", NULL,
366*5e7646d2SAndroid Build Coastguard Worker "glossy");
367*5e7646d2SAndroid Build Coastguard Worker
368*5e7646d2SAndroid Build Coastguard Worker ippAddCollections(request, IPP_TAG_JOB, "media-col", 2,
369*5e7646d2SAndroid Build Coastguard Worker (const ipp_t **)cols);
370*5e7646d2SAndroid Build Coastguard Worker ippDelete(cols[0]);
371*5e7646d2SAndroid Build Coastguard Worker ippDelete(cols[1]);
372*5e7646d2SAndroid Build Coastguard Worker
373*5e7646d2SAndroid Build Coastguard Worker length = ippLength(request);
374*5e7646d2SAndroid Build Coastguard Worker if (length != sizeof(collection))
375*5e7646d2SAndroid Build Coastguard Worker {
376*5e7646d2SAndroid Build Coastguard Worker printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n",
377*5e7646d2SAndroid Build Coastguard Worker (int)length, (int)sizeof(collection));
378*5e7646d2SAndroid Build Coastguard Worker status = 1;
379*5e7646d2SAndroid Build Coastguard Worker }
380*5e7646d2SAndroid Build Coastguard Worker else
381*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
382*5e7646d2SAndroid Build Coastguard Worker
383*5e7646d2SAndroid Build Coastguard Worker /*
384*5e7646d2SAndroid Build Coastguard Worker * Write test #1...
385*5e7646d2SAndroid Build Coastguard Worker */
386*5e7646d2SAndroid Build Coastguard Worker
387*5e7646d2SAndroid Build Coastguard Worker printf("Write Sample to Memory: ");
388*5e7646d2SAndroid Build Coastguard Worker
389*5e7646d2SAndroid Build Coastguard Worker data.wused = 0;
390*5e7646d2SAndroid Build Coastguard Worker data.wsize = sizeof(buffer);
391*5e7646d2SAndroid Build Coastguard Worker data.wbuffer = buffer;
392*5e7646d2SAndroid Build Coastguard Worker
393*5e7646d2SAndroid Build Coastguard Worker while ((state = ippWriteIO(&data, (ipp_iocb_t)write_cb, 1, NULL,
394*5e7646d2SAndroid Build Coastguard Worker request)) != IPP_STATE_DATA)
395*5e7646d2SAndroid Build Coastguard Worker if (state == IPP_STATE_ERROR)
396*5e7646d2SAndroid Build Coastguard Worker break;
397*5e7646d2SAndroid Build Coastguard Worker
398*5e7646d2SAndroid Build Coastguard Worker if (state != IPP_STATE_DATA)
399*5e7646d2SAndroid Build Coastguard Worker {
400*5e7646d2SAndroid Build Coastguard Worker printf("FAIL - %d bytes written.\n", (int)data.wused);
401*5e7646d2SAndroid Build Coastguard Worker status = 1;
402*5e7646d2SAndroid Build Coastguard Worker }
403*5e7646d2SAndroid Build Coastguard Worker else if (data.wused != sizeof(collection))
404*5e7646d2SAndroid Build Coastguard Worker {
405*5e7646d2SAndroid Build Coastguard Worker printf("FAIL - wrote %d bytes, expected %d bytes!\n", (int)data.wused,
406*5e7646d2SAndroid Build Coastguard Worker (int)sizeof(collection));
407*5e7646d2SAndroid Build Coastguard Worker hex_dump("Bytes Written", data.wbuffer, data.wused);
408*5e7646d2SAndroid Build Coastguard Worker hex_dump("Baseline", collection, sizeof(collection));
409*5e7646d2SAndroid Build Coastguard Worker status = 1;
410*5e7646d2SAndroid Build Coastguard Worker }
411*5e7646d2SAndroid Build Coastguard Worker else if (memcmp(data.wbuffer, collection, data.wused))
412*5e7646d2SAndroid Build Coastguard Worker {
413*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < data.wused; i ++)
414*5e7646d2SAndroid Build Coastguard Worker if (data.wbuffer[i] != collection[i])
415*5e7646d2SAndroid Build Coastguard Worker break;
416*5e7646d2SAndroid Build Coastguard Worker
417*5e7646d2SAndroid Build Coastguard Worker printf("FAIL - output does not match baseline at 0x%04x!\n", (unsigned)i);
418*5e7646d2SAndroid Build Coastguard Worker hex_dump("Bytes Written", data.wbuffer, data.wused);
419*5e7646d2SAndroid Build Coastguard Worker hex_dump("Baseline", collection, sizeof(collection));
420*5e7646d2SAndroid Build Coastguard Worker status = 1;
421*5e7646d2SAndroid Build Coastguard Worker }
422*5e7646d2SAndroid Build Coastguard Worker else
423*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
424*5e7646d2SAndroid Build Coastguard Worker
425*5e7646d2SAndroid Build Coastguard Worker ippDelete(request);
426*5e7646d2SAndroid Build Coastguard Worker
427*5e7646d2SAndroid Build Coastguard Worker /*
428*5e7646d2SAndroid Build Coastguard Worker * Read the data back in and confirm...
429*5e7646d2SAndroid Build Coastguard Worker */
430*5e7646d2SAndroid Build Coastguard Worker
431*5e7646d2SAndroid Build Coastguard Worker printf("Read Sample from Memory: ");
432*5e7646d2SAndroid Build Coastguard Worker
433*5e7646d2SAndroid Build Coastguard Worker request = ippNew();
434*5e7646d2SAndroid Build Coastguard Worker data.rpos = 0;
435*5e7646d2SAndroid Build Coastguard Worker
436*5e7646d2SAndroid Build Coastguard Worker while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL,
437*5e7646d2SAndroid Build Coastguard Worker request)) != IPP_STATE_DATA)
438*5e7646d2SAndroid Build Coastguard Worker if (state == IPP_STATE_ERROR)
439*5e7646d2SAndroid Build Coastguard Worker break;
440*5e7646d2SAndroid Build Coastguard Worker
441*5e7646d2SAndroid Build Coastguard Worker length = ippLength(request);
442*5e7646d2SAndroid Build Coastguard Worker
443*5e7646d2SAndroid Build Coastguard Worker if (state != IPP_STATE_DATA)
444*5e7646d2SAndroid Build Coastguard Worker {
445*5e7646d2SAndroid Build Coastguard Worker printf("FAIL - %d bytes read.\n", (int)data.rpos);
446*5e7646d2SAndroid Build Coastguard Worker status = 1;
447*5e7646d2SAndroid Build Coastguard Worker }
448*5e7646d2SAndroid Build Coastguard Worker else if (data.rpos != data.wused)
449*5e7646d2SAndroid Build Coastguard Worker {
450*5e7646d2SAndroid Build Coastguard Worker printf("FAIL - read %d bytes, expected %d bytes!\n", (int)data.rpos,
451*5e7646d2SAndroid Build Coastguard Worker (int)data.wused);
452*5e7646d2SAndroid Build Coastguard Worker print_attributes(request, 8);
453*5e7646d2SAndroid Build Coastguard Worker status = 1;
454*5e7646d2SAndroid Build Coastguard Worker }
455*5e7646d2SAndroid Build Coastguard Worker else if (length != sizeof(collection))
456*5e7646d2SAndroid Build Coastguard Worker {
457*5e7646d2SAndroid Build Coastguard Worker printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n",
458*5e7646d2SAndroid Build Coastguard Worker (int)length, (int)sizeof(collection));
459*5e7646d2SAndroid Build Coastguard Worker print_attributes(request, 8);
460*5e7646d2SAndroid Build Coastguard Worker status = 1;
461*5e7646d2SAndroid Build Coastguard Worker }
462*5e7646d2SAndroid Build Coastguard Worker else
463*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
464*5e7646d2SAndroid Build Coastguard Worker
465*5e7646d2SAndroid Build Coastguard Worker fputs("ippFindAttribute(media-col): ", stdout);
466*5e7646d2SAndroid Build Coastguard Worker if ((media_col = ippFindAttribute(request, "media-col",
467*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_BEGIN_COLLECTION)) == NULL)
468*5e7646d2SAndroid Build Coastguard Worker {
469*5e7646d2SAndroid Build Coastguard Worker if ((media_col = ippFindAttribute(request, "media-col",
470*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO)) == NULL)
471*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (not found)");
472*5e7646d2SAndroid Build Coastguard Worker else
473*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong type - %s)\n", ippTagString(media_col->value_tag));
474*5e7646d2SAndroid Build Coastguard Worker
475*5e7646d2SAndroid Build Coastguard Worker status = 1;
476*5e7646d2SAndroid Build Coastguard Worker }
477*5e7646d2SAndroid Build Coastguard Worker else if (media_col->num_values != 2)
478*5e7646d2SAndroid Build Coastguard Worker {
479*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong count - %d)\n", media_col->num_values);
480*5e7646d2SAndroid Build Coastguard Worker status = 1;
481*5e7646d2SAndroid Build Coastguard Worker }
482*5e7646d2SAndroid Build Coastguard Worker else
483*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
484*5e7646d2SAndroid Build Coastguard Worker
485*5e7646d2SAndroid Build Coastguard Worker if (media_col)
486*5e7646d2SAndroid Build Coastguard Worker {
487*5e7646d2SAndroid Build Coastguard Worker fputs("ippFindAttribute(media-size 1): ", stdout);
488*5e7646d2SAndroid Build Coastguard Worker if ((media_size = ippFindAttribute(media_col->values[0].collection,
489*5e7646d2SAndroid Build Coastguard Worker "media-size",
490*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_BEGIN_COLLECTION)) == NULL)
491*5e7646d2SAndroid Build Coastguard Worker {
492*5e7646d2SAndroid Build Coastguard Worker if ((media_size = ippFindAttribute(media_col->values[0].collection,
493*5e7646d2SAndroid Build Coastguard Worker "media-col",
494*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO)) == NULL)
495*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (not found)");
496*5e7646d2SAndroid Build Coastguard Worker else
497*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong type - %s)\n",
498*5e7646d2SAndroid Build Coastguard Worker ippTagString(media_size->value_tag));
499*5e7646d2SAndroid Build Coastguard Worker
500*5e7646d2SAndroid Build Coastguard Worker status = 1;
501*5e7646d2SAndroid Build Coastguard Worker }
502*5e7646d2SAndroid Build Coastguard Worker else
503*5e7646d2SAndroid Build Coastguard Worker {
504*5e7646d2SAndroid Build Coastguard Worker if ((attr = ippFindAttribute(media_size->values[0].collection,
505*5e7646d2SAndroid Build Coastguard Worker "x-dimension", IPP_TAG_INTEGER)) == NULL)
506*5e7646d2SAndroid Build Coastguard Worker {
507*5e7646d2SAndroid Build Coastguard Worker if ((attr = ippFindAttribute(media_size->values[0].collection,
508*5e7646d2SAndroid Build Coastguard Worker "x-dimension", IPP_TAG_ZERO)) == NULL)
509*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (missing x-dimension)");
510*5e7646d2SAndroid Build Coastguard Worker else
511*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong type for x-dimension - %s)\n",
512*5e7646d2SAndroid Build Coastguard Worker ippTagString(attr->value_tag));
513*5e7646d2SAndroid Build Coastguard Worker
514*5e7646d2SAndroid Build Coastguard Worker status = 1;
515*5e7646d2SAndroid Build Coastguard Worker }
516*5e7646d2SAndroid Build Coastguard Worker else if (attr->values[0].integer != 21590)
517*5e7646d2SAndroid Build Coastguard Worker {
518*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong value for x-dimension - %d)\n",
519*5e7646d2SAndroid Build Coastguard Worker attr->values[0].integer);
520*5e7646d2SAndroid Build Coastguard Worker status = 1;
521*5e7646d2SAndroid Build Coastguard Worker }
522*5e7646d2SAndroid Build Coastguard Worker else if ((attr = ippFindAttribute(media_size->values[0].collection,
523*5e7646d2SAndroid Build Coastguard Worker "y-dimension",
524*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_INTEGER)) == NULL)
525*5e7646d2SAndroid Build Coastguard Worker {
526*5e7646d2SAndroid Build Coastguard Worker if ((attr = ippFindAttribute(media_size->values[0].collection,
527*5e7646d2SAndroid Build Coastguard Worker "y-dimension", IPP_TAG_ZERO)) == NULL)
528*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (missing y-dimension)");
529*5e7646d2SAndroid Build Coastguard Worker else
530*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong type for y-dimension - %s)\n",
531*5e7646d2SAndroid Build Coastguard Worker ippTagString(attr->value_tag));
532*5e7646d2SAndroid Build Coastguard Worker
533*5e7646d2SAndroid Build Coastguard Worker status = 1;
534*5e7646d2SAndroid Build Coastguard Worker }
535*5e7646d2SAndroid Build Coastguard Worker else if (attr->values[0].integer != 27940)
536*5e7646d2SAndroid Build Coastguard Worker {
537*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong value for y-dimension - %d)\n",
538*5e7646d2SAndroid Build Coastguard Worker attr->values[0].integer);
539*5e7646d2SAndroid Build Coastguard Worker status = 1;
540*5e7646d2SAndroid Build Coastguard Worker }
541*5e7646d2SAndroid Build Coastguard Worker else
542*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
543*5e7646d2SAndroid Build Coastguard Worker }
544*5e7646d2SAndroid Build Coastguard Worker
545*5e7646d2SAndroid Build Coastguard Worker fputs("ippFindAttribute(media-size 2): ", stdout);
546*5e7646d2SAndroid Build Coastguard Worker if ((media_size = ippFindAttribute(media_col->values[1].collection,
547*5e7646d2SAndroid Build Coastguard Worker "media-size",
548*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_BEGIN_COLLECTION)) == NULL)
549*5e7646d2SAndroid Build Coastguard Worker {
550*5e7646d2SAndroid Build Coastguard Worker if ((media_size = ippFindAttribute(media_col->values[1].collection,
551*5e7646d2SAndroid Build Coastguard Worker "media-col",
552*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO)) == NULL)
553*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (not found)");
554*5e7646d2SAndroid Build Coastguard Worker else
555*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong type - %s)\n",
556*5e7646d2SAndroid Build Coastguard Worker ippTagString(media_size->value_tag));
557*5e7646d2SAndroid Build Coastguard Worker
558*5e7646d2SAndroid Build Coastguard Worker status = 1;
559*5e7646d2SAndroid Build Coastguard Worker }
560*5e7646d2SAndroid Build Coastguard Worker else
561*5e7646d2SAndroid Build Coastguard Worker {
562*5e7646d2SAndroid Build Coastguard Worker if ((attr = ippFindAttribute(media_size->values[0].collection,
563*5e7646d2SAndroid Build Coastguard Worker "x-dimension",
564*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_INTEGER)) == NULL)
565*5e7646d2SAndroid Build Coastguard Worker {
566*5e7646d2SAndroid Build Coastguard Worker if ((attr = ippFindAttribute(media_size->values[0].collection,
567*5e7646d2SAndroid Build Coastguard Worker "x-dimension", IPP_TAG_ZERO)) == NULL)
568*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (missing x-dimension)");
569*5e7646d2SAndroid Build Coastguard Worker else
570*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong type for x-dimension - %s)\n",
571*5e7646d2SAndroid Build Coastguard Worker ippTagString(attr->value_tag));
572*5e7646d2SAndroid Build Coastguard Worker
573*5e7646d2SAndroid Build Coastguard Worker status = 1;
574*5e7646d2SAndroid Build Coastguard Worker }
575*5e7646d2SAndroid Build Coastguard Worker else if (attr->values[0].integer != 21000)
576*5e7646d2SAndroid Build Coastguard Worker {
577*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong value for x-dimension - %d)\n",
578*5e7646d2SAndroid Build Coastguard Worker attr->values[0].integer);
579*5e7646d2SAndroid Build Coastguard Worker status = 1;
580*5e7646d2SAndroid Build Coastguard Worker }
581*5e7646d2SAndroid Build Coastguard Worker else if ((attr = ippFindAttribute(media_size->values[0].collection,
582*5e7646d2SAndroid Build Coastguard Worker "y-dimension",
583*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_INTEGER)) == NULL)
584*5e7646d2SAndroid Build Coastguard Worker {
585*5e7646d2SAndroid Build Coastguard Worker if ((attr = ippFindAttribute(media_size->values[0].collection,
586*5e7646d2SAndroid Build Coastguard Worker "y-dimension", IPP_TAG_ZERO)) == NULL)
587*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (missing y-dimension)");
588*5e7646d2SAndroid Build Coastguard Worker else
589*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong type for y-dimension - %s)\n",
590*5e7646d2SAndroid Build Coastguard Worker ippTagString(attr->value_tag));
591*5e7646d2SAndroid Build Coastguard Worker
592*5e7646d2SAndroid Build Coastguard Worker status = 1;
593*5e7646d2SAndroid Build Coastguard Worker }
594*5e7646d2SAndroid Build Coastguard Worker else if (attr->values[0].integer != 29700)
595*5e7646d2SAndroid Build Coastguard Worker {
596*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong value for y-dimension - %d)\n",
597*5e7646d2SAndroid Build Coastguard Worker attr->values[0].integer);
598*5e7646d2SAndroid Build Coastguard Worker status = 1;
599*5e7646d2SAndroid Build Coastguard Worker }
600*5e7646d2SAndroid Build Coastguard Worker else
601*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
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 * Test hierarchical find...
607*5e7646d2SAndroid Build Coastguard Worker */
608*5e7646d2SAndroid Build Coastguard Worker
609*5e7646d2SAndroid Build Coastguard Worker fputs("ippFindAttribute(media-col/media-size/x-dimension): ", stdout);
610*5e7646d2SAndroid Build Coastguard Worker if ((attr = ippFindAttribute(request, "media-col/media-size/x-dimension", IPP_TAG_INTEGER)) != NULL)
611*5e7646d2SAndroid Build Coastguard Worker {
612*5e7646d2SAndroid Build Coastguard Worker if (ippGetInteger(attr, 0) != 21590)
613*5e7646d2SAndroid Build Coastguard Worker {
614*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong value for x-dimension - %d)\n", ippGetInteger(attr, 0));
615*5e7646d2SAndroid Build Coastguard Worker status = 1;
616*5e7646d2SAndroid Build Coastguard Worker }
617*5e7646d2SAndroid Build Coastguard Worker else
618*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
619*5e7646d2SAndroid Build Coastguard Worker }
620*5e7646d2SAndroid Build Coastguard Worker else
621*5e7646d2SAndroid Build Coastguard Worker {
622*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (not found)");
623*5e7646d2SAndroid Build Coastguard Worker status = 1;
624*5e7646d2SAndroid Build Coastguard Worker }
625*5e7646d2SAndroid Build Coastguard Worker
626*5e7646d2SAndroid Build Coastguard Worker fputs("ippFindNextAttribute(media-col/media-size/x-dimension): ", stdout);
627*5e7646d2SAndroid Build Coastguard Worker if ((attr = ippFindNextAttribute(request, "media-col/media-size/x-dimension", IPP_TAG_INTEGER)) != NULL)
628*5e7646d2SAndroid Build Coastguard Worker {
629*5e7646d2SAndroid Build Coastguard Worker if (ippGetInteger(attr, 0) != 21000)
630*5e7646d2SAndroid Build Coastguard Worker {
631*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong value for x-dimension - %d)\n", ippGetInteger(attr, 0));
632*5e7646d2SAndroid Build Coastguard Worker status = 1;
633*5e7646d2SAndroid Build Coastguard Worker }
634*5e7646d2SAndroid Build Coastguard Worker else
635*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
636*5e7646d2SAndroid Build Coastguard Worker }
637*5e7646d2SAndroid Build Coastguard Worker else
638*5e7646d2SAndroid Build Coastguard Worker {
639*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (not found)");
640*5e7646d2SAndroid Build Coastguard Worker status = 1;
641*5e7646d2SAndroid Build Coastguard Worker }
642*5e7646d2SAndroid Build Coastguard Worker
643*5e7646d2SAndroid Build Coastguard Worker fputs("ippFindNextAttribute(media-col/media-size/x-dimension) again: ", stdout);
644*5e7646d2SAndroid Build Coastguard Worker if ((attr = ippFindNextAttribute(request, "media-col/media-size/x-dimension", IPP_TAG_INTEGER)) != NULL)
645*5e7646d2SAndroid Build Coastguard Worker {
646*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (got %d, expected nothing)\n", ippGetInteger(attr, 0));
647*5e7646d2SAndroid Build Coastguard Worker status = 1;
648*5e7646d2SAndroid Build Coastguard Worker }
649*5e7646d2SAndroid Build Coastguard Worker else
650*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
651*5e7646d2SAndroid Build Coastguard Worker
652*5e7646d2SAndroid Build Coastguard Worker ippDelete(request);
653*5e7646d2SAndroid Build Coastguard Worker
654*5e7646d2SAndroid Build Coastguard Worker /*
655*5e7646d2SAndroid Build Coastguard Worker * Read the bad collection data and confirm we get an error...
656*5e7646d2SAndroid Build Coastguard Worker */
657*5e7646d2SAndroid Build Coastguard Worker
658*5e7646d2SAndroid Build Coastguard Worker fputs("Read Bad Collection from Memory: ", stdout);
659*5e7646d2SAndroid Build Coastguard Worker
660*5e7646d2SAndroid Build Coastguard Worker request = ippNew();
661*5e7646d2SAndroid Build Coastguard Worker data.rpos = 0;
662*5e7646d2SAndroid Build Coastguard Worker data.wused = sizeof(bad_collection);
663*5e7646d2SAndroid Build Coastguard Worker data.wsize = sizeof(bad_collection);
664*5e7646d2SAndroid Build Coastguard Worker data.wbuffer = bad_collection;
665*5e7646d2SAndroid Build Coastguard Worker
666*5e7646d2SAndroid Build Coastguard Worker while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL, request)) != IPP_STATE_DATA)
667*5e7646d2SAndroid Build Coastguard Worker if (state == IPP_STATE_ERROR)
668*5e7646d2SAndroid Build Coastguard Worker break;
669*5e7646d2SAndroid Build Coastguard Worker
670*5e7646d2SAndroid Build Coastguard Worker if (state != IPP_STATE_ERROR)
671*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (read successful)");
672*5e7646d2SAndroid Build Coastguard Worker else
673*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
674*5e7646d2SAndroid Build Coastguard Worker
675*5e7646d2SAndroid Build Coastguard Worker /*
676*5e7646d2SAndroid Build Coastguard Worker * Read the mixed data and confirm we converted everything to rangeOfInteger
677*5e7646d2SAndroid Build Coastguard Worker * values...
678*5e7646d2SAndroid Build Coastguard Worker */
679*5e7646d2SAndroid Build Coastguard Worker
680*5e7646d2SAndroid Build Coastguard Worker fputs("Read Mixed integer/rangeOfInteger from Memory: ", stdout);
681*5e7646d2SAndroid Build Coastguard Worker
682*5e7646d2SAndroid Build Coastguard Worker request = ippNew();
683*5e7646d2SAndroid Build Coastguard Worker data.rpos = 0;
684*5e7646d2SAndroid Build Coastguard Worker data.wused = sizeof(mixed);
685*5e7646d2SAndroid Build Coastguard Worker data.wsize = sizeof(mixed);
686*5e7646d2SAndroid Build Coastguard Worker data.wbuffer = mixed;
687*5e7646d2SAndroid Build Coastguard Worker
688*5e7646d2SAndroid Build Coastguard Worker while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL,
689*5e7646d2SAndroid Build Coastguard Worker request)) != IPP_STATE_DATA)
690*5e7646d2SAndroid Build Coastguard Worker if (state == IPP_STATE_ERROR)
691*5e7646d2SAndroid Build Coastguard Worker break;
692*5e7646d2SAndroid Build Coastguard Worker
693*5e7646d2SAndroid Build Coastguard Worker length = ippLength(request);
694*5e7646d2SAndroid Build Coastguard Worker
695*5e7646d2SAndroid Build Coastguard Worker if (state != IPP_STATE_DATA)
696*5e7646d2SAndroid Build Coastguard Worker {
697*5e7646d2SAndroid Build Coastguard Worker printf("FAIL - %d bytes read.\n", (int)data.rpos);
698*5e7646d2SAndroid Build Coastguard Worker status = 1;
699*5e7646d2SAndroid Build Coastguard Worker }
700*5e7646d2SAndroid Build Coastguard Worker else if (data.rpos != sizeof(mixed))
701*5e7646d2SAndroid Build Coastguard Worker {
702*5e7646d2SAndroid Build Coastguard Worker printf("FAIL - read %d bytes, expected %d bytes!\n", (int)data.rpos,
703*5e7646d2SAndroid Build Coastguard Worker (int)sizeof(mixed));
704*5e7646d2SAndroid Build Coastguard Worker print_attributes(request, 8);
705*5e7646d2SAndroid Build Coastguard Worker status = 1;
706*5e7646d2SAndroid Build Coastguard Worker }
707*5e7646d2SAndroid Build Coastguard Worker else if (length != (sizeof(mixed) + 4))
708*5e7646d2SAndroid Build Coastguard Worker {
709*5e7646d2SAndroid Build Coastguard Worker printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n",
710*5e7646d2SAndroid Build Coastguard Worker (int)length, (int)sizeof(mixed) + 4);
711*5e7646d2SAndroid Build Coastguard Worker print_attributes(request, 8);
712*5e7646d2SAndroid Build Coastguard Worker status = 1;
713*5e7646d2SAndroid Build Coastguard Worker }
714*5e7646d2SAndroid Build Coastguard Worker else
715*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
716*5e7646d2SAndroid Build Coastguard Worker
717*5e7646d2SAndroid Build Coastguard Worker fputs("ippFindAttribute(notify-lease-duration-supported): ", stdout);
718*5e7646d2SAndroid Build Coastguard Worker if ((attr = ippFindAttribute(request, "notify-lease-duration-supported",
719*5e7646d2SAndroid Build Coastguard Worker IPP_TAG_ZERO)) == NULL)
720*5e7646d2SAndroid Build Coastguard Worker {
721*5e7646d2SAndroid Build Coastguard Worker puts("FAIL (not found)");
722*5e7646d2SAndroid Build Coastguard Worker status = 1;
723*5e7646d2SAndroid Build Coastguard Worker }
724*5e7646d2SAndroid Build Coastguard Worker else if (attr->value_tag != IPP_TAG_RANGE)
725*5e7646d2SAndroid Build Coastguard Worker {
726*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong type - %s)\n", ippTagString(attr->value_tag));
727*5e7646d2SAndroid Build Coastguard Worker status = 1;
728*5e7646d2SAndroid Build Coastguard Worker }
729*5e7646d2SAndroid Build Coastguard Worker else if (attr->num_values != 2)
730*5e7646d2SAndroid Build Coastguard Worker {
731*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong count - %d)\n", attr->num_values);
732*5e7646d2SAndroid Build Coastguard Worker status = 1;
733*5e7646d2SAndroid Build Coastguard Worker }
734*5e7646d2SAndroid Build Coastguard Worker else if (attr->values[0].range.lower != 1 ||
735*5e7646d2SAndroid Build Coastguard Worker attr->values[0].range.upper != 1 ||
736*5e7646d2SAndroid Build Coastguard Worker attr->values[1].range.lower != 16 ||
737*5e7646d2SAndroid Build Coastguard Worker attr->values[1].range.upper != 32)
738*5e7646d2SAndroid Build Coastguard Worker {
739*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (wrong values - %d,%d and %d,%d)\n",
740*5e7646d2SAndroid Build Coastguard Worker attr->values[0].range.lower,
741*5e7646d2SAndroid Build Coastguard Worker attr->values[0].range.upper,
742*5e7646d2SAndroid Build Coastguard Worker attr->values[1].range.lower,
743*5e7646d2SAndroid Build Coastguard Worker attr->values[1].range.upper);
744*5e7646d2SAndroid Build Coastguard Worker status = 1;
745*5e7646d2SAndroid Build Coastguard Worker }
746*5e7646d2SAndroid Build Coastguard Worker else
747*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
748*5e7646d2SAndroid Build Coastguard Worker
749*5e7646d2SAndroid Build Coastguard Worker ippDelete(request);
750*5e7646d2SAndroid Build Coastguard Worker
751*5e7646d2SAndroid Build Coastguard Worker #ifdef DEBUG
752*5e7646d2SAndroid Build Coastguard Worker /*
753*5e7646d2SAndroid Build Coastguard Worker * Test that private option array is sorted...
754*5e7646d2SAndroid Build Coastguard Worker */
755*5e7646d2SAndroid Build Coastguard Worker
756*5e7646d2SAndroid Build Coastguard Worker fputs("_ippCheckOptions: ", stdout);
757*5e7646d2SAndroid Build Coastguard Worker if ((name = _ippCheckOptions()) == NULL)
758*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
759*5e7646d2SAndroid Build Coastguard Worker else
760*5e7646d2SAndroid Build Coastguard Worker {
761*5e7646d2SAndroid Build Coastguard Worker printf("FAIL (\"%s\" out of order)\n", name);
762*5e7646d2SAndroid Build Coastguard Worker status = 1;
763*5e7646d2SAndroid Build Coastguard Worker }
764*5e7646d2SAndroid Build Coastguard Worker #endif /* DEBUG */
765*5e7646d2SAndroid Build Coastguard Worker
766*5e7646d2SAndroid Build Coastguard Worker /*
767*5e7646d2SAndroid Build Coastguard Worker * Test _ippFindOption() private API...
768*5e7646d2SAndroid Build Coastguard Worker */
769*5e7646d2SAndroid Build Coastguard Worker
770*5e7646d2SAndroid Build Coastguard Worker fputs("_ippFindOption(\"printer-type\"): ", stdout);
771*5e7646d2SAndroid Build Coastguard Worker if (_ippFindOption("printer-type"))
772*5e7646d2SAndroid Build Coastguard Worker puts("PASS");
773*5e7646d2SAndroid Build Coastguard Worker else
774*5e7646d2SAndroid Build Coastguard Worker {
775*5e7646d2SAndroid Build Coastguard Worker puts("FAIL");
776*5e7646d2SAndroid Build Coastguard Worker status = 1;
777*5e7646d2SAndroid Build Coastguard Worker }
778*5e7646d2SAndroid Build Coastguard Worker
779*5e7646d2SAndroid Build Coastguard Worker /*
780*5e7646d2SAndroid Build Coastguard Worker * Summarize...
781*5e7646d2SAndroid Build Coastguard Worker */
782*5e7646d2SAndroid Build Coastguard Worker
783*5e7646d2SAndroid Build Coastguard Worker putchar('\n');
784*5e7646d2SAndroid Build Coastguard Worker
785*5e7646d2SAndroid Build Coastguard Worker if (status)
786*5e7646d2SAndroid Build Coastguard Worker puts("Core IPP tests failed.");
787*5e7646d2SAndroid Build Coastguard Worker else
788*5e7646d2SAndroid Build Coastguard Worker puts("Core IPP tests passed.");
789*5e7646d2SAndroid Build Coastguard Worker }
790*5e7646d2SAndroid Build Coastguard Worker else
791*5e7646d2SAndroid Build Coastguard Worker {
792*5e7646d2SAndroid Build Coastguard Worker /*
793*5e7646d2SAndroid Build Coastguard Worker * Read IPP files...
794*5e7646d2SAndroid Build Coastguard Worker */
795*5e7646d2SAndroid Build Coastguard Worker
796*5e7646d2SAndroid Build Coastguard Worker for (i = 1; i < (size_t)argc; i ++)
797*5e7646d2SAndroid Build Coastguard Worker {
798*5e7646d2SAndroid Build Coastguard Worker if (strlen(argv[i]) > 5 && !strcmp(argv[i] + strlen(argv[i]) - 5, ".test"))
799*5e7646d2SAndroid Build Coastguard Worker {
800*5e7646d2SAndroid Build Coastguard Worker /*
801*5e7646d2SAndroid Build Coastguard Worker * Read an ASCII IPP message...
802*5e7646d2SAndroid Build Coastguard Worker */
803*5e7646d2SAndroid Build Coastguard Worker
804*5e7646d2SAndroid Build Coastguard Worker _ipp_vars_t v; /* IPP variables */
805*5e7646d2SAndroid Build Coastguard Worker
806*5e7646d2SAndroid Build Coastguard Worker _ippVarsInit(&v, NULL, NULL, token_cb);
807*5e7646d2SAndroid Build Coastguard Worker request = _ippFileParse(&v, argv[i], NULL);
808*5e7646d2SAndroid Build Coastguard Worker _ippVarsDeinit(&v);
809*5e7646d2SAndroid Build Coastguard Worker }
810*5e7646d2SAndroid Build Coastguard Worker else if (strlen(argv[i]) > 4 && !strcmp(argv[i] + strlen(argv[i]) - 4, ".hex"))
811*5e7646d2SAndroid Build Coastguard Worker {
812*5e7646d2SAndroid Build Coastguard Worker /*
813*5e7646d2SAndroid Build Coastguard Worker * Read a hex-encoded IPP message...
814*5e7646d2SAndroid Build Coastguard Worker */
815*5e7646d2SAndroid Build Coastguard Worker
816*5e7646d2SAndroid Build Coastguard Worker if ((fp = cupsFileOpen(argv[i], "r")) == NULL)
817*5e7646d2SAndroid Build Coastguard Worker {
818*5e7646d2SAndroid Build Coastguard Worker printf("Unable to open \"%s\" - %s\n", argv[i], strerror(errno));
819*5e7646d2SAndroid Build Coastguard Worker status = 1;
820*5e7646d2SAndroid Build Coastguard Worker continue;
821*5e7646d2SAndroid Build Coastguard Worker }
822*5e7646d2SAndroid Build Coastguard Worker
823*5e7646d2SAndroid Build Coastguard Worker request = ippNew();
824*5e7646d2SAndroid Build Coastguard Worker while ((state = ippReadIO(fp, (ipp_iocb_t)read_hex, 1, NULL, request)) == IPP_STATE_ATTRIBUTE);
825*5e7646d2SAndroid Build Coastguard Worker
826*5e7646d2SAndroid Build Coastguard Worker if (state != IPP_STATE_DATA)
827*5e7646d2SAndroid Build Coastguard Worker {
828*5e7646d2SAndroid Build Coastguard Worker printf("Error reading IPP message from \"%s\": %s\n", argv[i], cupsLastErrorString());
829*5e7646d2SAndroid Build Coastguard Worker status = 1;
830*5e7646d2SAndroid Build Coastguard Worker
831*5e7646d2SAndroid Build Coastguard Worker ippDelete(request);
832*5e7646d2SAndroid Build Coastguard Worker request = NULL;
833*5e7646d2SAndroid Build Coastguard Worker }
834*5e7646d2SAndroid Build Coastguard Worker
835*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(fp);
836*5e7646d2SAndroid Build Coastguard Worker }
837*5e7646d2SAndroid Build Coastguard Worker else
838*5e7646d2SAndroid Build Coastguard Worker {
839*5e7646d2SAndroid Build Coastguard Worker /*
840*5e7646d2SAndroid Build Coastguard Worker * Read a raw (binary) IPP message...
841*5e7646d2SAndroid Build Coastguard Worker */
842*5e7646d2SAndroid Build Coastguard Worker
843*5e7646d2SAndroid Build Coastguard Worker if ((fp = cupsFileOpen(argv[i], "r")) == NULL)
844*5e7646d2SAndroid Build Coastguard Worker {
845*5e7646d2SAndroid Build Coastguard Worker printf("Unable to open \"%s\" - %s\n", argv[i], strerror(errno));
846*5e7646d2SAndroid Build Coastguard Worker status = 1;
847*5e7646d2SAndroid Build Coastguard Worker continue;
848*5e7646d2SAndroid Build Coastguard Worker }
849*5e7646d2SAndroid Build Coastguard Worker
850*5e7646d2SAndroid Build Coastguard Worker request = ippNew();
851*5e7646d2SAndroid Build Coastguard Worker while ((state = ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL,
852*5e7646d2SAndroid Build Coastguard Worker request)) == IPP_STATE_ATTRIBUTE);
853*5e7646d2SAndroid Build Coastguard Worker
854*5e7646d2SAndroid Build Coastguard Worker if (state != IPP_STATE_DATA)
855*5e7646d2SAndroid Build Coastguard Worker {
856*5e7646d2SAndroid Build Coastguard Worker printf("Error reading IPP message from \"%s\": %s\n", argv[i], cupsLastErrorString());
857*5e7646d2SAndroid Build Coastguard Worker status = 1;
858*5e7646d2SAndroid Build Coastguard Worker
859*5e7646d2SAndroid Build Coastguard Worker ippDelete(request);
860*5e7646d2SAndroid Build Coastguard Worker request = NULL;
861*5e7646d2SAndroid Build Coastguard Worker }
862*5e7646d2SAndroid Build Coastguard Worker
863*5e7646d2SAndroid Build Coastguard Worker cupsFileClose(fp);
864*5e7646d2SAndroid Build Coastguard Worker }
865*5e7646d2SAndroid Build Coastguard Worker
866*5e7646d2SAndroid Build Coastguard Worker if (request)
867*5e7646d2SAndroid Build Coastguard Worker {
868*5e7646d2SAndroid Build Coastguard Worker printf("\n%s:\n", argv[i]);
869*5e7646d2SAndroid Build Coastguard Worker print_attributes(request, 4);
870*5e7646d2SAndroid Build Coastguard Worker ippDelete(request);
871*5e7646d2SAndroid Build Coastguard Worker }
872*5e7646d2SAndroid Build Coastguard Worker }
873*5e7646d2SAndroid Build Coastguard Worker }
874*5e7646d2SAndroid Build Coastguard Worker
875*5e7646d2SAndroid Build Coastguard Worker return (status);
876*5e7646d2SAndroid Build Coastguard Worker }
877*5e7646d2SAndroid Build Coastguard Worker
878*5e7646d2SAndroid Build Coastguard Worker
879*5e7646d2SAndroid Build Coastguard Worker /*
880*5e7646d2SAndroid Build Coastguard Worker * 'hex_dump()' - Produce a hex dump of a buffer.
881*5e7646d2SAndroid Build Coastguard Worker */
882*5e7646d2SAndroid Build Coastguard Worker
883*5e7646d2SAndroid Build Coastguard Worker void
hex_dump(const char * title,ipp_uchar_t * buffer,size_t bytes)884*5e7646d2SAndroid Build Coastguard Worker hex_dump(const char *title, /* I - Title */
885*5e7646d2SAndroid Build Coastguard Worker ipp_uchar_t *buffer, /* I - Buffer to dump */
886*5e7646d2SAndroid Build Coastguard Worker size_t bytes) /* I - Number of bytes */
887*5e7646d2SAndroid Build Coastguard Worker {
888*5e7646d2SAndroid Build Coastguard Worker size_t i, j; /* Looping vars */
889*5e7646d2SAndroid Build Coastguard Worker int ch; /* Current ASCII char */
890*5e7646d2SAndroid Build Coastguard Worker
891*5e7646d2SAndroid Build Coastguard Worker
892*5e7646d2SAndroid Build Coastguard Worker /*
893*5e7646d2SAndroid Build Coastguard Worker * Show lines of 16 bytes at a time...
894*5e7646d2SAndroid Build Coastguard Worker */
895*5e7646d2SAndroid Build Coastguard Worker
896*5e7646d2SAndroid Build Coastguard Worker printf(" %s:\n", title);
897*5e7646d2SAndroid Build Coastguard Worker
898*5e7646d2SAndroid Build Coastguard Worker for (i = 0; i < bytes; i += 16)
899*5e7646d2SAndroid Build Coastguard Worker {
900*5e7646d2SAndroid Build Coastguard Worker /*
901*5e7646d2SAndroid Build Coastguard Worker * Show the offset...
902*5e7646d2SAndroid Build Coastguard Worker */
903*5e7646d2SAndroid Build Coastguard Worker
904*5e7646d2SAndroid Build Coastguard Worker printf(" %04x ", (unsigned)i);
905*5e7646d2SAndroid Build Coastguard Worker
906*5e7646d2SAndroid Build Coastguard Worker /*
907*5e7646d2SAndroid Build Coastguard Worker * Then up to 16 bytes in hex...
908*5e7646d2SAndroid Build Coastguard Worker */
909*5e7646d2SAndroid Build Coastguard Worker
910*5e7646d2SAndroid Build Coastguard Worker for (j = 0; j < 16; j ++)
911*5e7646d2SAndroid Build Coastguard Worker if ((i + j) < bytes)
912*5e7646d2SAndroid Build Coastguard Worker printf(" %02x", buffer[i + j]);
913*5e7646d2SAndroid Build Coastguard Worker else
914*5e7646d2SAndroid Build Coastguard Worker printf(" ");
915*5e7646d2SAndroid Build Coastguard Worker
916*5e7646d2SAndroid Build Coastguard Worker /*
917*5e7646d2SAndroid Build Coastguard Worker * Then the ASCII representation of the bytes...
918*5e7646d2SAndroid Build Coastguard Worker */
919*5e7646d2SAndroid Build Coastguard Worker
920*5e7646d2SAndroid Build Coastguard Worker putchar(' ');
921*5e7646d2SAndroid Build Coastguard Worker putchar(' ');
922*5e7646d2SAndroid Build Coastguard Worker
923*5e7646d2SAndroid Build Coastguard Worker for (j = 0; j < 16 && (i + j) < bytes; j ++)
924*5e7646d2SAndroid Build Coastguard Worker {
925*5e7646d2SAndroid Build Coastguard Worker ch = buffer[i + j] & 127;
926*5e7646d2SAndroid Build Coastguard Worker
927*5e7646d2SAndroid Build Coastguard Worker if (ch < ' ' || ch == 127)
928*5e7646d2SAndroid Build Coastguard Worker putchar('.');
929*5e7646d2SAndroid Build Coastguard Worker else
930*5e7646d2SAndroid Build Coastguard Worker putchar(ch);
931*5e7646d2SAndroid Build Coastguard Worker }
932*5e7646d2SAndroid Build Coastguard Worker
933*5e7646d2SAndroid Build Coastguard Worker putchar('\n');
934*5e7646d2SAndroid Build Coastguard Worker }
935*5e7646d2SAndroid Build Coastguard Worker }
936*5e7646d2SAndroid Build Coastguard Worker
937*5e7646d2SAndroid Build Coastguard Worker
938*5e7646d2SAndroid Build Coastguard Worker /*
939*5e7646d2SAndroid Build Coastguard Worker * 'print_attributes()' - Print the attributes in a request...
940*5e7646d2SAndroid Build Coastguard Worker */
941*5e7646d2SAndroid Build Coastguard Worker
942*5e7646d2SAndroid Build Coastguard Worker void
print_attributes(ipp_t * ipp,int indent)943*5e7646d2SAndroid Build Coastguard Worker print_attributes(ipp_t *ipp, /* I - IPP request */
944*5e7646d2SAndroid Build Coastguard Worker int indent) /* I - Indentation */
945*5e7646d2SAndroid Build Coastguard Worker {
946*5e7646d2SAndroid Build Coastguard Worker ipp_tag_t group; /* Current group */
947*5e7646d2SAndroid Build Coastguard Worker ipp_attribute_t *attr; /* Current attribute */
948*5e7646d2SAndroid Build Coastguard Worker char buffer[2048]; /* Value string */
949*5e7646d2SAndroid Build Coastguard Worker
950*5e7646d2SAndroid Build Coastguard Worker
951*5e7646d2SAndroid Build Coastguard Worker for (group = IPP_TAG_ZERO, attr = ipp->attrs; attr; attr = attr->next)
952*5e7646d2SAndroid Build Coastguard Worker {
953*5e7646d2SAndroid Build Coastguard Worker if (!attr->name && indent == 4)
954*5e7646d2SAndroid Build Coastguard Worker {
955*5e7646d2SAndroid Build Coastguard Worker group = IPP_TAG_ZERO;
956*5e7646d2SAndroid Build Coastguard Worker putchar('\n');
957*5e7646d2SAndroid Build Coastguard Worker continue;
958*5e7646d2SAndroid Build Coastguard Worker }
959*5e7646d2SAndroid Build Coastguard Worker
960*5e7646d2SAndroid Build Coastguard Worker if (group != attr->group_tag)
961*5e7646d2SAndroid Build Coastguard Worker {
962*5e7646d2SAndroid Build Coastguard Worker group = attr->group_tag;
963*5e7646d2SAndroid Build Coastguard Worker
964*5e7646d2SAndroid Build Coastguard Worker printf("\n%*s%s:\n\n", indent - 4, "", ippTagString(group));
965*5e7646d2SAndroid Build Coastguard Worker }
966*5e7646d2SAndroid Build Coastguard Worker
967*5e7646d2SAndroid Build Coastguard Worker ippAttributeString(attr, buffer, sizeof(buffer));
968*5e7646d2SAndroid Build Coastguard Worker
969*5e7646d2SAndroid Build Coastguard Worker printf("%*s%s (%s%s): %s\n", indent, "", attr->name ? attr->name : "(null)", attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag), buffer);
970*5e7646d2SAndroid Build Coastguard Worker }
971*5e7646d2SAndroid Build Coastguard Worker }
972*5e7646d2SAndroid Build Coastguard Worker
973*5e7646d2SAndroid Build Coastguard Worker
974*5e7646d2SAndroid Build Coastguard Worker /*
975*5e7646d2SAndroid Build Coastguard Worker * 'read_cb()' - Read data from a buffer.
976*5e7646d2SAndroid Build Coastguard Worker */
977*5e7646d2SAndroid Build Coastguard Worker
978*5e7646d2SAndroid Build Coastguard Worker ssize_t /* O - Number of bytes read */
read_cb(_ippdata_t * data,ipp_uchar_t * buffer,size_t bytes)979*5e7646d2SAndroid Build Coastguard Worker read_cb(_ippdata_t *data, /* I - Data */
980*5e7646d2SAndroid Build Coastguard Worker ipp_uchar_t *buffer, /* O - Buffer to read */
981*5e7646d2SAndroid Build Coastguard Worker size_t bytes) /* I - Number of bytes to read */
982*5e7646d2SAndroid Build Coastguard Worker {
983*5e7646d2SAndroid Build Coastguard Worker size_t count; /* Number of bytes */
984*5e7646d2SAndroid Build Coastguard Worker
985*5e7646d2SAndroid Build Coastguard Worker
986*5e7646d2SAndroid Build Coastguard Worker /*
987*5e7646d2SAndroid Build Coastguard Worker * Copy bytes from the data buffer to the read buffer...
988*5e7646d2SAndroid Build Coastguard Worker */
989*5e7646d2SAndroid Build Coastguard Worker
990*5e7646d2SAndroid Build Coastguard Worker if ((count = data->wsize - data->rpos) > bytes)
991*5e7646d2SAndroid Build Coastguard Worker count = bytes;
992*5e7646d2SAndroid Build Coastguard Worker
993*5e7646d2SAndroid Build Coastguard Worker memcpy(buffer, data->wbuffer + data->rpos, count);
994*5e7646d2SAndroid Build Coastguard Worker data->rpos += count;
995*5e7646d2SAndroid Build Coastguard Worker
996*5e7646d2SAndroid Build Coastguard Worker /*
997*5e7646d2SAndroid Build Coastguard Worker * Return the number of bytes read...
998*5e7646d2SAndroid Build Coastguard Worker */
999*5e7646d2SAndroid Build Coastguard Worker
1000*5e7646d2SAndroid Build Coastguard Worker return ((ssize_t)count);
1001*5e7646d2SAndroid Build Coastguard Worker }
1002*5e7646d2SAndroid Build Coastguard Worker
1003*5e7646d2SAndroid Build Coastguard Worker
1004*5e7646d2SAndroid Build Coastguard Worker /*
1005*5e7646d2SAndroid Build Coastguard Worker * 'read_hex()' - Read a hex dump of an IPP request.
1006*5e7646d2SAndroid Build Coastguard Worker */
1007*5e7646d2SAndroid Build Coastguard Worker
1008*5e7646d2SAndroid Build Coastguard Worker ssize_t /* O - Number of bytes read */
read_hex(cups_file_t * fp,ipp_uchar_t * buffer,size_t bytes)1009*5e7646d2SAndroid Build Coastguard Worker read_hex(cups_file_t *fp, /* I - File to read from */
1010*5e7646d2SAndroid Build Coastguard Worker ipp_uchar_t *buffer, /* I - Buffer to read */
1011*5e7646d2SAndroid Build Coastguard Worker size_t bytes) /* I - Number of bytes to read */
1012*5e7646d2SAndroid Build Coastguard Worker {
1013*5e7646d2SAndroid Build Coastguard Worker size_t total = 0; /* Total bytes read */
1014*5e7646d2SAndroid Build Coastguard Worker static char hex[256] = ""; /* Line from file */
1015*5e7646d2SAndroid Build Coastguard Worker static char *hexptr = NULL; /* Pointer in line */
1016*5e7646d2SAndroid Build Coastguard Worker
1017*5e7646d2SAndroid Build Coastguard Worker
1018*5e7646d2SAndroid Build Coastguard Worker while (total < bytes)
1019*5e7646d2SAndroid Build Coastguard Worker {
1020*5e7646d2SAndroid Build Coastguard Worker if (!hexptr || (isspace(hexptr[0] & 255) && isspace(hexptr[1] & 255)))
1021*5e7646d2SAndroid Build Coastguard Worker {
1022*5e7646d2SAndroid Build Coastguard Worker if (!cupsFileGets(fp, hex, sizeof(hex)))
1023*5e7646d2SAndroid Build Coastguard Worker break;
1024*5e7646d2SAndroid Build Coastguard Worker
1025*5e7646d2SAndroid Build Coastguard Worker hexptr = hex;
1026*5e7646d2SAndroid Build Coastguard Worker while (isxdigit(*hexptr & 255))
1027*5e7646d2SAndroid Build Coastguard Worker hexptr ++;
1028*5e7646d2SAndroid Build Coastguard Worker while (isspace(*hexptr & 255))
1029*5e7646d2SAndroid Build Coastguard Worker hexptr ++;
1030*5e7646d2SAndroid Build Coastguard Worker
1031*5e7646d2SAndroid Build Coastguard Worker if (!isxdigit(*hexptr & 255))
1032*5e7646d2SAndroid Build Coastguard Worker {
1033*5e7646d2SAndroid Build Coastguard Worker hexptr = NULL;
1034*5e7646d2SAndroid Build Coastguard Worker continue;
1035*5e7646d2SAndroid Build Coastguard Worker }
1036*5e7646d2SAndroid Build Coastguard Worker }
1037*5e7646d2SAndroid Build Coastguard Worker
1038*5e7646d2SAndroid Build Coastguard Worker *buffer++ = (ipp_uchar_t)strtol(hexptr, &hexptr, 16);
1039*5e7646d2SAndroid Build Coastguard Worker total ++;
1040*5e7646d2SAndroid Build Coastguard Worker }
1041*5e7646d2SAndroid Build Coastguard Worker
1042*5e7646d2SAndroid Build Coastguard Worker return (total == 0 ? -1 : (ssize_t)total);
1043*5e7646d2SAndroid Build Coastguard Worker }
1044*5e7646d2SAndroid Build Coastguard Worker
1045*5e7646d2SAndroid Build Coastguard Worker
1046*5e7646d2SAndroid Build Coastguard Worker /*
1047*5e7646d2SAndroid Build Coastguard Worker * 'token_cb()' - Token callback for ASCII IPP data file parser.
1048*5e7646d2SAndroid Build Coastguard Worker */
1049*5e7646d2SAndroid Build Coastguard Worker
1050*5e7646d2SAndroid Build Coastguard Worker int /* O - 1 on success, 0 on failure */
token_cb(_ipp_file_t * f,_ipp_vars_t * v,void * user_data,const char * token)1051*5e7646d2SAndroid Build Coastguard Worker token_cb(_ipp_file_t *f, /* I - IPP file data */
1052*5e7646d2SAndroid Build Coastguard Worker _ipp_vars_t *v, /* I - IPP variables */
1053*5e7646d2SAndroid Build Coastguard Worker void *user_data, /* I - User data pointer */
1054*5e7646d2SAndroid Build Coastguard Worker const char *token) /* I - Token string */
1055*5e7646d2SAndroid Build Coastguard Worker {
1056*5e7646d2SAndroid Build Coastguard Worker (void)v;
1057*5e7646d2SAndroid Build Coastguard Worker (void)user_data;
1058*5e7646d2SAndroid Build Coastguard Worker
1059*5e7646d2SAndroid Build Coastguard Worker if (!token)
1060*5e7646d2SAndroid Build Coastguard Worker {
1061*5e7646d2SAndroid Build Coastguard Worker f->attrs = ippNew();
1062*5e7646d2SAndroid Build Coastguard Worker f->group_tag = IPP_TAG_PRINTER;
1063*5e7646d2SAndroid Build Coastguard Worker }
1064*5e7646d2SAndroid Build Coastguard Worker else
1065*5e7646d2SAndroid Build Coastguard Worker {
1066*5e7646d2SAndroid Build Coastguard Worker fprintf(stderr, "Unknown directive \"%s\" on line %d of \"%s\".\n", token, f->linenum, f->filename);
1067*5e7646d2SAndroid Build Coastguard Worker return (0);
1068*5e7646d2SAndroid Build Coastguard Worker }
1069*5e7646d2SAndroid Build Coastguard Worker
1070*5e7646d2SAndroid Build Coastguard Worker return (1);
1071*5e7646d2SAndroid Build Coastguard Worker }
1072*5e7646d2SAndroid Build Coastguard Worker
1073*5e7646d2SAndroid Build Coastguard Worker
1074*5e7646d2SAndroid Build Coastguard Worker /*
1075*5e7646d2SAndroid Build Coastguard Worker * 'write_cb()' - Write data into a buffer.
1076*5e7646d2SAndroid Build Coastguard Worker */
1077*5e7646d2SAndroid Build Coastguard Worker
1078*5e7646d2SAndroid Build Coastguard Worker ssize_t /* O - Number of bytes written */
write_cb(_ippdata_t * data,ipp_uchar_t * buffer,size_t bytes)1079*5e7646d2SAndroid Build Coastguard Worker write_cb(_ippdata_t *data, /* I - Data */
1080*5e7646d2SAndroid Build Coastguard Worker ipp_uchar_t *buffer, /* I - Buffer to write */
1081*5e7646d2SAndroid Build Coastguard Worker size_t bytes) /* I - Number of bytes to write */
1082*5e7646d2SAndroid Build Coastguard Worker {
1083*5e7646d2SAndroid Build Coastguard Worker size_t count; /* Number of bytes */
1084*5e7646d2SAndroid Build Coastguard Worker
1085*5e7646d2SAndroid Build Coastguard Worker
1086*5e7646d2SAndroid Build Coastguard Worker /*
1087*5e7646d2SAndroid Build Coastguard Worker * Loop until all bytes are written...
1088*5e7646d2SAndroid Build Coastguard Worker */
1089*5e7646d2SAndroid Build Coastguard Worker
1090*5e7646d2SAndroid Build Coastguard Worker if ((count = data->wsize - data->wused) > bytes)
1091*5e7646d2SAndroid Build Coastguard Worker count = bytes;
1092*5e7646d2SAndroid Build Coastguard Worker
1093*5e7646d2SAndroid Build Coastguard Worker memcpy(data->wbuffer + data->wused, buffer, count);
1094*5e7646d2SAndroid Build Coastguard Worker data->wused += count;
1095*5e7646d2SAndroid Build Coastguard Worker
1096*5e7646d2SAndroid Build Coastguard Worker /*
1097*5e7646d2SAndroid Build Coastguard Worker * Return the number of bytes written...
1098*5e7646d2SAndroid Build Coastguard Worker */
1099*5e7646d2SAndroid Build Coastguard Worker
1100*5e7646d2SAndroid Build Coastguard Worker return ((ssize_t)count);
1101*5e7646d2SAndroid Build Coastguard Worker }
1102