xref: /illumos-gate/usr/src/lib/print/libpapi-common/common/papi.h (revision 4c87aefe8930bd07275b8dd2e96ea5f24d93a52e)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  *
26  */
27 
28 #ifndef _PAPI_H
29 #define	_PAPI_H
30 
31 /* $Id: papi.h 161 2006-05-03 04:32:59Z njacobs $ */
32 
33 #pragma ident	"%Z%%M%	%I%	%E% SMI"
34 
35 #include <sys/types.h>
36 #include <time.h>
37 #include <stdio.h>
38 
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 
43 /*
44  * Types
45  */
46 
47 /*	service related types	*/
48 typedef void *papi_service_t;
49 typedef void *papi_printer_t;
50 typedef void *papi_job_t;
51 typedef void *papi_stream_t;
52 
53 typedef enum {
54 	PAPI_ENCRYPT_IF_REQUESTED,	/* Encrypt if requested (TLS upgrade) */
55 	PAPI_ENCRYPT_NEVER,		/* Never encrypt */
56 	PAPI_ENCRYPT_REQUIRED,		/* Encryption required (TLS upgrade) */
57 	PAPI_ENCRYPT_ALWAYS		/* Always encrypt (SSL) */
58 } papi_encryption_t;
59 
60 /*	attribute related types	*/
61 typedef enum {
62 	PAPI_STRING,
63 	PAPI_INTEGER,
64 	PAPI_BOOLEAN,
65 	PAPI_RANGE,
66 	PAPI_RESOLUTION,
67 	PAPI_DATETIME,
68 	PAPI_COLLECTION,
69 	PAPI_METADATA
70 } papi_attribute_value_type_t;
71 
72 typedef enum {
73 	PAPI_RES_PER_INCH = 3,
74 	PAPI_RES_PER_CM
75 } papi_resolution_unit_t;
76 
77 enum {	/* for boolean values */
78 	PAPI_FALSE = 0,
79 	PAPI_TRUE = 1
80 };
81 
82 typedef enum {
83 	PAPI_UNSUPPORTED = 0x10,
84 	PAPI_DEFAULT = 0x11,
85 	PAPI_UNKNOWN,
86 	PAPI_NO_VALUE,
87 	PAPI_NOT_SETTABLE = 0x15,
88 	PAPI_DELETE = 0x16
89 } papi_metadata_t;
90 
91 #define	PAPI_LIST_JOBS_OTHERS		0x0001
92 #define	PAPI_LIST_JOBS_COMPLETED	0x0002
93 #define	PAPI_LIST_JOBS_NOT_COMPLETED	0x0004
94 #define	PAPI_LIST_JOBS_ALL		0xFFFF
95 
96 typedef struct papi_attribute_s papi_attribute_t;
97 
98 typedef union {
99 	char *string;				/* PAPI_STRING value */
100 	int integer;				/* PAPI_INTEGER value */
101 	char boolean;				/* PAPI_BOOLEAN value */
102 	struct {				/* PAPI_RANGE value */
103 		int lower;
104 		int upper;
105 	} range;
106 	struct {				/* PAPI_RESOLUTION value */
107 		int xres;
108 		int yres;
109 		papi_resolution_unit_t units;
110 	} resolution;
111 	time_t datetime;			/* PAPI_DATETIME value */
112 	papi_attribute_t **collection;		/* PAPI_COLLECTION value */
113 	papi_metadata_t metadata;		/* PAPI_METADATA value */
114 } papi_attribute_value_t;
115 
116 struct papi_attribute_s {
117 	char *name;				/* attribute name */
118 	papi_attribute_value_type_t type;	/* type of values */
119 	papi_attribute_value_t **values;	/* list of values */
120 };
121 
122 #define	PAPI_ATTR_APPEND	0x0001	/* Add values to attr */
123 #define	PAPI_ATTR_REPLACE	0x0002	/* Delete existing values, then add */
124 #define	PAPI_ATTR_EXCL		0x0004	/* Fail if attr exists */
125 
126 /*	job related types	*/
127 typedef enum {
128 	PAPI_JT_FORMAT_JDF = 0,
129 	PAPI_JT_FORMAT_PWG = 1
130 } papi_jt_format_t;
131 
132 typedef struct {
133 	papi_jt_format_t format;
134 	char *ticket_data;
135 	char *file_name;
136 } papi_job_ticket_t;
137 
138 /*	status related types	*/
139 typedef enum {
140 	PAPI_OK = 0x0000,
141 	PAPI_OK_SUBST,
142 	PAPI_OK_CONFLICT,
143 	PAPI_OK_IGNORED_SUBSCRIPTIONS,
144 	PAPI_OK_IGNORED_NOTIFICATIONS,
145 	PAPI_OK_TOO_MANY_EVENTS,
146 	PAPI_OK_BUT_CANCEL_SUBSCRIPTION,
147 	PAPI_REDIRECTION_OTHER_SITE = 0x0300,
148 	PAPI_BAD_REQUEST = 0x0400,
149 	PAPI_FORBIDDEN,
150 	PAPI_NOT_AUTHENTICATED,
151 	PAPI_NOT_AUTHORIZED,
152 	PAPI_NOT_POSSIBLE,
153 	PAPI_TIMEOUT,
154 	PAPI_NOT_FOUND,
155 	PAPI_GONE,
156 	PAPI_REQUEST_ENTITY,
157 	PAPI_REQUEST_VALUE,
158 	PAPI_DOCUMENT_FORMAT,
159 	PAPI_ATTRIBUTES,
160 	PAPI_URI_SCHEME,
161 	PAPI_CHARSET,
162 	PAPI_CONFLICT,
163 	PAPI_COMPRESSION_NOT_SUPPORTED,
164 	PAPI_COMPRESSION_ERROR,
165 	PAPI_DOCUMENT_FORMAT_ERROR,
166 	PAPI_DOCUMENT_ACCESS_ERROR,
167 	PAPI_ATTRIBUTES_NOT_SETTABLE,
168 	PAPI_IGNORED_ALL_SUBSCRIPTIONS,
169 	PAPI_TOO_MANY_SUBSCRIPTIONS,
170 	PAPI_IGNORED_ALL_NOTIFICATIONS,
171 	PAPI_PRINT_SUPPORT_FILE_NOT_FOUND,
172 	PAPI_INTERNAL_ERROR = 0x0500,
173 	PAPI_OPERATION_NOT_SUPPORTED,
174 	PAPI_SERVICE_UNAVAILABLE,
175 	PAPI_VERSION_NOT_SUPPORTED,
176 	PAPI_DEVICE_ERROR,
177 	PAPI_TEMPORARY_ERROR,
178 	PAPI_NOT_ACCEPTING,
179 	PAPI_PRINTER_BUSY,
180 	PAPI_ERROR_JOB_CANCELLED,
181 	PAPI_MULTIPLE_JOBS_NOT_SUPPORTED,
182 	PAPI_PRINTER_IS_DEACTIVATED,
183 	PAPI_BAD_ARGUMENT,
184 	PAPI_JOB_TICKET_NOT_SUPPORTED
185 } papi_status_t;
186 
187 /*	list filter related	*/
188 typedef enum {
189 	PAPI_FILTER_BITMASK = 0
190 } papi_filter_type_t;
191 
192 typedef struct {
193 	papi_filter_type_t type;
194 	union {
195 		struct {			/* PAPI_FILTER_BITMASK */
196 			unsigned int mask;
197 			unsigned int value;
198 		} bitmask;
199 	} filter;
200 } papi_filter_t;
201 
202 enum {
203 	PAPI_PRINTER_LOCAL = 0x0000,	/* Local destination */
204 	PAPI_PRINTER_CLASS = 0x0001,	/* Printer class */
205 	PAPI_PRINTER_REMOTE = 0x0002,	/* Remote destination */
206 	PAPI_PRINTER_BW = 0x0004,	/* Can do B&W printing */
207 	PAPI_PRINTER_COLOR = 0x0008,	/* Can do color printing */
208 	PAPI_PRINTER_DUPLEX = 0x0010,	/* Can do duplex printing */
209 	PAPI_PRINTER_STAPLE = 0x0020,	/* Can do stapling */
210 	PAPI_PRINTER_COPIES = 0x0040,	/* Can do copies */
211 	PAPI_PRINTER_COLLATE = 0x0080,	/* Can collate copies */
212 	PAPI_PRINTER_PUNCH = 0x0100,	/* Can punch output */
213 	PAPI_PRINTER_COVER = 0x0200,	/* Can cover output */
214 	PAPI_PRINTER_BIND = 0x0400,	/* Can bind output */
215 	PAPI_PRINTER_SORT = 0x0800,	/* Can sort output */
216 	PAPI_PRINTER_SMALL = 0x1000,	/* Can do letter/legal/a4 */
217 	PAPI_PRINTER_MEDIUM = 0x2000,	/* Can do tabloid/B/C/A3/A2 */
218 	PAPI_PRINTER_LARGE = 0x4000,	/* Can do D/E/A1/A0 */
219 	PAPI_PRINTER_VARIABLE = 0x8000,	/* Can do variable sizes */
220 	PAPI_PRINTER_IMPLICIT = 0x10000, /* implicit class */
221 	PAPI_PRINTER_DEFAULT = 0x20000,	/* Default printer on network */
222 	PAPI_PRINTER_OPTIONS = 0xfffc	/* ~ (CLASS | REMOTE | IMPLICIT) */
223 };
224 
225 /*
226  * Functions
227  */
228 
229 /* 	Service related		*/
230 extern papi_status_t papiServiceCreate(papi_service_t *handle,
231 					char *service_name, char *user_name,
232 					char *password,
233 					int (*authCB)(papi_service_t svc,
234 							void *app_data),
235 					papi_encryption_t encryption,
236 					void *app_data);
237 extern void papiServiceDestroy(papi_service_t handle);
238 extern papi_status_t papiServiceSetUserName(papi_service_t handle,
239 					char *user_name);
240 extern papi_status_t papiServiceSetPassword(papi_service_t handle,
241 					char *password);
242 extern papi_status_t papiServiceSetEncryption(papi_service_t handle,
243 					papi_encryption_t encryption);
244 extern papi_status_t papiServiceSetAuthCB(papi_service_t handle,
245 					int (*authCB)(papi_service_t s,
246 							void *app_data));
247 extern papi_status_t papiServiceSetAppData(papi_service_t handle,
248 					void *app_data);
249 extern char *papiServiceGetServiceName(papi_service_t handle);
250 extern char *papiServiceGetUserName(papi_service_t handle);
251 extern char *papiServiceGetPassword(papi_service_t handle);
252 extern papi_encryption_t papiServiceGetEncryption(papi_service_t handle);
253 extern void *papiServiceGetAppData(papi_service_t handle);
254 extern papi_attribute_t **papiServiceGetAttributeList(papi_service_t handle);
255 extern char *papiServiceGetStatusMessage(papi_service_t handle);
256 
257 /*	Attribute related	 */
258 extern papi_status_t papiAttributeListAddValue(papi_attribute_t ***attrs,
259 					int flags, char *name,
260 					papi_attribute_value_type_t type,
261 					papi_attribute_value_t *value);
262 extern papi_status_t papiAttributeListAddString(papi_attribute_t ***attrs,
263 					int flags, char *name, char *string);
264 extern papi_status_t papiAttributeListAddInteger(papi_attribute_t ***attrs,
265 					int flags, char *name, int integer);
266 extern papi_status_t papiAttributeListAddBoolean(papi_attribute_t ***attrs,
267 					int flags, char *name, char boolean);
268 extern papi_status_t papiAttributeListAddRange(papi_attribute_t ***attrs,
269 					int flags, char *name,
270 					int lower, int upper);
271 extern papi_status_t papiAttributeListAddResolution(papi_attribute_t ***attrs,
272 					int flags, char *name,
273 					int xres, int yres,
274 					papi_resolution_unit_t units);
275 extern papi_status_t papiAttributeListAddDatetime(papi_attribute_t ***attrs,
276 					int flags, char *name, time_t datetime);
277 extern papi_status_t papiAttributeListAddCollection(papi_attribute_t ***attrs,
278 					int flags, char *name,
279 					papi_attribute_t **collection);
280 extern papi_status_t papiAttributeListAddMetadata(papi_attribute_t ***attrs,
281 					int flags, char *name,
282 					papi_metadata_t metadata);
283 extern papi_status_t papiAttributeListDelete(papi_attribute_t ***attributes,
284 					char *name);
285 extern papi_status_t papiAttributeListGetValue(papi_attribute_t **list,
286 					void **iterator, char *name,
287 					papi_attribute_value_type_t type,
288 					papi_attribute_value_t **value);
289 extern papi_status_t papiAttributeListGetString(papi_attribute_t **list,
290 					void **iterator, char *name,
291 					char **vptr);
292 extern papi_status_t papiAttributeListGetInteger(papi_attribute_t **list,
293 					void **iterator, char *name, int *vptr);
294 extern papi_status_t papiAttributeListGetBoolean(papi_attribute_t **list,
295 					void **iterator, char *name,
296 					char *vptr);
297 extern papi_status_t papiAttributeListGetRange(papi_attribute_t **list,
298 					void **iterator, char *name,
299 					int *min, int *max);
300 extern papi_status_t papiAttributeListGetResolution(papi_attribute_t **list,
301 					void **iterator, char *name,
302 					int *x, int *y,
303 					papi_resolution_unit_t *units);
304 extern papi_status_t papiAttributeListGetDatetime(papi_attribute_t **list,
305 					void **iterator, char *name,
306 					time_t *dt);
307 extern papi_status_t papiAttributeListGetCollection(papi_attribute_t **list,
308 					void **iterator, char *name,
309 					papi_attribute_t ***collection);
310 extern papi_status_t papiAttributeListGetMetadata(papi_attribute_t **list,
311 					void **iterator, char *name,
312 					papi_metadata_t *vptr);
313 extern papi_attribute_t *papiAttributeListFind(papi_attribute_t **list,
314 					char *name);
315 extern papi_attribute_t *papiAttributeListGetNext(papi_attribute_t **list,
316 					void **iterator);
317 extern void papiAttributeListFree(papi_attribute_t **attributes);
318 
319 extern papi_status_t papiAttributeListFromString(papi_attribute_t ***attrs,
320 					int flags, char *string);
321 extern papi_status_t papiAttributeListToString(papi_attribute_t **attrs,
322 					char *delim,
323 					char *buffer, size_t buflen);
324 extern void papiAttributeListPrint(FILE *fp, papi_attribute_t **list,
325 					char *prefix_fmt, ...);
326 
327 /*	Printer related		 */
328 extern papi_status_t papiPrintersList(papi_service_t handle,
329 					char **requested_attrs,
330 					papi_filter_t *filter,
331 					papi_printer_t **printers);
332 extern papi_status_t papiPrinterQuery(papi_service_t handle, char *name,
333 					char **requested_attrs,
334 					papi_attribute_t **job_attributes,
335 					papi_printer_t *printer);
336 extern papi_status_t papiPrinterAdd(papi_service_t handle, char *name,
337 					papi_attribute_t **attributes,
338 					papi_printer_t *printer);
339 extern papi_status_t papiPrinterModify(papi_service_t handle, char *name,
340 					papi_attribute_t **attributes,
341 					papi_printer_t *printer);
342 extern papi_status_t papiPrinterRemove(papi_service_t handle, char *name);
343 extern papi_status_t papiPrinterDisable(papi_service_t handle, char *name,
344 					char *message);
345 extern papi_status_t papiPrinterEnable(papi_service_t handle, char *name);
346 extern papi_status_t papiPrinterPause(papi_service_t handle, char *name,
347 					char *message);
348 extern papi_status_t papiPrinterResume(papi_service_t handle, char *name);
349 extern papi_status_t papiPrinterPurgeJobs(papi_service_t handle,
350 					char *name, papi_job_t **jobs);
351 extern papi_status_t papiPrinterListJobs(papi_service_t handle,
352 					char *name, char **requested_attrs,
353 					int type_mask, int max_num_jobs,
354 					papi_job_t **jobs);
355 extern papi_attribute_t **papiPrinterGetAttributeList(papi_printer_t printer);
356 extern void papiPrinterFree(papi_printer_t printer);
357 extern void papiPrinterListFree(papi_printer_t *printers);
358 
359 /*	Job related		*/
360 extern papi_status_t papiJobSubmit(papi_service_t handle, char *printer,
361 					papi_attribute_t **job_attributes,
362 					papi_job_ticket_t *job_ticket,
363 					char **files, papi_job_t *job);
364 extern papi_status_t papiJobSubmitByReference(papi_service_t handle,
365 					char *printer,
366 					papi_attribute_t **job_attributes,
367 					papi_job_ticket_t *job_ticket,
368 					char **files, papi_job_t *job);
369 extern papi_status_t papiJobValidate(papi_service_t handle, char *printer,
370 					papi_attribute_t **job_attributes,
371 					papi_job_ticket_t *job_ticket,
372 					char **files, papi_job_t *job);
373 extern papi_status_t papiJobStreamOpen(papi_service_t handle,
374 					char *printer,
375 					papi_attribute_t **job_attributes,
376 					papi_job_ticket_t *job_ticket,
377 					papi_stream_t *stream);
378 extern papi_status_t papiJobStreamWrite(papi_service_t handle,
379 					papi_stream_t stream,
380 					void *buffer, size_t buflen);
381 extern papi_status_t papiJobStreamClose(papi_service_t handle,
382 					papi_stream_t stream,
383 					papi_job_t *job);
384 extern papi_status_t papiJobQuery(papi_service_t handle, char *printer,
385 					int32_t job_id, char **requested_attrs,
386 					papi_job_t *job);
387 extern papi_status_t papiJobModify(papi_service_t handle, char *printer,
388 					int32_t job_id,
389 					papi_attribute_t **attributes,
390 					papi_job_t *job);
391 extern papi_status_t papiJobMove(papi_service_t handle, char *printer,
392 					int32_t job_id, char *destination);
393 extern papi_status_t papiJobCancel(papi_service_t handle, char *printer,
394 					int32_t job_id);
395 extern papi_status_t papiJobHold(papi_service_t handle, char *printer,
396 					int32_t job_id);
397 extern papi_status_t papiJobRelease(papi_service_t handle, char *printer,
398 					int32_t job_id);
399 extern papi_status_t papiJobRestart(papi_service_t handle, char *printer,
400 					int32_t job_id);
401 extern papi_status_t papiJobPromote(papi_service_t handle, char *printer,
402 					int32_t job_id);
403 extern papi_attribute_t **papiJobGetAttributeList(papi_job_t printer);
404 extern char *papiJobGetPrinterName(papi_job_t printer);
405 extern int32_t papiJobGetId(papi_job_t printer);
406 extern papi_job_ticket_t *papiJobGetJobTicket(papi_job_t printer);
407 extern void papiJobFree(papi_job_t job);
408 extern void papiJobListFree(papi_job_t *jobs);
409 
410 #ifdef SOLARIS_PRIVATE_POST_0_9
411 /*
412  * These have been added to support IPP create-job/send-document with PAPI v0.9
413  * in an IPP listener using PAPI as it's spooler interface.  A future version
414  * of the API is expected to support this type of functionality
415  */
416 extern papi_status_t papiJobCreate(papi_service_t handle, char *printer,
417 					papi_attribute_t **job_attributes,
418 					papi_job_ticket_t *job_ticket,
419 					papi_job_t *job);
420 extern papi_status_t papiJobStreamAdd(papi_service_t handle, char *printer,
421 					int32_t id, papi_stream_t *stream);
422 extern papi_status_t papiJobCommit(papi_service_t handle, char *printer,
423 					int32_t id);
424 extern papi_status_t papiServiceSetPeer(papi_service_t handle, int peerfd);
425 #endif /* SOLARIS_PRIVATE_POST_0_9 */
426 
427 extern char *papiStatusString(papi_status_t status);
428 
429 /*
430  * Internal functions that aren't in the API, but are shared across
431  * protocol support implementations(psms) and the tightly bound
432  * listener library.  Do not use these in your applications.
433  */
434 extern void list_append();
435 extern void list_concatenate();
436 extern void list_remove();
437 extern void copy_attributes(papi_attribute_t ***result,
438 				papi_attribute_t **list);
439 extern void split_and_copy_attributes(char **list,
440 				papi_attribute_t **attributes,
441 				papi_attribute_t ***in,
442 				papi_attribute_t ***out);
443 
444 extern papi_attribute_t **getprinterbyname(char *name, char *ns);
445 
446 extern int is_localhost(char *hostname);
447 
448 #ifdef __cplusplus
449 }
450 #endif
451 
452 #endif /* _PAPI_H */
453