/* * Private IPP definitions for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 1997-2006 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ #ifndef _CUPS_IPP_PRIVATE_H_ # define _CUPS_IPP_PRIVATE_H_ /* * Include necessary headers... */ # include /* * C++ magic... */ # ifdef __cplusplus extern "C" { # endif /* __cplusplus */ /* * Constants... */ # define IPP_BUF_SIZE (IPP_MAX_LENGTH + 2) /* Size of buffer */ /* * Structures... */ typedef union _ipp_request_u /**** Request Header ****/ { struct /* Any Header */ { ipp_uchar_t version[2]; /* Protocol version number */ int op_status; /* Operation ID or status code*/ int request_id; /* Request ID */ } any; struct /* Operation Header */ { ipp_uchar_t version[2]; /* Protocol version number */ ipp_op_t operation_id; /* Operation ID */ int request_id; /* Request ID */ } op; struct /* Status Header */ { ipp_uchar_t version[2]; /* Protocol version number */ ipp_status_t status_code; /* Status code */ int request_id; /* Request ID */ } status; /**** New in CUPS 1.1.19 ****/ struct /* Event Header @since CUPS 1.1.19/macOS 10.3@ */ { ipp_uchar_t version[2]; /* Protocol version number */ ipp_status_t status_code; /* Status code */ int request_id; /* Request ID */ } event; } _ipp_request_t; typedef union _ipp_value_u /**** Attribute Value ****/ { int integer; /* Integer/enumerated value */ char boolean; /* Boolean value */ ipp_uchar_t date[11]; /* Date/time value */ struct { int xres, /* Horizontal resolution */ yres; /* Vertical resolution */ ipp_res_t units; /* Resolution units */ } resolution; /* Resolution value */ struct { int lower, /* Lower value */ upper; /* Upper value */ } range; /* Range of integers value */ struct { char *language; /* Language code */ char *text; /* String */ } string; /* String with language value */ struct { int length; /* Length of attribute */ void *data; /* Data in attribute */ } unknown; /* Unknown attribute type */ /**** New in CUPS 1.1.19 ****/ ipp_t *collection; /* Collection value @since CUPS 1.1.19/macOS 10.3@ */ } _ipp_value_t; struct _ipp_attribute_s /**** IPP attribute ****/ { ipp_attribute_t *next; /* Next attribute in list */ ipp_tag_t group_tag, /* Job/Printer/Operation group tag */ value_tag; /* What type of value is it? */ char *name; /* Name of attribute */ int num_values; /* Number of values */ _ipp_value_t values[1]; /* Values */ }; struct _ipp_s /**** IPP Request/Response/Notification ****/ { ipp_state_t state; /* State of request */ _ipp_request_t request; /* Request header */ ipp_attribute_t *attrs; /* Attributes */ ipp_attribute_t *last; /* Last attribute in list */ ipp_attribute_t *current; /* Current attribute (for read/write) */ ipp_tag_t curtag; /* Current attribute group tag */ /**** New in CUPS 1.2 ****/ ipp_attribute_t *prev; /* Previous attribute (for read) @since CUPS 1.2/macOS 10.5@ */ /**** New in CUPS 1.4.4 ****/ int use; /* Use count @since CUPS 1.4.4/macOS 10.6.?@ */ /**** New in CUPS 2.0 ****/ int atend, /* At end of list? */ curindex; /* Current attribute index for hierarchical search */ }; typedef struct _ipp_option_s /**** Attribute mapping data ****/ { int multivalue; /* Option has multiple values? */ const char *name; /* Option/attribute name */ ipp_tag_t value_tag; /* Value tag for this attribute */ ipp_tag_t group_tag; /* Group tag for this attribute */ ipp_tag_t alt_group_tag; /* Alternate group tag for this * attribute */ const ipp_op_t *operations; /* Allowed operations for this attr */ } _ipp_option_t; typedef struct _ipp_file_s _ipp_file_t;/**** File Parser ****/ typedef struct _ipp_vars_s _ipp_vars_t;/**** Variables ****/ typedef int (*_ipp_fattr_cb_t)(_ipp_file_t *f, void *user_data, const char *attr); /**** File Attribute (Filter) Callback ****/ typedef int (*_ipp_ferror_cb_t)(_ipp_file_t *f, void *user_data, const char *error); /**** File Parser Error Callback ****/ typedef int (*_ipp_ftoken_cb_t)(_ipp_file_t *f, _ipp_vars_t *v, void *user_data, const char *token); /**** File Parser Token Callback ****/ struct _ipp_vars_s /**** Variables ****/ { char *uri, /* URI for printer */ scheme[64], /* Scheme from URI */ username[256], /* Username from URI */ *password, /* Password from URI (if any) */ host[256], /* Hostname from URI */ portstr[32], /* Port number string */ resource[1024]; /* Resource path from URI */ int port; /* Port number from URI */ int num_vars; /* Number of variables */ cups_option_t *vars; /* Array of variables */ int password_tries; /* Number of retries for password */ _ipp_fattr_cb_t attrcb; /* Attribute (filter) callback */ _ipp_ferror_cb_t errorcb; /* Error callback */ _ipp_ftoken_cb_t tokencb; /* Token callback */ }; struct _ipp_file_s /**** File Parser */ { const char *filename; /* Filename */ cups_file_t *fp; /* File pointer */ int linenum; /* Current line number */ ipp_t *attrs; /* Attributes */ ipp_tag_t group_tag; /* Current group for new attributes */ }; /* * Prototypes for private functions... */ /* encode.c */ #ifdef DEBUG extern const char *_ippCheckOptions(void) _CUPS_PRIVATE; #endif /* DEBUG */ extern _ipp_option_t *_ippFindOption(const char *name) _CUPS_PRIVATE; /* ipp-file.c */ extern ipp_t *_ippFileParse(_ipp_vars_t *v, const char *filename, void *user_data) _CUPS_PRIVATE; extern int _ippFileReadToken(_ipp_file_t *f, char *token, size_t tokensize) _CUPS_PRIVATE; /* ipp-vars.c */ extern void _ippVarsDeinit(_ipp_vars_t *v) _CUPS_PRIVATE; extern void _ippVarsExpand(_ipp_vars_t *v, char *dst, const char *src, size_t dstsize) _CUPS_NONNULL(1,2,3) _CUPS_PRIVATE; extern const char *_ippVarsGet(_ipp_vars_t *v, const char *name) _CUPS_PRIVATE; extern void _ippVarsInit(_ipp_vars_t *v, _ipp_fattr_cb_t attrcb, _ipp_ferror_cb_t errorcb, _ipp_ftoken_cb_t tokencb) _CUPS_PRIVATE; extern const char *_ippVarsPasswordCB(const char *prompt, http_t *http, const char *method, const char *resource, void *user_data) _CUPS_PRIVATE; extern int _ippVarsSet(_ipp_vars_t *v, const char *name, const char *value) _CUPS_PRIVATE; /* * C++ magic... */ # ifdef __cplusplus } # endif /* __cplusplus */ #endif /* !_CUPS_IPP_H_ */