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 */