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