From 4f05fa3b03c76794014f5c3b2459a1b655db1bf7 Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Mon, 11 Sep 2023 19:09:39 -0400 Subject: [PATCH] New IPP and raster APIs, plus cleanup. --- backend/dnssd.c | 6 +- backend/ipp.c | 28 +- backend/runloop.c | 4 +- backend/usb-darwin.c | 2 +- berkeley/lpc.c | 6 +- berkeley/lpq.c | 20 +- berkeley/lpr.c | 2 +- berkeley/lprm.c | 4 +- cgi-bin/admin.c | 86 +- cgi-bin/classes.c | 28 +- cgi-bin/help.c | 4 +- cgi-bin/ipp-var.c | 32 +- cgi-bin/jobs.c | 22 +- cgi-bin/printers.c | 32 +- cgi-bin/template.c | 4 +- cups/Makefile | 29 +- cups/auth.c | 6 +- cups/dnssd.c | 16 +- cups/dnssd.h | 6 +- cups/http-private.h | 2 +- cups/http-support.c | 26 +- cups/ipp-file.c | 2079 +++++++--- cups/ipp-private.h | 246 +- cups/ipp-support.c | 1290 +++--- cups/ipp-vars.c | 262 -- cups/ipp.c | 5320 +++++++++++-------------- cups/ipp.h | 1404 +++---- cups/raster-error.c | 6 +- cups/raster-stream.c | 1089 +++--- cups/raster-stubs.c | 36 +- cups/raster-testpage.h | 1706 ++++++++ cups/raster.h | 575 ++- cups/testdnssd.c | 6 +- cups/testipp.c | 830 ++-- cups/testtestpage.c | 647 ++++ cups/tls-openssl.c | 16 +- notifier/mailto.c | 8 +- notifier/rss.c | 8 +- notifier/testnotify.c | 8 +- scheduler/auth.c | 14 +- scheduler/classes.c | 12 +- scheduler/client.c | 24 +- scheduler/conf.c | 126 +- scheduler/cups-deviced.c | 2 +- scheduler/cups-driverd.cxx | 24 +- scheduler/cups-lpd.c | 6 +- scheduler/cupsfilter.c | 4 +- scheduler/dirsvc.c | 8 +- scheduler/ipp.c | 774 ++-- scheduler/job.c | 274 +- scheduler/log.c | 10 +- scheduler/main.c | 10 +- scheduler/policy.c | 18 +- scheduler/printers.c | 64 +- scheduler/printers.h | 2 +- scheduler/process.c | 23 +- scheduler/quotas.c | 2 +- scheduler/select.c | 2 +- scheduler/subscriptions.c | 36 +- scheduler/testspeed.c | 20 +- scheduler/testsub.c | 17 +- systemv/cancel.c | 32 +- systemv/cupsaccept.c | 18 +- systemv/lp.c | 10 +- systemv/lpinfo.c | 6 +- systemv/lpmove.c | 4 +- systemv/lpstat.c | 47 +- tools/ippeveprinter.c | 5377 +++++++++----------------- tools/ippfind.c | 22 +- tools/ipptool.c | 5170 +++++++++++++++---------- xcode/CUPS.xcodeproj/project.pbxproj | 64 +- 71 files changed, 14889 insertions(+), 13234 deletions(-) delete mode 100644 cups/ipp-vars.c create mode 100644 cups/raster-testpage.h create mode 100644 cups/testtestpage.c diff --git a/backend/dnssd.c b/backend/dnssd.c index cc6775c38a..fb978abcf3 100644 --- a/backend/dnssd.c +++ b/backend/dnssd.c @@ -547,7 +547,7 @@ browse_callback( fprintf(stderr, "DEBUG2: browse_callback(sdRef=%p, flags=%x, " "interfaceIndex=%u, errorCode=%d, serviceName=\"%s\", " "regtype=\"%s\", replyDomain=\"%s\", context=%p)\n", - sdRef, flags, interfaceIndex, errorCode, + (void *)sdRef, flags, interfaceIndex, errorCode, serviceName, regtype, replyDomain, context); /* @@ -586,7 +586,7 @@ browse_local_callback( fprintf(stderr, "DEBUG2: browse_local_callback(sdRef=%p, flags=%x, " "interfaceIndex=%u, errorCode=%d, serviceName=\"%s\", " "regtype=\"%s\", replyDomain=\"%s\", context=%p)\n", - sdRef, flags, interfaceIndex, errorCode, + (void *)sdRef, flags, interfaceIndex, errorCode, serviceName, regtype, replyDomain, context); /* @@ -1005,7 +1005,7 @@ query_callback( "interfaceIndex=%u, errorCode=%d, fullName=\"%s\", " "rrtype=%u, rrclass=%u, rdlen=%u, rdata=%p, ttl=%u, " "context=%p)\n", - sdRef, flags, interfaceIndex, errorCode, fullName, rrtype, rrclass, rdlen, rdata, ttl, context); + (void *)sdRef, flags, interfaceIndex, errorCode, fullName, rrtype, rrclass, rdlen, rdata, ttl, context); /* * Only process "add" data... diff --git a/backend/ipp.c b/backend/ipp.c index 5a624b3ca6..f26fe20516 100644 --- a/backend/ipp.c +++ b/backend/ipp.c @@ -145,7 +145,7 @@ static char mandatory_attrs[1024] = ""; * Local functions... */ -static void adjust_options(int num_options, cups_option_t *options); +static int adjust_options(int num_options, cups_option_t **options); static void cancel_job(http_t *http, const char *uri, int id, const char *resource, const char *user, int version); @@ -2288,9 +2288,9 @@ main(int argc, /* I - Number of command-line args */ * Support for each PPD x IPP option pair is added adhoc, based on demand. */ -static void +static int /* O - New number of options */ adjust_options(int num_options, /* I - Number of options */ - cups_option_t *options) /* I - Array of job options */ + cups_option_t **options) /* I - Array of job options */ { const char *ppd_option_value = NULL; /* PPD option value */ const char *ipp_attr_value = NULL; /* IPP attribute value */ @@ -2301,33 +2301,35 @@ adjust_options(int num_options, /* I - Number of options */ if (options == NULL || num_options < 2) { fprintf(stderr, "DEBUG: adjust_options(): Invalid values.\n"); - return; + return (num_options); } /* * PPD option ColorModel and IPP attribute print-color-mode */ - ppd_option_value = cupsGetOption("ColorModel", num_options, options); - ipp_attr_value = cupsGetOption("print-color-mode", num_options, options); + ppd_option_value = cupsGetOption("ColorModel", num_options, *options); + ipp_attr_value = cupsGetOption("print-color-mode", num_options, *options); if (!ppd_option_value || !ipp_attr_value) - return; + return (num_options); if (strcmp(ipp_attr_value, "monochrome") && (!strcmp(ppd_option_value, "Gray") || !strcmp(ppd_option_value, "FastGray") || !strcmp(ppd_option_value, "DeviceGray"))) { fprintf(stderr, "DEBUG: adjust_options(): Adjusting print-color-mode to monochrome.\n"); - num_options = cupsAddOption("print-color-mode", "monochrome", num_options, &options); + num_options = cupsAddOption("print-color-mode", "monochrome", num_options, options); } else if (strcmp(ipp_attr_value, "color") && (!strcmp(ppd_option_value, "CMY") || !strcmp(ppd_option_value, "CMYK") || !strcmp(ppd_option_value, "RGB"))) { fprintf(stderr, "DEBUG: adjust_options(): Adjusting print-color-mode to color.\n"); - num_options = cupsAddOption("print-color-mode", "color", num_options, &options); + num_options = cupsAddOption("print-color-mode", "color", num_options, options); } + + return (num_options); } @@ -2797,6 +2799,8 @@ new_request( const char *keyword; /* PWG keyword */ + (void)compression; // TODO: Add compression support??? + /* * Create the IPP request... */ @@ -2942,7 +2946,7 @@ new_request( */ fputs("DEBUG: Adding all operation/job attributes.\n", stderr); - adjust_options(num_options, options); + num_options = adjust_options(num_options, &options); cupsEncodeOptions2(request, num_options, options, IPP_TAG_OPERATION); cupsEncodeOptions2(request, num_options, options, IPP_TAG_JOB); } @@ -2974,8 +2978,8 @@ password_cb(const char *prompt, /* I - Prompt (not used) */ fprintf(stderr, "DEBUG: password_cb(prompt=\"%s\", http=%p, method=\"%s\", " "resource=\"%s\", password_tries=%p(%d)), password=%p\n", - prompt, http, method, resource, password_tries, *password_tries, - password); + prompt, (void *)http, method, resource, (void *)password_tries, *password_tries, + (void *)password); (void)prompt; (void)method; diff --git a/backend/runloop.c b/backend/runloop.c index 770b886abd..4759663ebd 100644 --- a/backend/runloop.c +++ b/backend/runloop.c @@ -155,7 +155,7 @@ backendRunLoop( fprintf(stderr, "DEBUG: backendRunLoop(print_fd=%d, device_fd=%d, snmp_fd=%d, " "addr=%p, use_bc=%d, side_cb=%p)\n", - print_fd, device_fd, snmp_fd, addr, use_bc, side_cb); + print_fd, device_fd, snmp_fd, (void *)addr, use_bc, (void *)side_cb); /* * If we are printing data from a print driver on stdin, ignore SIGTERM @@ -420,7 +420,7 @@ backendWaitLoop( fprintf(stderr, "DEBUG: backendWaitLoop(snmp_fd=%d, addr=%p, side_cb=%p)\n", - snmp_fd, addr, side_cb); + snmp_fd, (void *)addr, (void *)side_cb); /* * Now loop until we receive data from stdin... diff --git a/backend/usb-darwin.c b/backend/usb-darwin.c index 8fcde45c74..b2eb40a5fd 100644 --- a/backend/usb-darwin.c +++ b/backend/usb-darwin.c @@ -316,7 +316,7 @@ static CFStringRef deviceIDCopySerialNumber(CFStringRef deviceID); * 'list_devices()' - List all USB devices. */ -void list_devices() +void list_devices(void) { iterate_printers(list_device_cb, NULL); } diff --git a/berkeley/lpc.c b/berkeley/lpc.c index 7af10354fc..d19eb5a392 100644 --- a/berkeley/lpc.c +++ b/berkeley/lpc.c @@ -266,7 +266,7 @@ show_status(http_t *http, /* I - HTTP connection to server */ * attributes-natural-language */ - request = ippNewRequest(CUPS_GET_PRINTERS); + request = ippNewRequest(IPP_OP_CUPS_GET_PRINTERS); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(requested) / sizeof(requested[0]), @@ -301,7 +301,7 @@ show_status(http_t *http, /* I - HTTP connection to server */ printer = NULL; device = "file:/dev/null"; - pstate = IPP_PRINTER_IDLE; + pstate = IPP_PSTATE_IDLE; jobcount = 0; accepting = 1; @@ -430,7 +430,7 @@ show_status(http_t *http, /* I - HTTP connection to server */ else _cupsLangPuts(stdout, _("\tqueuing is disabled")); - if (pstate != IPP_PRINTER_STOPPED) + if (pstate != IPP_PSTATE_STOPPED) _cupsLangPuts(stdout, _("\tprinting is enabled")); else _cupsLangPuts(stdout, _("\tprinting is disabled")); diff --git a/berkeley/lpq.c b/berkeley/lpq.c index 4f4a0ca5cc..551dbd849c 100644 --- a/berkeley/lpq.c +++ b/berkeley/lpq.c @@ -362,7 +362,7 @@ show_jobs(const char *command, /* I - Command name */ * requesting-user-name */ - request = ippNewRequest(id ? IPP_GET_JOB_ATTRIBUTES : IPP_GET_JOBS); + request = ippNewRequest(id ? IPP_OP_GET_JOB_ATTRIBUTES : IPP_OP_GET_JOBS); if (id) { @@ -404,7 +404,7 @@ show_jobs(const char *command, /* I - Command name */ if ((response = cupsDoRequest(http, request, "/")) != NULL) { - if (response->request.status.status_code > IPP_OK_CONFLICT) + if (response->request.status.status_code > IPP_STATUS_OK_CONFLICTING) { _cupsLangPrintf(stderr, "%s: %s", command, cupsGetErrorString()); ippDelete(response); @@ -435,7 +435,7 @@ show_jobs(const char *command, /* I - Command name */ jobid = 0; jobsize = 0; - jobstate = IPP_JOB_PENDING; + jobstate = IPP_JSTATE_PENDING; jobname = "unknown"; jobuser = "unknown"; jobdest = NULL; @@ -498,7 +498,7 @@ show_jobs(const char *command, /* I - Command name */ * Display the job... */ - if (jobstate == IPP_JOB_PROCESSING) + if (jobstate == IPP_JSTATE_PROCESSING) cupsCopyString(rankstr, "active", sizeof(rankstr)); else { @@ -582,7 +582,7 @@ show_printer(const char *command, /* I - Command name */ * printer-uri */ - request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", dest); @@ -595,7 +595,7 @@ show_printer(const char *command, /* I - Command name */ if ((response = cupsDoRequest(http, request, "/")) != NULL) { - if (response->request.status.status_code > IPP_OK_CONFLICT) + if (response->request.status.status_code > IPP_STATUS_OK_CONFLICTING) { _cupsLangPrintf(stderr, "%s: %s", command, cupsGetErrorString()); ippDelete(response); @@ -605,18 +605,18 @@ show_printer(const char *command, /* I - Command name */ if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL) state = (ipp_pstate_t)attr->values[0].integer; else - state = IPP_PRINTER_STOPPED; + state = IPP_PSTATE_STOPPED; switch (state) { - case IPP_PRINTER_IDLE : + case IPP_PSTATE_IDLE : _cupsLangPrintf(stdout, _("%s is ready"), dest); break; - case IPP_PRINTER_PROCESSING : + case IPP_PSTATE_PROCESSING : _cupsLangPrintf(stdout, _("%s is ready and printing"), dest); break; - case IPP_PRINTER_STOPPED : + case IPP_PSTATE_STOPPED : _cupsLangPrintf(stdout, _("%s is not ready"), dest); break; } diff --git a/berkeley/lpr.c b/berkeley/lpr.c index 3ba0cb3b55..5036e574b4 100644 --- a/berkeley/lpr.c +++ b/berkeley/lpr.c @@ -404,7 +404,7 @@ main(int argc, /* I - Number of command-line arguments */ return (1); } - if (cupsFinishDocument(CUPS_HTTP_DEFAULT, printer) != IPP_OK) + if (cupsFinishDocument(CUPS_HTTP_DEFAULT, printer) != IPP_STATUS_OK) { _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsGetErrorString()); cupsCancelJob2(CUPS_HTTP_DEFAULT, printer, job_id, 0); diff --git a/berkeley/lprm.c b/berkeley/lprm.c index ceb943c8d1..eec125b620 100644 --- a/berkeley/lprm.c +++ b/berkeley/lprm.c @@ -185,7 +185,7 @@ main(int argc, /* I - Number of command-line arguments */ goto error; } - if (cupsCancelJob2(CUPS_HTTP_DEFAULT, name, job_id, 0) != IPP_OK) + if (cupsCancelJob2(CUPS_HTTP_DEFAULT, name, job_id, 0) != IPP_STATUS_OK) { _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsGetErrorString()); goto error; @@ -200,7 +200,7 @@ main(int argc, /* I - Number of command-line arguments */ * (or default) printer... */ - if (!did_cancel && cupsCancelJob2(CUPS_HTTP_DEFAULT, name, 0, 0) != IPP_OK) + if (!did_cancel && cupsCancelJob2(CUPS_HTTP_DEFAULT, name, 0, 0) != IPP_STATUS_OK) { _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsGetErrorString()); goto error; diff --git a/cgi-bin/admin.c b/cgi-bin/admin.c index 8c525638da..34c2d46bed 100644 --- a/cgi-bin/admin.c +++ b/cgi-bin/admin.c @@ -347,7 +347,7 @@ do_am_class(http_t *http, /* I - HTTP connection */ * attributes-natural-language */ - request = ippNewRequest(CUPS_GET_PRINTERS); + request = ippNewRequest(IPP_OP_CUPS_GET_PRINTERS); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type", CUPS_PRINTER_LOCAL); @@ -421,7 +421,7 @@ do_am_class(http_t *http, /* I - HTTP connection */ * printer-uri */ - request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/classes/%s", name); @@ -536,7 +536,7 @@ do_am_class(http_t *http, /* I - HTTP connection */ * member-uris */ - request = ippNewRequest(CUPS_ADD_CLASS); + request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_CLASS); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/classes/%s", name); @@ -552,7 +552,7 @@ do_am_class(http_t *http, /* I - HTTP connection */ ippAddBoolean(request, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1); ippAddInteger(request, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", - IPP_PRINTER_IDLE); + IPP_PSTATE_IDLE); if ((num_printers = cgiGetSize("MEMBER_URIS")) > 0) { @@ -568,12 +568,12 @@ do_am_class(http_t *http, /* I - HTTP connection */ ippDelete(cupsDoRequest(http, request, "/admin/")); - if (cupsGetError() == IPP_NOT_AUTHORIZED) + if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } - else if (cupsGetError() > IPP_OK_CONFLICT) + else if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) { cgiStartHTML(title); cgiShowIPPError(modify ? _("Unable to modify class") : @@ -660,7 +660,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */ * printer-uri */ - request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", @@ -799,7 +799,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */ current_device = 0; if (cupsGetDevices(http, 5, CUPS_INCLUDE_ALL, CUPS_EXCLUDE_NONE, (cups_device_cb_t)choose_device_cb, - (void *)title) == IPP_OK) + (void *)title) == IPP_STATUS_OK) { fputs("DEBUG: Got device list!\n", stderr); @@ -819,7 +819,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */ fprintf(stderr, "ERROR: CUPS-Get-Devices request failed with status %x: %s\n", cupsGetError(), cupsGetErrorString()); - if (cupsGetError() == IPP_NOT_AUTHORIZED) + if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); @@ -1010,7 +1010,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */ * printer-uri */ - request = ippNewRequest(CUPS_GET_PPDS); + request = ippNewRequest(IPP_OP_CUPS_GET_PPDS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, "ipp://localhost/printers/"); @@ -1051,7 +1051,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */ ippDelete(response); - request = ippNewRequest(CUPS_GET_PPDS); + request = ippNewRequest(IPP_OP_CUPS_GET_PPDS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, "ipp://localhost/printers/"); @@ -1115,7 +1115,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */ * printer-state */ - request = ippNewRequest(CUPS_ADD_PRINTER); + request = ippNewRequest(IPP_OP_CUPS_ADD_MODIFY_PRINTER); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", @@ -1171,7 +1171,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */ var && (!strcmp(var, "1") || !strcmp(var, "on"))); ippAddInteger(request, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", - IPP_PRINTER_IDLE); + IPP_PSTATE_IDLE); /* * Do the request and get back a response... @@ -1187,12 +1187,12 @@ do_am_printer(http_t *http, /* I - HTTP connection */ else ippDelete(cupsDoRequest(http, request, "/admin/")); - if (cupsGetError() == IPP_NOT_AUTHORIZED) + if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } - else if (cupsGetError() > IPP_OK_CONFLICT) + else if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) { cgiStartHTML(title); cgiShowIPPError(modify ? _("Unable to modify printer") : @@ -1484,7 +1484,7 @@ do_config_server(http_t *http) /* I - HTTP connection */ if (!cupsAdminSetServerSettings(http, num_newsettings, newsettings)) { - if (cupsGetError() == IPP_NOT_AUTHORIZED) + if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); @@ -1816,7 +1816,7 @@ do_delete_class(http_t *http) /* I - HTTP connection */ * printer-uri */ - request = ippNewRequest(CUPS_DELETE_CLASS); + request = ippNewRequest(IPP_OP_CUPS_DELETE_CLASS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); @@ -1831,12 +1831,12 @@ do_delete_class(http_t *http) /* I - HTTP connection */ * Show the results... */ - if (cupsGetError() == IPP_NOT_AUTHORIZED) + if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } - else if (cupsGetError() <= IPP_OK_CONFLICT) + else if (cupsGetError() <= IPP_STATUS_OK_CONFLICTING) { /* * Redirect successful updates back to the classes page... @@ -1847,7 +1847,7 @@ do_delete_class(http_t *http) /* I - HTTP connection */ cgiStartHTML(cgiText(_("Delete Class"))); - if (cupsGetError() > IPP_OK_CONFLICT) + if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) cgiShowIPPError(_("Unable to delete class")); else cgiCopyTemplateLang("class-deleted.tmpl"); @@ -1901,7 +1901,7 @@ do_delete_printer(http_t *http) /* I - HTTP connection */ * printer-uri */ - request = ippNewRequest(CUPS_DELETE_PRINTER); + request = ippNewRequest(IPP_OP_CUPS_DELETE_PRINTER); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); @@ -1916,12 +1916,12 @@ do_delete_printer(http_t *http) /* I - HTTP connection */ * Show the results... */ - if (cupsGetError() == IPP_NOT_AUTHORIZED) + if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } - else if (cupsGetError() <= IPP_OK_CONFLICT) + else if (cupsGetError() <= IPP_STATUS_OK_CONFLICTING) { /* * Redirect successful updates back to the printers page... @@ -1932,7 +1932,7 @@ do_delete_printer(http_t *http) /* I - HTTP connection */ cgiStartHTML(cgiText(_("Delete Printer"))); - if (cupsGetError() > IPP_OK_CONFLICT) + if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) cgiShowIPPError(_("Unable to delete printer")); else cgiCopyTemplateLang("printer-deleted.tmpl"); @@ -1960,7 +1960,7 @@ do_list_printers(http_t *http) /* I - HTTP connection */ * Get the list of printers and their devices... */ - request = ippNewRequest(CUPS_GET_PRINTERS); + request = ippNewRequest(IPP_OP_CUPS_GET_PRINTERS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", NULL, "device-uri"); @@ -2000,7 +2000,7 @@ do_list_printers(http_t *http) /* I - HTTP connection */ ippDelete(response); - request = ippNewRequest(CUPS_GET_DEVICES); + request = ippNewRequest(IPP_OP_CUPS_GET_DEVICES); if ((response = cupsDoRequest(http, request, "/")) != NULL) { @@ -2316,7 +2316,7 @@ do_set_allowed_users(http_t *http) /* I - HTTP connection */ * requested-attributes */ - request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, is_class ? "/classes/%s" : "/printers/%s", @@ -2341,12 +2341,12 @@ do_set_allowed_users(http_t *http) /* I - HTTP connection */ cgiStartHTML(cgiText(_("Set Allowed Users"))); - if (cupsGetError() == IPP_NOT_AUTHORIZED) + if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } - else if (cupsGetError() > IPP_OK_CONFLICT) + else if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) cgiShowIPPError(_("Unable to get printer attributes")); else cgiCopyTemplateLang("users.tmpl"); @@ -2411,7 +2411,7 @@ do_set_allowed_users(http_t *http) /* I - HTTP connection */ * requesting-user-name-{allowed,denied} */ - request = ippNewRequest(is_class ? CUPS_ADD_CLASS : CUPS_ADD_PRINTER); + request = ippNewRequest(is_class ? IPP_OP_CUPS_ADD_MODIFY_CLASS : IPP_OP_CUPS_ADD_MODIFY_PRINTER); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, is_class ? "/classes/%s" : "/printers/%s", @@ -2489,12 +2489,12 @@ do_set_allowed_users(http_t *http) /* I - HTTP connection */ ippDelete(cupsDoRequest(http, request, "/admin/")); - if (cupsGetError() == IPP_NOT_AUTHORIZED) + if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } - else if (cupsGetError() > IPP_OK_CONFLICT) + else if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) { cgiStartHTML(cgiText(_("Set Allowed Users"))); cgiShowIPPError(_("Unable to change printer")); @@ -2562,7 +2562,7 @@ do_set_default(http_t *http) /* I - HTTP connection */ * printer-uri */ - request = ippNewRequest(CUPS_SET_DEFAULT); + request = ippNewRequest(IPP_OP_CUPS_SET_DEFAULT); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, is_class ? "/classes/%s" : "/printers/%s", @@ -2576,12 +2576,12 @@ do_set_default(http_t *http) /* I - HTTP connection */ ippDelete(cupsDoRequest(http, request, "/admin/")); - if (cupsGetError() == IPP_NOT_AUTHORIZED) + if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } - else if (cupsGetError() > IPP_OK_CONFLICT) + else if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) { cgiStartHTML(title); cgiShowIPPError(_("Unable to set server default")); @@ -2764,7 +2764,7 @@ do_set_options(http_t *http, /* I - HTTP connection */ * Get the printer attributes... */ - request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", printer); @@ -3277,8 +3277,8 @@ do_set_options(http_t *http, /* I - HTTP connection */ * [ppd file] */ - request = ippNewRequest(is_class ? CUPS_ADD_MODIFY_CLASS : - CUPS_ADD_MODIFY_PRINTER); + request = ippNewRequest(is_class ? IPP_OP_CUPS_ADD_MODIFY_CLASS : + IPP_OP_CUPS_ADD_MODIFY_PRINTER); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); @@ -3309,12 +3309,12 @@ do_set_options(http_t *http, /* I - HTTP connection */ else ippDelete(cupsDoRequest(http, request, "/admin/")); - if (cupsGetError() == IPP_NOT_AUTHORIZED) + if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } - else if (cupsGetError() > IPP_OK_CONFLICT) + else if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) { cgiStartHTML(title); cgiShowIPPError(_("Unable to set options")); @@ -3387,7 +3387,7 @@ do_set_sharing(http_t *http) /* I - HTTP connection */ * printer-is-shared */ - request = ippNewRequest(is_class ? CUPS_ADD_CLASS : CUPS_ADD_PRINTER); + request = ippNewRequest(is_class ? IPP_OP_CUPS_ADD_MODIFY_CLASS : IPP_OP_CUPS_ADD_MODIFY_PRINTER); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, is_class ? "/classes/%s" : "/printers/%s", @@ -3408,12 +3408,12 @@ do_set_sharing(http_t *http) /* I - HTTP connection */ ippDelete(response); } - if (cupsGetError() == IPP_NOT_AUTHORIZED) + if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } - else if (cupsGetError() > IPP_OK_CONFLICT) + else if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) { cgiStartHTML(cgiText(_("Set Publishing"))); cgiShowIPPError(_("Unable to change printer-is-shared attribute")); diff --git a/cgi-bin/classes.c b/cgi-bin/classes.c index d8af6af9e6..07fb858afe 100644 --- a/cgi-bin/classes.c +++ b/cgi-bin/classes.c @@ -97,7 +97,7 @@ main(void) * Get the default destination... */ - request = ippNewRequest(CUPS_GET_DEFAULT); + request = ippNewRequest(IPP_OP_CUPS_GET_DEFAULT); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", @@ -148,13 +148,13 @@ main(void) printf("Location: %s\n\n", uri); } else if (!strcmp(op, "start-class")) - do_class_op(http, pclass, IPP_RESUME_PRINTER, cgiText(_("Resume Class"))); + do_class_op(http, pclass, IPP_OP_RESUME_PRINTER, cgiText(_("Resume Class"))); else if (!strcmp(op, "stop-class")) - do_class_op(http, pclass, IPP_PAUSE_PRINTER, cgiText(_("Pause Class"))); + do_class_op(http, pclass, IPP_OP_PAUSE_PRINTER, cgiText(_("Pause Class"))); else if (!strcmp(op, "accept-jobs")) - do_class_op(http, pclass, CUPS_ACCEPT_JOBS, cgiText(_("Accept Jobs"))); + do_class_op(http, pclass, IPP_OP_CUPS_ACCEPT_JOBS, cgiText(_("Accept Jobs"))); else if (!strcmp(op, "reject-jobs")) - do_class_op(http, pclass, CUPS_REJECT_JOBS, cgiText(_("Reject Jobs"))); + do_class_op(http, pclass, IPP_OP_CUPS_REJECT_JOBS, cgiText(_("Reject Jobs"))); else if (!strcmp(op, "cancel-jobs")) do_class_op(http, pclass, IPP_OP_CANCEL_JOBS, cgiText(_("Cancel Jobs"))); else if (!_cups_strcasecmp(op, "print-test-page")) @@ -235,12 +235,12 @@ do_class_op(http_t *http, /* I - HTTP connection */ snprintf(resource, sizeof(resource), "/classes/%s", printer); ippDelete(cupsDoRequest(http, request, resource)); - if (cupsGetError() == IPP_NOT_AUTHORIZED) + if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } - else if (cupsGetError() > IPP_OK_CONFLICT) + else if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) { cgiStartHTML(title); cgiShowIPPError(_("Unable to do maintenance command")); @@ -264,13 +264,13 @@ do_class_op(http_t *http, /* I - HTTP connection */ cgiSetVariable("IS_CLASS", "YES"); - if (op == IPP_PAUSE_PRINTER) + if (op == IPP_OP_PAUSE_PRINTER) cgiCopyTemplateLang("printer-stop.tmpl"); - else if (op == IPP_RESUME_PRINTER) + else if (op == IPP_OP_RESUME_PRINTER) cgiCopyTemplateLang("printer-start.tmpl"); - else if (op == CUPS_ACCEPT_JOBS) + else if (op == IPP_OP_CUPS_ACCEPT_JOBS) cgiCopyTemplateLang("printer-accept.tmpl"); - else if (op == CUPS_REJECT_JOBS) + else if (op == IPP_OP_CUPS_REJECT_JOBS) cgiCopyTemplateLang("printer-reject.tmpl"); else if (op == IPP_OP_CANCEL_JOBS) cgiCopyTemplateLang("printer-cancel-jobs.tmpl"); @@ -315,7 +315,7 @@ show_all_classes(http_t *http, /* I - Connection to server */ * requesting-user-name */ - request = ippNewRequest(CUPS_GET_CLASSES); + request = ippNewRequest(IPP_OP_CUPS_GET_CLASSES); if (user) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, @@ -454,7 +454,7 @@ show_class(http_t *http, /* I - Connection to server */ * printer-uri */ - request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/classes/%s", pclass); @@ -478,7 +478,7 @@ show_class(http_t *http, /* I - Connection to server */ if (pclass && (attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL && - attr->values[0].integer == IPP_PRINTER_PROCESSING) + attr->values[0].integer == IPP_PSTATE_PROCESSING) { /* * Class is processing - automatically refresh the page until we diff --git a/cgi-bin/help.c b/cgi-bin/help.c index faa1993d6f..efa1296c06 100644 --- a/cgi-bin/help.c +++ b/cgi-bin/help.c @@ -193,8 +193,8 @@ main(int argc, /* I - Number of command-line arguments */ fprintf(stderr, - "DEBUG: si=%p, si->sorted=%p, cupsArrayCount(si->sorted)=%d\n", si, - si->sorted, cupsArrayCount(si->sorted)); + "DEBUG: si=%p, si->sorted=%p, cupsArrayCount(si->sorted)=%d\n", (void *)si, + (void *)si->sorted, cupsArrayCount(si->sorted)); for (i = 0, n = (help_node_t *)cupsArrayFirst(si->sorted); n; diff --git a/cgi-bin/ipp-var.c b/cgi-bin/ipp-var.c index f6d88af4bd..ade70deac2 100644 --- a/cgi-bin/ipp-var.c +++ b/cgi-bin/ipp-var.c @@ -309,7 +309,7 @@ cgiMoveJobs(http_t *http, /* I - Connection to server */ char job_uri[1024]; /* Job URI */ - request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES); + request = ippNewRequest(IPP_OP_GET_JOB_ATTRIBUTES); snprintf(job_uri, sizeof(job_uri), "ipp://localhost/jobs/%d", job_id); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", @@ -351,7 +351,7 @@ cgiMoveJobs(http_t *http, /* I - Connection to server */ * Get the list of available destinations... */ - request = ippNewRequest(CUPS_GET_PRINTERS); + request = ippNewRequest(IPP_OP_CUPS_GET_PRINTERS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", NULL, "printer-uri-supported"); @@ -428,7 +428,7 @@ cgiMoveJobs(http_t *http, /* I - Connection to server */ const char *job_printer_name; /* New printer name */ - request = ippNewRequest(CUPS_MOVE_JOB); + request = ippNewRequest(IPP_OP_CUPS_MOVE_JOB); if (job_id) { @@ -472,7 +472,7 @@ cgiMoveJobs(http_t *http, /* I - Connection to server */ job_printer_name = strrchr(job_printer_uri, '/') + 1; - if (cupsGetError() <= IPP_OK_CONFLICT) + if (cupsGetError() <= IPP_STATUS_OK_CONFLICTING) { const char *path = strstr(job_printer_uri, "/printers/"); if (!path) @@ -494,7 +494,7 @@ cgiMoveJobs(http_t *http, /* I - Connection to server */ else cgiStartHTML(cgiText(_("Move All Jobs"))); - if (cupsGetError() > IPP_OK_CONFLICT) + if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) { if (job_id) cgiShowIPPError(_("Unable to move job")); @@ -592,7 +592,7 @@ cgiPrintCommand(http_t *http, /* I - Connection to server */ if (status == HTTP_STATUS_CONTINUE) cupsFinishDocument(http, dest); - if (cupsGetError() >= IPP_REDIRECTION_OTHER_SITE) + if (cupsGetError() >= IPP_STATUS_REDIRECTION_OTHER_SITE) { cgiSetVariable("MESSAGE", cgiText(_("Unable to send command to printer driver"))); cgiSetVariable("ERROR", cupsGetErrorString()); @@ -620,7 +620,7 @@ cgiPrintCommand(http_t *http, /* I - Connection to server */ */ snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); - request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES); + request = ippNewRequest(IPP_OP_GET_JOB_ATTRIBUTES); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); if (user) @@ -633,8 +633,8 @@ cgiPrintCommand(http_t *http, /* I - Connection to server */ cgiSetIPPVars(response, NULL, NULL, NULL, 0); attr = ippFindAttribute(response, "job-state", IPP_TAG_ENUM); - if (!attr || attr->values[0].integer >= IPP_JOB_STOPPED || - attr->values[0].integer == IPP_JOB_HELD) + if (!attr || attr->values[0].integer >= IPP_JSTATE_STOPPED || + attr->values[0].integer == IPP_JSTATE_HELD) { ippDelete(response); break; @@ -728,7 +728,7 @@ cgiPrintTestPage(http_t *http, /* I - Connection to server */ * requesting-user-name */ - request = ippNewRequest(IPP_PRINT_JOB); + request = ippNewRequest(IPP_OP_PRINT_JOB); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); @@ -752,7 +752,7 @@ cgiPrintTestPage(http_t *http, /* I - Connection to server */ ippDelete(response); } - if (cupsGetError() <= IPP_OK_CONFLICT) + if (cupsGetError() <= IPP_STATUS_OK_CONFLICTING) { /* * Automatically reload the printer status page... @@ -762,7 +762,7 @@ cgiPrintTestPage(http_t *http, /* I - Connection to server */ snprintf(refresh, sizeof(refresh), "2;URL=%s", uri); cgiSetVariable("refresh_page", refresh); } - else if (cupsGetError() == IPP_NOT_AUTHORIZED) + else if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); @@ -770,7 +770,7 @@ cgiPrintTestPage(http_t *http, /* I - Connection to server */ cgiStartHTML(cgiText(_("Print Test Page"))); - if (cupsGetError() > IPP_OK_CONFLICT) + if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) cgiShowIPPError(_("Unable to print test page")); else { @@ -937,7 +937,7 @@ cgiSetIPPObjectVars( fprintf(stderr, "DEBUG2: cgiSetIPPObjectVars(obj=%p, prefix=\"%s\", " "element=%d)\n", - obj, prefix ? prefix : "(null)", element); + (void *)obj, prefix ? prefix : "(null)", element); /* * Set common CGI template variables... @@ -1256,7 +1256,7 @@ cgiSetIPPVars(ipp_t *response, /* I - Response data to be copied... */ fprintf(stderr, "DEBUG2: cgiSetIPPVars(response=%p, filter_name=\"%s\", " "filter_value=\"%s\", prefix=\"%s\", parent_el=%d)\n", - response, filter_name ? filter_name : "(null)", + (void *)response, filter_name ? filter_name : "(null)", filter_value ? filter_value : "(null)", prefix ? prefix : "(null)", parent_el); @@ -1370,7 +1370,7 @@ cgiShowJobs(http_t *http, /* I - Connection to server */ * printer-uri */ - request = ippNewRequest(IPP_GET_JOBS); + request = ippNewRequest(IPP_OP_GET_JOBS); if (dest) { diff --git a/cgi-bin/jobs.c b/cgi-bin/jobs.c index 8ed7583bc5..bc0ef43579 100644 --- a/cgi-bin/jobs.c +++ b/cgi-bin/jobs.c @@ -73,15 +73,15 @@ main(void) */ if (!strcmp(op, "cancel-job")) - do_job_op(http, job_id, IPP_CANCEL_JOB); + do_job_op(http, job_id, IPP_OP_CANCEL_JOB); else if (!strcmp(op, "hold-job")) - do_job_op(http, job_id, IPP_HOLD_JOB); + do_job_op(http, job_id, IPP_OP_HOLD_JOB); else if (!strcmp(op, "move-job")) cgiMoveJobs(http, NULL, job_id); else if (!strcmp(op, "release-job")) - do_job_op(http, job_id, IPP_RELEASE_JOB); + do_job_op(http, job_id, IPP_OP_RELEASE_JOB); else if (!strcmp(op, "restart-job")) - do_job_op(http, job_id, IPP_RESTART_JOB); + do_job_op(http, job_id, IPP_OP_RESTART_JOB); else { /* @@ -161,7 +161,7 @@ do_job_op(http_t *http, /* I - HTTP connection */ ippDelete(cupsDoRequest(http, request, "/jobs")); - if (cupsGetError() <= IPP_OK_CONFLICT && getenv("HTTP_REFERER")) + if (cupsGetError() <= IPP_STATUS_OK_CONFLICTING && getenv("HTTP_REFERER")) { /* * Redirect successful updates back to the parent page... @@ -174,7 +174,7 @@ do_job_op(http_t *http, /* I - HTTP connection */ cgiFormEncode(url + 6, getenv("HTTP_REFERER"), sizeof(url) - 6); cgiSetVariable("refresh_page", url); } - else if (cupsGetError() == IPP_NOT_AUTHORIZED) + else if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); @@ -182,15 +182,15 @@ do_job_op(http_t *http, /* I - HTTP connection */ cgiStartHTML(cgiText(_("Jobs"))); - if (cupsGetError() > IPP_OK_CONFLICT) + if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) cgiShowIPPError(_("Job operation failed")); - else if (op == IPP_CANCEL_JOB) + else if (op == IPP_OP_CANCEL_JOB) cgiCopyTemplateLang("job-cancel.tmpl"); - else if (op == IPP_HOLD_JOB) + else if (op == IPP_OP_HOLD_JOB) cgiCopyTemplateLang("job-hold.tmpl"); - else if (op == IPP_RELEASE_JOB) + else if (op == IPP_OP_RELEASE_JOB) cgiCopyTemplateLang("job-release.tmpl"); - else if (op == IPP_RESTART_JOB) + else if (op == IPP_OP_RESTART_JOB) cgiCopyTemplateLang("job-restart.tmpl"); cgiEndHTML(); diff --git a/cgi-bin/printers.c b/cgi-bin/printers.c index 937f5e7848..21b1fbb197 100644 --- a/cgi-bin/printers.c +++ b/cgi-bin/printers.c @@ -98,7 +98,7 @@ main(void) * Get the default destination... */ - request = ippNewRequest(CUPS_GET_DEFAULT); + request = ippNewRequest(IPP_OP_CUPS_GET_DEFAULT); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", @@ -149,15 +149,15 @@ main(void) printf("Location: %s\n\n", uri); } else if (!strcmp(op, "start-printer")) - do_printer_op(http, printer, IPP_RESUME_PRINTER, + do_printer_op(http, printer, IPP_OP_RESUME_PRINTER, cgiText(_("Resume Printer"))); else if (!strcmp(op, "stop-printer")) - do_printer_op(http, printer, IPP_PAUSE_PRINTER, + do_printer_op(http, printer, IPP_OP_PAUSE_PRINTER, cgiText(_("Pause Printer"))); else if (!strcmp(op, "accept-jobs")) - do_printer_op(http, printer, CUPS_ACCEPT_JOBS, cgiText(_("Accept Jobs"))); + do_printer_op(http, printer, IPP_OP_CUPS_ACCEPT_JOBS, cgiText(_("Accept Jobs"))); else if (!strcmp(op, "reject-jobs")) - do_printer_op(http, printer, CUPS_REJECT_JOBS, cgiText(_("Reject Jobs"))); + do_printer_op(http, printer, IPP_OP_CUPS_REJECT_JOBS, cgiText(_("Reject Jobs"))); else if (!strcmp(op, "cancel-jobs")) do_printer_op(http, printer, IPP_OP_CANCEL_JOBS, cgiText(_("Cancel Jobs"))); else if (!_cups_strcasecmp(op, "print-self-test-page")) @@ -244,12 +244,12 @@ do_printer_op(http_t *http, /* I - HTTP connection */ snprintf(resource, sizeof(resource), "/printers/%s", printer); ippDelete(cupsDoRequest(http, request, resource)); - if (cupsGetError() == IPP_NOT_AUTHORIZED) + if (cupsGetError() == IPP_STATUS_ERROR_NOT_AUTHORIZED) { puts("Status: 401\n"); exit(0); } - else if (cupsGetError() > IPP_OK_CONFLICT) + else if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) { cgiStartHTML(title); cgiShowIPPError(_("Unable to do maintenance command")); @@ -271,13 +271,13 @@ do_printer_op(http_t *http, /* I - HTTP connection */ cgiStartHTML(title); - if (op == IPP_PAUSE_PRINTER) + if (op == IPP_OP_PAUSE_PRINTER) cgiCopyTemplateLang("printer-stop.tmpl"); - else if (op == IPP_RESUME_PRINTER) + else if (op == IPP_OP_RESUME_PRINTER) cgiCopyTemplateLang("printer-start.tmpl"); - else if (op == CUPS_ACCEPT_JOBS) + else if (op == IPP_OP_CUPS_ACCEPT_JOBS) cgiCopyTemplateLang("printer-accept.tmpl"); - else if (op == CUPS_REJECT_JOBS) + else if (op == IPP_OP_CUPS_REJECT_JOBS) cgiCopyTemplateLang("printer-reject.tmpl"); else if (op == IPP_OP_CANCEL_JOBS) cgiCopyTemplateLang("printer-cancel-jobs.tmpl"); @@ -308,7 +308,7 @@ show_all_printers(http_t *http, /* I - Connection to server */ fprintf(stderr, "DEBUG: show_all_printers(http=%p, user=\"%s\")\n", - http, user ? user : "(null)"); + (void *)http, user ? user : "(null)"); /* * Show the standard header... @@ -327,7 +327,7 @@ show_all_printers(http_t *http, /* I - Connection to server */ * requesting-user-name */ - request = ippNewRequest(CUPS_GET_PRINTERS); + request = ippNewRequest(IPP_OP_CUPS_GET_PRINTERS); ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type", 0); @@ -463,7 +463,7 @@ show_printer(http_t *http, /* I - Connection to server */ fprintf(stderr, "DEBUG: show_printer(http=%p, printer=\"%s\")\n", - http, printer ? printer : "(null)"); + (void *)http, printer ? printer : "(null)"); /* * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following @@ -474,7 +474,7 @@ show_printer(http_t *http, /* I - Connection to server */ * printer-uri */ - request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, "localhost", 0, "/printers/%s", printer); @@ -498,7 +498,7 @@ show_printer(http_t *http, /* I - Connection to server */ if (printer && (attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL && - attr->values[0].integer == IPP_PRINTER_PROCESSING) + attr->values[0].integer == IPP_PSTATE_PROCESSING) { /* * Printer is processing - automatically refresh the page until we diff --git a/cgi-bin/template.c b/cgi-bin/template.c index c60117cdd6..acd3f43140 100644 --- a/cgi-bin/template.c +++ b/cgi-bin/template.c @@ -33,7 +33,7 @@ cgiCopyTemplateFile(FILE *out, /* I - Output file */ { FILE *in; /* Input file */ - fprintf(stderr, "DEBUG2: cgiCopyTemplateFile(out=%p, tmpl=\"%s\")\n", out, + fprintf(stderr, "DEBUG2: cgiCopyTemplateFile(out=%p, tmpl=\"%s\")\n", (void *)out, tmpl ? tmpl : "(null)"); /* @@ -600,7 +600,7 @@ cgi_copy(FILE *out, /* I - Output file */ } fprintf(stderr, "DEBUG2: %*sFinished \"{%s%c%s\", out=%p...\n", indent, "", - name, op, compare, out); + name, op, compare, (void *)out); } else if (ch == '\\') /* Quoted char */ { diff --git a/cups/Makefile b/cups/Makefile index cd4d3f2a7a..658f62bf23 100644 --- a/cups/Makefile +++ b/cups/Makefile @@ -37,7 +37,6 @@ COREOBJS = \ http-support.o \ ipp.o \ ipp-file.o \ - ipp-vars.o \ ipp-support.o \ langprintf.o \ language.o \ @@ -46,6 +45,7 @@ COREOBJS = \ notify.o \ options.o \ pwg-media.o \ + rand.o \ raster-error.o \ raster-stream.o \ raster-stubs.o \ @@ -110,6 +110,7 @@ TESTOBJS = \ testpwg.o \ testraster.o \ testsnmp.o \ + testtestpage.o \ testthreads.o \ tlscheck.o OBJS = \ @@ -197,6 +198,7 @@ UNITTARGETS = \ testpwg \ testraster \ testsnmp \ + testtestpage \ testthreads \ tlscheck @@ -253,6 +255,8 @@ test: unittests ./testpwg test.ppd >>test.log echo Running raster API tests... ./testraster >>test.log + echo Running raster testpage API tests... + ./testtestpage >>test.log # echo Fuzzing IPP API... # ./fuzzipp >>test.log echo "Tests finished at $(date)..." >>test.log @@ -727,6 +731,16 @@ testsnmp: testsnmp.o $(LIBCUPSSTATIC) $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ +# +# testtestpage (dependency on static CUPS library is intentional) +# + +testtestpage: testtestpage.o $(LIBCUPSSTATIC) + echo Linking $@... + $(LD_CC) $(ALL_LDFLAGS) -o $@ testtestpage.o $(LINKCUPSSTATIC) + $(CODE_SIGN) -s "$(CODE_SIGN_IDENTITY)" $@ + + # # testthreads (dependency on static CUPS library is intentional) # @@ -754,15 +768,10 @@ tlscheck: tlscheck.o $(LIBCUPSSTATIC) apihelp: echo "Generating CUPS Programming Manual..." $(RM) cupspm.xml - codedoc --section "Programming" --body cupspm.md \ - cupspm.xml \ - array.[ch] auth.c cups.h dest*.c dir.[ch] encode.c file.[ch] \ - http.h http*.c ipp.h ipp*.c options.c pwg.[ch] \ - raster.h raster-stubs.c string.c tempfile.c thread.[ch] tls.c tls-openssl.c usersys.c util.c \ - --coverimage cupspm.png \ - --epub ../doc/help/cupspm.epub - codedoc --section "Programming" --body cupspm.md \ - cupspm.xml > ../doc/help/cupspm.html + codedoc --section "Programming" --body cupspm.md cupspm.xml \ + $(COREOBJS:.o=.c) $(COREHEADERS) tls-openssl.c \ + --coverimage cupspm.png --epub ../doc/help/cupspm.epub + codedoc --section "Programming" --body cupspm.md cupspm.xml > ../doc/help/cupspm.html $(RM) cupspm.xml echo "Generating Administration APIs help..." codedoc --section "Programming" --title "Administration APIs" \ diff --git a/cups/auth.c b/cups/auth.c index aa2838a39d..befd66d1fa 100644 --- a/cups/auth.c +++ b/cups/auth.c @@ -1,7 +1,7 @@ /* * Authentication functions for CUPS. * - * Copyright © 2021 by OpenPrinting. + * Copyright © 2021-2023 by OpenPrinting. * Copyright © 2007-2019 by Apple Inc. * Copyright © 1997-2007 by Easy Software Products. * @@ -312,9 +312,9 @@ cupsDoAuthentication( char nonce[HTTP_MAX_VALUE]; /* nonce="xyz" string */ cups_auth_param(schemedata, "algorithm", http->algorithm, sizeof(http->algorithm)); + cups_auth_param(schemedata, "nonce", nonce, sizeof(nonce)); cups_auth_param(schemedata, "opaque", http->opaque, sizeof(http->opaque)); cups_auth_param(schemedata, "qop", http->qop, sizeof(http->qop)); - cups_auth_param(schemedata, "nonce", nonce, sizeof(nonce)); cups_auth_param(schemedata, "realm", http->realm, sizeof(http->realm)); if (_httpSetDigestAuthString(http, nonce, method, resource)) @@ -830,7 +830,7 @@ cups_gss_getname( char buf[1024]; /* Name buffer */ - DEBUG_printf("7cups_gss_getname(http=%p, service_name=\"%s\")", http, service_name); + DEBUG_printf("7cups_gss_getname(http=%p, service_name=\"%s\")", (void *)http, service_name); /* * Get the hostname... diff --git a/cups/dnssd.c b/cups/dnssd.c index c8a50f7735..4daa4169e6 100644 --- a/cups/dnssd.c +++ b/cups/dnssd.c @@ -244,13 +244,13 @@ cupsDNSSDCopyHostName( // function and freed using the @link cupsFreeOptions@ function. // -size_t // O - Number of key/value pairs +int // O - Number of key/value pairs cupsDNSSDDecodeTXT( const unsigned char *txtrec, // I - TXT record data uint16_t txtlen, // I - TXT record length cups_option_t **txt) // O - Key/value pairs { - size_t num_txt = 0; // Number of key/value pairs + int num_txt = 0; // Number of key/value pairs unsigned char keylen; // Length of key/value char key[256], // Key/value buffer *value; // Pointer to value @@ -906,7 +906,7 @@ cupsDNSSDResolveGetContext( // const char *fullname, // const char *host, // uint16_t port, -// size_t num_txt, +// int num_txt, // cups_option_t *txt) // { // // Process resolved service @@ -1011,14 +1011,14 @@ cupsDNSSDServiceAdd( const char *domain, // I - Domain name or `NULL` for default const char *host, // I - Host name or `NULL` for default uint16_t port, // I - Port number or `0` for none - size_t num_txt, // I - Number of TXT record values + int num_txt, // I - Number of TXT record values cups_option_t *txt) // I - TXT record values { bool ret = true; // Return value - size_t i; // Looping var + int i; // Looping var - DEBUG_printf("cupsDNSSDServiceAdd(service=%p, types=\"%s\", domain=\"%s\", host=\"%s\", port=%u, num_txt=%u, txt=%p)", (void *)service, types, domain, host, port, (unsigned)num_txt, (void *)txt); + DEBUG_printf("cupsDNSSDServiceAdd(service=%p, types=\"%s\", domain=\"%s\", host=\"%s\", port=%u, num_txt=%d, txt=%p)", (void *)service, types, domain, host, port, num_txt, (void *)txt); // Range check input... if (!service || !types) @@ -1698,7 +1698,7 @@ mdns_resolve_cb( const unsigned char *txtrec, // I - TXT record cups_dnssd_resolve_t *resolve) // I - Resolve request { - size_t num_txt; // Number of TXT key/value pairs + int num_txt; // Number of TXT key/value pairs cups_option_t *txt; // TXT key/value pairs @@ -2075,7 +2075,7 @@ avahi_resolve_cb( cups_dnssd_resolve_t *resolve) // I - Resolve request { AvahiStringList *txtpair; // Current pair - size_t num_txt = 0; // Number of TXT key/value pairs + int num_txt = 0; // Number of TXT key/value pairs cups_option_t *txt = NULL; // TXT key/value pairs char fullname[1024]; // Full service name diff --git a/cups/dnssd.h b/cups/dnssd.h index cc3f1cd7fb..d0f8b6ac08 100644 --- a/cups/dnssd.h +++ b/cups/dnssd.h @@ -75,7 +75,7 @@ typedef void (*cups_dnssd_query_cb_t)(cups_dnssd_query_t *query, void *cb_data, typedef struct _cups_dnssd_resolve_s cups_dnssd_resolve_t; // DNS resolve request -typedef void (*cups_dnssd_resolve_cb_t)(cups_dnssd_resolve_t *res, void *cb_data, cups_dnssd_flags_t flags, uint32_t if_index, const char *fullname, const char *host, uint16_t port, size_t num_txt, cups_option_t *txt); +typedef void (*cups_dnssd_resolve_cb_t)(cups_dnssd_resolve_t *res, void *cb_data, cups_dnssd_flags_t flags, uint32_t if_index, const char *fullname, const char *host, uint16_t port, int num_txt, cups_option_t *txt); // DNS-SD resolve callback typedef struct _cups_dnssd_service_s cups_dnssd_service_t; @@ -105,7 +105,7 @@ extern void cupsDNSSDResolveDelete(cups_dnssd_resolve_t *res) _CUPS_PUBLIC; extern cups_dnssd_t *cupsDNSSDResolveGetContext(cups_dnssd_resolve_t *res) _CUPS_PUBLIC; extern cups_dnssd_resolve_t *cupsDNSSDResolveNew(cups_dnssd_t *dnssd, uint32_t if_index, const char *name, const char *type, const char *domain, cups_dnssd_resolve_cb_t resolve_cb, void *cb_data) _CUPS_PUBLIC; -extern bool cupsDNSSDServiceAdd(cups_dnssd_service_t *service, const char *types, const char *domain, const char *host, uint16_t port, size_t num_txt, cups_option_t *txt) _CUPS_PUBLIC; +extern bool cupsDNSSDServiceAdd(cups_dnssd_service_t *service, const char *types, const char *domain, const char *host, uint16_t port, int num_txt, cups_option_t *txt) _CUPS_PUBLIC; extern void cupsDNSSDServiceDelete(cups_dnssd_service_t *service) _CUPS_PUBLIC; extern cups_dnssd_t *cupsDNSSDServiceGetContext(cups_dnssd_service_t *service) _CUPS_PUBLIC; extern const char *cupsDNSSDServiceGetName(cups_dnssd_service_t *service) _CUPS_PUBLIC; @@ -114,7 +114,7 @@ extern bool cupsDNSSDServicePublish(cups_dnssd_service_t *service) _CUPS_PUBLIC extern bool cupsDNSSDServiceSetLocation(cups_dnssd_service_t *service, const char *geo_uri) _CUPS_PUBLIC; extern bool cupsDNSSDAssembleFullName(char *fullname, size_t fullsize, const char *name, const char *type, const char *domain); -extern size_t cupsDNSSDDecodeTXT(const unsigned char *txtrec, uint16_t txtlen, cups_option_t **txt) _CUPS_PUBLIC; +extern int cupsDNSSDDecodeTXT(const unsigned char *txtrec, uint16_t txtlen, cups_option_t **txt) _CUPS_PUBLIC; extern bool cupsDNSSDSeparateFullName(const char *fullname, char *name, size_t namesize, char *type, size_t typesize, char *domain, size_t domainsize); diff --git a/cups/http-private.h b/cups/http-private.h index e783fccde1..6aac7ecb8c 100644 --- a/cups/http-private.h +++ b/cups/http-private.h @@ -231,7 +231,7 @@ struct _http_s // HTTP connection structure /* Default field values, if any */ /**** New in CUPS 2.5 ****/ char qop[HTTP_MAX_VALUE]; - /* qop value from WWW-Authenticate */ + /* Quality of Protection (qop) value from WWW-Authenticate */ }; # endif /* !_HTTP_NO_PRIVATE */ diff --git a/cups/http-support.c b/cups/http-support.c index 47f2723b0e..b1845efc0f 100644 --- a/cups/http-support.c +++ b/cups/http-support.c @@ -85,7 +85,7 @@ static const char * const http_states[] = static const char *http_copy_decode(char *dst, const char *src, size_t dstsize, const char *term, int decode); static char *http_copy_encode(char *dst, const char *src, char *dstend, const char *reserved, const char *term, int encode); -static void http_resolve_cb(cups_dnssd_resolve_t *res, void *cb_data, cups_dnssd_flags_t flags, uint32_t if_index, const char *fullname, const char *host, uint16_t port, size_t num_txt, cups_option_t *txt); +static void http_resolve_cb(cups_dnssd_resolve_t *res, void *cb_data, cups_dnssd_flags_t flags, uint32_t if_index, const char *fullname, const char *host, uint16_t port, int num_txt, cups_option_t *txt); // @@ -594,7 +594,7 @@ char * // O - Encoded string httpEncode64(char *out, // I - String to write to const char *in) // I - String to read from { - return (httpEncode64_2(out, 512, in, (int)strlen(in))); + return (httpEncode64_3(out, 512, in, (size_t)strlen(in), false)); } @@ -610,7 +610,7 @@ httpEncode64_2(char *out, // I - String to write to const char *in, // I - String to read from int inlen) // I - Size of input string { - return (httpEncode64_3(out, outlen, in, inlen, false)); + return (httpEncode64_3(out, (size_t)outlen, in, (size_t)inlen, false)); } @@ -960,7 +960,7 @@ httpSeparateURI( if ((sep = strpbrk(uri, "@/")) != NULL && *sep == '@') { // Get a username:password combo... - uri = http_copy_decode(username, uri, usernamelen, "@", decoding & HTTP_URI_CODING_USERNAME); + uri = http_copy_decode(username, uri, (size_t)usernamelen, "@", decoding & HTTP_URI_CODING_USERNAME); if (!uri) { @@ -993,7 +993,7 @@ httpSeparateURI( uri ++; } - uri = http_copy_decode(host, uri, hostlen, "]", decoding & HTTP_URI_CODING_HOSTNAME); + uri = http_copy_decode(host, uri, (size_t)hostlen, "]", decoding & HTTP_URI_CODING_HOSTNAME); if (!uri) { @@ -1051,7 +1051,7 @@ httpSeparateURI( } // Then copy the hostname or IPv4 address to the buffer... - uri = http_copy_decode(host, uri, hostlen, ":?/", decoding & HTTP_URI_CODING_HOSTNAME); + uri = http_copy_decode(host, uri, (size_t)hostlen, ":?/", decoding & HTTP_URI_CODING_HOSTNAME); if (!uri) { @@ -1103,20 +1103,20 @@ httpSeparateURI( // Copy any query string... if (*uri == '?') - uri = http_copy_decode(resource + 1, uri, resourcelen - 1, NULL, decoding & HTTP_URI_CODING_QUERY); + uri = http_copy_decode(resource + 1, uri, (size_t)resourcelen - 1, NULL, decoding & HTTP_URI_CODING_QUERY); else resource[1] = '\0'; } else { - uri = http_copy_decode(resource, uri, resourcelen, "?", decoding & HTTP_URI_CODING_RESOURCE); + uri = http_copy_decode(resource, uri, (size_t)resourcelen, "?", decoding & HTTP_URI_CODING_RESOURCE); if (uri && *uri == '?') { // Concatenate any query string... char *resptr = resource + strlen(resource); - uri = http_copy_decode(resptr, uri, resourcelen - (int)(resptr - resource), NULL, decoding & HTTP_URI_CODING_QUERY); + uri = http_copy_decode(resptr, uri, (size_t)(resourcelen - (resptr - resource)), NULL, decoding & HTTP_URI_CODING_QUERY); } } @@ -1183,7 +1183,7 @@ _httpSetDigestAuthString( int i; /* Looping var */ char cnonce[65]; /* cnonce value */ const char *hashalg; /* Hashing algorithm */ - const char *qop; /* quality of protection */ + const char *qop; /* Quality of Protection */ DEBUG_puts("3_httpSetDigestAuthString: Follow RFC 2617/7616..."); @@ -1208,7 +1208,7 @@ _httpSetDigestAuthString( return (0); } - if (!_cups_strcasecmp(http->algorithm, "MD5")) + if (!http->algorithm[0] || !_cups_strcasecmp(http->algorithm, "MD5")) { // RFC 2617 Digest with MD5 if (cg->digestoptions == _CUPS_DIGESTOPTIONS_DENYMD5) @@ -1540,7 +1540,7 @@ _httpDecodeURI(char *dst, // I - Destination buffer const char *src, // I - Source URI size_t dstsize) // I - Size of destination buffer { - if (http_copy_decode(dst, src, (int)dstsize, NULL, 1)) + if (http_copy_decode(dst, src, dstsize, NULL, 1)) return (dst); else return (NULL); @@ -1838,7 +1838,7 @@ http_resolve_cb( const char *fullname, // I - Full service name const char *host, // I - Hostname uint16_t port, // I - Port number - size_t num_txt, // I - Number of TXT key/value pairs + int num_txt, // I - Number of TXT key/value pairs cups_option_t *txt) // I - TXT key/value pairs { _http_uribuf_t *uribuf = (_http_uribuf_t *)cb_data; diff --git a/cups/ipp-file.c b/cups/ipp-file.c index c73a2665f7..6bbbf9c3d5 100644 --- a/cups/ipp-file.c +++ b/cups/ipp-file.c @@ -1,568 +1,1581 @@ -/* - * IPP data file parsing functions. - * - * Copyright © 2007-2019 by Apple Inc. - * Copyright © 1997-2007 by Easy Software Products. - * - * Licensed under Apache License v2.0. See the file "LICENSE" for more - * information. - */ - -/* - * Include necessary headers... - */ - -#include "ipp-private.h" -#include "string-private.h" -#include "debug-internal.h" - - -/* - * Local functions... - */ - -static ipp_t *parse_collection(_ipp_file_t *f, _ipp_vars_t *v, void *user_data); -static int parse_value(_ipp_file_t *f, _ipp_vars_t *v, void *user_data, ipp_t *ipp, ipp_attribute_t **attr, int element); -static void report_error(_ipp_file_t *f, _ipp_vars_t *v, void *user_data, const char *message, ...) _CUPS_FORMAT(4, 5); - - -/* - * '_ippFileParse()' - Parse an IPP data file. - */ - -ipp_t * /* O - IPP attributes or @code NULL@ on failure */ -_ippFileParse( - _ipp_vars_t *v, /* I - Variables */ - const char *filename, /* I - Name of file to parse */ - void *user_data) /* I - User data pointer */ +// +// IPP data file functions. +// +// Copyright © 2021-2022 by OpenPrinting. +// Copyright © 2007-2019 by Apple Inc. +// Copyright © 1997-2007 by Easy Software Products. +// +// Licensed under Apache License v2.0. See the file "LICENSE" for more +// information. +// + +#include "cups-private.h" + + +// +// Private structures... +// + +struct _ipp_file_s // IPP data file { - _ipp_file_t f; /* IPP data file information */ - ipp_t *attrs = NULL; /* Active IPP message */ - ipp_attribute_t *attr = NULL; /* Current attribute */ - char token[1024]; /* Token string */ - ipp_t *ignored = NULL; /* Ignored attributes */ + ipp_file_t *parent; // Parent data file, if any + cups_file_t *fp; // File pointer + char *filename, // Filename + mode; // Read/write mode + int indent, // Current indentation + column, // Current column + linenum, // Current line number + save_line; // Saved line number + off_t save_pos; // Saved position + ipp_tag_t group_tag; // Current group for attributes + ipp_t *attrs; // Current attributes + size_t num_vars; // Number of variables + cups_option_t *vars; // Variables + ipp_fattr_cb_t attr_cb; // Attribute (filter) callback + ipp_ferror_cb_t error_cb; // Error reporting callback + ipp_ftoken_cb_t token_cb; // Token processing callback + void *cb_data; // Callback data + char *buffer; // Output buffer + size_t alloc_buffer; // Size of output buffer +}; + + +// +// Local functions... +// + +static bool expand_buffer(ipp_file_t *file, size_t buffer_size); +static bool parse_value(ipp_file_t *file, ipp_t *ipp, ipp_attribute_t **attr, size_t element); +static bool report_error(ipp_file_t *file, const char *message, ...) _CUPS_FORMAT(2,3); +static bool write_string(ipp_file_t *file, const char *s, size_t len); + + +// +// 'ippFileClose()' - Close an IPP data file. +// +// This function closes the current IPP data file. The `ipp_file_t` object can +// be reused for another file as needed. +// + +bool // O - `true` on success, `false` on error +ippFileClose(ipp_file_t *file) // I - IPP data file +{ + bool ret; // Return value + + + if (!file || !file->fp) + return (false); + + if ((ret = cupsFileClose(file->fp)) == false) + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); + free(file->filename); - DEBUG_printf("_ippFileParse(v=%p, filename=\"%s\", user_data=%p)", (void *)v, filename, user_data); + file->fp = NULL; + file->filename = NULL; + file->mode = '\0'; + file->attrs = NULL; + + return (ret); +} - /* - * Initialize file info... - */ - memset(&f, 0, sizeof(f)); - f.filename = filename; - f.linenum = 1; +// +// 'ippFileDelete()' - Close an IPP data file and free all memory. +// +// This function closes an IPP data file, if necessary, and frees all memory +// associated with it. +// + +bool // O - `true` on success, `false` on error +ippFileDelete(ipp_file_t *file) // I - IPP data file +{ + if (!file) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); + return (false); + } - if ((f.fp = cupsFileOpen(filename, "r")) == NULL) + if (file->fp) { - DEBUG_printf("1_ippFileParse: Unable to open \"%s\": %s", filename, strerror(errno)); - return (0); + if (!ippFileClose(file)) + return (false); } - /* - * Do the callback with a NULL token to setup any initial state... - */ + cupsFreeOptions(file->num_vars, file->vars); + free(file->buffer); + free(file); + + return (true); +} + + +// +// 'ippFileExpandVars()' - Expand IPP data file and environment variables in a string. +// +// This function expands IPP data file variables of the form "$name" and +// environment variables of the form "$ENV[name]" in the source string to the +// destination string. The +// + +size_t // O - Required size for expanded variables +ippFileExpandVars(ipp_file_t *file, // I - IPP data file + char *dst, // I - Destination buffer + const char *src, // I - Source string + size_t dstsize) // I - Size of destination buffer +{ + char *dstptr, // Pointer into destination + *dstend, // End of destination + temp[256], // Temporary string + *tempptr; // Pointer into temporary string + const char *value; // Value to substitute + - (*v->tokencb)(&f, v, user_data, NULL); + // Range check input... + if (!file || !dst || !src || dstsize < 32) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); + return (false); + } - /* - * Read data file, using the callback function as needed... - */ + // Copy the source string to the destination, expanding variables as needed... + dstptr = dst; + dstend = dst + dstsize - 1; - while (_ippFileReadToken(&f, token, sizeof(token))) + while (*src) + { + if (*src == '$') + { + // Substitute a string/number... + if (!strncmp(src, "$$", 2)) + { + // Literal $ + value = "$"; + src += 2; + } + else if (!strncmp(src, "$ENV[", 5)) + { + // Environment variable + cupsCopyString(temp, src + 5, sizeof(temp)); + + for (tempptr = temp; *tempptr; tempptr ++) + { + if (*tempptr == ']') + break; + } + + if (*tempptr) + *tempptr++ = '\0'; + + value = getenv(temp); + src += tempptr - temp + 5; + } + else + { + // $name or ${name} + if (src[1] == '{') + { + src += 2; + cupsCopyString(temp, src, sizeof(temp)); + if ((tempptr = strchr(temp, '}')) != NULL) + *tempptr = '\0'; + else + tempptr = temp + strlen(temp); + } + else + { + cupsCopyString(temp, src + 1, sizeof(temp)); + + for (tempptr = temp; *tempptr; tempptr ++) + { + if (!isalnum(*tempptr & 255) && *tempptr != '-' && *tempptr != '_') + break; + } + + if (*tempptr) + *tempptr = '\0'; + } + + value = ippFileGetVar(file, temp); + src += tempptr - temp + 1; + } + + if (value) + { + if (dstptr < dstend) + cupsCopyString(dstptr, value, (size_t)(dstend - dstptr + 1)); + dstptr += strlen(value); + } + } + else if (dstptr < dstend) + *dstptr++ = *src++; + else + dstptr ++; + } + + if (dstptr < dstend) + *dstptr = '\0'; + else + *dstend = '\0'; + + return ((size_t)(dstptr - dst)); +} + + +// +// 'ippFileGetAttribute()' - Get a single named attribute from an IPP data file. +// +// This function finds the first occurence of a named attribute in the current +// IPP attributes in the specified data file. Unlike +// @link ippFileGetAttributes@, this function does not clear the attribute +// state. +// + +ipp_attribute_t * // O - Attribute or `NULL` if none +ippFileGetAttribute( + ipp_file_t *file, // I - IPP data file + const char *name, // I - Attribute name + ipp_tag_t value_tag) // I - Value tag or `IPP_TAG_ZERO` for any +{ + if (!file || !name) + return (NULL); + else + return (ippFindAttribute(file->attrs, name, value_tag)); +} + + +// +// 'ippFileGetAttributes()' - Get the current set of attributes from an IPP data file. +// +// This function gets the current set of attributes from an IPP data file. +// + +ipp_t * // O - IPP attributes +ippFileGetAttributes(ipp_file_t *file) // I - IPP data file +{ + return (file ? file->attrs : NULL); +} + + +// +// 'ippFileGetFilename()' - Get the filename for an IPP data file. +// +// This function returns the filename associated with an IPP data file. +// + +const char * // O - Filename +ippFileGetFilename(ipp_file_t *file) // I - IPP data file +{ + return (file ? file->filename : NULL); +} + + +// +// 'ippFileGetLineNumber()' - Get the current line number in an IPP data file. +// +// This function returns the current line number in an IPP data file. +// + +int // O - Line number +ippFileGetLineNumber(ipp_file_t *file) // I - IPP data file +{ + return (file ? file->linenum : 0); +} + + +// +// 'ippFileGetVar()' - Get the value of an IPP data file variable. +// +// This function returns the value of an IPP data file variable. `NULL` is +// returned if the variable is not set. +// + +const char * // O - Variable value or `NULL` if none. +ippFileGetVar(ipp_file_t *file, // I - IPP data file + const char *name) // I - Variable name +{ + const char *value; // Value + + + if (!file || !name) + return (NULL); + else if (!strcmp(name, "user")) + return (cupsGetUser()); + else if ((value = cupsGetOption(name, file->num_vars, file->vars)) != NULL) + return (value); + else if (file->parent) + return (cupsGetOption(name, file->parent->num_vars, file->parent->vars)); + else + return (NULL); +} + + +// +// 'ippFileNew()' - Create a new IPP data file object for reading or writing. +// +// This function opens an IPP data file for reading (mode="r") or writing +// (mode="w"). If the "parent" argument is not `NULL`, all variables from the +// parent data file are copied to the new file. +// + +ipp_file_t * // O - IPP data file +ippFileNew(ipp_file_t *parent, // I - Parent data file or `NULL` for none + ipp_fattr_cb_t attr_cb, // I - Attribute filtering callback, if any + ipp_ferror_cb_t error_cb, // I - Error reporting callback, if any + void *cb_data) // I - Callback data, if any +{ + ipp_file_t *file; // IPP data file + + + // Allocate memory... + if ((file = (ipp_file_t *)calloc(1, sizeof(ipp_file_t))) == NULL) + return (NULL); + + // Set callbacks and parent... + file->parent = parent; + file->attr_cb = attr_cb; + file->error_cb = error_cb; + file->cb_data = cb_data; + + return (file); +} + + +// +// 'ippFileOpen()' - Open an IPP data file for reading or writing. +// +// This function opens an IPP data file for reading (mode="r") or writing +// (mode="w"). If the "parent" argument is not `NULL`, all variables from the +// parent data file are copied to the new file. +// + +bool // O - `true` on success, `false` on error +ippFileOpen(ipp_file_t *file, // I - IPP data file + const char *filename, // I - Filename to open + const char *mode) // I - Open mode - "r" to read and "w" to write +{ + cups_file_t *fp; // IPP data file pointer + + + // Range check input... + if (!file || !filename || !mode || (strcmp(mode, "r") && strcmp(mode, "w"))) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); + return (false); + } + else if (file->fp) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EBUSY), 0); + return (false); + } + + // Try opening the file... + if ((fp = cupsFileOpen(filename, mode)) == NULL) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); + return (false); + } + + // Save the file information and return... + file->fp = fp; + file->filename = strdup(filename); + file->mode = *mode; + file->column = 0; + file->linenum = 1; + + return (true); +} + + +// +// 'ippFileRead()' - Read an IPP data file. +// + +bool // O - `true` on success, `false` on error +ippFileRead(ipp_file_t *file, // I - IPP data file + ipp_ftoken_cb_t token_cb, // I - Token callback + bool with_groups)// I - Read attributes with GROUP directives +{ + ipp_t *attrs = NULL; // Active IPP message + ipp_attribute_t *attr = NULL; // Current attribute + char token[1024]; // Token string + ipp_t *ignored = NULL; // Ignored attributes + bool ret = true; // Return value + + + // Range check input + if (!file || file->mode != 'r') + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); + return (false); + } + + // Read data file, using the callback function as needed... + while (ippFileReadToken(file, token, sizeof(token))) { if (!_cups_strcasecmp(token, "DEFINE") || !_cups_strcasecmp(token, "DEFINE-DEFAULT")) { - char name[128], /* Variable name */ - value[1024], /* Variable value */ - temp[1024]; /* Temporary string */ + // Define a variable... + char name[128], // Variable name + value[1024], // Variable value + temp[1024]; // Temporary string attr = NULL; - if (_ippFileReadToken(&f, name, sizeof(name)) && _ippFileReadToken(&f, temp, sizeof(temp))) + if (ippFileReadToken(file, name, sizeof(name)) && ippFileReadToken(file, temp, sizeof(temp))) { - if (_cups_strcasecmp(token, "DEFINE-DEFAULT") || !_ippVarsGet(v, name)) + if (_cups_strcasecmp(token, "DEFINE-DEFAULT") || !ippFileGetVar(file, name)) { - _ippVarsExpand(v, value, temp, sizeof(value)); - _ippVarsSet(v, name, value); + ippFileExpandVars(file, value, temp, sizeof(value)); + ippFileSetVar(file, name, value); } } else { - report_error(&f, v, user_data, "Missing %s name and/or value on line %d of \"%s\".", token, f.linenum, f.filename); + report_error(file, "Missing %s name and/or value on line %d of '%s'.", token, file->linenum, file->filename); + ret = false; break; } } - else if (f.attrs && !_cups_strcasecmp(token, "ATTR")) + else if (file->attrs && with_groups && !_cups_strcasecmp(token, "GROUP")) + { + // Attribute group... + char temp[1024]; // Temporary token + ipp_tag_t group_tag; // Group tag + + if (!ippFileReadToken(file, temp, sizeof(temp))) + { + report_error(file, "Missing GROUP tag on line %d of '%s'.", file->linenum, file->filename); + ret = false; + break; + } + + if ((group_tag = ippTagValue(temp)) == IPP_TAG_ZERO || group_tag >= IPP_TAG_UNSUPPORTED_VALUE) + { + report_error(file, "Bad GROUP tag '%s' on line %d of '%s'.", temp, file->linenum, file->filename); + ret = false; + break; + } + + if (group_tag == file->group_tag) + ippAddSeparator(file->attrs); + + file->group_tag = group_tag; + } + else if (file->attrs && !_cups_strcasecmp(token, "ATTR")) { - /* - * Attribute definition... - */ + // Attribute definition... + char syntax[128], // Attribute syntax (value tag) + name[128]; // Attribute name + ipp_tag_t value_tag; // Value tag + + attr = NULL; + + if (!ippFileReadToken(file, syntax, sizeof(syntax))) + { + report_error(file, "Missing ATTR syntax on line %d of '%s'.", file->linenum, file->filename); + ret = false; + break; + } + else if ((value_tag = ippTagValue(syntax)) < IPP_TAG_UNSUPPORTED_VALUE) + { + report_error(file, "Bad ATTR syntax \"%s\" on line %d of '%s'.", syntax, file->linenum, file->filename); + ret = false; + break; + } - char syntax[128], /* Attribute syntax (value tag) */ - name[128]; /* Attribute name */ - ipp_tag_t value_tag; /* Value tag */ + if (!ippFileReadToken(file, name, sizeof(name)) || !name[0]) + { + report_error(file, "Missing ATTR name on line %d of '%s'.", file->linenum, file->filename); + ret = false; + break; + } + + if (!file->attr_cb || (*file->attr_cb)(file, file->cb_data, name)) + { + // Add this attribute... + attrs = file->attrs; + } + else + { + // Ignore this attribute... + if (!ignored) + ignored = ippNew(); + + attrs = ignored; + } + + if (value_tag < IPP_TAG_INTEGER) + { + // Add out-of-band attribute - no value string needed... + ippAddOutOfBand(attrs, file->group_tag, value_tag, name); + } + else + { + // Add attribute with one or more values... + attr = ippAddString(attrs, file->group_tag, value_tag, name, NULL, NULL); + + if (!parse_value(file, attrs, &attr, 0)) + { + ret = false; + break; + } + } + } + else if (file->attrs && (!_cups_strcasecmp(token, "ATTR-IF-DEFINED") || !_cups_strcasecmp(token, "ATTR-IF-NOT-DEFINED"))) + { + // Conditional attribute definition... + char varname[128], // Variable name + syntax[128], // Attribute syntax (value tag) + name[128]; // Attribute name + ipp_tag_t value_tag; // Value tag + + if (!ippFileReadToken(file, varname, sizeof(varname))) + { + report_error(file, "Missing %s variable on line %d of '%s'.", token, file->linenum, file->filename); + ret = false; + break; + } + + if (!ippFileReadToken(file, syntax, sizeof(syntax))) + { + report_error(file, "Missing %s syntax on line %d of '%s'.", token, file->linenum, file->filename); + ret = false; + break; + } + else if ((value_tag = ippTagValue(syntax)) < IPP_TAG_UNSUPPORTED_VALUE) + { + report_error(file, "Bad %s syntax \"%s\" on line %d of '%s'.", token, syntax, file->linenum, file->filename); + ret = false; + break; + } + + if (!ippFileReadToken(file, name, sizeof(name)) || !name[0]) + { + report_error(file, "Missing %s name on line %d of '%s'.", token, file->linenum, file->filename); + ret = false; + break; + } + + if (!file->attr_cb || (*file->attr_cb)(file, file->cb_data, name)) + { + // Add this attribute... + attrs = file->attrs; + } + else if (!_cups_strcasecmp(token, "ATTR-IF-DEFINED")) + { + if (ippFileGetVar(file, varname)) + attrs = file->attrs; + else + attrs = ignored; + } + else // ATTR-IF-NOT-DEFINED + { + if (ippFileGetVar(file, varname)) + attrs = ignored; + else + attrs = file->attrs; + } + + if (value_tag < IPP_TAG_INTEGER) + { + // Add out-of-band attribute - no value string needed... + ippAddOutOfBand(attrs, file->group_tag, value_tag, name); + } + else + { + // Add attribute with one or more values... + attr = ippAddString(attrs, file->group_tag, value_tag, name, NULL, NULL); + + if (!parse_value(file, attrs, &attr, 0)) + { + ret = false; + break; + } + } + } + else if (attr && !_cups_strcasecmp(token, ",")) + { + // Additional value... + if (!parse_value(file, attrs, &attr, ippGetCount(attr))) + { + ret = false; + break; + } + } + else + { + // Something else... + attr = NULL; + attrs = NULL; + + if (!token_cb) + { + ret = false; + break; + } + else if ((ret = (token_cb)(file, file->cb_data, token)) == false) + { + break; + } + } + } + + // Free any ignored attributes and return... + ippDelete(ignored); + + return (ret); +} + + +// +// 'ippFileReadCollection()' - Read a collection from an IPP data file. +// +// This function reads a collection value from an IPP data file. Collection +// values are surrounded by curly braces ("{" and "}") and have "MEMBER" +// directives to define member attributes in the collection. +// + +ipp_t * // O - Collection value +ippFileReadCollection(ipp_file_t *file) // I - IPP data file +{ + ipp_t *col; // Collection value + ipp_attribute_t *attr = NULL; // Current member attribute + char token[1024]; // Token string + + + // Range check input... + if (!file) + return (NULL); + + // Read the first token to verify it is an open curly brace... + if (!ippFileReadToken(file, token, sizeof(token))) + { + report_error(file, "Missing collection value on line %d of '%s'.", file->linenum, file->filename); + return (NULL); + } + else if (strcmp(token, "{")) + { + report_error(file, "Bad collection value on line %d of '%s'.", file->linenum, file->filename); + return (NULL); + } + + // Parse the collection value... + col = ippNew(); + + while (ippFileReadToken(file, token, sizeof(token))) + { + if (!strcmp(token, "}")) + { + // End of collection value... + break; + } + else if (!_cups_strcasecmp(token, "MEMBER")) + { + // Member attribute definition... + char syntax[128], // Attribute syntax (value tag) + name[128]; // Attribute name + ipp_tag_t value_tag; // Value tag attr = NULL; - if (!_ippFileReadToken(&f, syntax, sizeof(syntax))) + if (!ippFileReadToken(file, syntax, sizeof(syntax))) { - report_error(&f, v, user_data, "Missing ATTR syntax on line %d of \"%s\".", f.linenum, f.filename); + report_error(file, "Missing MEMBER syntax on line %d of '%s'.", file->linenum, file->filename); + ippDelete(col); + col = NULL; break; } else if ((value_tag = ippTagValue(syntax)) < IPP_TAG_UNSUPPORTED_VALUE) { - report_error(&f, v, user_data, "Bad ATTR syntax \"%s\" on line %d of \"%s\".", syntax, f.linenum, f.filename); + report_error(file, "Bad MEMBER syntax \"%s\" on line %d of '%s'.", syntax, file->linenum, file->filename); + ippDelete(col); + col = NULL; + break; + } + + if (!ippFileReadToken(file, name, sizeof(name)) || !name[0]) + { + report_error(file, "Missing MEMBER name on line %d of '%s'.", file->linenum, file->filename); + ippDelete(col); + col = NULL; break; } - if (!_ippFileReadToken(&f, name, sizeof(name)) || !name[0]) + if (value_tag < IPP_TAG_INTEGER) + { + // Add out-of-band attribute - no value string needed... + ippAddOutOfBand(col, IPP_TAG_ZERO, value_tag, name); + } + else + { + // Add attribute with one or more values... + attr = ippAddString(col, IPP_TAG_ZERO, value_tag, name, NULL, NULL); + + if (!parse_value(file, col, &attr, 0)) + { + ippDelete(col); + col = NULL; + break; + } + } + + } + else if (attr && !_cups_strcasecmp(token, ",")) + { + // Additional value... + if (!parse_value(file, col, &attr, ippGetCount(attr))) { - report_error(&f, v, user_data, "Missing ATTR name on line %d of \"%s\".", f.linenum, f.filename); + ippDelete(col); + col = NULL; break; } + } + else + { + // Something else... + report_error(file, "Unknown directive \"%s\" on line %d of '%s'.", token, file->linenum, file->filename); + ippDelete(col); + col = NULL; + attr = NULL; + break; + + } + } + + return (col); +} + + +// +// 'ippFileReadToken()' - Read a token from an IPP data file. +// +// This function reads a single token or value from an IPP data file, skipping +// comments and whitespace as needed. +// + +bool // O - `true` on success, `false` on error +ippFileReadToken(ipp_file_t *file, // I - IPP data file + char *token, // I - Token buffer + size_t tokensize) // I - Size of token buffer +{ + int ch, // Character from file + quote = 0; // Quoting character + char *tokptr = token, // Pointer into token buffer + *tokend = token + tokensize - 1;// End of token buffer + + + // Range check input... + if (!file || !token || tokensize < 32) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); + + if (token) + *token = '\0'; + + return (false); + } + + // Skip whitespace and comments... + DEBUG_printf("1ippFileReadToken: linenum=%d, pos=%ld", file->linenum, (long)cupsFileTell(file->fp)); + + while ((ch = cupsFileGetChar(file->fp)) != EOF) + { + if (_cups_isspace(ch)) + { + // Whitespace... + if (ch == '\n') + { + file->linenum ++; + DEBUG_printf("1ippFileReadToken: LF in leading whitespace, linenum=%d, pos=%ld", file->linenum, (long)cupsFileTell(file->fp)); + } + } + else if (ch == '#') + { + // Comment... + DEBUG_puts("1ippFileReadToken: Skipping comment in leading whitespace..."); + + while ((ch = cupsFileGetChar(file->fp)) != EOF) + { + if (ch == '\n') + break; + } + + if (ch == '\n') + { + file->linenum ++; + DEBUG_printf("1ippFileReadToken: LF at end of comment, linenum=%d, pos=%ld", file->linenum, (long)cupsFileTell(file->fp)); + } + else + break; + } + else + break; + } + + if (ch == EOF) + { + DEBUG_puts("1ippFileReadToken: EOF"); + return (false); + } + + // Read a token... + while (ch != EOF) + { + if (ch == '\n') + { + file->linenum ++; + DEBUG_printf("1ippFileReadToken: LF in token, linenum=%d, pos=%ld", file->linenum, (long)cupsFileTell(file->fp)); + } + + if (ch == quote) + { + // End of quoted text... + *tokptr = '\0'; + DEBUG_printf("1ippFileReadToken: Returning \"%s\" at closing quote.", token); + return (true); + } + else if (!quote && _cups_isspace(ch)) + { + // End of unquoted text... + *tokptr = '\0'; + DEBUG_printf("1ippFileReadToken: Returning \"%s\" before whitespace.", token); + return (true); + } + else if (!quote && (ch == '\'' || ch == '\"')) + { + // Start of quoted text or regular expression... + quote = ch; + + DEBUG_printf("1ippFileReadToken: Start of quoted string, quote=%c, pos=%ld", quote, (long)cupsFileTell(file->fp)); + } + else if (!quote && ch == '#') + { + // Start of comment... + cupsFileSeek(file->fp, cupsFileTell(file->fp) - 1); + *tokptr = '\0'; + DEBUG_printf("1ippFileReadToken: Returning \"%s\" before comment.", token); + return (true); + } + else if (!quote && (ch == '{' || ch == '}' || ch == ',')) + { + // Delimiter... + if (tokptr > token) + { + // Return the preceding token first... + cupsFileSeek(file->fp, cupsFileTell(file->fp) - 1); + } + else + { + // Return this delimiter by itself... + *tokptr++ = (char)ch; + } + + *tokptr = '\0'; + DEBUG_printf("1ippFileReadToken: Returning \"%s\".", token); + return (true); + } + else + { + if (ch == '\\') + { + // Quoted character... + DEBUG_printf("1ippFileReadToken: Quoted character at pos=%ld", (long)cupsFileTell(file->fp)); + + if ((ch = cupsFileGetChar(file->fp)) == EOF) + { + *token = '\0'; + DEBUG_puts("1ippFileReadToken: EOF"); + return (false); + } + else if (ch == '\n') + { + file->linenum ++; + DEBUG_printf("1ippFileReadToken: quoted LF, linenum=%d, pos=%ld", file->linenum, (long)cupsFileTell(file->fp)); + } + else if (ch == 'a') + ch = '\a'; + else if (ch == 'b') + ch = '\b'; + else if (ch == 'f') + ch = '\f'; + else if (ch == 'n') + ch = '\n'; + else if (ch == 'r') + ch = '\r'; + else if (ch == 't') + ch = '\t'; + else if (ch == 'v') + ch = '\v'; + } + + if (tokptr < tokend) + { + // Add to current token... + *tokptr++ = (char)ch; + } + else + { + // Token too long... + *tokptr = '\0'; + DEBUG_printf("1ippFileReadToken: Too long: \"%s\".", token); + return (false); + } + } + + // Get the next character... + ch = cupsFileGetChar(file->fp); + } + + *tokptr = '\0'; + DEBUG_printf("1ippFileReadToken: Returning \"%s\" at EOF.", token); + + return (tokptr > token); +} + + +// +// 'ippFileRestorePosition()' - Restore the previous position in an IPP data file. +// +// This function restores the previous position in an IPP data file that is open +// for reading. +// + +bool // O - `true` on success, `false` on failure +ippFileRestorePosition(ipp_file_t *file)// I - IPP data file +{ + // Range check input... + if (!file || file->mode != 'r' || file->save_line == 0) + return (false); + + // Seek back to the saved position... + if (cupsFileSeek(file->fp, file->save_pos) != file->save_pos) + return (false); + + file->linenum = file->save_line; + file->save_pos = 0; + file->save_line = 0; + + return (true); +} + + +// +// 'ippFileSavePosition()' - Save the current position in an IPP data file. +// +// This function saves the current position in an IPP data file that is open +// for reading. +// + +bool // O - `true` on success, `false` on failure +ippFileSavePosition(ipp_file_t *file) // I - IPP data file +{ + // Range check input... + if (!file || file->mode != 'r') + return (false); + + // Save the current position... + file->save_pos = cupsFileTell(file->fp); + file->save_line = file->linenum; + + return (true); +} + + +// +// 'ippFileSetAttributes()' - Set the attributes for an IPP data file. +// +// This function sets the current set of attributes for an IPP data file, +// typically an empty collection created with @link ippNew@. +// + +bool // O - `true` on success, `false` otherwise +ippFileSetAttributes(ipp_file_t *file, // I - IPP data file + ipp_t *attrs) // I - IPP attributes +{ + if (file) + { + file->attrs = attrs; + return (true); + } + + return (false); +} + + +// +// 'ippFileSetGroupTag()' - Set the group tag for an IPP data file. +// +// This function sets the group tag associated with attributes that are read +// from an IPP data file. +// + +bool // O - `true` on success, `false` otherwise +ippFileSetGroupTag(ipp_file_t *file, // I - IPP data file + ipp_tag_t group_tag)// I - Group tag +{ + if (file && group_tag >= IPP_TAG_OPERATION && group_tag <= IPP_TAG_SYSTEM) + { + file->group_tag = group_tag; + return (true); + } + + return (false); +} + + +// +// 'ippFileSetVar()' - Set an IPP data file variable to a constant value. +// +// This function sets an IPP data file variable to a constant value. Setting +// the "uri" variable also initializes the "scheme", "uriuser", "hostname", +// "port", and "resource" variables. +// + +bool // O - `true` on success, `false` on failure +ippFileSetVar(ipp_file_t *file, // I - IPP data file + const char *name, // I - Variable name + const char *value) // I - Value +{ + if (!file || !name || !value) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); + return (false); + } + + // Save new variable... + if (!strcmp(name, "uri")) + { + // Also set URI component values... + char uri[1024], // New printer URI + resolved[1024], // Resolved mDNS URI + scheme[32], // URI scheme + userpass[256], // URI username:password + *password, // Pointer to password + hostname[256], // URI hostname + resource[256]; // URI resource path + int port; // URI port number + http_uri_status_t uri_status; // URI decoding status + + if (strstr(value, "._tcp")) + { + // Resolve URI... + if (!httpResolveURI(value, resolved, sizeof(resolved), HTTP_RESOLVE_DEFAULT, NULL, NULL)) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(ENOENT), 0); + return (false); + } + + value = resolved; + } + + if ((uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource))) < HTTP_URI_STATUS_OK) + { + // Bad URI... + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, httpURIStatusString(uri_status), 0); + return (false); + } + else + { + // Valid URI... + if ((password = strchr(userpass, ':')) != NULL) + { + // Separate and save password from URI... + *password++ = '\0'; + + file->num_vars = cupsAddOption("uripassword", password, file->num_vars, &file->vars); + } + + file->num_vars = cupsAddOption("scheme", scheme, file->num_vars, &file->vars); + file->num_vars = cupsAddOption("uriuser", userpass, file->num_vars, &file->vars); + file->num_vars = cupsAddOption("hostname", hostname, file->num_vars, &file->vars); + file->num_vars = cupsAddIntegerOption("port", port, file->num_vars, &file->vars); + file->num_vars = cupsAddOption("resource", resource, file->num_vars, &file->vars); + + // Reassemble URI without username or password... + httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), scheme, NULL, hostname, port, resource); + file->num_vars = cupsAddOption("uri", uri, file->num_vars, &file->vars); + } + } + else + { + // Set another variable... + file->num_vars = cupsAddOption(name, value, file->num_vars, &file->vars); + } + + return (true); +} + + +// +// 'ippFileSetVarf()' - Set an IPP data file variable to a formatted value. +// +// This function sets an IPP data file variable to a formatted value. Setting +// the "uri" variable also initializes the "scheme", "uriuser", "hostname", +// "port", and "resource" variables. +// + +bool // O - `true` on success, `false` on error +ippFileSetVarf(ipp_file_t *file, // I - IPP data file + const char *name, // I - Variable name + const char *value, // I - Printf-style value + ...) // I - Additional arguments as needed +{ + va_list ap; // Pointer to arguments + char buffer[16384]; // Value buffer + + + if (!file || !name || !value) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); + return (false); + } + + va_start(ap, value); + vsnprintf(buffer, sizeof(buffer), value, ap); + va_end(ap); + + return (ippFileSetVar(file, name, buffer)); +} + + +// +// 'ippFileWriteAttributes()' - Write an IPP message to an IPP data file. +// +// This function writes an IPP message to an IPP data file using the attribute +// filter specified in the call to @link ippFileOpen@. If "with_group" is +// `true`, "GROUP" directives are written as necessary to place the attributes +// in the correct groups. +// + +bool // O - `true` on success, `false` on error +ippFileWriteAttributes( + ipp_file_t *file, // I - IPP data file + ipp_t *ipp, // I - IPP attributes to write + bool with_groups) // I - `true` to include GROUPs, `false` otherwise +{ + bool ret = true; // Return value + ipp_attribute_t *attr; // Current attribute + const char *name; // Attribute name + ipp_tag_t group_tag, // Group tag + value_tag; // Value tag + size_t i, // Looping var + count; // Number of values + + + // Range check input... + if (!file || file->mode != 'w' || !ipp) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); + return (false); + } + + // Make sure we are on a new line... + if (file->column) + { + cupsFilePutChar(file->fp, '\n'); + file->column = 0; + } + + // Loop through the attributes... + for (attr = ippGetFirstAttribute(ipp); attr; attr = ippGetNextAttribute(ipp)) + { + if ((name = ippGetName(attr)) == NULL) + continue; + + if (file->attr_cb && !(*file->attr_cb)(file, file->cb_data, name)) + continue; + + count = ippGetCount(attr); + group_tag = ippGetGroupTag(attr); + value_tag = ippGetValueTag(attr); + + if (with_groups && group_tag != IPP_TAG_ZERO && group_tag != file->group_tag) + { + ret &= ippFileWriteToken(file, "GROUP"); + ret &= ippFileWriteTokenf(file, "%s\n", ippTagString(group_tag)); + file->group_tag = group_tag; + } + + ret &= ippFileWriteToken(file, group_tag == IPP_TAG_ZERO ? "MEMBER" : "ATTR"); + ret &= ippFileWriteToken(file, ippTagString(value_tag)); + ret &= ippFileWriteToken(file, name); + + switch (value_tag) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + for (i = 0; i < count; i ++) + ret &= cupsFilePrintf(file->fp, "%s%d", i ? "," : " ", ippGetInteger(attr, i)); + break; - if (!v->attrcb || (*v->attrcb)(&f, user_data, name)) - { - /* - * Add this attribute... - */ + case IPP_TAG_BOOLEAN : + ret &= cupsFilePuts(file->fp, ippGetBoolean(attr, 0) ? " true" : " false"); - attrs = f.attrs; - } - else - { - /* - * Ignore this attribute... - */ + for (i = 1; i < count; i ++) + ret &= cupsFilePuts(file->fp, ippGetBoolean(attr, 1) ? ",true" : ",false"); + break; - if (!ignored) - ignored = ippNew(); + case IPP_TAG_RANGE : + for (i = 0; i < count; i ++) + { + int upper, lower = ippGetRange(attr, i, &upper); + // Upper/lower range values - attrs = ignored; - } + ret &= cupsFilePrintf(file->fp, "%s%d-%d", i ? "," : " ", lower, upper); + } + break; - if (value_tag < IPP_TAG_INTEGER) - { - /* - * Add out-of-band attribute - no value string needed... - */ + case IPP_TAG_RESOLUTION : + for (i = 0; i < count; i ++) + { + ipp_res_t units; // Resolution units + int yres, xres = ippGetResolution(attr, i, &yres, &units); + // X/Y resolution - ippAddOutOfBand(attrs, f.group_tag, value_tag, name); - } - else - { - /* - * Add attribute with one or more values... - */ + if (xres == yres) + ret &= cupsFilePrintf(file->fp, "%s%d%s", i ? "," : " ", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); + else + ret &= cupsFilePrintf(file->fp, "%s%dx%d%s", i ? "," : " ", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); + } + break; - attr = ippAddString(attrs, f.group_tag, value_tag, name, NULL, NULL); + case IPP_TAG_DATE : + for (i = 0; i < count; i ++) + { + time_t utctime = ippDateToTime(ippGetDate(attr, i)); + // Date/time value + struct tm utcdate; // Date/time components - if (!parse_value(&f, v, user_data, attrs, &attr, 0)) - break; - } + // Get the UTC date and time corresponding to this date value... + gmtime_r(&utctime, &utcdate); - } - else if (attr && !_cups_strcasecmp(token, ",")) - { - /* - * Additional value... - */ + ret &= cupsFilePrintf(file->fp, "%s%04d-%02d-%02dT%02d:%02d:%02dZ", i ? "," : " ", utcdate.tm_year + 1900, utcdate.tm_mon + 1, utcdate.tm_mday, utcdate.tm_hour, utcdate.tm_min, utcdate.tm_sec); + } + break; - if (!parse_value(&f, v, user_data, attrs, &attr, ippGetCount(attr))) - break; - } - else - { - /* - * Something else... - */ + case IPP_TAG_STRING : + for (i = 0; i < count; i ++) + { + size_t len; // Length of octetString + const char *s = (const char *)ippGetOctetString(attr, i, &len); + // octetString value - attr = NULL; - attrs = NULL; + ret &= cupsFilePuts(file->fp, i ? "," : " "); + ret &= write_string(file, s, len); + } + break; + + case IPP_TAG_TEXT : + case IPP_TAG_TEXTLANG : + case IPP_TAG_NAME : + case IPP_TAG_NAMELANG : + case IPP_TAG_KEYWORD : + case IPP_TAG_URI : + case IPP_TAG_URISCHEME : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + for (i = 0; i < count; i ++) + { + const char *s = ippGetString(attr, i, NULL); + // String value - if (!(*v->tokencb)(&f, v, user_data, token)) - break; - } - } + ret &= cupsFilePuts(file->fp, i ? "," : " "); + ret &= write_string(file, s, strlen(s)); + } + break; + + case IPP_TAG_BEGIN_COLLECTION : + file->indent += 4; + for (i = 0; i < count; i ++) + { + ret &= cupsFilePuts(file->fp, i ? ",{\n" : " {\n"); + ret &= ippFileWriteAttributes(file, ippGetCollection(attr, i), false); + ret &= cupsFilePrintf(file->fp, "%*s}", file->indent - 4, ""); + } + file->indent -= 4; + break; - /* - * Close the file and free ignored attributes, then return any attributes we - * kept... - */ + default : + /* Out-of-band value */ + break; + } - cupsFileClose(f.fp); - ippDelete(ignored); + // Finish with a newline after the attribute definition + ret &= cupsFilePutChar(file->fp, '\n'); + } - return (f.attrs); + return (ret); } -/* - * '_ippFileReadToken()' - Read a token from an IPP data file. - */ +// +// 'ippFileWriteComment()' - Write a comment to an IPP data file. +// +// This function writes a comment to an IPP data file. Every line in the string +// is prefixed with the "#" character and indented as needed. +// -int /* O - 1 on success, 0 on failure */ -_ippFileReadToken(_ipp_file_t *f, /* I - File to read from */ - char *token, /* I - Token string buffer */ - size_t tokensize)/* I - Size of token string buffer */ +bool // O - `true` on success, `false` on error +ippFileWriteComment(ipp_file_t *file, // I - IPP data file + const char *comment,// I - Printf-style comment string + ...) // I - Additional arguments as needed { - int ch, /* Character from file */ - quote = 0; /* Quoting character */ - char *tokptr = token, /* Pointer into token buffer */ - *tokend = token + tokensize - 1;/* End of token buffer */ + bool ret = true; // Return value + va_list ap, // Pointer to arguments + ap2; // Copy of arguments + int bufsize; // Size of formatted string + const char *start, // Start of comment line + *ptr; // Pointer into comment - /* - * Skip whitespace and comments... - */ + // Range check input... + if (!file || file->mode != 'w' || !comment) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); + return (false); + } - DEBUG_printf("1_ippFileReadToken: linenum=%d, pos=%ld", f->linenum, (long)cupsFileTell(f->fp)); + // Format the comment... + va_start(ap, comment); + va_copy(ap2, ap); - while ((ch = cupsFileGetChar(f->fp)) != EOF) + if ((bufsize = vsnprintf(file->buffer, file->alloc_buffer, comment, ap2)) >= (int)file->alloc_buffer) { - if (_cups_isspace(ch)) + if (!expand_buffer(file, (size_t)bufsize + 1)) { - /* - * Whitespace... - */ - - if (ch == '\n') - { - f->linenum ++; - DEBUG_printf("1_ippFileReadToken: LF in leading whitespace, linenum=%d, pos=%ld", f->linenum, (long)cupsFileTell(f->fp)); - } + va_end(ap2); + va_end(ap); + return (false); } - else if (ch == '#') - { - /* - * Comment... - */ - DEBUG_puts("1_ippFileReadToken: Skipping comment in leading whitespace..."); + vsnprintf(file->buffer, file->alloc_buffer, comment, ap); + } - while ((ch = cupsFileGetChar(f->fp)) != EOF) - { - if (ch == '\n') - break; - } + va_end(ap2); + va_end(ap); - if (ch == '\n') - { - f->linenum ++; - DEBUG_printf("1_ippFileReadToken: LF at end of comment, linenum=%d, pos=%ld", f->linenum, (long)cupsFileTell(f->fp)); - } - else - break; - } - else - break; + // Make sure we start on a new line... + if (file->column > 0) + { + ret &= cupsFilePutChar(file->fp, '\n'); + file->column = 0; } - if (ch == EOF) + for (start = file->buffer, ptr = start; *ptr; start = ptr) { - DEBUG_puts("1_ippFileReadToken: EOF"); - return (0); + // Find the end of the line... + while (*ptr && *ptr != '\n') + ptr ++; + + // Write this line... + ret &= cupsFilePrintf(file->fp, "%*s# ", file->indent, ""); + ret &= cupsFileWrite(file->fp, start, (size_t)(ptr - start)); + ret &= cupsFilePutChar(file->fp, '\n'); + + // Skip newline, if any... + if (*ptr) + ptr ++; } - /* - * Read a token... - */ + return (ret); +} - while (ch != EOF) - { - if (ch == '\n') - { - f->linenum ++; - DEBUG_printf("1_ippFileReadToken: LF in token, linenum=%d, pos=%ld", f->linenum, (long)cupsFileTell(f->fp)); - } - if (ch == quote) - { - /* - * End of quoted text... - */ +// +// 'ippFileWriteToken()' - Write a token or value string to an IPP data file. +// +// This function writes a token or value string to an IPP data file, quoting +// and indenting the string as needed. +// - *tokptr = '\0'; - DEBUG_printf("1_ippFileReadToken: Returning \"%s\" at closing quote.", token); - return (1); - } - else if (!quote && _cups_isspace(ch)) - { - /* - * End of unquoted text... - */ +bool // O - `true` on success, `false` on error +ippFileWriteToken(ipp_file_t *file, // I - IPP data file + const char *token) // I - Token/value string +{ + const char *ptr; // Pointer into token/value string + bool ret = true; // Return value - *tokptr = '\0'; - DEBUG_printf("1_ippFileReadToken: Returning \"%s\" before whitespace.", token); - return (1); - } - else if (!quote && (ch == '\'' || ch == '\"')) - { - /* - * Start of quoted text or regular expression... - */ - quote = ch; + // Range check input... + if (!file || file->mode != 'w' || !token) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); + return (false); + } - DEBUG_printf("1_ippFileReadToken: Start of quoted string, quote=%c, pos=%ld", quote, (long)cupsFileTell(f->fp)); - } - else if (!quote && ch == '#') + // Handle indentation... + if (!strcmp(token, "}")) + { + // Add newline before '}' as needed and unindent... + if (file->column > 0) { - /* - * Start of comment... - */ - - cupsFileSeek(f->fp, cupsFileTell(f->fp) - 1); - *tokptr = '\0'; - DEBUG_printf("1_ippFileReadToken: Returning \"%s\" before comment.", token); - return (1); + ret &= cupsFilePutChar(file->fp, '\n'); + file->column = 0; } - else if (!quote && (ch == '{' || ch == '}' || ch == ',')) - { - /* - * Delimiter... - */ - if (tokptr > token) - { - /* - * Return the preceding token first... - */ + if (file->indent > 0) + file->indent -= 4; + } - cupsFileSeek(f->fp, cupsFileTell(f->fp) - 1); - } - else - { - /* - * Return this delimiter by itself... - */ + if (file->column == 0 && file->indent > 0) + { + ret &= cupsFilePrintf(file->fp, "%*s", file->indent, ""); + file->column += file->indent; + } + else if (strcmp(token, "{") && strcmp(token, "}")) + { + ret &= cupsFilePutChar(file->fp, ' '); + file->column ++; + } - *tokptr++ = (char)ch; - } + // Look for whitespace or special characters... + for (ptr = token; *ptr; ptr ++) + { + if (strchr(" \t\'\"\\", *ptr)) + break; + } - *tokptr = '\0'; - DEBUG_printf("1_ippFileReadToken: Returning \"%s\".", token); - return (1); + if (*ptr) + { + // Need to quote the string + ret &= write_string(file, token, strlen(token)); + } + else if (!strcmp(token, "{")) + { + // Add newline after '{' and indent... + ret &= cupsFilePuts(file->fp, "{\n"); + file->column = 0; + file->indent += 4; + } + else if (!strcmp(token, "}")) + { + // Add newline after '}'... + ret &= cupsFilePuts(file->fp, "}\n"); + file->column = 0; + } + else + { + // Just write the string as-is... + ret &= cupsFilePuts(file->fp, token); + + if ((ptr = token + strlen(token) - 1) >= token && *ptr == '\n') + { + // New line... + file->column = 0; } else { - if (ch == '\\') - { - /* - * Quoted character... - */ - - DEBUG_printf("1_ippFileReadToken: Quoted character at pos=%ld", (long)cupsFileTell(f->fp)); - - if ((ch = cupsFileGetChar(f->fp)) == EOF) - { - *token = '\0'; - DEBUG_puts("1_ippFileReadToken: EOF"); - return (0); - } - else if (ch == '\n') - { - f->linenum ++; - DEBUG_printf("1_ippFileReadToken: quoted LF, linenum=%d, pos=%ld", f->linenum, (long)cupsFileTell(f->fp)); - } - else if (ch == 'a') - ch = '\a'; - else if (ch == 'b') - ch = '\b'; - else if (ch == 'f') - ch = '\f'; - else if (ch == 'n') - ch = '\n'; - else if (ch == 'r') - ch = '\r'; - else if (ch == 't') - ch = '\t'; - else if (ch == 'v') - ch = '\v'; - } - - if (tokptr < tokend) - { - /* - * Add to current token... - */ - - *tokptr++ = (char)ch; - } - else - { - /* - * Token too long... - */ - - *tokptr = '\0'; - DEBUG_printf("1_ippFileReadToken: Too long: \"%s\".", token); - return (0); - } + // Existing line... + file->column += strlen(token); } - - /* - * Get the next character... - */ - - ch = cupsFileGetChar(f->fp); } - *tokptr = '\0'; - DEBUG_printf("1_ippFileReadToken: Returning \"%s\" at EOF.", token); - - return (tokptr > token); + return (ret); } -/* - * 'parse_collection()' - Parse an IPP collection value. - */ +// +// 'ippFileWriteTokenf()' - Write a formatted token or value string to an IPP data file. +// +// This function writes a formatted token or value string to an IPP data file, +// quoting and indenting the string as needed. +// -static ipp_t * /* O - Collection value or @code NULL@ on error */ -parse_collection( - _ipp_file_t *f, /* I - IPP data file */ - _ipp_vars_t *v, /* I - IPP variables */ - void *user_data) /* I - User data pointer */ +bool // O - `true` on success, `false` on error +ippFileWriteTokenf(ipp_file_t *file, // I - IPP data file + const char *token, // I - Printf-style token/value string + ...) // I - Additional arguments as needed { - ipp_t *col = ippNew(); /* Collection value */ - ipp_attribute_t *attr = NULL; /* Current member attribute */ - char token[1024]; /* Token string */ + va_list ap, // Pointer to arguments + ap2; // Copy of arguments + int bufsize; // Size of formatted string + + // Range check input... + if (!file || file->mode != 'w' || !token) + { + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(EINVAL), 0); + return (false); + } - /* - * Parse the collection value... - */ + // Format the message... + va_start(ap, token); + va_copy(ap2, ap); - while (_ippFileReadToken(f, token, sizeof(token))) + if ((bufsize = vsnprintf(file->buffer, file->alloc_buffer, token, ap2)) >= (int)file->alloc_buffer) { - if (!_cups_strcasecmp(token, "}")) + if (!expand_buffer(file, (size_t)bufsize + 1)) { - /* - * End of collection value... - */ - - break; + va_end(ap2); + va_end(ap); + return (false); } - else if (!_cups_strcasecmp(token, "MEMBER")) - { - /* - * Member attribute definition... - */ - - char syntax[128], /* Attribute syntax (value tag) */ - name[128]; /* Attribute name */ - ipp_tag_t value_tag; /* Value tag */ - - attr = NULL; - if (!_ippFileReadToken(f, syntax, sizeof(syntax))) - { - report_error(f, v, user_data, "Missing MEMBER syntax on line %d of \"%s\".", f->linenum, f->filename); - ippDelete(col); - col = NULL; - break; - } - else if ((value_tag = ippTagValue(syntax)) < IPP_TAG_UNSUPPORTED_VALUE) - { - report_error(f, v, user_data, "Bad MEMBER syntax \"%s\" on line %d of \"%s\".", syntax, f->linenum, f->filename); - ippDelete(col); - col = NULL; - break; - } + vsnprintf(file->buffer, file->alloc_buffer, token, ap); + } - if (!_ippFileReadToken(f, name, sizeof(name)) || !name[0]) - { - report_error(f, v, user_data, "Missing MEMBER name on line %d of \"%s\".", f->linenum, f->filename); - ippDelete(col); - col = NULL; - break; - } + va_end(ap2); + va_end(ap); - if (value_tag < IPP_TAG_INTEGER) - { - /* - * Add out-of-band attribute - no value string needed... - */ + return (ippFileWriteToken(file, file->buffer)); +} - ippAddOutOfBand(col, IPP_TAG_ZERO, value_tag, name); - } - else - { - /* - * Add attribute with one or more values... - */ - attr = ippAddString(col, IPP_TAG_ZERO, value_tag, name, NULL, NULL); +// +// 'expand_buffer()' - Expand the output buffer of the IPP data file as needed. +// - if (!parse_value(f, v, user_data, col, &attr, 0)) - { - ippDelete(col); - col = NULL; - break; - } - } +static bool // O - `true` on success, `false` on failure +expand_buffer(ipp_file_t *file, // I - IPP data file + size_t buffer_size) // I - Required size +{ + char *buffer; // New buffer pointer - } - else if (attr && !_cups_strcasecmp(token, ",")) - { - /* - * Additional value... - */ - if (!parse_value(f, v, user_data, col, &attr, ippGetCount(attr))) - { - ippDelete(col); - col = NULL; - break; - } - } - else - { - /* - * Something else... - */ + // If we already have enough, return right away... + if (buffer_size <= file->alloc_buffer) + return (true); - report_error(f, v, user_data, "Unknown directive \"%s\" on line %d of \"%s\".", token, f->linenum, f->filename); - ippDelete(col); - col = NULL; - attr = NULL; - break; + // Try allocating/expanding the current buffer... + if ((buffer = realloc(file->buffer, buffer_size)) == NULL) + return (false); - } - } + // Save new buffer and size... + file->buffer = buffer; + file->alloc_buffer = buffer_size; - return (col); + return (true); } -/* - * 'parse_value()' - Parse an IPP value. - */ +// +// 'parse_value()' - Parse an IPP value. +// -static int /* O - 1 on success or 0 on error */ -parse_value(_ipp_file_t *f, /* I - IPP data file */ - _ipp_vars_t *v, /* I - IPP variables */ - void *user_data,/* I - User data pointer */ - ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - IPP attribute */ - int element) /* I - Element number */ +static bool // O - `true` on success or `false` on error +parse_value(ipp_file_t *file, // I - IPP data file + ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - IPP attribute + size_t element) // I - Element number { - char value[2049], /* Value string */ - *valueptr, /* Pointer into value string */ - temp[2049], /* Temporary string */ - *tempptr; /* Pointer into temporary string */ - size_t valuelen; /* Length of value */ + char value[2049], // Value string + *valueptr, // Pointer into value string + temp[2049], // Temporary string + *tempptr; // Pointer into temporary string + size_t valuelen; // Length of value - if (!_ippFileReadToken(f, temp, sizeof(temp))) + ippFileSavePosition(file); + + if (!ippFileReadToken(file, temp, sizeof(temp))) { - report_error(f, v, user_data, "Missing value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + report_error(file, "Missing value on line %d of '%s'.", file->linenum, file->filename); + return (false); } - _ippVarsExpand(v, value, temp, sizeof(value)); + ippFileExpandVars(file, value, temp, sizeof(value)); switch (ippGetValueTag(*attr)) { @@ -575,24 +1588,21 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */ case IPP_TAG_DATE : { - int year, /* Year */ - month, /* Month */ - day, /* Day of month */ - hour, /* Hour */ - minute, /* Minute */ - second, /* Second */ - utc_offset = 0; /* Timezone offset from UTC */ - ipp_uchar_t date[11]; /* dateTime value */ + int year, // Year + month, // Month + day, // Day of month + hour, // Hour + minute, // Minute + second, // Second + utc_offset = 0; // Timezone offset from UTC + ipp_uchar_t date[11]; // dateTime value if (*value == 'P') { - /* - * Time period... - */ - - time_t curtime; /* Current time in seconds */ - int period = 0, /* Current period value */ - saw_T = 0; /* Saw time separator */ + // Time period... + time_t curtime; // Current time in seconds + int period = 0; // Current period value + bool saw_T = false; // Saw time separator? curtime = time(NULL); @@ -604,8 +1614,8 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */ if (!valueptr || period < 0) { - report_error(f, v, user_data, "Bad dateTime value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); - return (0); + report_error(file, "Bad dateTime value \"%s\" on line %d of '%s'.", value, file->linenum, file->filename); + return (false); } } @@ -640,13 +1650,13 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */ } else if (*valueptr == 'T') { - saw_T = 1; + saw_T = true; period = 0; } else { - report_error(f, v, user_data, "Bad dateTime value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); - return (0); + report_error(file, "Bad dateTime value \"%s\" on line %d of '%s'.", value, file->linenum, file->filename); + return (false); } } @@ -654,12 +1664,9 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */ } else if (sscanf(value, "%d-%d-%dT%d:%d:%d%d", &year, &month, &day, &hour, &minute, &second, &utc_offset) < 6) { - /* - * Date/time value did not parse... - */ - - report_error(f, v, user_data, "Bad dateTime value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); - return (0); + // Date/time value did not parse... + report_error(file, "Bad dateTime value \"%s\" on line %d of '%s'.", value, file->linenum, file->filename); + return (false); } date[0] = (ipp_uchar_t)(year >> 8); @@ -688,21 +1695,21 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */ case IPP_TAG_RESOLUTION : { - int xres, /* X resolution */ - yres; /* Y resolution */ - char *ptr; /* Pointer into value */ + int xres, // X resolution + yres; // Y resolution + char *ptr; // Pointer into value - xres = yres = (int)strtol(value, &ptr, 10); + xres = yres = (int)strtol(value, (char **)&ptr, 10); if (ptr > value && xres > 0) { if (*ptr == 'x') - yres = (int)strtol(ptr + 1, &ptr, 10); + yres = (int)strtol(ptr + 1, (char **)&ptr, 10); } if (ptr <= value || xres <= 0 || yres <= 0 || !ptr || (_cups_strcasecmp(ptr, "dpi") && _cups_strcasecmp(ptr, "dpc") && _cups_strcasecmp(ptr, "dpcm") && _cups_strcasecmp(ptr, "other"))) { - report_error(f, v, user_data, "Bad resolution value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); - return (0); + report_error(file, "Bad resolution value \"%s\" on line %d of '%s'.", value, file->linenum, file->filename); + return (false); } if (!_cups_strcasecmp(ptr, "dpi")) @@ -715,13 +1722,13 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */ case IPP_TAG_RANGE : { - int lower, /* Lower value */ - upper; /* Upper value */ + int lower, // Lower value + upper; // Upper value if (sscanf(value, "%d-%d", &lower, &upper) != 2) { - report_error(f, v, user_data, "Bad rangeOfInteger value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); - return (0); + report_error(file, "Bad rangeOfInteger value \"%s\" on line %d of '%s'.", value, file->linenum, file->filename); + return (false); } return (ippSetRange(ipp, attr, element, lower, upper)); @@ -734,19 +1741,19 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */ { if (valuelen & 1) { - report_error(f, v, user_data, "Bad octetString value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + report_error(file, "Bad octetString value on line %d of '%s'.", file->linenum, file->filename); + return (false); } valueptr = value + 1; tempptr = temp; - while (*valueptr && *valueptr != '>') + while (*valueptr && *valueptr != '>' && tempptr < (temp + sizeof(temp))) { if (!isxdigit(valueptr[0] & 255) || !isxdigit(valueptr[1] & 255)) { - report_error(f, v, user_data, "Bad octetString value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + report_error(file, "Bad octetString value on line %d of '%s'.", file->linenum, file->filename); + return (false); } if (valueptr[0] >= '0' && valueptr[0] <= '9') @@ -760,12 +1767,23 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */ *tempptr |= (tolower(valueptr[1]) - 'a' + 10); tempptr ++; + valueptr += 2; } - return (ippSetOctetString(ipp, attr, element, temp, (int)(tempptr - temp))); + if (*valueptr != '>') + { + if (*valueptr) + report_error(file, "octetString value too long on line %d of '%s'.", file->linenum, file->filename); + else + report_error(file, "Bad octetString value on line %d of '%s'.", file->linenum, file->filename); + + return (false); + } + + return (ippSetOctetString(ipp, attr, element, temp, (size_t)(tempptr - temp))); } else - return (ippSetOctetString(ipp, attr, element, value, (int)valuelen)); + return (ippSetOctetString(ipp, attr, element, value, valuelen)); case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : @@ -781,17 +1799,13 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */ case IPP_TAG_BEGIN_COLLECTION : { - int status; /* Add status */ - ipp_t *col; /* Collection value */ + bool status; // Add status + ipp_t *col; // Collection value - if (strcmp(value, "{")) - { - report_error(f, v, user_data, "Bad collection value on line %d of \"%s\".", f->linenum, f->filename); - return (0); - } + ippFileRestorePosition(file); - if ((col = parse_collection(f, v, user_data)) == NULL) - return (0); + if ((col = ippFileReadCollection(file)) == NULL) + return (false); status = ippSetCollection(ipp, attr, element, col); ippDelete(col); @@ -800,34 +1814,85 @@ parse_value(_ipp_file_t *f, /* I - IPP data file */ } default : - report_error(f, v, user_data, "Unsupported value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + report_error(file, "Unsupported value on line %d of '%s'.", file->linenum, file->filename); + return (false); } } -/* - * 'report_error()' - Report an error. - */ +// +// 'report_error()' - Report an error. +// -static void +static bool // O - `true` to continue, `false` to stop report_error( - _ipp_file_t *f, /* I - IPP data file */ - _ipp_vars_t *v, /* I - Error callback function, if any */ - void *user_data, /* I - User data pointer */ - const char *message, /* I - Printf-style message */ - ...) /* I - Additional arguments as needed */ + ipp_file_t *file, // I - IPP data file + const char *message, // I - Printf-style message + ...) // I - Additional arguments as needed { - char buffer[8192]; /* Formatted string */ - va_list ap; /* Argument pointer */ + va_list ap; // Argument pointer + char buffer[8192]; // Formatted string va_start(ap, message); vsnprintf(buffer, sizeof(buffer), message, ap); va_end(ap); - if (v->errorcb) - (*v->errorcb)(f, user_data, buffer); - else - fprintf(stderr, "%s\n", buffer); + if (file->error_cb) + return ((*file->error_cb)(file, file->cb_data, buffer)); + + fprintf(stderr, "%s\n", buffer); + return (false); +} + + +// +// 'write_string()' - Write a quoted string value. +// + +static bool // O - `true` on success, `false` on failure +write_string(ipp_file_t *file, // I - IPP data file + const char *s, // I - String + size_t len) // I - Length of string +{ + bool ret = true; // Return value + const char *start, // Start of string + *ptr, // Pointer into string + *end; // End of string + + + // Start with a double quote... + ret &= cupsFilePutChar(file->fp, '\"'); + file->column ++; + + // Loop through the string... + for (start = s, end = s + len, ptr = start; ptr < end; ptr ++) + { + if (*ptr == '\"' || *ptr == '\\') + { + // Something that needs to be quoted... + if (ptr > start) + { + // Write lead-in text... + ret &= cupsFileWrite(file->fp, start, (size_t)(ptr - start)); + file->column += ptr - start; + } + + // Then quote the " or \... + ret &= cupsFilePrintf(file->fp, "\\%c", *ptr); + start = ptr + 1; + file->column ++; + } + } + + if (ptr > start) + { + ret &= cupsFileWrite(file->fp, start, (size_t)(ptr - start)); + file->column += ptr - start; + } + + ret &= cupsFilePutChar(file->fp, '\"'); + file->column ++; + + return (ret); } diff --git a/cups/ipp-private.h b/cups/ipp-private.h index fa5e435503..71d26db091 100644 --- a/cups/ipp-private.h +++ b/cups/ipp-private.h @@ -1,219 +1,157 @@ -/* - * 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. - */ +// +// Private IPP definitions for CUPS. +// +// Copyright © 2021-2023 by OpenPrinting. +// 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 */ +# endif // __cplusplus -/* - * Constants... - */ +// +// Constants... +// # define IPP_BUF_SIZE (IPP_MAX_LENGTH + 2) - /* Size of buffer */ + // Size of buffer +# define _IPP_MAX_FIND 8 // Size of find stack -/* - * Structures... - */ +// +// Structures... +// -typedef union _ipp_request_u /**** Request Header ****/ +typedef union _ipp_request_u // Request Header { - struct /* Any 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 */ + 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 */ + struct // Operation Header { - ipp_uchar_t version[2]; /* Protocol version number */ - ipp_op_t operation_id; /* Operation ID */ - int request_id; /* Request ID */ + ipp_uchar_t version[2]; // Protocol version number + ipp_op_t operation_id; // Operation ID + int request_id; // Request ID } op; - struct /* Status Header */ + struct // Status Header { - ipp_uchar_t version[2]; /* Protocol version number */ - ipp_status_t status_code; /* Status code */ - int request_id; /* Request ID */ + 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@ */ + struct // Event Header { - ipp_uchar_t version[2]; /* Protocol version number */ - ipp_status_t status_code; /* Status code */ - int request_id; /* Request ID */ + 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 ****/ +typedef union _ipp_value_u // Attribute Value { - int integer; /* Integer/enumerated value */ + int integer; // Integer/enumerated value - char boolean; /* Boolean value */ + char boolean; // Boolean value - ipp_uchar_t date[11]; /* Date/time 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 */ + 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 */ + 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 */ + 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 */ + 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_t *collection; // Collection value } _ipp_value_t; -struct _ipp_attribute_s /**** IPP attribute ****/ +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 */ + 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 ****/ +typedef struct _ipp_find_s // IPP find data { - 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 */ + ipp_attribute_t *attr; // Current attribute + int idx; // Current attribute index for hierarchical search + bool atend; // At the end of the message? +} _ipp_find_t; + +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 + ipp_attribute_t *prev; // Previous attribute (for read) + int use; // Use count + _ipp_find_t fstack[_IPP_MAX_FIND]; + // Find stack + _ipp_find_t *find; // Current find }; -typedef struct _ipp_option_s /**** Attribute mapping data ****/ +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 */ + 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 */ + 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 */ -}; +// +// Functions... +// -/* - * Prototypes for private functions... - */ - -/* encode.c */ #ifdef DEBUG extern const char *_ippCheckOptions(void) _CUPS_PRIVATE; -#endif /* DEBUG */ +#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_ */ +# endif // __cplusplus +#endif // !_CUPS_IPP_H_ diff --git a/cups/ipp-support.c b/cups/ipp-support.c index 450d645c55..9bdf809b40 100644 --- a/cups/ipp-support.c +++ b/cups/ipp-support.c @@ -1,25 +1,20 @@ -/* - * Internet Printing Protocol support functions for CUPS. - * - * Copyright © 2023 by OpenPrinting. - * Copyright © 2007-2018 by Apple Inc. - * Copyright © 1997-2007 by Easy Software Products, all rights reserved. - * - * Licensed under Apache License v2.0. See the file "LICENSE" for more - * information. - */ - -/* - * Include necessary headers... - */ +// +// Internet Printing Protocol support functions for CUPS. +// +// Copyright © 2023 by OpenPrinting. +// Copyright © 2007-2018 by Apple Inc. +// Copyright © 1997-2007 by Easy Software Products, all rights reserved. +// +// Licensed under Apache License v2.0. See the file "LICENSE" for more +// information. +// #include "cups-private.h" -#include "debug-internal.h" -/* - * Local globals... - */ +// +// Local globals... +// static const char * const ipp_states[] = { @@ -29,8 +24,8 @@ static const char * const ipp_states[] = "IPP_STATE_ATTRIBUTE", "IPP_STATE_DATA" }; -static const char * const ipp_status_oks[] = /* "OK" status codes */ - { /* (name) = abandoned standard value */ +static const char * const ipp_status_oks[] = // "OK" status codes + { // (name) = abandoned standard value "successful-ok", "successful-ok-ignored-or-substituted-attributes", "successful-ok-conflicting-attributes", @@ -40,8 +35,8 @@ static const char * const ipp_status_oks[] = /* "OK" status codes */ "(successful-ok-but-cancel-subscription)", "successful-ok-events-complete" }, - * const ipp_status_400s[] = /* Client errors */ - { /* (name) = abandoned standard value */ + * const ipp_status_400s[] = // Client errors + { // (name) = abandoned standard value "client-error-bad-request", "client-error-forbidden", "client-error-not-authenticated", @@ -76,9 +71,9 @@ static const char * const ipp_status_oks[] = /* "OK" status codes */ "client-error-account-authorization-failed", "client-error-not-fetchable" }, - * const ipp_status_480s[] = /* Vendor client errors */ + * const ipp_status_480s[] = // Vendor client errors { - /* 0x0480 - 0x048F */ + // 0x0480 - 0x048F "0x0480", "0x0481", "0x0482", @@ -95,7 +90,7 @@ static const char * const ipp_status_oks[] = /* "OK" status codes */ "0x048D", "0x048E", "0x048F", - /* 0x0490 - 0x049F */ + // 0x0490 - 0x049F "0x0490", "0x0491", "0x0492", @@ -113,7 +108,7 @@ static const char * const ipp_status_oks[] = /* "OK" status codes */ "cups-error-account-limit-reached", "cups-error-account-authorization-failed" }, - * const ipp_status_500s[] = /* Server errors */ + * const ipp_status_500s[] = // Server errors { "server-error-internal-error", "server-error-operation-not-supported", @@ -129,7 +124,7 @@ static const char * const ipp_status_oks[] = /* "OK" status codes */ "server-error-too-many-jobs", "server-error-too-many-documents" }, - * const ipp_status_1000s[] = /* CUPS internal */ + * const ipp_status_1000s[] = // CUPS internal { "cups-authentication-canceled", "cups-pki-error", @@ -137,120 +132,120 @@ static const char * const ipp_status_oks[] = /* "OK" status codes */ }; static const char * const ipp_std_ops[] = { - /* 0x0000 - 0x000f */ + // 0x0000 - 0x000f "0x0000", "0x0001", - "Print-Job", /* RFC 8011 */ - "Print-URI", /* RFC 8011 */ - "Validate-Job", /* RFC 8011 */ - "Create-Job", /* RFC 8011 */ - "Send-Document", /* RFC 8011 */ - "Send-URI", /* RFC 8011 */ - "Cancel-Job", /* RFC 8011 */ - "Get-Job-Attributes", /* RFC 8011 */ - "Get-Jobs", /* RFC 8011 */ - "Get-Printer-Attributes", /* RFC 8011 */ - "Hold-Job", /* RFC 8011 */ - "Release-Job", /* RFC 8011 */ - "Restart-Job", /* RFC 8011 */ + "Print-Job", // RFC 8011 + "Print-URI", // RFC 8011 + "Validate-Job", // RFC 8011 + "Create-Job", // RFC 8011 + "Send-Document", // RFC 8011 + "Send-URI", // RFC 8011 + "Cancel-Job", // RFC 8011 + "Get-Job-Attributes", // RFC 8011 + "Get-Jobs", // RFC 8011 + "Get-Printer-Attributes", // RFC 8011 + "Hold-Job", // RFC 8011 + "Release-Job", // RFC 8011 + "Restart-Job", // RFC 8011 "0x000f", - /* 0x0010 - 0x001f */ - "Pause-Printer", /* RFC 8011 */ - "Resume-Printer", /* RFC 8011 */ - "Purge-Jobs", /* RFC 8011 */ - "Set-Printer-Attributes", /* RFC 3380 */ - "Set-Job-Attributes", /* RFC 3380 */ - "Get-Printer-Supported-Values", /* RFC 3380 */ - "Create-Printer-Subscriptions", /* RFC 3995 */ - "Create-Job-Subscriptions", /* RFC 3995 */ - "Get-Subscription-Attributes", /* RFC 3995 */ - "Get-Subscriptions", /* RFC 3995 */ - "Renew-Subscription", /* RFC 3995 */ - "Cancel-Subscription", /* RFC 3995 */ - "Get-Notifications", /* RFC 3996 */ + // 0x0010 - 0x001f + "Pause-Printer", // RFC 8011 + "Resume-Printer", // RFC 8011 + "Purge-Jobs", // RFC 8011 + "Set-Printer-Attributes", // RFC 3380 + "Set-Job-Attributes", // RFC 3380 + "Get-Printer-Supported-Values",// RFC 3380 + "Create-Printer-Subscriptions",// RFC 3995 + "Create-Job-Subscriptions", // RFC 3995 + "Get-Subscription-Attributes",// RFC 3995 + "Get-Subscriptions", // RFC 3995 + "Renew-Subscription", // RFC 3995 + "Cancel-Subscription", // RFC 3995 + "Get-Notifications", // RFC 3996 "(Send-Notifications)", - "Get-Resource-Attributes", /* IPP System */ + "Get-Resource-Attributes", // IPP System "(Get-Resource-Data)", - /* 0x0020 - 0x002f */ - "Get-Resources", /* IPP System */ + // 0x0020 - 0x002f + "Get-Resources", // IPP System "(Get-Printer-Support-Files)", - "Enable-Printer", /* RFC 3998 */ - "Disable-Printer", /* RFC 3998 */ - "Pause-Printer-After-Current-Job", /* RFC 3998 */ - "Hold-New-Jobs", /* RFC 3998 */ - "Release-Held-New-Jobs", /* RFC 3998 */ - "Deactivate-Printer", /* RFC 3998 */ - "Activate-Printer", /* RFC 3998 */ - "Restart-Printer", /* RFC 3998 */ - "Shutdown-Printer", /* RFC 3998 */ - "Startup-Printer", /* RFC 3998 */ - "Reprocess-Job", /* RFC 3998 */ - "Cancel-Current-Job", /* RFC 3998 */ - "Suspend-Current-Job", /* RFC 3998 */ - "Resume-Job", /* RFC 3998 */ - - /* 0x0030 - 0x003f */ - "Promote-Job", /* RFC 3998 */ - "Schedule-Job-After", /* RFC 3998 */ + "Enable-Printer", // RFC 3998 + "Disable-Printer", // RFC 3998 + "Pause-Printer-After-Current-Job",// RFC 3998 + "Hold-New-Jobs", // RFC 3998 + "Release-Held-New-Jobs", // RFC 3998 + "Deactivate-Printer", // RFC 3998 + "Activate-Printer", // RFC 3998 + "Restart-Printer", // RFC 3998 + "Shutdown-Printer", // RFC 3998 + "Startup-Printer", // RFC 3998 + "Reprocess-Job", // RFC 3998 + "Cancel-Current-Job", // RFC 3998 + "Suspend-Current-Job", // RFC 3998 + "Resume-Job", // RFC 3998 + + // 0x0030 - 0x003f + "Promote-Job", // RFC 3998 + "Schedule-Job-After", // RFC 3998 "0x0032", - "Cancel-Document", /* IPP DocObject */ - "Get-Document-Attributes", /* IPP DocObject */ - "Get-Documents", /* IPP DocObject */ - "Delete-Document", /* IPP DocObject */ - "Set-Document-Attributes", /* IPP DocObject */ - "Cancel-Jobs", /* IPP JPS2 */ - "Cancel-My-Jobs", /* IPP JPS2 */ - "Resubmit-Job", /* IPP JPS2 */ - "Close-Job", /* IPP JPS2 */ - "Identify-Printer", /* IPP JPS3 */ - "Validate-Document", /* IPP JPS3 */ - "Add-Document-Images", /* IPP Scan */ - "Acknowledge-Document", /* IPP INFRA */ - - /* 0x0040 - 0x004f */ - "Acknowledge-Identify-Printer", /* IPP INFRA */ - "Acknowledge-Job", /* IPP INFRA */ - "Fetch-Document", /* IPP INFRA */ - "Fetch-Job", /* IPP INFRA */ - "Get-Output-Device-Attributes", /* IPP INFRA */ - "Update-Active-Jobs", /* IPP INFRA */ - "Deregister-Output-Device", /* IPP INFRA */ - "Update-Document-Status", /* IPP INFRA */ - "Update-Job-Status", /* IPP INFRA */ - "Update-Output-Device-Attributes", /* IPP INFRA */ - "Get-Next-Document-Data", /* IPP Scan */ - "Allocate-Printer-Resources", /* IPP System */ - "Create-Printer", /* IPP System */ - "Deallocate-Printer-Resources", /* IPP System */ - "Delete-Printer", /* IPP System */ - "Get-Printers", /* IPP System */ - - /* 0x0050 - 0x005f */ - "Shutdown-One-Printer", /* IPP System */ - "Startup-One-Printer", /* IPP System */ - "Cancel-Resource", /* IPP System */ - "Create-Resource", /* IPP System */ - "Install-Resource", /* IPP System */ - "Send-Resource-Data", /* IPP System */ - "Set-Resource-Attributes", /* IPP System */ - "Create-Resource-Subscriptions", /* IPP System */ - "Create-System-Subscriptions", /* IPP System */ - "Disable-All-Printers", /* IPP System */ - "Enable-All-Printers", /* IPP System */ - "Get-System-Attributes", /* IPP System */ - "Get-System-Supported-Values", /* IPP System */ - "Pause-All-Printers", /* IPP System */ - "Pause-All-Printers-After-Current-Job", /* IPP System */ - "Register-Output-Device", /* IPP System */ - - /* 0x0060 - 0x0064 */ - "Restart-System", /* IPP System */ - "Resume-All-Printers", /* IPP System */ - "Set-System-Attributes", /* IPP System */ - "Shutdown-All-Printers", /* IPP System */ - "Startup-All-Printers" /* IPP System */ + "Cancel-Document", // IPP DocObject + "Get-Document-Attributes", // IPP DocObject + "Get-Documents", // IPP DocObject + "Delete-Document", // IPP DocObject + "Set-Document-Attributes", // IPP DocObject + "Cancel-Jobs", // IPP JPS2 + "Cancel-My-Jobs", // IPP JPS2 + "Resubmit-Job", // IPP JPS2 + "Close-Job", // IPP JPS2 + "Identify-Printer", // IPP JPS3 + "Validate-Document", // IPP JPS3 + "Add-Document-Images", // IPP Scan + "Acknowledge-Document", // IPP INFRA + + // 0x0040 - 0x004f + "Acknowledge-Identify-Printer",// IPP INFRA + "Acknowledge-Job", // IPP INFRA + "Fetch-Document", // IPP INFRA + "Fetch-Job", // IPP INFRA + "Get-Output-Device-Attributes",// IPP INFRA + "Update-Active-Jobs", // IPP INFRA + "Deregister-Output-Device", // IPP INFRA + "Update-Document-Status", // IPP INFRA + "Update-Job-Status", // IPP INFRA + "Update-Output-Device-Attributes",// IPP INFRA + "Get-Next-Document-Data", // IPP Scan + "Allocate-Printer-Resources", // IPP System + "Create-Printer", // IPP System + "Deallocate-Printer-Resources",// IPP System + "Delete-Printer", // IPP System + "Get-Printers", // IPP System + + // 0x0050 - 0x005f + "Shutdown-One-Printer", // IPP System + "Startup-One-Printer", // IPP System + "Cancel-Resource", // IPP System + "Create-Resource", // IPP System + "Install-Resource", // IPP System + "Send-Resource-Data", // IPP System + "Set-Resource-Attributes", // IPP System + "Create-Resource-Subscriptions",// IPP System + "Create-System-Subscriptions",// IPP System + "Disable-All-Printers", // IPP System + "Enable-All-Printers", // IPP System + "Get-System-Attributes", // IPP System + "Get-System-Supported-Values",// IPP System + "Pause-All-Printers", // IPP System + "Pause-All-Printers-After-Current-Job",// IPP System + "Register-Output-Device", // IPP System + + // 0x0060 - 0x0064 + "Restart-System", // IPP System + "Resume-All-Printers", // IPP System + "Set-System-Attributes", // IPP System + "Shutdown-All-Printers", // IPP System + "Startup-All-Printers" // IPP System }, * const ipp_cups_ops[] = { @@ -276,104 +271,104 @@ static const char * const ipp_std_ops[] = "CUPS-Create-Local-Printer" }, * const ipp_tag_names[] = - { /* Value/group tag names */ - "zero", /* 0x00 */ + { // Value/group tag names + "zero", // 0x00 "operation-attributes-tag", - /* 0x01 */ - "job-attributes-tag", /* 0x02 */ + // 0x01 + "job-attributes-tag", // 0x02 "end-of-attributes-tag", - /* 0x03 */ + // 0x03 "printer-attributes-tag", - /* 0x04 */ + // 0x04 "unsupported-attributes-tag", - /* 0x05 */ + // 0x05 "subscription-attributes-tag", - /* 0x06 - RFC 3995 */ + // 0x06 - RFC 3995 "event-notification-attributes-tag", - /* 0x07 - RFC 3995 */ + // 0x07 - RFC 3995 "resource-attributes-tag", - /* 0x08 - IPP System */ + // 0x08 - IPP System "document-attributes-tag", - /* 0x09 - IPP DocObject */ + // 0x09 - IPP DocObject "system-attributes-tag", - /* 0x0a - IPP System */ - "0x0b", /* 0x0b */ - "0x0c", /* 0x0c */ - "0x0d", /* 0x0d */ - "0x0e", /* 0x0e */ - "0x0f", /* 0x0f */ - "unsupported", /* 0x10 */ - "default", /* 0x11 */ - "unknown", /* 0x12 */ - "no-value", /* 0x13 */ - "0x14", /* 0x14 */ - "not-settable", /* 0x15 - RFC 3380 */ - "delete-attribute", /* 0x16 - RFC 3380 */ - "admin-define", /* 0x17 - RFC 3380 */ - "0x18", /* 0x18 */ - "0x19", /* 0x19 */ - "0x1a", /* 0x1a */ - "0x1b", /* 0x1b */ - "0x1c", /* 0x1c */ - "0x1d", /* 0x1d */ - "0x1e", /* 0x1e */ - "0x1f", /* 0x1f */ - "0x20", /* 0x20 */ - "integer", /* 0x21 */ - "boolean", /* 0x22 */ - "enum", /* 0x23 */ - "0x24", /* 0x24 */ - "0x25", /* 0x25 */ - "0x26", /* 0x26 */ - "0x27", /* 0x27 */ - "0x28", /* 0x28 */ - "0x29", /* 0x29 */ - "0x2a", /* 0x2a */ - "0x2b", /* 0x2b */ - "0x2c", /* 0x2c */ - "0x2d", /* 0x2d */ - "0x2e", /* 0x2e */ - "0x2f", /* 0x2f */ - "octetString", /* 0x30 */ - "dateTime", /* 0x31 */ - "resolution", /* 0x32 */ - "rangeOfInteger", /* 0x33 */ - "collection", /* 0x34 */ - "textWithLanguage", /* 0x35 */ - "nameWithLanguage", /* 0x36 */ - "endCollection", /* 0x37 */ - "0x38", /* 0x38 */ - "0x39", /* 0x39 */ - "0x3a", /* 0x3a */ - "0x3b", /* 0x3b */ - "0x3c", /* 0x3c */ - "0x3d", /* 0x3d */ - "0x3e", /* 0x3e */ - "0x3f", /* 0x3f */ - "0x40", /* 0x40 */ - "textWithoutLanguage",/* 0x41 */ - "nameWithoutLanguage",/* 0x42 */ - "0x43", /* 0x43 */ - "keyword", /* 0x44 */ - "uri", /* 0x45 */ - "uriScheme", /* 0x46 */ - "charset", /* 0x47 */ - "naturalLanguage", /* 0x48 */ - "mimeMediaType", /* 0x49 */ - "memberAttrName" /* 0x4a */ + // 0x0a - IPP System + "0x0b", // 0x0b + "0x0c", // 0x0c + "0x0d", // 0x0d + "0x0e", // 0x0e + "0x0f", // 0x0f + "unsupported", // 0x10 + "default", // 0x11 + "unknown", // 0x12 + "no-value", // 0x13 + "0x14", // 0x14 + "not-settable", // 0x15 - RFC 3380 + "delete-attribute", // 0x16 - RFC 3380 + "admin-define", // 0x17 - RFC 3380 + "0x18", // 0x18 + "0x19", // 0x19 + "0x1a", // 0x1a + "0x1b", // 0x1b + "0x1c", // 0x1c + "0x1d", // 0x1d + "0x1e", // 0x1e + "0x1f", // 0x1f + "0x20", // 0x20 + "integer", // 0x21 + "boolean", // 0x22 + "enum", // 0x23 + "0x24", // 0x24 + "0x25", // 0x25 + "0x26", // 0x26 + "0x27", // 0x27 + "0x28", // 0x28 + "0x29", // 0x29 + "0x2a", // 0x2a + "0x2b", // 0x2b + "0x2c", // 0x2c + "0x2d", // 0x2d + "0x2e", // 0x2e + "0x2f", // 0x2f + "octetString", // 0x30 + "dateTime", // 0x31 + "resolution", // 0x32 + "rangeOfInteger", // 0x33 + "collection", // 0x34 + "textWithLanguage", // 0x35 + "nameWithLanguage", // 0x36 + "endCollection", // 0x37 + "0x38", // 0x38 + "0x39", // 0x39 + "0x3a", // 0x3a + "0x3b", // 0x3b + "0x3c", // 0x3c + "0x3d", // 0x3d + "0x3e", // 0x3e + "0x3f", // 0x3f + "0x40", // 0x40 + "textWithoutLanguage",// 0x41 + "nameWithoutLanguage",// 0x42 + "0x43", // 0x43 + "keyword", // 0x44 + "uri", // 0x45 + "uriScheme", // 0x46 + "charset", // 0x47 + "naturalLanguage", // 0x48 + "mimeMediaType", // 0x49 + "memberAttrName" // 0x4a }; static const char * const ipp_document_states[] = - { /* document-state-enums */ + { // document-state-enums "pending", "4", "processing", - "processing-stopped", /* IPP INFRA */ + "processing-stopped", // IPP INFRA "canceled", "aborted", "completed" }, * const ipp_finishings[] = - { /* finishings enums */ + { // finishings enums "none", "staple", "punch", @@ -386,8 +381,8 @@ static const char * const ipp_document_states[] = "bale", "booklet-maker", "jog-offset", - "coat", /* IPP Finishings 2.0 */ - "laminate", /* IPP Finishings 2.0 */ + "coat", // IPP Finishings 2.0 + "laminate", // IPP Finishings 2.0 "17", "18", "19", @@ -403,10 +398,10 @@ static const char * const ipp_document_states[] = "staple-dual-top", "staple-dual-right", "staple-dual-bottom", - "staple-triple-left", /* IPP Finishings 2.0 */ - "staple-triple-top", /* IPP Finishings 2.0 */ - "staple-triple-right",/* IPP Finishings 2.0 */ - "staple-triple-bottom",/* IPP Finishings 2.0 */ + "staple-triple-left", // IPP Finishings 2.0 + "staple-triple-top", // IPP Finishings 2.0 + "staple-triple-right",// IPP Finishings 2.0 + "staple-triple-bottom",// IPP Finishings 2.0 "36", "37", "38", @@ -441,42 +436,42 @@ static const char * const ipp_document_states[] = "67", "68", "69", - "punch-top-left", /* IPP Finishings 2.0 */ - "punch-bottom-left", /* IPP Finishings 2.0 */ - "punch-top-right", /* IPP Finishings 2.0 */ - "punch-bottom-right", /* IPP Finishings 2.0 */ - "punch-dual-left", /* IPP Finishings 2.0 */ - "punch-dual-top", /* IPP Finishings 2.0 */ - "punch-dual-right", /* IPP Finishings 2.0 */ - "punch-dual-bottom", /* IPP Finishings 2.0 */ - "punch-triple-left", /* IPP Finishings 2.0 */ - "punch-triple-top", /* IPP Finishings 2.0 */ - "punch-triple-right", /* IPP Finishings 2.0 */ - "punch-triple-bottom",/* IPP Finishings 2.0 */ - "punch-quad-left", /* IPP Finishings 2.0 */ - "punch-quad-top", /* IPP Finishings 2.0 */ - "punch-quad-right", /* IPP Finishings 2.0 */ - "punch-quad-bottom", /* IPP Finishings 2.0 */ - "punch-multiple-left",/* IPP Finishings 2.1/Canon */ - "punch-multiple-top", /* IPP Finishings 2.1/Canon */ - "punch-multiple-right",/* IPP Finishings 2.1/Canon */ - "punch-multiple-bottom",/* IPP Finishings 2.1/Canon */ - "fold-accordion", /* IPP Finishings 2.0 */ - "fold-double-gate", /* IPP Finishings 2.0 */ - "fold-gate", /* IPP Finishings 2.0 */ - "fold-half", /* IPP Finishings 2.0 */ - "fold-half-z", /* IPP Finishings 2.0 */ - "fold-left-gate", /* IPP Finishings 2.0 */ - "fold-letter", /* IPP Finishings 2.0 */ - "fold-parallel", /* IPP Finishings 2.0 */ - "fold-poster", /* IPP Finishings 2.0 */ - "fold-right-gate", /* IPP Finishings 2.0 */ - "fold-z", /* IPP Finishings 2.0 */ - "fold-engineering-z" /* IPP Finishings 2.1 */ + "punch-top-left", // IPP Finishings 2.0 + "punch-bottom-left", // IPP Finishings 2.0 + "punch-top-right", // IPP Finishings 2.0 + "punch-bottom-right", // IPP Finishings 2.0 + "punch-dual-left", // IPP Finishings 2.0 + "punch-dual-top", // IPP Finishings 2.0 + "punch-dual-right", // IPP Finishings 2.0 + "punch-dual-bottom", // IPP Finishings 2.0 + "punch-triple-left", // IPP Finishings 2.0 + "punch-triple-top", // IPP Finishings 2.0 + "punch-triple-right", // IPP Finishings 2.0 + "punch-triple-bottom",// IPP Finishings 2.0 + "punch-quad-left", // IPP Finishings 2.0 + "punch-quad-top", // IPP Finishings 2.0 + "punch-quad-right", // IPP Finishings 2.0 + "punch-quad-bottom", // IPP Finishings 2.0 + "punch-multiple-left",// IPP Finishings 2.1/Canon + "punch-multiple-top", // IPP Finishings 2.1/Canon + "punch-multiple-right",// IPP Finishings 2.1/Canon + "punch-multiple-bottom",// IPP Finishings 2.1/Canon + "fold-accordion", // IPP Finishings 2.0 + "fold-double-gate", // IPP Finishings 2.0 + "fold-gate", // IPP Finishings 2.0 + "fold-half", // IPP Finishings 2.0 + "fold-half-z", // IPP Finishings 2.0 + "fold-left-gate", // IPP Finishings 2.0 + "fold-letter", // IPP Finishings 2.0 + "fold-parallel", // IPP Finishings 2.0 + "fold-poster", // IPP Finishings 2.0 + "fold-right-gate", // IPP Finishings 2.0 + "fold-z", // IPP Finishings 2.0 + "fold-engineering-z" // IPP Finishings 2.1 }, * const ipp_finishings_vendor[] = { - /* 0x40000000 to 0x4000000F */ + // 0x40000000 to 0x4000000F "0x40000000", "0x40000001", "0x40000002", @@ -493,7 +488,7 @@ static const char * const ipp_document_states[] = "0x4000000D", "0x4000000E", "0x4000000F", - /* 0x40000010 to 0x4000001F */ + // 0x40000010 to 0x4000001F "0x40000010", "0x40000011", "0x40000012", @@ -510,7 +505,7 @@ static const char * const ipp_document_states[] = "0x4000001D", "0x4000001E", "0x4000001F", - /* 0x40000020 to 0x4000002F */ + // 0x40000020 to 0x4000002F "0x40000020", "0x40000021", "0x40000022", @@ -527,7 +522,7 @@ static const char * const ipp_document_states[] = "0x4000002D", "0x4000002E", "0x4000002F", - /* 0x40000030 to 0x4000003F */ + // 0x40000030 to 0x4000003F "0x40000030", "0x40000031", "0x40000032", @@ -544,7 +539,7 @@ static const char * const ipp_document_states[] = "0x4000003D", "0x4000003E", "0x4000003F", - /* 0x40000040 - 0x4000004F */ + // 0x40000040 - 0x4000004F "0x40000040", "0x40000041", "0x40000042", @@ -561,7 +556,7 @@ static const char * const ipp_document_states[] = "cups-punch-dual-bottom", "cups-punch-triple-left", "cups-punch-triple-top", - /* 0x40000050 - 0x4000005F */ + // 0x40000050 - 0x4000005F "cups-punch-triple-right", "cups-punch-triple-bottom", "cups-punch-quad-left", @@ -578,7 +573,7 @@ static const char * const ipp_document_states[] = "cups-fold-half", "cups-fold-half-z", "cups-fold-left-gate", - /* 0x40000060 - 0x40000064 */ + // 0x40000060 - 0x40000064 "cups-fold-letter", "cups-fold-parallel", "cups-fold-poster", @@ -586,13 +581,13 @@ static const char * const ipp_document_states[] = "cups-fold-z" }, * const ipp_job_collation_types[] = - { /* job-collation-type enums */ + { // job-collation-type enums "uncollated-sheets", "collated-documents", "uncollated-documents" }, * const ipp_job_states[] = - { /* job-state enums */ + { // job-state enums "pending", "pending-held", "processing", @@ -602,7 +597,7 @@ static const char * const ipp_document_states[] = "completed" }, * const ipp_orientation_requesteds[] = - { /* orientation-requested enums */ + { // orientation-requested enums "portrait", "landscape", "reverse-landscape", @@ -610,19 +605,19 @@ static const char * const ipp_document_states[] = "none" }, * const ipp_print_qualities[] = - { /* print-quality enums */ + { // print-quality enums "draft", "normal", "high" }, * const ipp_printer_states[] = - { /* printer-state enums */ + { // printer-state enums "idle", "processing", "stopped" }, * const ipp_resource_states[] = - { /* resource-state enums */ + { // resource-state enums "pending", "available", "installed", @@ -630,43 +625,43 @@ static const char * const ipp_document_states[] = "aborted" }, * const ipp_system_states[] = - { /* system-state enums */ + { // system-state enums "idle", "processing", "stopped" }; -/* - * Local functions... - */ +// +// Local functions... +// static size_t ipp_col_string(ipp_t *col, char *buffer, size_t bufsize); -/* - * 'ippAttributeString()' - Convert the attribute's value to a string. - * - * Returns the number of bytes that would be written, not including the - * trailing nul. The buffer pointer can be NULL to get the required length, - * just like (v)snprintf. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippAttributeString()' - Convert the attribute's value to a string. +// +// Returns the number of bytes that would be written, not including the +// trailing nul. The buffer pointer can be NULL to get the required length, +// just like (v)snprintf. +// +// @since CUPS 1.6/macOS 10.8@ +// -size_t /* O - Number of bytes less nul */ +size_t // O - Number of bytes less nul ippAttributeString( - ipp_attribute_t *attr, /* I - Attribute */ - char *buffer, /* I - String buffer or NULL */ - size_t bufsize) /* I - Size of string buffer */ + ipp_attribute_t *attr, // I - Attribute + char *buffer, // I - String buffer or NULL + size_t bufsize) // I - Size of string buffer { - int i; /* Looping var */ - char *bufptr, /* Pointer into buffer */ - *bufend, /* End of buffer */ - temp[256]; /* Temporary string */ - const char *ptr, /* Pointer into string */ - *end; /* Pointer to end of string */ - _ipp_value_t *val; /* Current value */ + int i; // Looping var + char *bufptr, // Pointer into buffer + *bufend, // End of buffer + temp[256]; // Temporary string + const char *ptr, // Pointer into string + *end; // Pointer to end of string + _ipp_value_t *val; // Current value if (!attr || !attr->name) @@ -741,7 +736,7 @@ ippAttributeString( case IPP_TAG_DATE : { - unsigned year; /* Year */ + unsigned year; // Year year = ((unsigned)val->date[0] << 8) | (unsigned)val->date[1]; @@ -865,39 +860,39 @@ ippAttributeString( } -/* - * 'ippCreateRequestedArray()' - Create a CUPS array of attribute names from the - * given requested-attributes attribute. - * - * This function creates a (sorted) CUPS array of attribute names matching the - * list of "requested-attribute" values supplied in an IPP request. All IANA- - * registered values are supported in addition to the CUPS IPP extension - * attributes. - * - * The @code request@ parameter specifies the request message that was read from - * the client. - * - * @code NULL@ is returned if all attributes should be returned. Otherwise, the - * result is a sorted array of attribute names, where @code cupsArrayFind(array, - * "attribute-name")@ will return a non-NULL pointer. The array must be freed - * using the @code cupsArrayDelete@ function. - * - * @since CUPS 1.7/macOS 10.9@ - */ - -cups_array_t * /* O - CUPS array or @code NULL@ if all */ -ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ +// +// 'ippCreateRequestedArray()' - Create a CUPS array of attribute names from the +// given requested-attributes attribute. +// +// This function creates a (sorted) CUPS array of attribute names matching the +// list of "requested-attribute" values supplied in an IPP request. All IANA- +// registered values are supported in addition to the CUPS IPP extension +// attributes. +// +// The @code request@ parameter specifies the request message that was read from +// the client. +// +// @code NULL@ is returned if all attributes should be returned. Otherwise, the +// result is a sorted array of attribute names, where @code cupsArrayFind(array, +// "attribute-name")@ will return a non-NULL pointer. The array must be freed +// using the @code cupsArrayDelete@ function. +// +// @since CUPS 1.7/macOS 10.9@ +// + +cups_array_t * // O - CUPS array or @code NULL@ if all +ippCreateRequestedArray(ipp_t *request) // I - IPP request { - int i, j, /* Looping vars */ - count, /* Number of values */ - added; /* Was name added? */ - ipp_op_t op; /* IPP operation code */ - ipp_attribute_t *requested; /* requested-attributes attribute */ - cups_array_t *ra; /* Requested attributes array */ - const char *value; /* Current value */ - /* The following lists come from the current IANA IPP registry of attributes */ + int i, j, // Looping vars + count, // Number of values + added; // Was name added? + ipp_op_t op; // IPP operation code + ipp_attribute_t *requested; // requested-attributes attribute + cups_array_t *ra; // Requested attributes array + const char *value; // Current value + // The following lists come from the current IANA IPP registry of attributes static const char * const document_description[] = - { /* document-description group */ + { // document-description group "compression", "copies-actual", "cover-back-actual", @@ -927,7 +922,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "document-state-message", "document-state-reasons", "document-uri", - "document-uuid", /* IPP JPS3 */ + "document-uuid", // IPP JPS3 "errors-count", "finishings-actual", "finishings-col-actual", @@ -942,7 +937,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "k-octets", "k-octets-processed", "last-document", - "materials-col-actual", /* IPP 3D */ + "materials-col-actual", // IPP 3D "media-actual", "media-col-actual", "media-input-tray-check-actual", @@ -951,7 +946,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "media-sheets-completed", "media-sheets-completed-col", "more-info", - "multiple-object-handling-actual", /* IPP 3D */ + "multiple-object-handling-actual", // IPP 3D "number-up-actual", "orientation-requested-actual", "output-bin-actual", @@ -965,17 +960,17 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "pages-completed", "pages-completed-col", "pages-completed-current-copy", - "platform-temperature-actual", /* IPP 3D */ + "platform-temperature-actual", // IPP 3D "presentation-direction-number-up-actual", - "print-accuracy-actual", /* IPP 3D */ - "print-base-actual", /* IPP 3D */ + "print-accuracy-actual", // IPP 3D + "print-base-actual", // IPP 3D "print-color-mode-actual", "print-content-optimize-actual", - "print-objects-actual", /* IPP 3D */ + "print-objects-actual", // IPP 3D "print-quality-actual", "print-rendering-intent-actual", - "print-scaling-actual", /* IPP Paid Printing */ - "print-supports-actual", /* IPP 3D */ + "print-scaling-actual", // IPP Paid Printing + "print-supports-actual", // IPP 3D "printer-resolution-actual", "printer-up-time", "separator-sheets-actual", @@ -994,13 +989,13 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "y-side2-image-shift-actual" }; static const char * const document_template[] = - { /* document-template group */ - "chamber-humidity", /* IPP 3D */ - "chamber-humidity-default", /* IPP 3D */ - "chamber-humidity-supported", /* IPP 3D */ - "chamber-temperature", /* IPP 3D */ - "chamber-temperature-default", /* IPP 3D */ - "chamber-temperature-supported", /* IPP 3D */ + { // document-template group + "chamber-humidity", // IPP 3D + "chamber-humidity-default", // IPP 3D + "chamber-humidity-supported", // IPP 3D + "chamber-temperature", // IPP 3D + "chamber-temperature-default", // IPP 3D + "chamber-temperature-supported", // IPP 3D "copies", "copies-default", "copies-supported", @@ -1039,20 +1034,20 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "insert-sheet", "insert-sheet-default", "insert-sheet-supported", - "material-amount-units-supported", /* IPP 3D */ - "material-diameter-supported", /* IPP 3D */ - "material-purpose-supported", /* IPP 3D */ - "material-rate-supported", /* IPP 3D */ - "material-rate-units-supported", /* IPP 3D */ - "material-shell-thickness-supported",/* IPP 3D */ - "material-temperature-supported", /* IPP 3D */ - "material-type-supported", /* IPP 3D */ - "materials-col", /* IPP 3D */ - "materials-col-database", /* IPP 3D */ - "materials-col-default", /* IPP 3D */ - "materials-col-ready", /* IPP 3D */ - "materials-col-supported", /* IPP 3D */ - "max-materials-col-supported", /* IPP 3D */ + "material-amount-units-supported", // IPP 3D + "material-diameter-supported", // IPP 3D + "material-purpose-supported", // IPP 3D + "material-rate-supported", // IPP 3D + "material-rate-units-supported", // IPP 3D + "material-shell-thickness-supported",// IPP 3D + "material-temperature-supported", // IPP 3D + "material-type-supported", // IPP 3D + "materials-col", // IPP 3D + "materials-col-database", // IPP 3D + "materials-col-default", // IPP 3D + "materials-col-ready", // IPP 3D + "materials-col-supported", // IPP 3D + "max-materials-col-supported", // IPP 3D "max-stitching-locations-supported", "media", "media-back-coating-supported", @@ -1087,18 +1082,18 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "multiple-document-handling", "multiple-document-handling-default", "multiple-document-handling-supported", - "multiple-object-handling", /* IPP 3D */ - "multiple-object-handling-default", /* IPP 3D */ - "multiple-object-handling-supported",/* IPP 3D */ + "multiple-object-handling", // IPP 3D + "multiple-object-handling-default", // IPP 3D + "multiple-object-handling-supported",// IPP 3D "number-up", "number-up-default", "number-up-supported", "orientation-requested", "orientation-requested-default", "orientation-requested-supported", - "output-mode", /* CUPS extension */ - "output-mode-default", /* CUPS extension */ - "output-mode-supported", /* CUPS extension */ + "output-mode", // CUPS extension + "output-mode-default", // CUPS extension + "output-mode-supported", // CUPS extension "overrides", "overrides-supported", "page-delivery", @@ -1118,39 +1113,39 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "pdl-init-file-name-subdirectory-supported", "pdl-init-file-name-supported", "pdl-init-file-supported", - "platform-temperature", /* IPP 3D */ - "platform-temperature-default", /* IPP 3D */ - "platform-temperature-supported", /* IPP 3D */ + "platform-temperature", // IPP 3D + "platform-temperature-default", // IPP 3D + "platform-temperature-supported", // IPP 3D "presentation-direction-number-up", "presentation-direction-number-up-default", "presentation-direction-number-up-supported", - "print-accuracy", /* IPP 3D */ - "print-accuracy-default", /* IPP 3D */ - "print-accuracy-supported", /* IPP 3D */ - "print-base", /* IPP 3D */ - "print-base-default", /* IPP 3D */ - "print-base-supported", /* IPP 3D */ + "print-accuracy", // IPP 3D + "print-accuracy-default", // IPP 3D + "print-accuracy-supported", // IPP 3D + "print-base", // IPP 3D + "print-base-default", // IPP 3D + "print-base-supported", // IPP 3D "print-color-mode", "print-color-mode-default", "print-color-mode-supported", "print-content-optimize", "print-content-optimize-default", "print-content-optimize-supported", - "print-objects", /* IPP 3D */ - "print-objects-default", /* IPP 3D */ - "print-objects-supported", /* IPP 3D */ + "print-objects", // IPP 3D + "print-objects-default", // IPP 3D + "print-objects-supported", // IPP 3D "print-quality", "print-quality-default", "print-quality-supported", "print-rendering-intent", "print-rendering-intent-default", "print-rendering-intent-supported", - "print-scaling", /* IPP Paid Printing */ - "print-scaling-default", /* IPP Paid Printing */ - "print-scaling-supported", /* IPP Paid Printing */ - "print-supports", /* IPP 3D */ - "print-supports-default", /* IPP 3D */ - "print-supports-supported", /* IPP 3D */ + "print-scaling", // IPP Paid Printing + "print-scaling-default", // IPP Paid Printing + "print-scaling-supported", // IPP Paid Printing + "print-supports", // IPP 3D + "print-supports-default", // IPP 3D + "print-supports-supported", // IPP 3D "printer-resolution", "printer-resolution-default", "printer-resolution-supported", @@ -1191,9 +1186,9 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "y-side2-image-shift-supported" }; static const char * const job_description[] = - { /* job-description group */ - "chamber-humidity-actual", /* IPP 3D */ - "chamber-temperature-actual", /* IPP 3D */ + { // job-description group + "chamber-humidity-actual", // IPP 3D + "chamber-temperature-actual", // IPP 3D "compression-supplied", "copies-actual", "cover-back-actual", @@ -1223,7 +1218,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "job-accounting-sheets-actual", "job-accounting-user-id-actual", "job-attribute-fidelity", - "job-charge-info", /* CUPS extension */ + "job-charge-info", // CUPS extension "job-collation-type", "job-collation-type-actual", "job-copies-actual", @@ -1243,7 +1238,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "job-k-octets", "job-k-octets-processed", "job-mandatory-attributes", - "job-media-progress", /* CUPS extension */ + "job-media-progress", // CUPS extension "job-media-sheets", "job-media-sheets-col", "job-media-sheets-completed", @@ -1251,20 +1246,20 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "job-message-from-operator", "job-more-info", "job-name", - "job-originating-host-name", /* CUPS extension */ + "job-originating-host-name", // CUPS extension "job-originating-user-name", - "job-originating-user-uri", /* IPP JPS3 */ + "job-originating-user-uri", // IPP JPS3 "job-pages", "job-pages-col", "job-pages-completed", "job-pages-completed-col", "job-pages-completed-current-copy", - "job-printer-state-message", /* CUPS extension */ - "job-printer-state-reasons", /* CUPS extension */ + "job-printer-state-message", // CUPS extension + "job-printer-state-reasons", // CUPS extension "job-printer-up-time", "job-printer-uri", "job-priority-actual", - "job-resource-ids", /* IPP System */ + "job-resource-ids", // IPP System "job-save-printer-make-and-model", "job-sheet-message-actual", "job-sheets-actual", @@ -1273,13 +1268,13 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "job-state-message", "job-state-reasons", "job-uri", - "job-uuid", /* IPP JPS3 */ - "materials-col-actual", /* IPP 3D */ + "job-uuid", // IPP JPS3 + "materials-col-actual", // IPP 3D "media-actual", "media-col-actual", "media-check-input-tray-actual", "multiple-document-handling-actual", - "multiple-object-handling-actual", /* IPP 3D */ + "multiple-object-handling-actual", // IPP 3D "number-of-documents", "number-of-intervening-jobs", "number-up-actual", @@ -1287,25 +1282,25 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "original-requesting-user-name", "output-bin-actual", "output-device-assigned", - "output-device-job-state", /* IPP INFRA */ - "output-device-job-state-message", /* IPP INFRA */ - "output-device-job-state-reasons", /* IPP INFRA */ - "output-device-uuid-assigned", /* IPP INFRA */ + "output-device-job-state", // IPP INFRA + "output-device-job-state-message", // IPP INFRA + "output-device-job-state-reasons", // IPP INFRA + "output-device-uuid-assigned", // IPP INFRA "overrides-actual", "page-delivery-actual", "page-order-received-actual", "page-ranges-actual", - "platform-temperature-actual", /* IPP 3D */ + "platform-temperature-actual", // IPP 3D "presentation-direction-number-up-actual", - "print-accuracy-actual", /* IPP 3D */ - "print-base-actual", /* IPP 3D */ + "print-accuracy-actual", // IPP 3D + "print-base-actual", // IPP 3D "print-color-mode-actual", "print-content-optimize-actual", - "print-objects-actual", /* IPP 3D */ + "print-objects-actual", // IPP 3D "print-quality-actual", "print-rendering-intent-actual", - "print-scaling-actual", /* IPP Paid Printing */ - "print-supports-actual", /* IPP 3D */ + "print-scaling-actual", // IPP Paid Printing + "print-supports-actual", // IPP 3D "printer-resolution-actual", "separator-sheets-actual", "sheet-collate-actual", @@ -1326,15 +1321,15 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "y-side2-image-shift-actual" }; static const char * const job_template[] = - { /* job-template group */ - "accuracy-units-supported", /* IPP 3D */ - "chamber-humidity", /* IPP 3D */ - "chamber-humidity-default", /* IPP 3D */ - "chamber-humidity-supported", /* IPP 3D */ - "chamber-temperature", /* IPP 3D */ - "chamber-temperature-default", /* IPP 3D */ - "chamber-temperature-supported", /* IPP 3D */ - "confirmation-sheet-print", /* IPP FaxOut */ + { // job-template group + "accuracy-units-supported", // IPP 3D + "chamber-humidity", // IPP 3D + "chamber-humidity-default", // IPP 3D + "chamber-humidity-supported", // IPP 3D + "chamber-temperature", // IPP 3D + "chamber-temperature-default", // IPP 3D + "chamber-temperature-supported", // IPP 3D + "confirmation-sheet-print", // IPP FaxOut "confirmation-sheet-print-default", "copies", "copies-default", @@ -1345,11 +1340,11 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "cover-front", "cover-front-default", "cover-front-supported", - "cover-sheet-info", /* IPP FaxOut */ + "cover-sheet-info", // IPP FaxOut "cover-sheet-info-default", "cover-sheet-info-supported", - "destination-uri-schemes-supported",/* IPP FaxOut */ - "destination-uris", /* IPP FaxOut */ + "destination-uri-schemes-supported",// IPP FaxOut + "destination-uris", // IPP FaxOut "destination-uris-supported", "feed-orientation", "feed-orientation-default", @@ -1444,20 +1439,20 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "job-sheets-default", "job-sheets-supported", "logo-uri-schemes-supported", - "material-amount-units-supported", /* IPP 3D */ - "material-diameter-supported", /* IPP 3D */ - "material-purpose-supported", /* IPP 3D */ - "material-rate-supported", /* IPP 3D */ - "material-rate-units-supported", /* IPP 3D */ - "material-shell-thickness-supported",/* IPP 3D */ - "material-temperature-supported", /* IPP 3D */ - "material-type-supported", /* IPP 3D */ - "materials-col", /* IPP 3D */ - "materials-col-database", /* IPP 3D */ - "materials-col-default", /* IPP 3D */ - "materials-col-ready", /* IPP 3D */ - "materials-col-supported", /* IPP 3D */ - "max-materials-col-supported", /* IPP 3D */ + "material-amount-units-supported", // IPP 3D + "material-diameter-supported", // IPP 3D + "material-purpose-supported", // IPP 3D + "material-rate-supported", // IPP 3D + "material-rate-units-supported", // IPP 3D + "material-shell-thickness-supported",// IPP 3D + "material-temperature-supported", // IPP 3D + "material-type-supported", // IPP 3D + "materials-col", // IPP 3D + "materials-col-database", // IPP 3D + "materials-col-default", // IPP 3D + "materials-col-ready", // IPP 3D + "materials-col-supported", // IPP 3D + "max-materials-col-supported", // IPP 3D "max-save-info-supported", "max-stitching-locations-supported", "media", @@ -1493,10 +1488,10 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "multiple-document-handling", "multiple-document-handling-default", "multiple-document-handling-supported", - "multiple-object-handling", /* IPP 3D */ - "multiple-object-handling-default", /* IPP 3D */ - "multiple-object-handling-supported",/* IPP 3D */ - "number-of-retries", /* IPP FaxOut */ + "multiple-object-handling", // IPP 3D + "multiple-object-handling-default", // IPP 3D + "multiple-object-handling-supported",// IPP 3D + "number-of-retries", // IPP FaxOut "number-of-retries-default", "number-of-retries-supported", "number-up", @@ -1510,10 +1505,10 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "output-bin-supported", "output-device", "output-device-supported", - "output-device-uuid-supported", /* IPP INFRA */ - "output-mode", /* CUPS extension */ - "output-mode-default", /* CUPS extension */ - "output-mode-supported", /* CUPS extension */ + "output-device-uuid-supported", // IPP INFRA + "output-mode", // CUPS extension + "output-mode-default", // CUPS extension + "output-mode-supported", // CUPS extension "overrides", "overrides-supported", "page-delivery", @@ -1533,49 +1528,49 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "pdl-init-file-name-subdirectory-supported", "pdl-init-file-name-supported", "pdl-init-file-supported", - "platform-temperature", /* IPP 3D */ - "platform-temperature-default", /* IPP 3D */ - "platform-temperature-supported", /* IPP 3D */ + "platform-temperature", // IPP 3D + "platform-temperature-default", // IPP 3D + "platform-temperature-supported", // IPP 3D "presentation-direction-number-up", "presentation-direction-number-up-default", "presentation-direction-number-up-supported", - "print-accuracy", /* IPP 3D */ - "print-accuracy-default", /* IPP 3D */ - "print-accuracy-supported", /* IPP 3D */ - "print-base", /* IPP 3D */ - "print-base-default", /* IPP 3D */ - "print-base-supported", /* IPP 3D */ + "print-accuracy", // IPP 3D + "print-accuracy-default", // IPP 3D + "print-accuracy-supported", // IPP 3D + "print-base", // IPP 3D + "print-base-default", // IPP 3D + "print-base-supported", // IPP 3D "print-color-mode", "print-color-mode-default", "print-color-mode-supported", "print-content-optimize", "print-content-optimize-default", "print-content-optimize-supported", - "print-objects", /* IPP 3D */ - "print-objects-default", /* IPP 3D */ - "print-objects-supported", /* IPP 3D */ + "print-objects", // IPP 3D + "print-objects-default", // IPP 3D + "print-objects-supported", // IPP 3D "print-quality", "print-quality-default", "print-quality-supported", "print-rendering-intent", "print-rendering-intent-default", "print-rendering-intent-supported", - "print-scaling", /* IPP Paid Printing */ - "print-scaling-default", /* IPP Paid Printing */ - "print-scaling-supported", /* IPP Paid Printing */ - "print-supports", /* IPP 3D */ - "print-supports-default", /* IPP 3D */ - "print-supports-supported", /* IPP 3D */ + "print-scaling", // IPP Paid Printing + "print-scaling-default", // IPP Paid Printing + "print-scaling-supported", // IPP Paid Printing + "print-supports", // IPP 3D + "print-supports-default", // IPP 3D + "print-supports-supported", // IPP 3D "printer-resolution", "printer-resolution-default", "printer-resolution-supported", "proof-print", "proof-print-default", "proof-print-supported", - "retry-interval", /* IPP FaxOut */ + "retry-interval", // IPP FaxOut "retry-interval-default", "retry-interval-supported", - "retry-timeout", /* IPP FaxOut */ + "retry-timeout", // IPP FaxOut "retry-timeout-default", "retry-timeout-supported", "save-disposition-supported", @@ -1622,16 +1617,16 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "y-side2-image-shift-supported" }; static const char * const printer_description[] = - { /* printer-description group */ - "auth-info-required", /* CUPS extension */ - "chamber-humidity-current", /* IPP 3D */ - "chamber-temperature-current", /* IPP 3D */ + { // printer-description group + "auth-info-required", // CUPS extension + "chamber-humidity-current", // IPP 3D + "chamber-temperature-current", // IPP 3D "charset-configured", "charset-supported", "color-supported", "compression-supported", "device-service-count", - "device-uri", /* CUPS extension */ + "device-uri", // CUPS extension "device-uuid", "document-charset-default", "document-charset-supported", @@ -1641,7 +1636,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "document-format-default", "document-format-details-default", "document-format-details-supported", - "document-format-preferred", /* AirPrint extension */ + "document-format-preferred", // AirPrint extension "document-format-supported", "document-format-varying-attributes", "document-format-version-default", @@ -1649,8 +1644,8 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "document-natural-language-default", "document-natural-language-supported", "document-password-supported", - "document-privacy-attributes", /* IPP Privacy Attributes */ - "document-privacy-scope", /* IPP Privacy Attributes */ + "document-privacy-attributes", // IPP Privacy Attributes + "document-privacy-scope", // IPP Privacy Attributes "generated-natural-language-supported", "identify-actions-default", "identify-actions-supported", @@ -1658,44 +1653,44 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "ipp-features-supported", "ipp-versions-supported", "ippget-event-life", - "job-authorization-uri-supported", /* CUPS extension */ + "job-authorization-uri-supported", // CUPS extension "job-constraints-supported", "job-creation-attributes-supported", "job-finishings-col-ready", "job-finishings-ready", "job-ids-supported", "job-impressions-supported", - "job-k-limit", /* CUPS extension */ + "job-k-limit", // CUPS extension "job-k-octets-supported", "job-media-sheets-supported", - "job-page-limit", /* CUPS extension */ + "job-page-limit", // CUPS extension "job-password-encryption-supported", "job-password-supported", - "job-presets-supported", /* IPP Presets */ - "job-privacy-attributes", /* IPP Privacy Attributes */ - "job-privacy-scope", /* IPP Privacy Attributes */ - "job-quota-period", /* CUPS extension */ + "job-presets-supported", // IPP Presets + "job-privacy-attributes", // IPP Privacy Attributes + "job-privacy-scope", // IPP Privacy Attributes + "job-quota-period", // CUPS extension "job-resolvers-supported", "job-settable-attributes-supported", "job-spooling-supported", - "job-triggers-supported", /* IPP Presets */ - "jpeg-k-octets-supported", /* CUPS extension */ - "jpeg-x-dimension-supported", /* CUPS extension */ - "jpeg-y-dimension-supported", /* CUPS extension */ + "job-triggers-supported", // IPP Presets + "jpeg-k-octets-supported", // CUPS extension + "jpeg-x-dimension-supported", // CUPS extension + "jpeg-y-dimension-supported", // CUPS extension "landscape-orientation-requested-preferred", - /* CUPS extension */ - "marker-change-time", /* CUPS extension */ - "marker-colors", /* CUPS extension */ - "marker-high-levels", /* CUPS extension */ - "marker-levels", /* CUPS extension */ - "marker-low-levels", /* CUPS extension */ - "marker-message", /* CUPS extension */ - "marker-names", /* CUPS extension */ - "marker-types", /* CUPS extension */ - "member-names", /* CUPS extension */ - "member-uris", /* CUPS extension */ - "mopria-certified", /* Mopria extension */ - "multiple-destination-uris-supported",/* IPP FaxOut */ + // CUPS extension + "marker-change-time", // CUPS extension + "marker-colors", // CUPS extension + "marker-high-levels", // CUPS extension + "marker-levels", // CUPS extension + "marker-low-levels", // CUPS extension + "marker-message", // CUPS extension + "marker-names", // CUPS extension + "marker-types", // CUPS extension + "member-names", // CUPS extension + "member-uris", // CUPS extension + "mopria-certified", // Mopria extension + "multiple-destination-uris-supported",// IPP FaxOut "multiple-document-jobs-supported", "multiple-operation-time-out", "multiple-operation-time-out-action", @@ -1703,48 +1698,48 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "operations-supported", "pages-per-minute", "pages-per-minute-color", - "pdf-k-octets-supported", /* CUPS extension */ - "pdf-features-supported", /* IPP 3D */ - "pdf-versions-supported", /* CUPS extension */ + "pdf-k-octets-supported", // CUPS extension + "pdf-features-supported", // IPP 3D + "pdf-versions-supported", // CUPS extension "pdl-override-supported", - "platform-shape", /* IPP 3D */ - "port-monitor", /* CUPS extension */ - "port-monitor-supported", /* CUPS extension */ + "platform-shape", // IPP 3D + "port-monitor", // CUPS extension + "port-monitor-supported", // CUPS extension "preferred-attributes-supported", "printer-alert", "printer-alert-description", - "printer-camera-image-uri", /* IPP 3D */ + "printer-camera-image-uri", // IPP 3D "printer-charge-info", "printer-charge-info-uri", - "printer-commands", /* CUPS extension */ + "printer-commands", // CUPS extension "printer-config-change-date-time", "printer-config-change-time", - "printer-config-changes", /* IPP System */ - "printer-contact-col", /* IPP System */ + "printer-config-changes", // IPP System + "printer-contact-col", // IPP System "printer-current-time", "printer-detailed-status-messages", "printer-device-id", - "printer-dns-sd-name", /* CUPS extension */ + "printer-dns-sd-name", // CUPS extension "printer-driver-installer", - "printer-fax-log-uri", /* IPP FaxOut */ - "printer-fax-modem-info", /* IPP FaxOut */ - "printer-fax-modem-name", /* IPP FaxOut */ - "printer-fax-modem-number", /* IPP FaxOut */ - "printer-firmware-name", /* PWG 5110.1 */ - "printer-firmware-patches", /* PWG 5110.1 */ - "printer-firmware-string-version", /* PWG 5110.1 */ - "printer-firmware-version", /* PWG 5110.1 */ + "printer-fax-log-uri", // IPP FaxOut + "printer-fax-modem-info", // IPP FaxOut + "printer-fax-modem-name", // IPP FaxOut + "printer-fax-modem-number", // IPP FaxOut + "printer-firmware-name", // PWG 5110.1 + "printer-firmware-patches", // PWG 5110.1 + "printer-firmware-string-version", // PWG 5110.1 + "printer-firmware-version", // PWG 5110.1 "printer-geo-location", "printer-get-attributes-supported", "printer-icc-profiles", "printer-icons", - "printer-id", /* IPP System */ + "printer-id", // IPP System "printer-info", - "printer-input-tray", /* IPP JPS3 */ + "printer-input-tray", // IPP JPS3 "printer-is-accepting-jobs", - "printer-is-shared", /* CUPS extension */ - "printer-is-temporary", /* CUPS extension */ - "printer-kind", /* IPP Paid Printing */ + "printer-is-shared", // CUPS extension + "printer-is-temporary", // CUPS extension + "printer-kind", // IPP Paid Printing "printer-location", "printer-make-and-model", "printer-mandatory-job-attributes", @@ -1757,8 +1752,8 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "printer-native-formats", "printer-organization", "printer-organizational-unit", - "printer-output-tray", /* IPP JPS3 */ - "printer-service-type", /* IPP System */ + "printer-output-tray", // IPP JPS3 + "printer-service-type", // IPP System "printer-settable-attributes-supported", "printer-state", "printer-state-change-date-time", @@ -1766,17 +1761,17 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "printer-state-message", "printer-state-reasons", "printer-strings-languages-supported", - /* IPP JPS3 */ - "printer-strings-uri", /* IPP JPS3 */ + // IPP JPS3 + "printer-strings-uri", // IPP JPS3 "printer-supply", "printer-supply-description", "printer-supply-info-uri", - "printer-type", /* CUPS extension */ + "printer-type", // CUPS extension "printer-up-time", "printer-uri-supported", "printer-uuid", - "printer-wifi-ssid", /* AirPrint extension */ - "printer-wifi-state", /* AirPrint extension */ + "printer-wifi-ssid", // AirPrint extension + "printer-wifi-state", // AirPrint extension "printer-xri-supported", "pwg-raster-document-resolution-supported", "pwg-raster-document-sheet-back", @@ -1784,19 +1779,19 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "queued-job-count", "reference-uri-schemes-supported", "repertoire-supported", - "requesting-user-name-allowed", /* CUPS extension */ - "requesting-user-name-denied", /* CUPS extension */ + "requesting-user-name-allowed", // CUPS extension + "requesting-user-name-denied", // CUPS extension "requesting-user-uri-supported", - "smi2699-auth-print-group", /* PWG ippserver extension */ - "smi2699-auth-proxy-group", /* PWG ippserver extension */ - "smi2699-device-command", /* PWG ippserver extension */ - "smi2699-device-format", /* PWG ippserver extension */ - "smi2699-device-name", /* PWG ippserver extension */ - "smi2699-device-uri", /* PWG ippserver extension */ + "smi2699-auth-print-group", // PWG ippserver extension + "smi2699-auth-proxy-group", // PWG ippserver extension + "smi2699-device-command", // PWG ippserver extension + "smi2699-device-format", // PWG ippserver extension + "smi2699-device-name", // PWG ippserver extension + "smi2699-device-uri", // PWG ippserver extension "subordinate-printers-supported", - "subscription-privacy-attributes", /* IPP Privacy Attributes */ - "subscription-privacy-scope", /* IPP Privacy Attributes */ - "urf-supported", /* CUPS extension */ + "subscription-privacy-attributes", // IPP Privacy Attributes + "subscription-privacy-scope", // IPP Privacy Attributes + "urf-supported", // CUPS extension "uri-authentication-supported", "uri-security-supported", "user-defined-value-supported", @@ -1806,12 +1801,12 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "xri-uri-scheme-supported" }; static const char * const resource_description[] = - { /* resource-description group - IPP System */ + { // resource-description group - IPP System "resource-info", "resource-name" }; static const char * const resource_status[] = - { /* resource-status group - IPP System */ + { // resource-status group - IPP System "date-time-at-canceled", "date-time-at-creation", "date-time-at-installed", @@ -1832,7 +1827,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "time-at-installed" }; static const char * const resource_template[] = - { /* resource-template group - IPP System */ + { // resource-template group - IPP System "resource-format", "resource-format-supported", "resource-info", @@ -1841,21 +1836,21 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "resource-type-supported" }; static const char * const subscription_description[] = - { /* subscription-description group */ + { // subscription-description group "notify-job-id", "notify-lease-expiration-time", "notify-printer-up-time", "notify-printer-uri", - "notify-resource-id", /* IPP System */ - "notify-system-uri", /* IPP System */ + "notify-resource-id", // IPP System + "notify-system-uri", // IPP System "notify-sequence-number", "notify-subscriber-user-name", "notify-subscriber-user-uri", "notify-subscription-id", - "notify-subscription-uuid" /* IPP JPS3 */ + "notify-subscription-uuid" // IPP JPS3 }; static const char * const subscription_template[] = - { /* subscription-template group */ + { // subscription-template group "notify-attributes", "notify-attributes-supported", "notify-charset", @@ -1875,7 +1870,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "notify-user-data" }; static const char * const system_description[] = - { /* system-description group - IPP System */ + { // system-description group - IPP System "charset-configured", "charset-supported", "generated-natural-language-supported", @@ -1888,11 +1883,11 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "power-timeout-policy-col", "printer-creation-attributes-supported", "resource-settable-attributes-supported", - "smi2699-auth-group-supported", /* PWG ippserver extension */ - "smi2699-device-command-supported", /* PWG ippserver extension */ - "smi2699-device-format-format", /* PWG ippserver extension */ + "smi2699-auth-group-supported", // PWG ippserver extension + "smi2699-device-command-supported", // PWG ippserver extension + "smi2699-device-format-format", // PWG ippserver extension "smi2699-device-uri-schemes-supported", - /* PWG ippserver extension */ + // PWG ippserver extension "system-contact-col", "system-current-time", "system-default-printer-id", @@ -1910,7 +1905,7 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ "system-xri-supported" }; static const char * const system_status[] = - { /* system-status group - IPP System */ + { // system-status group - IPP System "power-log-col", "power-state-capabilities-col", "power-state-counters-col", @@ -2080,15 +2075,15 @@ ippCreateRequestedArray(ipp_t *request) /* I - IPP request */ } -/* - * 'ippEnumString()' - Return a string corresponding to the enum value. - */ +// +// 'ippEnumString()' - Return a string corresponding to the enum value. +// -const char * /* O - Enum string */ -ippEnumString(const char *attrname, /* I - Attribute name */ - int enumvalue) /* I - Enum value */ +const char * // O - Enum string +ippEnumString(const char *attrname, // I - Attribute name + int enumvalue) // I - Enum value { - _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + _cups_globals_t *cg = _cupsGlobals(); // Pointer to library globals /* @@ -2130,17 +2125,17 @@ ippEnumString(const char *attrname, /* I - Attribute name */ } -/* - * 'ippEnumValue()' - Return the value associated with a given enum string. - */ +// +// 'ippEnumValue()' - Return the value associated with a given enum string. +// -int /* O - Enum value or -1 if unknown */ -ippEnumValue(const char *attrname, /* I - Attribute name */ - const char *enumstring) /* I - Enum string */ +int // O - Enum value or -1 if unknown +ippEnumValue(const char *attrname, // I - Attribute name + const char *enumstring) // I - Enum string { - int i, /* Looping var */ - num_strings; /* Number of strings to compare */ - const char * const *strings; /* Strings to compare */ + int i, // Looping var + num_strings; // Number of strings to compare + const char * const *strings; // Strings to compare /* @@ -2232,14 +2227,14 @@ ippEnumValue(const char *attrname, /* I - Attribute name */ } -/* - * 'ippErrorString()' - Return a name for the given status code. - */ +// +// 'ippErrorString()' - Return a name for the given status code. +// -const char * /* O - Text string */ -ippErrorString(ipp_status_t error) /* I - Error status */ +const char * // O - Text string +ippErrorString(ipp_status_t error) // I - Error status { - _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + _cups_globals_t *cg = _cupsGlobals(); // Pointer to library globals /* @@ -2276,16 +2271,16 @@ ippErrorString(ipp_status_t error) /* I - Error status */ } -/* - * 'ippErrorValue()' - Return a status code for the given name. - * - * @since CUPS 1.2/macOS 10.5@ - */ +// +// 'ippErrorValue()' - Return a status code for the given name. +// +// @since CUPS 1.2/macOS 10.5@ +// -ipp_status_t /* O - IPP status code */ -ippErrorValue(const char *name) /* I - Name */ +ipp_status_t // O - IPP status code +ippErrorValue(const char *name) // I - Name { - size_t i; /* Looping var */ + size_t i; // Looping var for (i = 0; i < (sizeof(ipp_status_oks) / sizeof(ipp_status_oks[0])); i ++) @@ -2318,16 +2313,39 @@ ippErrorValue(const char *name) /* I - Name */ } -/* - * 'ippOpString()' - Return a name for the given operation id. - * - * @since CUPS 1.2/macOS 10.5@ - */ +// +// 'ippGetPort()' - Return the default IPP port number. +// +// @since CUPS 2.5@ +// -const char * /* O - Name */ -ippOpString(ipp_op_t op) /* I - Operation ID */ +int // O - Port number +ippGetPort(void) { - _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + _cups_globals_t *cg = _cupsGlobals(); // Pointer to library globals + + + DEBUG_puts("ippPort()"); + + if (!cg->ipp_port) + _cupsSetDefaults(); + + DEBUG_printf("1ippPort: Returning %d...", cg->ipp_port); + + return (cg->ipp_port); +} + + +// +// 'ippOpString()' - Return a name for the given operation id. +// +// @since CUPS 1.2/macOS 10.5@ +// + +const char * // O - Name +ippOpString(ipp_op_t op) // I - Operation ID +{ + _cups_globals_t *cg = _cupsGlobals(); // Pointer to library globals /* @@ -2353,16 +2371,16 @@ ippOpString(ipp_op_t op) /* I - Operation ID */ } -/* - * 'ippOpValue()' - Return an operation id for the given name. - * - * @since CUPS 1.2/macOS 10.5@ - */ +// +// 'ippOpValue()' - Return an operation id for the given name. +// +// @since CUPS 1.2/macOS 10.5@ +// -ipp_op_t /* O - Operation ID */ -ippOpValue(const char *name) /* I - Textual name */ +ipp_op_t // O - Operation ID +ippOpValue(const char *name) // I - Textual name { - size_t i; /* Looping var */ + size_t i; // Looping var if (!strncmp(name, "0x", 2)) @@ -2399,33 +2417,25 @@ ippOpValue(const char *name) /* I - Textual name */ } -/* - * 'ippPort()' - Return the default IPP port number. - */ +// +// 'ippPort()' - Return the default IPP port number. +// +// @deprecated@ @exclude all@ +// -int /* O - Port number */ +int // O - Port number ippPort(void) { - _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ - - - DEBUG_puts("ippPort()"); - - if (!cg->ipp_port) - _cupsSetDefaults(); - - DEBUG_printf("1ippPort: Returning %d...", cg->ipp_port); - - return (cg->ipp_port); + return (ippGetPort()); } -/* - * 'ippSetPort()' - Set the default port number. - */ +// +// 'ippSetPort()' - Set the default port number. +// void -ippSetPort(int p) /* I - Port number to use */ +ippSetPort(int p) // I - Port number to use { DEBUG_printf("ippSetPort(p=%d)", p); @@ -2433,14 +2443,14 @@ ippSetPort(int p) /* I - Port number to use */ } -/* - * 'ippStateString()' - Return the name corresponding to a state value. - * - * @since CUPS 2.0/OS 10.10@ - */ +// +// 'ippStateString()' - Return the name corresponding to a state value. +// +// @since CUPS 2.0/OS 10.10@ +// -const char * /* O - State name */ -ippStateString(ipp_state_t state) /* I - State value */ +const char * // O - State name +ippStateString(ipp_state_t state) // I - State value { if (state >= IPP_STATE_ERROR && state <= IPP_STATE_DATA) return (ipp_states[state - IPP_STATE_ERROR]); @@ -2449,16 +2459,16 @@ ippStateString(ipp_state_t state) /* I - State value */ } -/* - * 'ippTagString()' - Return the tag name corresponding to a tag value. - * - * The returned names are defined in RFC 8011 and the IANA IPP Registry. - * - * @since CUPS 1.4/macOS 10.6@ - */ +// +// 'ippTagString()' - Return the tag name corresponding to a tag value. +// +// The returned names are defined in RFC 8011 and the IANA IPP Registry. +// +// @since CUPS 1.4/macOS 10.6@ +// -const char * /* O - Tag name */ -ippTagString(ipp_tag_t tag) /* I - Tag value */ +const char * // O - Tag name +ippTagString(ipp_tag_t tag) // I - Tag value { tag &= IPP_TAG_CUPS_MASK; @@ -2469,18 +2479,18 @@ ippTagString(ipp_tag_t tag) /* I - Tag value */ } -/* - * 'ippTagValue()' - Return the tag value corresponding to a tag name. - * - * The tag names are defined in RFC 8011 and the IANA IPP Registry. - * - * @since CUPS 1.4/macOS 10.6@ - */ +// +// 'ippTagValue()' - Return the tag value corresponding to a tag name. +// +// The tag names are defined in RFC 8011 and the IANA IPP Registry. +// +// @since CUPS 1.4/macOS 10.6@ +// -ipp_tag_t /* O - Tag value */ -ippTagValue(const char *name) /* I - Tag name */ +ipp_tag_t // O - Tag value +ippTagValue(const char *name) // I - Tag name { - size_t i; /* Looping var */ + size_t i; // Looping var for (i = 0; i < (sizeof(ipp_tag_names) / sizeof(ipp_tag_names[0])); i ++) @@ -2514,20 +2524,20 @@ ippTagValue(const char *name) /* I - Tag name */ } -/* - * 'ipp_col_string()' - Convert a collection to a string. - */ +// +// 'ipp_col_string()' - Convert a collection to a string. +// -static size_t /* O - Number of bytes */ -ipp_col_string(ipp_t *col, /* I - Collection attribute */ - char *buffer, /* I - Buffer or NULL */ - size_t bufsize) /* I - Size of buffer */ +static size_t // O - Number of bytes +ipp_col_string(ipp_t *col, // I - Collection attribute + char *buffer, // I - Buffer or NULL + size_t bufsize) // I - Size of buffer { - char *bufptr, /* Position in buffer */ - *bufend, /* End of buffer */ - prefix = '{', /* Prefix character */ - temp[256]; /* Temporary string */ - ipp_attribute_t *attr; /* Current member attribute */ + char *bufptr, // Position in buffer + *bufend, // End of buffer + prefix = '{', // Prefix character + temp[256]; // Temporary string + ipp_attribute_t *attr; // Current member attribute if (!col) diff --git a/cups/ipp-vars.c b/cups/ipp-vars.c deleted file mode 100644 index c85bc02435..0000000000 --- a/cups/ipp-vars.c +++ /dev/null @@ -1,262 +0,0 @@ -/* - * IPP data file parsing functions. - * - * Copyright © 2007-2019 by Apple Inc. - * Copyright © 1997-2007 by Easy Software Products. - * - * Licensed under Apache License v2.0. See the file "LICENSE" for more - * information. - */ - -/* - * Include necessary headers... - */ - -#include "cups-private.h" -#include "ipp-private.h" -#include "string-private.h" -#include "debug-internal.h" - - -/* - * '_ippVarsDeinit()' - Free all memory associated with the IPP variables. - */ - -void -_ippVarsDeinit(_ipp_vars_t *v) /* I - IPP variables */ -{ - if (v->uri) - { - free(v->uri); - v->uri = NULL; - } - - cupsFreeOptions(v->num_vars, v->vars); - v->num_vars = 0; - v->vars = NULL; -} - - -/* - * '_ippVarsExpand()' - Expand variables in the source string. - */ - -void -_ippVarsExpand(_ipp_vars_t *v, /* I - IPP variables */ - char *dst, /* I - Destination buffer */ - const char *src, /* I - Source string */ - size_t dstsize) /* I - Destination buffer size */ -{ - char *dstptr, /* Pointer into destination */ - *dstend, /* End of destination */ - temp[256], /* Temporary string */ - *tempptr; /* Pointer into temporary string */ - const char *value; /* Value to substitute */ - - - dstptr = dst; - dstend = dst + dstsize - 1; - - while (*src && dstptr < dstend) - { - if (*src == '$') - { - /* - * Substitute a string/number... - */ - - if (!strncmp(src, "$$", 2)) - { - value = "$"; - src += 2; - } - else if (!strncmp(src, "$ENV[", 5)) - { - cupsCopyString(temp, src + 5, sizeof(temp)); - - for (tempptr = temp; *tempptr; tempptr ++) - if (*tempptr == ']') - break; - - if (*tempptr) - *tempptr++ = '\0'; - - value = getenv(temp); - src += tempptr - temp + 5; - } - else - { - if (src[1] == '{') - { - src += 2; - cupsCopyString(temp, src, sizeof(temp)); - if ((tempptr = strchr(temp, '}')) != NULL) - *tempptr = '\0'; - else - tempptr = temp + strlen(temp); - } - else - { - cupsCopyString(temp, src + 1, sizeof(temp)); - - for (tempptr = temp; *tempptr; tempptr ++) - if (!isalnum(*tempptr & 255) && *tempptr != '-' && *tempptr != '_') - break; - - if (*tempptr) - *tempptr = '\0'; - } - - value = _ippVarsGet(v, temp); - - src += tempptr - temp + 1; - } - - if (value) - { - cupsCopyString(dstptr, value, (size_t)(dstend - dstptr + 1)); - dstptr += strlen(dstptr); - } - } - else - *dstptr++ = *src++; - } - - *dstptr = '\0'; -} - - -/* - * '_ippVarsGet()' - Get a variable string. - */ - -const char * /* O - Value or @code NULL@ if not set */ -_ippVarsGet(_ipp_vars_t *v, /* I - IPP variables */ - const char *name) /* I - Variable name */ -{ - if (!v) - return (NULL); - else if (!strcmp(name, "uri")) - return (v->uri); - else if (!strcmp(name, "uriuser") || !strcmp(name, "username")) - return (v->username[0] ? v->username : NULL); - else if (!strcmp(name, "scheme") || !strcmp(name, "method")) - return (v->scheme); - else if (!strcmp(name, "hostname")) - return (v->host); - else if (!strcmp(name, "port")) - return (v->portstr); - else if (!strcmp(name, "resource")) - return (v->resource); - else if (!strcmp(name, "user")) - return (cupsGetUser()); - else - return (cupsGetOption(name, v->num_vars, v->vars)); -} - - -/* - * '_ippVarsInit()' - Initialize . - */ - -void -_ippVarsInit(_ipp_vars_t *v, /* I - IPP variables */ - _ipp_fattr_cb_t attrcb, /* I - Attribute (filter) callback */ - _ipp_ferror_cb_t errorcb, /* I - Error callback */ - _ipp_ftoken_cb_t tokencb) /* I - Token callback */ -{ - memset(v, 0, sizeof(_ipp_vars_t)); - - v->attrcb = attrcb; - v->errorcb = errorcb; - v->tokencb = tokencb; -} - - -/* - * '_ippVarsPasswordCB()' - Password callback using the IPP variables. - */ - -const char * /* O - Password string or @code NULL@ */ -_ippVarsPasswordCB( - const char *prompt, /* I - Prompt string (not used) */ - http_t *http, /* I - HTTP connection (not used) */ - const char *method, /* I - HTTP method (not used) */ - const char *resource, /* I - Resource path (not used) */ - void *user_data) /* I - IPP variables */ -{ - _ipp_vars_t *v = (_ipp_vars_t *)user_data; - /* I - IPP variables */ - - - (void)prompt; - (void)http; - (void)method; - (void)resource; - - if (v->username[0] && v->password && v->password_tries < 3) - { - v->password_tries ++; - - cupsSetUser(v->username); - - return (v->password); - } - else - { - return (NULL); - } -} - - -/* - * '_ippVarsSet()' - Set an IPP variable. - */ - -int /* O - 1 on success, 0 on failure */ -_ippVarsSet(_ipp_vars_t *v, /* I - IPP variables */ - const char *name, /* I - Variable name */ - const char *value) /* I - Variable value */ -{ - if (!strcmp(name, "uri")) - { - char uri[1024]; /* New printer URI */ - char resolved[1024]; /* Resolved mDNS URI */ - - if (strstr(value, "._tcp")) - { - /* - * Resolve URI... - */ - - if (!httpResolveURI(value, resolved, sizeof(resolved), HTTP_RESOLVE_DEFAULT, NULL, NULL)) - return (0); - - value = resolved; - } - - if (httpSeparateURI(HTTP_URI_CODING_ALL, value, v->scheme, sizeof(v->scheme), v->username, sizeof(v->username), v->host, sizeof(v->host), &(v->port), v->resource, sizeof(v->resource)) < HTTP_URI_STATUS_OK) - return (0); - - if (v->username[0]) - { - if ((v->password = strchr(v->username, ':')) != NULL) - *(v->password)++ = '\0'; - } - - snprintf(v->portstr, sizeof(v->portstr), "%d", v->port); - - if (v->uri) - free(v->uri); - - httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), v->scheme, NULL, v->host, v->port, v->resource); - v->uri = strdup(uri); - - return (v->uri != NULL); - } - else - { - v->num_vars = cupsAddOption(name, value, v->num_vars, &v->vars); - return (1); - } -} diff --git a/cups/ipp.c b/cups/ipp.c index c4019b7e53..743fad15ef 100644 --- a/cups/ipp.c +++ b/cups/ipp.c @@ -1,59 +1,47 @@ -/* - * Internet Printing Protocol functions for CUPS. - * - * Copyright © 2007-2021 by Apple Inc. - * Copyright © 1997-2007 by Easy Software Products, all rights reserved. - * - * Licensed under Apache License v2.0. See the file "LICENSE" for more - * information. - */ - -/* - * Include necessary headers... - */ +// +// Internet Printing Protocol functions for CUPS. +// +// Copyright © 2021-2023 by OpenPrinting. +// Copyright © 2007-2021 by Apple Inc. +// Copyright © 1997-2007 by Easy Software Products, all rights reserved. +// +// Licensed under Apache License v2.0. See the file "LICENSE" for more +// information. +// #include "cups-private.h" -#include "debug-internal.h" #include #ifdef _WIN32 # include -#endif /* _WIN32 */ +#endif // _WIN32 -/* - * Local functions... - */ +// +// Local functions... +// -static ipp_attribute_t *ipp_add_attr(ipp_t *ipp, const char *name, - ipp_tag_t group_tag, ipp_tag_t value_tag, - int num_values); -static void ipp_free_values(ipp_attribute_t *attr, int element, - int count); +static ipp_attribute_t *ipp_add_attr(ipp_t *ipp, const char *name, ipp_tag_t group_tag, ipp_tag_t value_tag, int num_values); +static void ipp_free_values(ipp_attribute_t *attr, int element, int count); static char *ipp_get_code(const char *locale, char *buffer, size_t bufsize) _CUPS_NONNULL(1,2); static char *ipp_lang_code(const char *locale, char *buffer, size_t bufsize) _CUPS_NONNULL(1,2); static size_t ipp_length(ipp_t *ipp, int collection); -static ssize_t ipp_read_http(http_t *http, ipp_uchar_t *buffer, - size_t length); -static ssize_t ipp_read_file(int *fd, ipp_uchar_t *buffer, - size_t length); -static void ipp_set_error(ipp_status_t status, const char *format, - ...); -static _ipp_value_t *ipp_set_value(ipp_t *ipp, ipp_attribute_t **attr, - int element); -static ssize_t ipp_write_file(int *fd, ipp_uchar_t *buffer, - size_t length); - - -/* - * '_cupsBufferGet()' - Get a read/write buffer. - */ - -char * /* O - Buffer */ -_cupsBufferGet(size_t size) /* I - Size required */ +static ssize_t ipp_read_http(http_t *http, ipp_uchar_t *buffer, size_t length); +static ssize_t ipp_read_file(int *fd, ipp_uchar_t *buffer, size_t length); +static void ipp_set_error(ipp_status_t status, const char *format, ...); +static _ipp_value_t *ipp_set_value(ipp_t *ipp, ipp_attribute_t **attr, int element); +static ssize_t ipp_write_file(int *fd, ipp_uchar_t *buffer, size_t length); + + +// +// '_cupsBufferGet()' - Get a read/write buffer. +// + +char * // O - Buffer +_cupsBufferGet(size_t size) // I - Size required { - _cups_buffer_t *buffer; /* Current buffer */ + _cups_buffer_t *buffer; // Current buffer _cups_globals_t *cg = _cupsGlobals(); - /* Global data */ + // Global data for (buffer = cg->cups_buffers; buffer; buffer = buffer->next) @@ -76,61 +64,51 @@ _cupsBufferGet(size_t size) /* I - Size required */ } -/* - * '_cupsBufferRelease()' - Release a read/write buffer. - */ +// +// '_cupsBufferRelease()' - Release a read/write buffer. +// void -_cupsBufferRelease(char *b) /* I - Buffer to release */ +_cupsBufferRelease(char *b) // I - Buffer to release { - _cups_buffer_t *buffer; /* Buffer */ - + _cups_buffer_t *buffer; // Buffer - /* - * Mark this buffer as unused... - */ + // Mark this buffer as unused... buffer = (_cups_buffer_t *)(b - offsetof(_cups_buffer_t, d)); buffer->used = 0; } -/* - * 'ippAddBoolean()' - Add a boolean attribute to an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddBoolean(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - const char *name, /* I - Name of attribute */ - char value) /* I - Value of attribute */ +// +// 'ippAddBoolean()' - Add a boolean attribute to an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// + +ipp_attribute_t * // O - New attribute +ippAddBoolean(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + const char *name, // I - Name of attribute + char value) // I - Value of attribute { - ipp_attribute_t *attr; /* New attribute */ + ipp_attribute_t *attr; // New attribute DEBUG_printf("ippAddBoolean(ipp=%p, group=%02x(%s), name=\"%s\", value=%d)", (void *)ipp, group, ippTagString(group), name, value); - /* - * Range check input... - */ - - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) + // Range check input... + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) return (NULL); - /* - * Create the attribute... - */ - + // Create the attribute... if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_BOOLEAN, 1)) == NULL) return (NULL); @@ -140,54 +118,44 @@ ippAddBoolean(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippAddBooleans()' - Add an array of boolean values. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddBooleans(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - const char *name, /* I - Name of attribute */ - int num_values, /* I - Number of values */ - const char *values) /* I - Values */ +// +// 'ippAddBooleans()' - Add an array of boolean values. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// + +ipp_attribute_t * // O - New attribute +ippAddBooleans(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + const char *name, // I - Name of attribute + int num_values, // I - Number of values + const char *values) // I - Values { - int i; /* Looping var */ - ipp_attribute_t *attr; /* New attribute */ - _ipp_value_t *value; /* Current value */ + int i; // Looping var + ipp_attribute_t *attr; // New attribute + _ipp_value_t *value; // Current value DEBUG_printf("ippAddBooleans(ipp=%p, group=%02x(%s), name=\"%s\", num_values=%d, values=%p)", (void *)ipp, group, ippTagString(group), name, num_values, (void *)values); - /* - * Range check input... - */ - - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || - num_values < 1) + // Range check input... + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || num_values < 1) return (NULL); - /* - * Create the attribute... - */ - + // Create the attribute... if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_BOOLEAN, num_values)) == NULL) return (NULL); if (values) { - for (i = num_values, value = attr->values; - i > 0; - i --, value ++) + for (i = num_values, value = attr->values; i > 0; i --, value ++) value->boolean = *values++; } @@ -195,44 +163,37 @@ ippAddBooleans(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippAddCollection()' - Add a collection value. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - * - * @since CUPS 1.1.19/macOS 10.3@ - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddCollection(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - const char *name, /* I - Name of attribute */ - ipp_t *value) /* I - Value */ +// +// 'ippAddCollection()' - Add a collection value. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// +// @since CUPS 1.1.19/macOS 10.3@ +// + +ipp_attribute_t * // O - New attribute +ippAddCollection(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + const char *name, // I - Name of attribute + ipp_t *value) // I - Value { - ipp_attribute_t *attr; /* New attribute */ + ipp_attribute_t *attr; // New attribute DEBUG_printf("ippAddCollection(ipp=%p, group=%02x(%s), name=\"%s\", value=%p)", (void *)ipp, group, ippTagString(group), name, (void *)value); - /* - * Range check input... - */ - - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) + // Range check input... + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) return (NULL); - /* - * Create the attribute... - */ - + // Create the attribute... if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_BEGIN_COLLECTION, 1)) == NULL) return (NULL); @@ -245,58 +206,47 @@ ippAddCollection(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippAddCollections()' - Add an array of collection values. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - * - * @since CUPS 1.1.19/macOS 10.3@ - */ - -ipp_attribute_t * /* O - New attribute */ +// +// 'ippAddCollections()' - Add an array of collection values. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// +// @since CUPS 1.1.19/macOS 10.3@ +// + +ipp_attribute_t * // O - New attribute ippAddCollections( - ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - const char *name, /* I - Name of attribute */ - int num_values, /* I - Number of values */ - const ipp_t **values) /* I - Values */ + ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + const char *name, // I - Name of attribute + int num_values, // I - Number of values + const ipp_t **values) // I - Values { - int i; /* Looping var */ - ipp_attribute_t *attr; /* New attribute */ - _ipp_value_t *value; /* Current value */ + int i; // Looping var + ipp_attribute_t *attr; // New attribute + _ipp_value_t *value; // Current value DEBUG_printf("ippAddCollections(ipp=%p, group=%02x(%s), name=\"%s\", num_values=%d, values=%p)", (void *)ipp, group, ippTagString(group), name, num_values, (void *)values); - /* - * Range check input... - */ - - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || - num_values < 1) + // Range check input... + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || num_values < 1) return (NULL); - /* - * Create the attribute... - */ - - if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_BEGIN_COLLECTION, - num_values)) == NULL) + // Create the attribute... + if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_BEGIN_COLLECTION, num_values)) == NULL) return (NULL); if (values) { - for (i = num_values, value = attr->values; - i > 0; - i --, value ++) + for (i = num_values, value = attr->values; i > 0; i --, value ++) { value->collection = (ipp_t *)*values++; value->collection->use ++; @@ -307,42 +257,129 @@ ippAddCollections( } -/* - * 'ippAddDate()' - Add a dateTime attribute to an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddDate(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - const char *name, /* I - Name of attribute */ - const ipp_uchar_t *value) /* I - Value */ +// +// 'ippAddCredentialsString()' - Add a credentials string attribute to an IPP message. +// +// This function adds a 1setOf text attribute to an IPP message corresponding to +// the specified credentials string. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// +// @since CUPS 2.5@ +// + +ipp_attribute_t * // O - New attribute +ippAddCredentialsString( + ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + const char *name, // I - Attribute name + const char *credentials) // I - Credentials string { - ipp_attribute_t *attr; /* New attribute */ - + ipp_attribute_t *attr; // New attribute + char *cvalue, // Copied value + *cstart, // Start of value + *cptr; // Pointer into copied value + size_t i, // Looping var + num_values; // Number of values - DEBUG_printf("ippAddDate(ipp=%p, group=%02x(%s), name=\"%s\", value=%p)", (void *)ipp, group, ippTagString(group), name, (void *)value); - /* - * Range check input... - */ + // Range check input... + if (!ipp || !name || !credentials) + return (NULL); - if (!ipp || !name || !value || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) + // Copy the value string and figure out the number of values... + if ((cvalue = strdup(credentials)) == NULL) return (NULL); - /* - * Create the attribute... - */ + for (num_values = 0, cptr = cvalue; cptr;) + { + // Find the next delimiter + if (*cptr && *cptr != '\r' && *cptr != '\n') + num_values ++; + cstart = cptr; + if ((cptr = strchr(cstart, '\r')) != NULL) + { + // Skip CR or CR LF + if (cptr[1] == '\n') + cptr += 2; + else + cptr ++; + } + else if ((cptr = strchr(cstart, '\n')) != NULL) + { + // Skip LF + cptr ++; + } + } + + // Create the empty attribute and copy the values... + if ((attr = ippAddStrings(ipp, group, IPP_TAG_TEXT, name, num_values, NULL, NULL)) != NULL) + { + for (i = 0, cptr = cvalue; cptr && i < num_values;) + { + cstart = cptr; + if ((cptr = strchr(cptr, '\r')) != NULL) + { + // Terminate on CR + *cptr++ = '\0'; + if (*cptr == '\n') + cptr ++; // Skip LF + } + else if ((cptr = strchr(cptr, '\n')) != NULL) + { + // Terminate on LF + *cptr++ = '\0'; + } + + if (*cstart) + attr->values[i++].string.text = _cupsStrAlloc(cstart); + } + } + + // Free the copied string and return... + free(cvalue); + + return (attr); +} + + +// +// 'ippAddDate()' - Add a dateTime attribute to an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// + +ipp_attribute_t * // O - New attribute +ippAddDate(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + const char *name, // I - Name of attribute + const ipp_uchar_t *value) // I - Value +{ + ipp_attribute_t *attr; // New attribute + + + DEBUG_printf("ippAddDate(ipp=%p, group=%02x(%s), name=\"%s\", value=%p)", (void *)ipp, group, ippTagString(group), name, (void *)value); + + // Range check input... + if (!ipp || !name || !value || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) + return (NULL); + + // Create the attribute... if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_DATE, 1)) == NULL) return (NULL); @@ -352,63 +389,47 @@ ippAddDate(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippAddInteger()' - Add a integer attribute to an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - * - * Supported values include enum (@code IPP_TAG_ENUM@) and integer - * (@code IPP_TAG_INTEGER@). - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddInteger(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - ipp_tag_t value_tag, /* I - Type of attribute */ - const char *name, /* I - Name of attribute */ - int value) /* I - Value of attribute */ +// +// 'ippAddInteger()' - Add a integer attribute to an IPP message. +// +// This function adds an integer or enum attribute to an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// +// Supported values include enum (`IPP_TAG_ENUM`) and integer +// (`IPP_TAG_INTEGER`). +// + +ipp_attribute_t * // O - New attribute +ippAddInteger(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + ipp_tag_t value_tag, // I - Type of attribute + const char *name, // I - Name of attribute + int value) // I - Value of attribute { - ipp_attribute_t *attr; /* New attribute */ + ipp_attribute_t *attr; // New attribute DEBUG_printf("ippAddInteger(ipp=%p, group=%02x(%s), type=%02x(%s), name=\"%s\", value=%d)", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name, value); value_tag &= IPP_TAG_CUPS_MASK; - /* - * Special-case for legacy usage: map out-of-band attributes to new ippAddOutOfBand - * function... - */ - + // Special-case for legacy usage: map out-of-band attributes to new ippAddOutOfBand function... if (value_tag >= IPP_TAG_UNSUPPORTED_VALUE && value_tag <= IPP_TAG_ADMINDEFINE) return (ippAddOutOfBand(ipp, group, value_tag, name)); - /* - * Range check input... - */ - -#if 0 - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || - (value_tag != IPP_TAG_INTEGER && value_tag != IPP_TAG_ENUM)) - return (NULL); -#else - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) + // Range check input... + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || (value_tag != IPP_TAG_INTEGER && value_tag != IPP_TAG_ENUM)) return (NULL); -#endif /* 0 */ - - /* - * Create the attribute... - */ + // Create the attribute... if ((attr = ipp_add_attr(ipp, name, group, value_tag, 1)) == NULL) return (NULL); @@ -418,68 +439,50 @@ ippAddInteger(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippAddIntegers()' - Add an array of integer values. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - * - * Supported values include enum (@code IPP_TAG_ENUM@) and integer - * (@code IPP_TAG_INTEGER@). - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddIntegers(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - ipp_tag_t value_tag, /* I - Type of attribute */ - const char *name, /* I - Name of attribute */ - int num_values, /* I - Number of values */ - const int *values) /* I - Values */ +// +// 'ippAddIntegers()' - Add an array of integer values. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// +// Supported values include enum (`IPP_TAG_ENUM`) and integer +// (`IPP_TAG_INTEGER`). +// + +ipp_attribute_t * // O - New attribute +ippAddIntegers(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + ipp_tag_t value_tag, // I - Type of attribute + const char *name, // I - Name of attribute + int num_values, // I - Number of values + const int *values) // I - Values { - int i; /* Looping var */ - ipp_attribute_t *attr; /* New attribute */ - _ipp_value_t *value; /* Current value */ + int i; // Looping var + ipp_attribute_t *attr; // New attribute + _ipp_value_t *value; // Current value DEBUG_printf("ippAddIntegers(ipp=%p, group=%02x(%s), type=%02x(%s), name=\"%s\", num_values=%d, values=%p)", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name, num_values, (void *)values); value_tag &= IPP_TAG_CUPS_MASK; - /* - * Range check input... - */ - -#if 0 - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || - (value_tag != IPP_TAG_INTEGER && value_tag != IPP_TAG_ENUM) || - num_values < 1) + // Range check input... + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || (value_tag != IPP_TAG_INTEGER && value_tag != IPP_TAG_ENUM) || num_values < 1) return (NULL); -#else - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || - num_values < 1) - return (NULL); -#endif /* 0 */ - - /* - * Create the attribute... - */ + // Create the attribute... if ((attr = ipp_add_attr(ipp, name, group, value_tag, num_values)) == NULL) return (NULL); if (values) { - for (i = num_values, value = attr->values; - i > 0; - i --, value ++) + for (i = num_values, value = attr->values; i > 0; i --, value ++) value->integer = *values++; } @@ -487,43 +490,39 @@ ippAddIntegers(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippAddOctetString()' - Add an octetString value to an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - * - * @since CUPS 1.2/macOS 10.5@ - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddOctetString(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - const char *name, /* I - Name of attribute */ - const void *data, /* I - octetString data */ - int datalen) /* I - Length of data in bytes */ +// +// 'ippAddOctetString()' - Add an octetString value to an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// +// @since CUPS 1.2/macOS 10.5@ +// + +ipp_attribute_t * // O - New attribute +ippAddOctetString(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + const char *name, // I - Name of attribute + const void *data, // I - octetString data + int datalen) // I - Length of data in bytes { - ipp_attribute_t *attr; /* New attribute */ + ipp_attribute_t *attr; // New attribute - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || - datalen < 0 || datalen > IPP_MAX_LENGTH) + // Range check input... + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || datalen < 0 || datalen > IPP_MAX_LENGTH) return (NULL); if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_STRING, 1)) == NULL) return (NULL); - /* - * Initialize the attribute data... - */ - + // Initialize the attribute data... attr->values[0].unknown.length = datalen; if (data) @@ -537,107 +536,83 @@ ippAddOctetString(ipp_t *ipp, /* I - IPP message */ memcpy(attr->values[0].unknown.data, data, (size_t)datalen); } - /* - * Return the new attribute... - */ - + // Return the new attribute... return (attr); } -/* - * 'ippAddOutOfBand()' - Add an out-of-band value to an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - * - * Supported out-of-band values include unsupported-value - * (@code IPP_TAG_UNSUPPORTED_VALUE@), default (@code IPP_TAG_DEFAULT@), unknown - * (@code IPP_TAG_UNKNOWN@), no-value (@code IPP_TAG_NOVALUE@), not-settable - * (@code IPP_TAG_NOTSETTABLE@), delete-attribute (@code IPP_TAG_DELETEATTR@), and - * admin-define (@code IPP_TAG_ADMINDEFINE@). - * - * @since CUPS 1.6/macOS 10.8@ - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddOutOfBand(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - ipp_tag_t value_tag, /* I - Type of attribute */ - const char *name) /* I - Name of attribute */ +// +// 'ippAddOutOfBand()' - Add an out-of-band value to an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// +// Supported out-of-band values include unsupported-value +// (`IPP_TAG_UNSUPPORTED_VALUE`), default (`IPP_TAG_DEFAULT`), unknown +// (`IPP_TAG_UNKNOWN`), no-value (`IPP_TAG_NOVALUE`), not-settable +// (`IPP_TAG_NOTSETTABLE`), delete-attribute (`IPP_TAG_DELETEATTR`), and +// admin-define (`IPP_TAG_ADMINDEFINE`). +// +// @since CUPS 1.6/macOS 10.8@ +// + +ipp_attribute_t * // O - New attribute +ippAddOutOfBand(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + ipp_tag_t value_tag, // I - Type of attribute + const char *name) // I - Name of attribute { DEBUG_printf("ippAddOutOfBand(ipp=%p, group=%02x(%s), value_tag=%02x(%s), name=\"%s\")", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name); value_tag &= IPP_TAG_CUPS_MASK; - /* - * Range check input... - */ - - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || - (value_tag != IPP_TAG_UNSUPPORTED_VALUE && - value_tag != IPP_TAG_DEFAULT && - value_tag != IPP_TAG_UNKNOWN && - value_tag != IPP_TAG_NOVALUE && - value_tag != IPP_TAG_NOTSETTABLE && - value_tag != IPP_TAG_DELETEATTR && - value_tag != IPP_TAG_ADMINDEFINE)) + // Range check input... + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || (value_tag != IPP_TAG_UNSUPPORTED_VALUE && value_tag != IPP_TAG_DEFAULT && value_tag != IPP_TAG_UNKNOWN && value_tag != IPP_TAG_NOVALUE && value_tag != IPP_TAG_NOTSETTABLE && value_tag != IPP_TAG_DELETEATTR && value_tag != IPP_TAG_ADMINDEFINE)) return (NULL); - /* - * Create the attribute... - */ - + // Create the attribute... return (ipp_add_attr(ipp, name, group, value_tag, 1)); } -/* - * 'ippAddRange()' - Add a range of values to an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - * - * The @code lower@ parameter must be less than or equal to the @code upper@ parameter. - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddRange(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - const char *name, /* I - Name of attribute */ - int lower, /* I - Lower value */ - int upper) /* I - Upper value */ +// +// 'ippAddRange()' - Add a range of values to an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// +// The "lower" parameter must be less than or equal to the "upper" parameter. +// + +ipp_attribute_t * // O - New attribute +ippAddRange(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + const char *name, // I - Name of attribute + int lower, // I - Lower value + int upper) // I - Upper value { - ipp_attribute_t *attr; /* New attribute */ + ipp_attribute_t *attr; // New attribute DEBUG_printf("ippAddRange(ipp=%p, group=%02x(%s), name=\"%s\", lower=%d, upper=%d)", (void *)ipp, group, ippTagString(group), name, lower, upper); - /* - * Range check input... - */ - - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) + // Range check input... + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) return (NULL); - /* - * Create the attribute... - */ - + // Create the attribute... if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_RANGE, 1)) == NULL) return (NULL); @@ -648,55 +623,45 @@ ippAddRange(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippAddRanges()' - Add ranges of values to an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddRanges(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - const char *name, /* I - Name of attribute */ - int num_values, /* I - Number of values */ - const int *lower, /* I - Lower values */ - const int *upper) /* I - Upper values */ +// +// 'ippAddRanges()' - Add ranges of values to an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// + +ipp_attribute_t * // O - New attribute +ippAddRanges(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + const char *name, // I - Name of attribute + int num_values, // I - Number of values + const int *lower, // I - Lower values + const int *upper) // I - Upper values { - int i; /* Looping var */ - ipp_attribute_t *attr; /* New attribute */ - _ipp_value_t *value; /* Current value */ + int i; // Looping var + ipp_attribute_t *attr; // New attribute + _ipp_value_t *value; // Current value DEBUG_printf("ippAddRanges(ipp=%p, group=%02x(%s), name=\"%s\", num_values=%d, lower=%p, upper=%p)", (void *)ipp, group, ippTagString(group), name, num_values, (void *)lower, (void *)upper); - /* - * Range check input... - */ - - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || - num_values < 1) + // Range check input... + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || num_values < 1) return (NULL); - /* - * Create the attribute... - */ - + // Create the attribute... if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_RANGE, num_values)) == NULL) return (NULL); if (lower && upper) { - for (i = num_values, value = attr->values; - i > 0; - i --, value ++) + for (i = num_values, value = attr->values; i > 0; i --, value ++) { value->range.lower = *lower++; value->range.upper = *upper++; @@ -707,46 +672,37 @@ ippAddRanges(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippAddResolution()' - Add a resolution value to an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddResolution(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - const char *name, /* I - Name of attribute */ - ipp_res_t units, /* I - Units for resolution */ - int xres, /* I - X resolution */ - int yres) /* I - Y resolution */ +// +// 'ippAddResolution()' - Add a resolution value to an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// + +ipp_attribute_t * // O - New attribute +ippAddResolution(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + const char *name, // I - Name of attribute + ipp_res_t units, // I - Units for resolution + int xres, // I - X resolution + int yres) // I - Y resolution { - ipp_attribute_t *attr; /* New attribute */ + ipp_attribute_t *attr; // New attribute DEBUG_printf("ippAddResolution(ipp=%p, group=%02x(%s), name=\"%s\", units=%d, xres=%d, yres=%d)", (void *)ipp, group, ippTagString(group), name, units, xres, yres); - /* - * Range check input... - */ - - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || - units < IPP_RES_PER_INCH || units > IPP_RES_PER_CM || - xres < 0 || yres < 0) + // Range check input... + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || units < IPP_RES_PER_INCH || units > IPP_RES_PER_CM || xres < 0 || yres < 0) return (NULL); - /* - * Create the attribute... - */ - + // Create the attribute... if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_RESOLUTION, 1)) == NULL) return (NULL); @@ -758,57 +714,46 @@ ippAddResolution(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippAddResolutions()' - Add resolution values to an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddResolutions(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - const char *name, /* I - Name of attribute */ - int num_values,/* I - Number of values */ - ipp_res_t units, /* I - Units for resolution */ - const int *xres, /* I - X resolutions */ - const int *yres) /* I - Y resolutions */ +// +// 'ippAddResolutions()' - Add resolution values to an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// + +ipp_attribute_t * // O - New attribute +ippAddResolutions(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + const char *name, // I - Name of attribute + int num_values,// I - Number of values + ipp_res_t units, // I - Units for resolution + const int *xres, // I - X resolutions + const int *yres) // I - Y resolutions { - int i; /* Looping var */ - ipp_attribute_t *attr; /* New attribute */ - _ipp_value_t *value; /* Current value */ + int i; // Looping var + ipp_attribute_t *attr; // New attribute + _ipp_value_t *value; // Current value DEBUG_printf("ippAddResolutions(ipp=%p, group=%02x(%s), name=\"%s\", num_value=%d, units=%d, xres=%p, yres=%p)", (void *)ipp, group, ippTagString(group), name, num_values, units, (void *)xres, (void *)yres); - /* - * Range check input... - */ - - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || - num_values < 1 || - units < IPP_RES_PER_INCH || units > IPP_RES_PER_CM) + // Range check input... + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || num_values < 1 || units < IPP_RES_PER_INCH || units > IPP_RES_PER_CM) return (NULL); - /* - * Create the attribute... - */ - + // Create the attribute... if ((attr = ipp_add_attr(ipp, name, group, IPP_TAG_RESOLUTION, num_values)) == NULL) return (NULL); if (xres && yres) { - for (i = num_values, value = attr->values; - i > 0; - i --, value ++) + for (i = num_values, value = attr->values; i > 0; i --, value ++) { value->resolution.xres = *xres++; value->resolution.yres = *yres++; @@ -820,76 +765,67 @@ ippAddResolutions(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippAddSeparator()' - Add a group separator to an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - */ +// +// 'ippAddSeparator()' - Add a group separator to an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// -ipp_attribute_t * /* O - New attribute */ -ippAddSeparator(ipp_t *ipp) /* I - IPP message */ +ipp_attribute_t * // O - New attribute +ippAddSeparator(ipp_t *ipp) // I - IPP message { DEBUG_printf("ippAddSeparator(ipp=%p)", (void *)ipp); - /* - * Range check input... - */ - + // Range check input... if (!ipp) return (NULL); - /* - * Create the attribute... - */ - + // Create the attribute... return (ipp_add_attr(ipp, NULL, IPP_TAG_ZERO, IPP_TAG_ZERO, 0)); } -/* - * 'ippAddString()' - Add a language-encoded string to an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - * - * Supported string values include charset (@code IPP_TAG_CHARSET@), keyword - * (@code IPP_TAG_KEYWORD@), language (@code IPP_TAG_LANGUAGE@), mimeMediaType - * (@code IPP_TAG_MIMETYPE@), name (@code IPP_TAG_NAME@), nameWithLanguage - * (@code IPP_TAG_NAMELANG), text (@code IPP_TAG_TEXT@), textWithLanguage - * (@code IPP_TAG_TEXTLANG@), uri (@code IPP_TAG_URI@), and uriScheme - * (@code IPP_TAG_URISCHEME@). - * - * The @code language@ parameter must be non-@code NULL@ for nameWithLanguage and - * textWithLanguage string values and must be @code NULL@ for all other string values. - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddString(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - ipp_tag_t value_tag, /* I - Type of attribute */ - const char *name, /* I - Name of attribute */ - const char *language, /* I - Language code */ - const char *value) /* I - Value */ +// +// 'ippAddString()' - Add a language-encoded string to an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// +// Supported string values include charset (`IPP_TAG_CHARSET`), keyword +// (`IPP_TAG_KEYWORD`), language (`IPP_TAG_LANGUAGE`), mimeMediaType +// (`IPP_TAG_MIMETYPE`), name (`IPP_TAG_NAME`), nameWithLanguage +// (@code IPP_TAG_NAMELANG), text (`IPP_TAG_TEXT`), textWithLanguage +// (`IPP_TAG_TEXTLANG`), uri (`IPP_TAG_URI`), and uriScheme +// (`IPP_TAG_URISCHEME`). +// +// The "language" parameter must be non-`NULL` for nameWithLanguage and +// textWithLanguage string values and must be `NULL` for all other string values. +// + +ipp_attribute_t * // O - New attribute +ippAddString(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + ipp_tag_t value_tag, // I - Type of attribute + const char *name, // I - Name of attribute + const char *language, // I - Language code + const char *value) // I - Value { - ipp_tag_t temp_tag; /* Temporary value tag (masked) */ - ipp_attribute_t *attr; /* New attribute */ + ipp_tag_t temp_tag; // Temporary value tag (masked) + ipp_attribute_t *attr; // New attribute char code[IPP_MAX_LANGUAGE]; - /* Charset/language code buffer */ + // Charset/language code buffer DEBUG_printf("ippAddString(ipp=%p, group=%02x(%s), value_tag=%02x(%s), name=\"%s\", language=\"%s\", value=\"%s\")", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name, language, value); - /* - * Range check input... - */ - + // Range check input... temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_CUPS_MASK); #if 0 @@ -903,36 +839,23 @@ ippAddString(ipp_t *ipp, /* I - IPP message */ != (language != NULL)) return (NULL); #else - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE) return (NULL); -#endif /* 0 */ - - /* - * See if we need to map charset, language, or locale values... - */ - - if (language && ((int)value_tag & IPP_TAG_CUPS_CONST) && - strcmp(language, ipp_lang_code(language, code, sizeof(code)))) - value_tag = temp_tag; /* Don't do a fast copy */ - else if (value && value_tag == (ipp_tag_t)(IPP_TAG_CHARSET | IPP_TAG_CUPS_CONST) && - strcmp(value, ipp_get_code(value, code, sizeof(code)))) - value_tag = temp_tag; /* Don't do a fast copy */ - else if (value && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_CUPS_CONST) && - strcmp(value, ipp_lang_code(value, code, sizeof(code)))) - value_tag = temp_tag; /* Don't do a fast copy */ - - /* - * Create the attribute... - */ +#endif // 0 + // See if we need to map charset, language, or locale values... + if (language && ((int)value_tag & IPP_TAG_CUPS_CONST) && strcmp(language, ipp_lang_code(language, code, sizeof(code)))) + value_tag = temp_tag; // Don't do a fast copy + else if (value && value_tag == (ipp_tag_t)(IPP_TAG_CHARSET | IPP_TAG_CUPS_CONST) && strcmp(value, ipp_get_code(value, code, sizeof(code)))) + value_tag = temp_tag; // Don't do a fast copy + else if (value && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_CUPS_CONST) && strcmp(value, ipp_lang_code(value, code, sizeof(code)))) + value_tag = temp_tag; // Don't do a fast copy + + // Create the attribute... if ((attr = ipp_add_attr(ipp, name, group, value_tag, 1)) == NULL) return (NULL); - /* - * Initialize the attribute data... - */ - + // Initialize the attribute data... if ((int)value_tag & IPP_TAG_CUPS_CONST) { attr->values[0].string.language = (char *)language; @@ -941,17 +864,14 @@ ippAddString(ipp_t *ipp, /* I - IPP message */ else { if (language) - attr->values[0].string.language = _cupsStrAlloc(ipp_lang_code(language, code, - sizeof(code))); + attr->values[0].string.language = _cupsStrAlloc(ipp_lang_code(language, code, sizeof(code))); if (value) { if (value_tag == IPP_TAG_CHARSET) - attr->values[0].string.text = _cupsStrAlloc(ipp_get_code(value, code, - sizeof(code))); + attr->values[0].string.text = _cupsStrAlloc(ipp_get_code(value, code, sizeof(code))); else if (value_tag == IPP_TAG_LANGUAGE) - attr->values[0].string.text = _cupsStrAlloc(ipp_lang_code(value, code, - sizeof(code))); + attr->values[0].string.text = _cupsStrAlloc(ipp_lang_code(value, code, sizeof(code))); else attr->values[0].string.text = _cupsStrAlloc(value); } @@ -961,49 +881,49 @@ ippAddString(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippAddStringf()' - Add a formatted string to an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document - * (@code IPP_TAG_DOCUMENT@), event notification - * (@code IPP_TAG_EVENT_NOTIFICATION@), operation (@code IPP_TAG_OPERATION@), - * printer (@code IPP_TAG_PRINTER@), subscription (@code IPP_TAG_SUBSCRIPTION@), - * or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - * - * Supported string values include charset (@code IPP_TAG_CHARSET@), keyword - * (@code IPP_TAG_KEYWORD@), language (@code IPP_TAG_LANGUAGE@), mimeMediaType - * (@code IPP_TAG_MIMETYPE@), name (@code IPP_TAG_NAME@), nameWithLanguage - * (@code IPP_TAG_NAMELANG), text (@code IPP_TAG_TEXT@), textWithLanguage - * (@code IPP_TAG_TEXTLANG@), uri (@code IPP_TAG_URI@), and uriScheme - * (@code IPP_TAG_URISCHEME@). - * - * The @code language@ parameter must be non-@code NULL@ for nameWithLanguage - * and textWithLanguage string values and must be @code NULL@ for all other - * string values. - * - * The @code format@ parameter uses formatting characters compatible with the - * printf family of standard functions. Additional arguments follow it as - * needed. The formatted string is truncated as needed to the maximum length of - * the corresponding value type. - * - * @since CUPS 1.7/macOS 10.9@ - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddStringf(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - ipp_tag_t value_tag, /* I - Type of attribute */ - const char *name, /* I - Name of attribute */ - const char *language, /* I - Language code (@code NULL@ for default) */ - const char *format, /* I - Printf-style format string */ - ...) /* I - Additional arguments as needed */ +// +// 'ippAddStringf()' - Add a formatted string to an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document +// (`IPP_TAG_DOCUMENT`), event notification +// (`IPP_TAG_EVENT_NOTIFICATION`), operation (`IPP_TAG_OPERATION`), +// printer (`IPP_TAG_PRINTER`), subscription (`IPP_TAG_SUBSCRIPTION`), +// or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// +// Supported string values include charset (`IPP_TAG_CHARSET`), keyword +// (`IPP_TAG_KEYWORD`), language (`IPP_TAG_LANGUAGE`), mimeMediaType +// (`IPP_TAG_MIMETYPE`), name (`IPP_TAG_NAME`), nameWithLanguage +// (@code IPP_TAG_NAMELANG), text (`IPP_TAG_TEXT`), textWithLanguage +// (`IPP_TAG_TEXTLANG`), uri (`IPP_TAG_URI`), and uriScheme +// (`IPP_TAG_URISCHEME`). +// +// The "language" parameter must be non-`NULL` for nameWithLanguage +// and textWithLanguage string values and must be `NULL` for all other +// string values. +// +// The "format" parameter uses formatting characters compatible with the +// printf family of standard functions. Additional arguments follow it as +// needed. The formatted string is truncated as needed to the maximum length of +// the corresponding value type. +// +// @since CUPS 1.7/macOS 10.9@ +// + +ipp_attribute_t * // O - New attribute +ippAddStringf(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + ipp_tag_t value_tag, // I - Type of attribute + const char *name, // I - Name of attribute + const char *language, // I - Language code (`NULL` for default) + const char *format, // I - Printf-style format string + ...) // I - Additional arguments as needed { - ipp_attribute_t *attr; /* New attribute */ - va_list ap; /* Argument pointer */ + ipp_attribute_t *attr; // New attribute + va_list ap; // Argument pointer va_start(ap, format); @@ -1014,78 +934,64 @@ ippAddStringf(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippAddStringfv()' - Add a formatted string to an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document - * (@code IPP_TAG_DOCUMENT@), event notification - * (@code IPP_TAG_EVENT_NOTIFICATION@), operation (@code IPP_TAG_OPERATION@), - * printer (@code IPP_TAG_PRINTER@), subscription (@code IPP_TAG_SUBSCRIPTION@), - * or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - * - * Supported string values include charset (@code IPP_TAG_CHARSET@), keyword - * (@code IPP_TAG_KEYWORD@), language (@code IPP_TAG_LANGUAGE@), mimeMediaType - * (@code IPP_TAG_MIMETYPE@), name (@code IPP_TAG_NAME@), nameWithLanguage - * (@code IPP_TAG_NAMELANG), text (@code IPP_TAG_TEXT@), textWithLanguage - * (@code IPP_TAG_TEXTLANG@), uri (@code IPP_TAG_URI@), and uriScheme - * (@code IPP_TAG_URISCHEME@). - * - * The @code language@ parameter must be non-@code NULL@ for nameWithLanguage - * and textWithLanguage string values and must be @code NULL@ for all other - * string values. - * - * The @code format@ parameter uses formatting characters compatible with the - * printf family of standard functions. Additional arguments are passed in the - * stdarg pointer @code ap@. The formatted string is truncated as needed to the - * maximum length of the corresponding value type. - * - * @since CUPS 1.7/macOS 10.9@ - */ - -ipp_attribute_t * /* O - New attribute */ -ippAddStringfv(ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - ipp_tag_t value_tag, /* I - Type of attribute */ - const char *name, /* I - Name of attribute */ - const char *language, /* I - Language code (@code NULL@ for default) */ - const char *format, /* I - Printf-style format string */ - va_list ap) /* I - Additional arguments */ +// +// 'ippAddStringfv()' - Add a formatted string to an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document +// (`IPP_TAG_DOCUMENT`), event notification +// (`IPP_TAG_EVENT_NOTIFICATION`), operation (`IPP_TAG_OPERATION`), +// printer (`IPP_TAG_PRINTER`), subscription (`IPP_TAG_SUBSCRIPTION`), +// or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// +// Supported string values include charset (`IPP_TAG_CHARSET`), keyword +// (`IPP_TAG_KEYWORD`), language (`IPP_TAG_LANGUAGE`), mimeMediaType +// (`IPP_TAG_MIMETYPE`), name (`IPP_TAG_NAME`), nameWithLanguage +// (@code IPP_TAG_NAMELANG), text (`IPP_TAG_TEXT`), textWithLanguage +// (`IPP_TAG_TEXTLANG`), uri (`IPP_TAG_URI`), and uriScheme +// (`IPP_TAG_URISCHEME`). +// +// The "language" parameter must be non-`NULL` for nameWithLanguage +// and textWithLanguage string values and must be `NULL` for all other +// string values. +// +// The "format" parameter uses formatting characters compatible with the +// printf family of standard functions. Additional arguments are passed in the +// stdarg pointer "ap". The formatted string is truncated as needed to the +// maximum length of the corresponding value type. +// +// @since CUPS 1.7/macOS 10.9@ +// + +ipp_attribute_t * // O - New attribute +ippAddStringfv(ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + ipp_tag_t value_tag, // I - Type of attribute + const char *name, // I - Name of attribute + const char *language, // I - Language code (`NULL` for default) + const char *format, // I - Printf-style format string + va_list ap) // I - Additional arguments { char buffer[IPP_MAX_TEXT + 4]; - /* Formatted text string */ - ssize_t bytes, /* Length of formatted value */ - max_bytes; /* Maximum number of bytes for value */ + // Formatted text string + ssize_t bytes, // Length of formatted value + max_bytes; // Maximum number of bytes for value - /* - * Range check input... - */ - - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || - (value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG && - value_tag != IPP_TAG_NAMELANG) || value_tag > IPP_TAG_MIMETYPE || - !format) + // Range check input... + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || (value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG && value_tag != IPP_TAG_NAMELANG) || value_tag > IPP_TAG_MIMETYPE || !format) return (NULL); - if ((value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_NAMELANG) - != (language != NULL)) + if ((value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_NAMELANG) != (language != NULL)) return (NULL); - /* - * Format the string... - */ - + // Format the string... if (!strcmp(format, "%s")) { - /* - * Optimize the simple case... - */ - + // Optimize the simple case... const char *s = va_arg(ap, char *); if (!s) @@ -1096,18 +1002,12 @@ ippAddStringfv(ipp_t *ipp, /* I - IPP message */ } else { - /* - * Do a full formatting of the message... - */ - + // Do a full formatting of the message... if ((bytes = vsnprintf(buffer, sizeof(buffer), format, ap)) < 0) return (NULL); } - /* - * Limit the length of the string... - */ - + // Limit the length of the string... switch (value_tag) { default : @@ -1148,8 +1048,8 @@ ippAddStringfv(ipp_t *ipp, /* I - IPP message */ if (bytes >= max_bytes) { - char *bufmax, /* Buffer at max_bytes */ - *bufptr; /* Pointer into buffer */ + char *bufmax, // Buffer at max_bytes + *bufptr; // Pointer into buffer bufptr = buffer + strlen(buffer) - 1; bufmax = buffer + max_bytes - 1; @@ -1168,120 +1068,101 @@ ippAddStringfv(ipp_t *ipp, /* I - IPP message */ *bufptr = '\0'; } - /* - * Add the formatted string and return... - */ - + // Add the formatted string and return... return (ippAddString(ipp, group, value_tag, name, language, buffer)); } -/* - * 'ippAddStrings()' - Add language-encoded strings to an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - * - * Supported string values include charset (@code IPP_TAG_CHARSET@), keyword - * (@code IPP_TAG_KEYWORD@), language (@code IPP_TAG_LANGUAGE@), mimeMediaType - * (@code IPP_TAG_MIMETYPE@), name (@code IPP_TAG_NAME@), nameWithLanguage - * (@code IPP_TAG_NAMELANG), text (@code IPP_TAG_TEXT@), textWithLanguage - * (@code IPP_TAG_TEXTLANG@), uri (@code IPP_TAG_URI@), and uriScheme - * (@code IPP_TAG_URISCHEME@). - * - * The @code language@ parameter must be non-@code NULL@ for nameWithLanguage and - * textWithLanguage string values and must be @code NULL@ for all other string values. - */ - -ipp_attribute_t * /* O - New attribute */ +// +// 'ippAddStrings()' - Add language-encoded strings to an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// +// Supported string values include charset (`IPP_TAG_CHARSET`), keyword +// (`IPP_TAG_KEYWORD`), language (`IPP_TAG_LANGUAGE`), mimeMediaType +// (`IPP_TAG_MIMETYPE`), name (`IPP_TAG_NAME`), nameWithLanguage +// (@code IPP_TAG_NAMELANG), text (`IPP_TAG_TEXT`), textWithLanguage +// (`IPP_TAG_TEXTLANG`), uri (`IPP_TAG_URI`), and uriScheme +// (`IPP_TAG_URISCHEME`). +// +// The "language" parameter must be non-`NULL` for nameWithLanguage and +// textWithLanguage string values and must be `NULL` for all other string values. +// + +ipp_attribute_t * // O - New attribute ippAddStrings( - ipp_t *ipp, /* I - IPP message */ - ipp_tag_t group, /* I - IPP group */ - ipp_tag_t value_tag, /* I - Type of attribute */ - const char *name, /* I - Name of attribute */ - int num_values, /* I - Number of values */ - const char *language, /* I - Language code (@code NULL@ for default) */ - const char * const *values) /* I - Values */ + ipp_t *ipp, // I - IPP message + ipp_tag_t group, // I - IPP group + ipp_tag_t value_tag, // I - Type of attribute + const char *name, // I - Name of attribute + int num_values, // I - Number of values + const char *language, // I - Language code (`NULL` for default) + const char * const *values) // I - Values { - int i; /* Looping var */ - ipp_tag_t temp_tag; /* Temporary value tag (masked) */ - ipp_attribute_t *attr; /* New attribute */ - _ipp_value_t *value; /* Current value */ - char code[32]; /* Language/charset value buffer */ + int i; // Looping var + ipp_tag_t temp_tag; // Temporary value tag (masked) + ipp_attribute_t *attr; // New attribute + _ipp_value_t *value; // Current value + char code[32]; // Language/charset value buffer DEBUG_printf("ippAddStrings(ipp=%p, group=%02x(%s), value_tag=%02x(%s), name=\"%s\", num_values=%d, language=\"%s\", values=%p)", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name, num_values, language, (void *)values); - /* - * Range check input... - */ - + // Range check input... temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_CUPS_MASK); #if 0 - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || - (temp_tag < IPP_TAG_TEXT && temp_tag != IPP_TAG_TEXTLANG && - temp_tag != IPP_TAG_NAMELANG) || temp_tag > IPP_TAG_MIMETYPE || - num_values < 1) + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || (temp_tag < IPP_TAG_TEXT && temp_tag != IPP_TAG_TEXTLANG && temp_tag != IPP_TAG_NAMELANG) || temp_tag > IPP_TAG_MIMETYPE || num_values < 1) return (NULL); - if ((temp_tag == IPP_TAG_TEXTLANG || temp_tag == IPP_TAG_NAMELANG) - != (language != NULL)) + if ((temp_tag == IPP_TAG_TEXTLANG || temp_tag == IPP_TAG_NAMELANG) != (language != NULL)) return (NULL); #else - if (!ipp || !name || group < IPP_TAG_ZERO || - group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || - num_values < 1) + if (!ipp || !name || group < IPP_TAG_ZERO || group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE || num_values < 1) return (NULL); -#endif /* 0 */ - - /* - * See if we need to map charset, language, or locale values... - */ +#endif // 0 - if (language && ((int)value_tag & IPP_TAG_CUPS_CONST) && - strcmp(language, ipp_lang_code(language, code, sizeof(code)))) - value_tag = temp_tag; /* Don't do a fast copy */ + // See if we need to map charset, language, or locale values... + if (language && ((int)value_tag & IPP_TAG_CUPS_CONST) && strcmp(language, ipp_lang_code(language, code, sizeof(code)))) + { + value_tag = temp_tag; // Don't do a fast copy + } else if (values && value_tag == (ipp_tag_t)(IPP_TAG_CHARSET | IPP_TAG_CUPS_CONST)) { for (i = 0; i < num_values; i ++) + { if (strcmp(values[i], ipp_get_code(values[i], code, sizeof(code)))) { - value_tag = temp_tag; /* Don't do a fast copy */ + value_tag = temp_tag; // Don't do a fast copy break; } + } } else if (values && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_CUPS_CONST)) { for (i = 0; i < num_values; i ++) + { if (strcmp(values[i], ipp_lang_code(values[i], code, sizeof(code)))) { - value_tag = temp_tag; /* Don't do a fast copy */ + value_tag = temp_tag; // Don't do a fast copy break; } + } } - /* - * Create the attribute... - */ - + // Create the attribute... if ((attr = ipp_add_attr(ipp, name, group, value_tag, num_values)) == NULL) return (NULL); - /* - * Initialize the attribute data... - */ - - for (i = num_values, value = attr->values; - i > 0; - i --, value ++) + // Initialize the attribute data... + for (i = num_values, value = attr->values; i > 0; i --, value ++) { if (language) { @@ -1290,11 +1171,12 @@ ippAddStrings( if ((int)value_tag & IPP_TAG_CUPS_CONST) value->string.language = (char *)language; else - value->string.language = _cupsStrAlloc(ipp_lang_code(language, code, - sizeof(code))); + value->string.language = _cupsStrAlloc(ipp_lang_code(language, code, sizeof(code))); } else + { value->string.language = attr->values[0].string.language; + } } if (values) @@ -1314,93 +1196,86 @@ ippAddStrings( } -/* - * 'ippContainsInteger()' - Determine whether an attribute contains the - * specified value or is within the list of ranges. - * - * Returns non-zero when the attribute contains either a matching integer or - * enum value, or the value falls within one of the rangeOfInteger values for - * the attribute. - * - * @since CUPS 1.7/macOS 10.9@ - */ +// +// 'ippContainsInteger()' - Determine whether an attribute contains the +// specified value or is within the list of ranges. +// +// Returns non-zero when the attribute contains either a matching integer or +// enum value, or the value falls within one of the rangeOfInteger values for +// the attribute. +// +// @since CUPS 1.7/macOS 10.9@ +// -int /* O - 1 on a match, 0 on no match */ +int // O - 1 on a match, 0 on no match ippContainsInteger( - ipp_attribute_t *attr, /* I - Attribute */ - int value) /* I - Integer/enum value */ + ipp_attribute_t *attr, // I - Attribute + int value) // I - Integer/enum value { - int i; /* Looping var */ - _ipp_value_t *avalue; /* Current attribute value */ - + int i; // Looping var + _ipp_value_t *avalue; // Current attribute value - /* - * Range check input... - */ + // Range check input... if (!attr) return (0); - if (attr->value_tag != IPP_TAG_INTEGER && attr->value_tag != IPP_TAG_ENUM && - attr->value_tag != IPP_TAG_RANGE) + if (attr->value_tag != IPP_TAG_INTEGER && attr->value_tag != IPP_TAG_ENUM && attr->value_tag != IPP_TAG_RANGE) return (0); - /* - * Compare... - */ - + // Compare... if (attr->value_tag == IPP_TAG_RANGE) { + // Check ranges... for (i = attr->num_values, avalue = attr->values; i > 0; i --, avalue ++) + { if (value >= avalue->range.lower && value <= avalue->range.upper) return (1); + } } else { + // Check discrete values... for (i = attr->num_values, avalue = attr->values; i > 0; i --, avalue ++) + { if (value == avalue->integer) return (1); + } } return (0); } -/* - * 'ippContainsString()' - Determine whether an attribute contains the - * specified string value. - * - * Returns non-zero when the attribute contains a matching charset, keyword, - * naturalLanguage, mimeMediaType, name, text, uri, or uriScheme value. - * - * @since CUPS 1.7/macOS 10.9@ - */ +// +// 'ippContainsString()' - Determine whether an attribute contains the +// specified string value. +// +// Returns non-zero when the attribute contains a matching charset, keyword, +// naturalLanguage, mimeMediaType, name, text, uri, or uriScheme value. +// +// @since CUPS 1.7/macOS 10.9@ +// -int /* O - 1 on a match, 0 on no match */ +int // O - 1 on a match, 0 on no match ippContainsString( - ipp_attribute_t *attr, /* I - Attribute */ - const char *value) /* I - String value */ + ipp_attribute_t *attr, // I - Attribute + const char *value) // I - String value { - int i; /* Looping var */ - _ipp_value_t *avalue; /* Current attribute value */ + int i; // Looping var + _ipp_value_t *avalue; // Current attribute value DEBUG_printf("ippContainsString(attr=%p, value=\"%s\")", (void *)attr, value); - /* - * Range check input... - */ - + // Range check input... if (!attr || !value) { DEBUG_puts("1ippContainsString: Returning 0 (bad input)"); return (0); } - /* - * Compare... - */ - + // Compare... DEBUG_printf("1ippContainsString: attr %s, %s with %d values.", attr->name, ippTagString(attr->value_tag), attr->num_values); switch (attr->value_tag & IPP_TAG_CUPS_MASK) @@ -1410,13 +1285,11 @@ ippContainsString( case IPP_TAG_LANGUAGE : case IPP_TAG_URI : case IPP_TAG_URISCHEME : - for (i = attr->num_values, avalue = attr->values; - i > 0; - i --, avalue ++) + for (i = attr->num_values, avalue = attr->values; i > 0; i --, avalue ++) { DEBUG_printf("1ippContainsString: value[%d]=\"%s\"", attr->num_values - i, avalue->string.text); - if (!strcmp(value, avalue->string.text)) + if (avalue->string.text && !strcmp(value, avalue->string.text)) { DEBUG_puts("1ippContainsString: Returning 1 (match)"); return (1); @@ -1428,13 +1301,11 @@ ippContainsString( case IPP_TAG_NAMELANG : case IPP_TAG_TEXT : case IPP_TAG_TEXTLANG : - for (i = attr->num_values, avalue = attr->values; - i > 0; - i --, avalue ++) + for (i = attr->num_values, avalue = attr->values; i > 0; i --, avalue ++) { DEBUG_printf("1ippContainsString: value[%d]=\"%s\"", attr->num_values - i, avalue->string.text); - if (!_cups_strcasecmp(value, avalue->string.text)) + if (avalue->string.text && !_cups_strcasecmp(value, avalue->string.text)) { DEBUG_puts("1ippContainsString: Returning 1 (match)"); return (1); @@ -1451,46 +1322,40 @@ ippContainsString( } -/* - * 'ippCopyAttribute()' - Copy an attribute. - * - * The specified attribute, @code attr@, is copied to the destination IPP message. - * When @code quickcopy@ is non-zero, a "shallow" reference copy of the attribute is - * created - this should only be done as long as the original source IPP message will - * not be freed for the life of the destination. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippCopyAttribute()' - Copy an attribute. +// +// The specified attribute, @code attr@, is copied to the destination IPP message. +// When "quickcopy" is non-zero, a "shallow" reference copy of the attribute is +// created - this should only be done as long as the original source IPP message will +// not be freed for the life of the destination. +// +// @since CUPS 1.6/macOS 10.8@ +// - -ipp_attribute_t * /* O - New attribute */ +ipp_attribute_t * // O - New attribute ippCopyAttribute( - ipp_t *dst, /* I - Destination IPP message */ - ipp_attribute_t *srcattr, /* I - Attribute to copy */ - int quickcopy) /* I - 1 for a referenced copy, 0 for normal */ + ipp_t *dst, // I - Destination IPP message + ipp_attribute_t *srcattr, // I - Attribute to copy + int quickcopy) // I - 1 for a referenced copy, 0 for normal { - int i; /* Looping var */ - ipp_tag_t srctag; /* Source value tag */ - ipp_attribute_t *dstattr; /* Destination attribute */ - _ipp_value_t *srcval, /* Source value */ - *dstval; /* Destination value */ + int i; // Looping var + ipp_tag_t srctag, // Source value tag + dstcopy; // Copy bit for quick copies + ipp_attribute_t *dstattr; // Destination attribute + _ipp_value_t *srcval, // Source value + *dstval; // Destination value DEBUG_printf("ippCopyAttribute(dst=%p, srcattr=%p, quickcopy=%d)", (void *)dst, (void *)srcattr, quickcopy); - /* - * Range check input... - */ - + // Range check input... if (!dst || !srcattr) return (NULL); - /* - * Copy it... - */ - - quickcopy = (quickcopy && (srcattr->value_tag & IPP_TAG_CUPS_CONST)) ? IPP_TAG_CUPS_CONST : 0; - srctag = srcattr->value_tag & IPP_TAG_CUPS_MASK; + // Copy it... + dstcopy = (quickcopy && (srcattr->value_tag & IPP_TAG_CUPS_CONST)) ? IPP_TAG_CUPS_CONST : 0; + srctag = srcattr->value_tag & IPP_TAG_CUPS_MASK; switch (srctag) { @@ -1527,23 +1392,17 @@ ippCopyAttribute( case IPP_TAG_CHARSET : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : - if ((dstattr = ippAddStrings(dst, srcattr->group_tag, (ipp_tag_t)(srctag | quickcopy), srcattr->name, srcattr->num_values, NULL, NULL)) == NULL) + if ((dstattr = ippAddStrings(dst, srcattr->group_tag, (ipp_tag_t)(srctag | dstcopy), srcattr->name, srcattr->num_values, NULL, NULL)) == NULL) break; - if (quickcopy) + if (dstcopy) { - /* - * Can safely quick-copy these string values... - */ - + // Can safely quick-copy these string values... memcpy(dstattr->values, srcattr->values, (size_t)srcattr->num_values * sizeof(_ipp_value_t)); } else { - /* - * Otherwise do a normal reference counted copy... - */ - + // Otherwise do a normal reference counted copy... for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++) dstval->string.text = _cupsStrAlloc(srcval->string.text); } @@ -1551,23 +1410,17 @@ ippCopyAttribute( case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : - if ((dstattr = ippAddStrings(dst, srcattr->group_tag, (ipp_tag_t)(srctag | quickcopy), srcattr->name, srcattr->num_values, NULL, NULL)) == NULL) + if ((dstattr = ippAddStrings(dst, srcattr->group_tag, (ipp_tag_t)(srctag | dstcopy), srcattr->name, srcattr->num_values, NULL, NULL)) == NULL) break; - if (quickcopy) + if (dstcopy) { - /* - * Can safely quick-copy these string values... - */ - + // Can safely quick-copy these string values... memcpy(dstattr->values, srcattr->values, (size_t)srcattr->num_values * sizeof(_ipp_value_t)); } else if (srcattr->value_tag & IPP_TAG_CUPS_CONST) { - /* - * Otherwise do a normal reference counted copy... - */ - + // Otherwise do a normal reference counted copy... for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++) { if (srcval == srcattr->values) @@ -1581,13 +1434,15 @@ ippCopyAttribute( break; case IPP_TAG_BEGIN_COLLECTION : - if ((dstattr = ippAddCollections(dst, srcattr->group_tag, srcattr->name, srcattr->num_values, NULL)) == NULL) - break; - - for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++) + for (i = srcattr->num_values, srcval = srcattr->values, dstattr = NULL; i > 0; i --, srcval ++) { - dstval->collection = srcval->collection; - srcval->collection->use ++; + if (srcval->collection) + { + if (dstattr) + ippSetCollection(dst, &dstattr, ippGetCount(dstattr), srcval->collection); + else + dstattr = ippAddCollection(dst, srcattr->group_tag, srcattr->name, srcval->collection); + } } break; @@ -1608,72 +1463,123 @@ ippCopyAttribute( memcpy(dstval->unknown.data, srcval->unknown.data, (size_t)dstval->unknown.length); } } - break; /* anti-compiler-warning-code */ + break; // anti-compiler-warning-code } return (dstattr); } -/* - * 'ippCopyAttributes()' - Copy attributes from one IPP message to another. - * - * Zero or more attributes are copied from the source IPP message, @code src@, to the - * destination IPP message, @code dst@. When @code quickcopy@ is non-zero, a "shallow" - * reference copy of the attribute is created - this should only be done as long as the - * original source IPP message will not be freed for the life of the destination. - * - * The @code cb@ and @code context@ parameters provide a generic way to "filter" the - * attributes that are copied - the function must return 1 to copy the attribute or - * 0 to skip it. The function may also choose to do a partial copy of the source attribute - * itself. - * - * @since CUPS 1.6/macOS 10.8@ - */ - -int /* O - 1 on success, 0 on error */ +// +// 'ippCopyAttributes()' - Copy attributes from one IPP message to another. +// +// Zero or more attributes are copied from the source IPP message "src" to the +// destination IPP message "dst". When "quickcopy" is non-zero, a "shallow" +// reference copy of the attribute is created - this should only be done as long +// as the original source IPP message will not be freed for the life of the +// destination. +// +// The "cb" and "context" parameters provide a generic way to "filter" the +// attributes that are copied - the function must return 1 to copy the attribute or +// 0 to skip it. The function may also choose to do a partial copy of the source attribute +// itself. +// +// @since CUPS 1.6/macOS 10.8@ +// + +int // O - 1 on success, 0 on error ippCopyAttributes( - ipp_t *dst, /* I - Destination IPP message */ - ipp_t *src, /* I - Source IPP message */ - int quickcopy, /* I - 1 for a referenced copy, 0 for normal */ - ipp_copycb_t cb, /* I - Copy callback or @code NULL@ for none */ - void *context) /* I - Context pointer */ + ipp_t *dst, // I - Destination IPP message + ipp_t *src, // I - Source IPP message + int quickcopy, // I - 1 for a referenced copy, 0 for normal + ipp_copy_cb_t cb, // I - Copy callback or `NULL` for none + void *context) // I - Context pointer { - ipp_attribute_t *srcattr; /* Source attribute */ + ipp_attribute_t *srcattr; // Source attribute DEBUG_printf("ippCopyAttributes(dst=%p, src=%p, quickcopy=%d, cb=%p, context=%p)", (void *)dst, (void *)src, quickcopy, (void *)cb, context); - /* - * Range check input... - */ - + // Range check input... if (!dst || !src) return (0); - /* - * Loop through source attributes and copy as needed... - */ - + // Loop through source attributes and copy as needed... for (srcattr = src->attrs; srcattr; srcattr = srcattr->next) + { if (!cb || (*cb)(context, dst, srcattr)) if (!ippCopyAttribute(dst, srcattr, quickcopy)) return (0); + } return (1); } -/* - * 'ippDateToTime()' - Convert from RFC 2579 Date/Time format to time in - * seconds. - */ +// +// 'ippCopyCredentialsString()' - Copy a credentials value from an IPP attribute. +// +// This function concatenates the 1setOf text credential values of an attribute, +// separated by newlines. The returned string must be freed using the `free` +// function. +// -time_t /* O - UNIX time value */ -ippDateToTime(const ipp_uchar_t *date) /* I - RFC 2579 date info */ +char * // O - Combined string or `NULL` on error +ippCopyCredentialsString( + ipp_attribute_t *attr) // I - Attribute { - struct tm unixdate; /* UNIX date/time info */ - time_t t; /* Computed time */ + char *s = NULL, // Combined string + *ptr; // Pointer into string + size_t i, // Looping var + slen; // Length of combined string + + + if (attr && ippGetValueTag(attr) == IPP_TAG_TEXT) + { + // Loop through string values and add up the total length... + for (i = 0, slen = 0; i < attr->num_values; i ++) + { + if (attr->values[i].string.text) + slen += strlen(attr->values[i].string.text) + 1; + } + + if (slen > 0) + { + // Allocate memory... + if ((s = malloc(slen + 1)) != NULL) + { + for (i = 0, ptr = s; i < attr->num_values; i ++) + { + if (attr->values[i].string.text) + { + size_t len = strlen(attr->values[i].string.text); + // Length of string + + memcpy(ptr, attr->values[i].string.text, len); + ptr += len; + *ptr++ = '\n'; + } + } + + *ptr = '\0'; + } + } + } + + return (s); +} + + +// +// 'ippDateToTime()' - Convert from RFC 2579 Date/Time format to time in +// seconds. +// + +time_t // O - UNIX time value +ippDateToTime(const ipp_uchar_t *date) // I - RFC 2579 date info +{ + struct tm unixdate; // UNIX date/time info + time_t t; // Computed time if (!date) @@ -1681,23 +1587,20 @@ ippDateToTime(const ipp_uchar_t *date) /* I - RFC 2579 date info */ memset(&unixdate, 0, sizeof(unixdate)); - /* - * RFC-2579 date/time format is: - * - * Byte(s) Description - * ------- ----------- - * 0-1 Year (0 to 65535) - * 2 Month (1 to 12) - * 3 Day (1 to 31) - * 4 Hours (0 to 23) - * 5 Minutes (0 to 59) - * 6 Seconds (0 to 60, 60 = "leap second") - * 7 Deciseconds (0 to 9) - * 8 +/- UTC - * 9 UTC hours (0 to 11) - * 10 UTC minutes (0 to 59) - */ - + // RFC-2579 date/time format is: + // + // Byte(s) Description + // ------- ----------- + // 0-1 Year (0 to 65535) + // 2 Month (1 to 12) + // 3 Day (1 to 31) + // 4 Hours (0 to 23) + // 5 Minutes (0 to 59) + // 6 Seconds (0 to 60, 60 = "leap second") + // 7 Deciseconds (0 to 9) + // 8 +/- UTC + // 9 UTC hours (0 to 11) + // 10 UTC minutes (0 to 59) unixdate.tm_year = ((date[0] << 8) | date[1]) - 1900; unixdate.tm_mon = date[2] - 1; unixdate.tm_mday = date[3]; @@ -1716,15 +1619,15 @@ ippDateToTime(const ipp_uchar_t *date) /* I - RFC 2579 date info */ } -/* - * 'ippDelete()' - Delete an IPP message. - */ +// +// 'ippDelete()' - Delete an IPP message. +// void -ippDelete(ipp_t *ipp) /* I - IPP message */ +ippDelete(ipp_t *ipp) // I - IPP message { - ipp_attribute_t *attr, /* Current attribute */ - *next; /* Next attribute */ + ipp_attribute_t *attr, // Current attribute + *next; // Next attribute DEBUG_printf("ippDelete(ipp=%p)", (void *)ipp); @@ -1759,47 +1662,37 @@ ippDelete(ipp_t *ipp) /* I - IPP message */ } -/* - * 'ippDeleteAttribute()' - Delete a single attribute in an IPP message. - * - * @since CUPS 1.1.19/macOS 10.3@ - */ +// +// 'ippDeleteAttribute()' - Delete a single attribute in an IPP message. +// +// @since CUPS 1.1.19/macOS 10.3@ +// void ippDeleteAttribute( - ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t *attr) /* I - Attribute to delete */ + ipp_t *ipp, // I - IPP message + ipp_attribute_t *attr) // I - Attribute to delete { - ipp_attribute_t *current, /* Current attribute */ - *prev; /* Previous attribute */ + ipp_attribute_t *current, // Current attribute + *prev; // Previous attribute DEBUG_printf("ippDeleteAttribute(ipp=%p, attr=%p(%s))", (void *)ipp, (void *)attr, attr ? attr->name : "(null)"); - /* - * Range check input... - */ - + // Range check input... if (!attr) return; DEBUG_printf("4debug_free: %p %s %s%s (%d values)", (void *)attr, attr->name, attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag), attr->num_values); - /* - * Find the attribute in the list... - */ - + // Find the attribute in the list... if (ipp) { - for (current = ipp->attrs, prev = NULL; - current; - prev = current, current = current->next) + for (current = ipp->attrs, prev = NULL; current; prev = current, current = current->next) + { if (current == attr) { - /* - * Found it, remove the attribute from the list... - */ - + // Found it, remove the attribute from the list... if (prev) prev->next = current->next; else @@ -1810,15 +1703,13 @@ ippDeleteAttribute( break; } + } if (!current) return; } - /* - * Free memory used by the attribute... - */ - + // Free memory used by the attribute... ipp_free_values(attr, 0, attr->num_values); if (attr->name) @@ -1828,39 +1719,33 @@ ippDeleteAttribute( } -/* - * 'ippDeleteValues()' - Delete values in an attribute. - * - * The @code element@ parameter specifies the first value to delete, starting at - * 0. It must be less than the number of values returned by @link ippGetCount@. - * - * The @code attr@ parameter may be modified as a result of setting the value. - * - * Deleting all values in an attribute deletes the attribute. - * - * @since CUPS 1.6/macOS 10.8@ - */ - -int /* O - 1 on success, 0 on failure */ +// +// 'ippDeleteValues()' - Delete values in an attribute. +// +// This function deletes one or more values in an attribute. The "element" +// parameter specifies the first value to delete, starting at 0. It must be +// less than the number of values returned by @link ippGetCount@. +// +// The "attr" parameter may be modified as a result of setting the value, +// which will set the variable to `NULL`. +// +// Deleting all values in an attribute deletes the attribute. +// +// @since CUPS 1.6/macOS 10.8@ +// + +int // O - 1 on success, 0 on failure ippDeleteValues( - ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - Attribute */ - int element, /* I - Index of first value to delete (0-based) */ - int count) /* I - Number of values to delete */ + ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - Attribute + int element, // I - Index of first value to delete (0-based) + int count) // I - Number of values to delete { - /* - * Range check input... - */ - - if (!ipp || !attr || !*attr || - element < 0 || element >= (*attr)->num_values || count <= 0 || - (element + count) > (*attr)->num_values) + // Range check input... + if (!ipp || !attr || !*attr || element < 0 || element >= (*attr)->num_values || count <= 0 || (element + count) > (*attr)->num_values) return (0); - /* - * If we are deleting all values, just delete the attribute entirely. - */ - + // If we are deleting all values, just delete the attribute entirely. if (count == (*attr)->num_values) { ippDeleteAttribute(ipp, *attr); @@ -1868,85 +1753,76 @@ ippDeleteValues( return (1); } - /* - * Otherwise free the values in question and return. - */ - + // Otherwise free the values in question and return. ipp_free_values(*attr, element, count); return (1); } -/* - * 'ippFindAttribute()' - Find a named attribute in a request. - * - * Starting with CUPS 2.0, the attribute name can contain a hierarchical list - * of attribute and member names separated by slashes, for example - * "media-col/media-size". - */ +// +// 'ippFindAttribute()' - Find a named attribute in a request. +// +// This function finds the first occurrence of a named attribute in an IPP +// message. The attribute name can contain a hierarchical list of attribute and +// member names separated by slashes, for example "media-col/media-size". +// -ipp_attribute_t * /* O - Matching attribute */ -ippFindAttribute(ipp_t *ipp, /* I - IPP message */ - const char *name, /* I - Name of attribute */ - ipp_tag_t type) /* I - Type of attribute */ +ipp_attribute_t * // O - Matching attribute +ippFindAttribute(ipp_t *ipp, // I - IPP message + const char *name, // I - Name of attribute + ipp_tag_t type) // I - Type of attribute { DEBUG_printf("2ippFindAttribute(ipp=%p, name=\"%s\", type=%02x(%s))", (void *)ipp, name, type, ippTagString(type)); + // Range check input... if (!ipp || !name) return (NULL); - /* - * Reset the current pointer... - */ - - ipp->current = NULL; - ipp->atend = 0; - - /* - * Search for the attribute... - */ + // Reset the current attribute pointer... + ipp->find->attr = NULL; + ipp->find->idx = 0; + ipp->find->atend = false; + // Search for the attribute... return (ippFindNextAttribute(ipp, name, type)); } -/* - * 'ippFindNextAttribute()' - Find the next named attribute in a request. - * - * Starting with CUPS 2.0, the attribute name can contain a hierarchical list - * of attribute and member names separated by slashes, for example - * "media-col/media-size". - */ +// +// 'ippFindNextAttribute()' - Find the next named attribute in a request. +// +// This function finds the next named attribute in an IPP message. The +// attribute name can contain a hierarchical list of attribute and member names +// separated by slashes, for example "media-col/media-size". +// -ipp_attribute_t * /* O - Matching attribute */ -ippFindNextAttribute(ipp_t *ipp, /* I - IPP message */ - const char *name, /* I - Name of attribute */ - ipp_tag_t type) /* I - Type of attribute */ +ipp_attribute_t * // O - Matching attribute +ippFindNextAttribute(ipp_t *ipp, // I - IPP message + const char *name, // I - Name of attribute + ipp_tag_t type) // I - Type of attribute { - ipp_attribute_t *attr, /* Current attribute */ - *childattr; /* Child attribute */ - ipp_tag_t value_tag; /* Value tag */ - char parent[1024], /* Parent attribute name */ - *child = NULL; /* Child attribute name */ + ipp_attribute_t *attr, // Current attribute + *childattr; // Child attribute + ipp_tag_t value_tag; // Value tag + char parent[1024], // Parent attribute name + *child = NULL; // Child attribute name DEBUG_printf("2ippFindNextAttribute(ipp=%p, name=\"%s\", type=%02x(%s))", (void *)ipp, name, type, ippTagString(type)); + // Range check input... if (!ipp || !name) return (NULL); - DEBUG_printf("3ippFindNextAttribute: atend=%d", ipp->atend); + DEBUG_printf("3ippFindNextAttribute: atend=%s", ipp->find->atend ? "true" : "false"); - if (ipp->atend) + if (ipp->find->atend) return (NULL); if (strchr(name, '/')) { - /* - * Search for child attribute... - */ - + // Search for child attribute... cupsCopyString(parent, name, sizeof(parent)); if ((child = strchr(parent, '/')) == NULL) { @@ -1956,48 +1832,44 @@ ippFindNextAttribute(ipp_t *ipp, /* I - IPP message */ *child++ = '\0'; - if (ipp->current && ipp->current->name && ipp->current->value_tag == IPP_TAG_BEGIN_COLLECTION && !strcmp(parent, ipp->current->name)) + if (ipp->find->attr && ipp->find->attr->name && ipp->find->attr->value_tag == IPP_TAG_BEGIN_COLLECTION && !strcmp(parent, ipp->find->attr->name)) { - while (ipp->curindex < ipp->current->num_values) + while (ipp->find->idx < ipp->find->attr->num_values) { - if ((childattr = ippFindNextAttribute(ipp->current->values[ipp->curindex].collection, child, type)) != NULL) + if ((childattr = ippFindNextAttribute(ipp->find->attr->values[ipp->find->idx].collection, child, type)) != NULL) return (childattr); - ipp->curindex ++; - if (ipp->curindex < ipp->current->num_values && ipp->current->values[ipp->curindex].collection) - ipp->current->values[ipp->curindex].collection->current = NULL; + ipp->find->idx ++; + if (ipp->find->idx < ipp->find->attr->num_values && ipp->find->attr->values[ipp->find->idx].collection) + ipp->find->attr->values[ipp->find->idx].collection->find->attr = NULL; } - ipp->prev = ipp->current; - ipp->current = ipp->current->next; - ipp->curindex = 0; + ipp->find->attr = ipp->find->attr->next; + ipp->find->idx = 0; - if (!ipp->current) + if (!ipp->find->attr) { - ipp->atend = 1; + ipp->find->atend = true; return (NULL); } } - if (!ipp->current) + if (!ipp->find->attr) { - ipp->prev = NULL; - ipp->current = ipp->attrs; - ipp->curindex = 0; + ipp->find->attr = ipp->attrs; + ipp->find->idx = 0; } name = parent; - attr = ipp->current; + attr = ipp->find->attr; } - else if (ipp->current) + else if (ipp->find->attr) { - ipp->prev = ipp->current; - attr = ipp->current->next; + attr = ipp->find->attr->next; } else { - ipp->prev = NULL; - attr = ipp->attrs; + attr = ipp->attrs; } for (; attr != NULL; ipp->prev = attr, attr = attr->next) @@ -2006,273 +1878,268 @@ ippFindNextAttribute(ipp_t *ipp, /* I - IPP message */ value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_CUPS_MASK); - if (attr->name != NULL && _cups_strcasecmp(attr->name, name) == 0 && - (value_tag == type || type == IPP_TAG_ZERO || name == parent || - (value_tag == IPP_TAG_TEXTLANG && type == IPP_TAG_TEXT) || - (value_tag == IPP_TAG_NAMELANG && type == IPP_TAG_NAME))) + if (attr->name != NULL && _cups_strcasecmp(attr->name, name) == 0 && (value_tag == type || type == IPP_TAG_ZERO || name == parent || (value_tag == IPP_TAG_TEXTLANG && type == IPP_TAG_TEXT) || (value_tag == IPP_TAG_NAMELANG && type == IPP_TAG_NAME))) { - ipp->current = attr; + ipp->find->attr = attr; if (name == parent && attr->value_tag == IPP_TAG_BEGIN_COLLECTION) { - int i; /* Looping var */ + int i; // Looping var for (i = 0; i < attr->num_values; i ++) { if ((childattr = ippFindAttribute(attr->values[i].collection, child, type)) != NULL) { - attr->values[0].collection->curindex = i; + attr->values[0].collection->find->idx = i; return (childattr); } } } else + { return (attr); + } } } - ipp->current = NULL; - ipp->prev = NULL; - ipp->atend = 1; + // If we get this far, we didn't find it... + ipp->find->attr = NULL; + ipp->find->atend = true; return (NULL); } -/* - * 'ippFirstAttribute()' - Return the first attribute in the message. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippFirstAttribute()' - Return the first attribute in the message. +// +// @deprecated@ @exclude all@ +// -ipp_attribute_t * /* O - First attribute or @code NULL@ if none */ -ippFirstAttribute(ipp_t *ipp) /* I - IPP message */ +ipp_attribute_t * // O - First attribute or `NULL` if none +ippFirstAttribute(ipp_t *ipp) // I - IPP message { - /* - * Range check input... - */ - - if (!ipp) - return (NULL); - - /* - * Return the first attribute... - */ - - return (ipp->current = ipp->attrs); + return (ippGetFirstAttribute(ipp)); } -/* - * 'ippGetBoolean()' - Get a boolean value for an attribute. - * - * The @code element@ parameter specifies which value to get from 0 to - * @code ippGetCount(attr)@ - 1. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetBoolean()' - Get a boolean value for an attribute. +// +// The "element" parameter specifies which value to get from 0 to +// @code ippGetCount(attr)@ - 1. +// +// @since CUPS 1.6/macOS 10.8@ +// -int /* O - Boolean value or 0 on error */ -ippGetBoolean(ipp_attribute_t *attr, /* I - IPP attribute */ - int element) /* I - Value number (0-based) */ +int // O - Boolean value or 0 on error +ippGetBoolean(ipp_attribute_t *attr, // I - IPP attribute + int element) // I - Value number (0-based) { - /* - * Range check input... - */ - - if (!attr || attr->value_tag != IPP_TAG_BOOLEAN || - element < 0 || element >= attr->num_values) + // Range check input... + if (!attr || attr->value_tag != IPP_TAG_BOOLEAN || element < 0 || element >= attr->num_values) return (0); - /* - * Return the value... - */ - + // Return the value... return (attr->values[element].boolean); } -/* - * 'ippGetCollection()' - Get a collection value for an attribute. - * - * The @code element@ parameter specifies which value to get from 0 to - * @code ippGetCount(attr)@ - 1. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetCollection()' - Get a collection value for an attribute. +// +// The "element" parameter specifies which value to get from 0 to +// @code ippGetCount(attr)@ - 1. +// +// @since CUPS 1.6/macOS 10.8@ +// -ipp_t * /* O - Collection value or @code NULL@ on error */ +ipp_t * // O - Collection value or `NULL` on error ippGetCollection( - ipp_attribute_t *attr, /* I - IPP attribute */ - int element) /* I - Value number (0-based) */ + ipp_attribute_t *attr, // I - IPP attribute + int element) // I - Value number (0-based) { - /* - * Range check input... - */ - - if (!attr || attr->value_tag != IPP_TAG_BEGIN_COLLECTION || - element < 0 || element >= attr->num_values) + // Range check input... + if (!attr || attr->value_tag != IPP_TAG_BEGIN_COLLECTION || element < 0 || element >= attr->num_values) return (NULL); - /* - * Return the value... - */ - + // Return the value... return (attr->values[element].collection); } -/* - * 'ippGetCount()' - Get the number of values in an attribute. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetCount()' - Get the number of values in an attribute. +// +// @since CUPS 1.6/macOS 10.8@ +// -int /* O - Number of values or 0 on error */ -ippGetCount(ipp_attribute_t *attr) /* I - IPP attribute */ +int // O - Number of values or 0 on error +ippGetCount(ipp_attribute_t *attr) // I - IPP attribute { - /* - * Range check input... - */ - + // Range check input... if (!attr) return (0); - /* - * Return the number of values... - */ - + // Return the number of values... return (attr->num_values); } -/* - * 'ippGetDate()' - Get a dateTime value for an attribute. - * - * The @code element@ parameter specifies which value to get from 0 to - * @code ippGetCount(attr)@ - 1. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetDate()' - Get a dateTime value for an attribute. +// +// The "element" parameter specifies which value to get from 0 to +// @code ippGetCount(attr)@ - 1. +// +// @since CUPS 1.6/macOS 10.8@ +// -const ipp_uchar_t * /* O - dateTime value or @code NULL@ */ -ippGetDate(ipp_attribute_t *attr, /* I - IPP attribute */ - int element) /* I - Value number (0-based) */ +const ipp_uchar_t * // O - dateTime value or `NULL` +ippGetDate(ipp_attribute_t *attr, // I - IPP attribute + int element) // I - Value number (0-based) { - /* - * Range check input... - */ - - if (!attr || attr->value_tag != IPP_TAG_DATE || - element < 0 || element >= attr->num_values) + // Range check input... + if (!attr || attr->value_tag != IPP_TAG_DATE || element < 0 || element >= attr->num_values) return (NULL); - /* - * Return the value... - */ - + // Return the value... return (attr->values[element].date); } -/* - * 'ippGetGroupTag()' - Get the group associated with an attribute. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetFirstAttribute()' - Return the first attribute in the message. +// +// @since CUPS 2.5@ +// -ipp_tag_t /* O - Group tag or @code IPP_TAG_ZERO@ on error */ -ippGetGroupTag(ipp_attribute_t *attr) /* I - IPP attribute */ +ipp_attribute_t * // O - First attribute or `NULL` if none +ippGetFirstAttribute(ipp_t *ipp) // I - IPP message { - /* - * Range check input... - */ + // Range check input... + if (!ipp) + return (NULL); + + if (!ipp->find) + ipp->find = ipp->fstack; + + ipp->find->attr = ipp->attrs; + ipp->find->idx = 0; + ipp->find->atend = ipp->find->attr == NULL; + + // Return the first attribute... + return (ipp->find->attr); +} + + +// +// 'ippGetGroupTag()' - Get the group associated with an attribute. +// +// @since CUPS 1.6/macOS 10.8@ +// +ipp_tag_t // O - Group tag or `IPP_TAG_ZERO` on error +ippGetGroupTag(ipp_attribute_t *attr) // I - IPP attribute +{ + // Range check input... if (!attr) return (IPP_TAG_ZERO); - /* - * Return the group... - */ - + // Return the group... return (attr->group_tag); } -/* - * 'ippGetInteger()' - Get the integer/enum value for an attribute. - * - * The @code element@ parameter specifies which value to get from 0 to - * @code ippGetCount(attr)@ - 1. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetInteger()' - Get the integer/enum value for an attribute. +// +// The "element" parameter specifies which value to get from 0 to +// @code ippGetCount(attr)@ - 1. +// +// @since CUPS 1.6/macOS 10.8@ +// -int /* O - Value or 0 on error */ -ippGetInteger(ipp_attribute_t *attr, /* I - IPP attribute */ - int element) /* I - Value number (0-based) */ +int // O - Value or 0 on error +ippGetInteger(ipp_attribute_t *attr, // I - IPP attribute + int element) // I - Value number (0-based) { - /* - * Range check input... - */ - - if (!attr || (attr->value_tag != IPP_TAG_INTEGER && attr->value_tag != IPP_TAG_ENUM) || - element < 0 || element >= attr->num_values) + // Range check input... + if (!attr || (attr->value_tag != IPP_TAG_INTEGER && attr->value_tag != IPP_TAG_ENUM) || element < 0 || element >= attr->num_values) return (0); - /* - * Return the value... - */ - + // Return the value... return (attr->values[element].integer); } -/* - * 'ippGetName()' - Get the attribute name. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetLength()' - Compute the length of an IPP message. +// -const char * /* O - Attribute name or @code NULL@ for separators */ -ippGetName(ipp_attribute_t *attr) /* I - IPP attribute */ +size_t // O - Size of IPP message +ippGetLength(ipp_t *ipp) // I - IPP message { - /* - * Range check input... - */ + return (ipp_length(ipp, 0)); +} + +// +// 'ippGetName()' - Get the attribute name. +// +// @since CUPS 1.6/macOS 10.8@ +// + +const char * // O - Attribute name or `NULL` for separators +ippGetName(ipp_attribute_t *attr) // I - IPP attribute +{ + // Range check input... if (!attr) return (NULL); - /* - * Return the name... - */ - + // Return the name... return (attr->name); } -/* - * 'ippGetOctetString()' - Get an octetString value from an IPP attribute. - * - * The @code element@ parameter specifies which value to get from 0 to - * @code ippGetCount(attr)@ - 1. - * - * @since CUPS 1.7/macOS 10.9@ - */ +// +// 'ippGetNextAttribute()' - Return the next attribute in the message. +// +// @since CUPS 2.5@ +// -void * /* O - Pointer to octetString data */ -ippGetOctetString( - ipp_attribute_t *attr, /* I - IPP attribute */ - int element, /* I - Value number (0-based) */ - int *datalen) /* O - Length of octetString data */ +ipp_attribute_t * // O - Next attribute or `NULL` if none +ippGetNextAttribute(ipp_t *ipp) // I - IPP message { - /* - * Range check input... - */ + // Range check input... + if (!ipp || !ipp->find || !ipp->find->attr) + return (NULL); + + ipp->find->attr = ipp->find->attr->next; + ipp->find->atend = ipp->find->attr == NULL; + + // Return the next attribute... + return (ipp->find->attr); +} + - if (!attr || attr->value_tag != IPP_TAG_STRING || - element < 0 || element >= attr->num_values) +// +// 'ippGetOctetString()' - Get an octetString value from an IPP attribute. +// +// The "element" parameter specifies which value to get from 0 to +// @code ippGetCount(attr)@ - 1. +// +// @since CUPS 1.7/macOS 10.9@ +// + +void * // O - Pointer to octetString data +ippGetOctetString( + ipp_attribute_t *attr, // I - IPP attribute + int element, // I - Value number (0-based) + int *datalen) // O - Length of octetString data +{ + // Range check input... + if (!attr || attr->value_tag != IPP_TAG_STRING || element < 0 || element >= attr->num_values) { if (datalen) *datalen = 0; @@ -2280,10 +2147,7 @@ ippGetOctetString( return (NULL); } - /* - * Return the values... - */ - + // Return the values... if (datalen) *datalen = attr->values[element].unknown.length; @@ -2291,50 +2155,40 @@ ippGetOctetString( } -/* - * 'ippGetOperation()' - Get the operation ID in an IPP message. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetOperation()' - Get the operation ID in an IPP message. +// +// @since CUPS 1.6/macOS 10.8@ +// -ipp_op_t /* O - Operation ID or 0 on error */ -ippGetOperation(ipp_t *ipp) /* I - IPP request message */ +ipp_op_t // O - Operation ID or 0 on error +ippGetOperation(ipp_t *ipp) // I - IPP request message { - /* - * Range check input... - */ - + // Range check input... if (!ipp) return ((ipp_op_t)0); - /* - * Return the value... - */ - + // Return the value... return (ipp->request.op.operation_id); } -/* - * 'ippGetRange()' - Get a rangeOfInteger value from an attribute. - * - * The @code element@ parameter specifies which value to get from 0 to - * @code ippGetCount(attr)@ - 1. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetRange()' - Get a rangeOfInteger value from an attribute. +// +// The "element" parameter specifies which value to get from 0 to +// @code ippGetCount(attr)@ - 1. +// +// @since CUPS 1.6/macOS 10.8@ +// -int /* O - Lower value of range or 0 */ -ippGetRange(ipp_attribute_t *attr, /* I - IPP attribute */ - int element, /* I - Value number (0-based) */ - int *uppervalue)/* O - Upper value of range */ +int // O - Lower value of range or 0 +ippGetRange(ipp_attribute_t *attr, // I - IPP attribute + int element, // I - Value number (0-based) + int *uppervalue)// O - Upper value of range { - /* - * Range check input... - */ - - if (!attr || attr->value_tag != IPP_TAG_RANGE || - element < 0 || element >= attr->num_values) + // Range check input... + if (!attr || attr->value_tag != IPP_TAG_RANGE || element < 0 || element >= attr->num_values) { if (uppervalue) *uppervalue = 0; @@ -2342,10 +2196,7 @@ ippGetRange(ipp_attribute_t *attr, /* I - IPP attribute */ return (0); } - /* - * Return the values... - */ - + // Return the values... if (uppervalue) *uppervalue = attr->values[element].range.upper; @@ -2353,52 +2204,42 @@ ippGetRange(ipp_attribute_t *attr, /* I - IPP attribute */ } -/* - * 'ippGetRequestId()' - Get the request ID from an IPP message. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetRequestId()' - Get the request ID from an IPP message. +// +// @since CUPS 1.6/macOS 10.8@ +// -int /* O - Request ID or 0 on error */ -ippGetRequestId(ipp_t *ipp) /* I - IPP message */ +int // O - Request ID or 0 on error +ippGetRequestId(ipp_t *ipp) // I - IPP message { - /* - * Range check input... - */ - + // Range check input... if (!ipp) return (0); - /* - * Return the request ID... - */ - + // Return the request ID... return (ipp->request.any.request_id); } -/* - * 'ippGetResolution()' - Get a resolution value for an attribute. - * - * The @code element@ parameter specifies which value to get from 0 to - * @code ippGetCount(attr)@ - 1. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetResolution()' - Get a resolution value for an attribute. +// +// The "element" parameter specifies which value to get from 0 to +// @code ippGetCount(attr)@ - 1. +// +// @since CUPS 1.6/macOS 10.8@ +// -int /* O - Horizontal/cross feed resolution or 0 */ +int // O - Horizontal/cross feed resolution or 0 ippGetResolution( - ipp_attribute_t *attr, /* I - IPP attribute */ - int element, /* I - Value number (0-based) */ - int *yres, /* O - Vertical/feed resolution */ - ipp_res_t *units) /* O - Units for resolution */ + ipp_attribute_t *attr, // I - IPP attribute + int element, // I - Value number (0-based) + int *yres, // O - Vertical/feed resolution + ipp_res_t *units) // O - Units for resolution { - /* - * Range check input... - */ - - if (!attr || attr->value_tag != IPP_TAG_RESOLUTION || - element < 0 || element >= attr->num_values) + // Range check input... + if (!attr || attr->value_tag != IPP_TAG_RESOLUTION || element < 0 || element >= attr->num_values) { if (yres) *yres = 0; @@ -2409,10 +2250,7 @@ ippGetResolution( return (0); } - /* - * Return the value... - */ - + // Return the value... if (yres) *yres = attr->values[element].resolution.yres; @@ -2423,84 +2261,66 @@ ippGetResolution( } -/* - * 'ippGetState()' - Get the IPP message state. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetState()' - Get the IPP message state. +// +// @since CUPS 1.6/macOS 10.8@ +// -ipp_state_t /* O - IPP message state value */ -ippGetState(ipp_t *ipp) /* I - IPP message */ +ipp_state_t // O - IPP message state value +ippGetState(ipp_t *ipp) // I - IPP message { - /* - * Range check input... - */ - + // Range check input... if (!ipp) return (IPP_STATE_IDLE); - /* - * Return the value... - */ - + // Return the value... return (ipp->state); } -/* - * 'ippGetStatusCode()' - Get the status code from an IPP response or event message. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetStatusCode()' - Get the status code from an IPP response or event message. +// +// @since CUPS 1.6/macOS 10.8@ +// -ipp_status_t /* O - Status code in IPP message */ -ippGetStatusCode(ipp_t *ipp) /* I - IPP response or event message */ +ipp_status_t // O - Status code in IPP message +ippGetStatusCode(ipp_t *ipp) // I - IPP response or event message { - /* - * Range check input... - */ - + // Range check input... if (!ipp) return (IPP_STATUS_ERROR_INTERNAL); - /* - * Return the value... - */ - + // Return the value... return (ipp->request.status.status_code); } -/* - * 'ippGetString()' - Get the string and optionally the language code for an attribute. - * - * The @code element@ parameter specifies which value to get from 0 to - * @code ippGetCount(attr)@ - 1. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetString()' - Get the string and optionally the language code for an attribute. +// +// The "element" parameter specifies which value to get from 0 to +// @code ippGetCount(attr)@ - 1. +// +// @since CUPS 1.6/macOS 10.8@ +// const char * -ippGetString(ipp_attribute_t *attr, /* I - IPP attribute */ - int element, /* I - Value number (0-based) */ - const char **language)/* O - Language code (@code NULL@ for don't care) */ +ippGetString(ipp_attribute_t *attr, // I - IPP attribute + int element, // I - Value number (0-based) + const char **language)// O - Language code (`NULL` for don't care) { - ipp_tag_t tag; /* Value tag */ - + ipp_tag_t tag; // Value tag - /* - * Range check input... - */ + // Range check input... tag = ippGetValueTag(attr); if (!attr || element < 0 || element >= attr->num_values || (tag != IPP_TAG_TEXTLANG && tag != IPP_TAG_NAMELANG && (tag < IPP_TAG_TEXT || tag > IPP_TAG_MIMETYPE))) return (NULL); - /* - * Return the value... - */ - + // Return the value... if (language) *language = attr->values[element].string.language; @@ -2508,44 +2328,35 @@ ippGetString(ipp_attribute_t *attr, /* I - IPP attribute */ } -/* - * 'ippGetValueTag()' - Get the value tag for an attribute. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetValueTag()' - Get the value tag for an attribute. +// +// @since CUPS 1.6/macOS 10.8@ +// -ipp_tag_t /* O - Value tag or @code IPP_TAG_ZERO@ on error */ -ippGetValueTag(ipp_attribute_t *attr) /* I - IPP attribute */ +ipp_tag_t // O - Value tag or `IPP_TAG_ZERO` on error +ippGetValueTag(ipp_attribute_t *attr) // I - IPP attribute { - /* - * Range check input... - */ - + // Range check input... if (!attr) return (IPP_TAG_ZERO); - /* - * Return the value... - */ - + // Return the value... return (attr->value_tag & IPP_TAG_CUPS_MASK); } -/* - * 'ippGetVersion()' - Get the major and minor version number from an IPP message. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippGetVersion()' - Get the major and minor version number from an IPP message. +// +// @since CUPS 1.6/macOS 10.8@ +// -int /* O - Major version number or 0 on error */ -ippGetVersion(ipp_t *ipp, /* I - IPP message */ - int *minor) /* O - Minor version number or @code NULL@ for don't care */ +int // O - Major version number or 0 on error +ippGetVersion(ipp_t *ipp, // I - IPP message + int *minor) // O - Minor version number or `NULL` for don't care { - /* - * Range check input... - */ - + // Range check input... if (!ipp) { if (minor) @@ -2554,10 +2365,7 @@ ippGetVersion(ipp_t *ipp, /* I - IPP message */ return (0); } - /* - * Return the value... - */ - + // Return the value... if (minor) *minor = ipp->request.any.version[1]; @@ -2565,61 +2373,49 @@ ippGetVersion(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippLength()' - Compute the length of an IPP message. - */ +// +// 'ippLength()' - Compute the length of an IPP message. +// +// @deprecated@ @exclude all@ +// -size_t /* O - Size of IPP message */ -ippLength(ipp_t *ipp) /* I - IPP message */ +size_t // O - Size of IPP message +ippLength(ipp_t *ipp) // I - IPP message { - return (ipp_length(ipp, 0)); + return (ippGetLength(ipp)); } -/* - * 'ippNextAttribute()' - Return the next attribute in the message. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippNextAttribute()' - Return the next attribute in the message. +// +// @deprecated@ @exclude all@ +// -ipp_attribute_t * /* O - Next attribute or @code NULL@ if none */ -ippNextAttribute(ipp_t *ipp) /* I - IPP message */ +ipp_attribute_t * // O - Next attribute or `NULL` if none +ippNextAttribute(ipp_t *ipp) // I - IPP message { - /* - * Range check input... - */ - - if (!ipp || !ipp->current) - return (NULL); - - /* - * Return the next attribute... - */ - - return (ipp->current = ipp->current->next); + return (ippGetNextAttribute(ipp)); } -/* - * 'ippNew()' - Allocate a new IPP message. - */ +// +// 'ippNew()' - Allocate a new IPP message. +// -ipp_t * /* O - New IPP message */ +ipp_t * // O - New IPP message ippNew(void) { - ipp_t *temp; /* New IPP message */ + ipp_t *temp; // New IPP message _cups_globals_t *cg = _cupsGlobals(); - /* Global data */ + // Global data DEBUG_puts("ippNew()"); if ((temp = (ipp_t *)calloc(1, sizeof(ipp_t))) != NULL) { - /* - * Set default version - usually 2.0... - */ - + // Set default version - usually 2.0... DEBUG_printf("4debug_alloc: %p IPP message", (void *)temp); if (cg->server_version == 0) @@ -2628,6 +2424,7 @@ ippNew(void) temp->request.any.version[0] = (ipp_uchar_t)(cg->server_version / 10); temp->request.any.version[1] = (ipp_uchar_t)(cg->server_version % 10); temp->use = 1; + temp->find = temp->fstack; } DEBUG_printf("1ippNew: Returning %p", (void *)temp); @@ -2636,39 +2433,33 @@ ippNew(void) } -/* - * 'ippNewRequest()' - Allocate a new IPP request message. - * - * The new request message is initialized with the "attributes-charset" and - * "attributes-natural-language" attributes added. The - * "attributes-natural-language" value is derived from the current locale. - * - * @since CUPS 1.2/macOS 10.5@ - */ +// +// 'ippNewRequest()' - Allocate a new IPP request message. +// +// The new request message is initialized with the "attributes-charset" and +// "attributes-natural-language" attributes added. The +// "attributes-natural-language" value is derived from the current locale. +// +// @since CUPS 1.2/macOS 10.5@ +// -ipp_t * /* O - IPP request message */ -ippNewRequest(ipp_op_t op) /* I - Operation code */ +ipp_t * // O - IPP request message +ippNewRequest(ipp_op_t op) // I - Operation code { - ipp_t *request; /* IPP request message */ - cups_lang_t *language; /* Current language localization */ - static int request_id = 0; /* Current request ID */ + ipp_t *request; // IPP request message + cups_lang_t *language; // Current language localization + static int request_id = 0; // Current request ID static cups_mutex_t request_mutex = CUPS_MUTEX_INITIALIZER; - /* Mutex for request ID */ + // Mutex for request ID DEBUG_printf("ippNewRequest(op=%02x(%s))", op, ippOpString(op)); - /* - * Create a new IPP message... - */ - + // Create a new IPP message... if ((request = ippNew()) == NULL) return (NULL); - /* - * Set the operation and request ID... - */ - + // Set the operation and request ID... cupsMutexLock(&request_mutex); request->request.op.operation_id = op; @@ -2676,145 +2467,95 @@ ippNewRequest(ipp_op_t op) /* I - Operation code */ cupsMutexUnlock(&request_mutex); - /* - * Use UTF-8 as the character set... - */ - - ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, - "attributes-charset", NULL, "utf-8"); - - /* - * Get the language from the current locale... - */ + // Use UTF-8 as the character set... + ippAddString(request, IPP_TAG_OPERATION, IPP_CONST_TAG(IPP_TAG_CHARSET), "attributes-charset", NULL, "utf-8"); + // Get the language from the current locale... language = cupsLangDefault(); - ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, - "attributes-natural-language", NULL, language->language); - - /* - * Return the new request... - */ + ippAddString(request, IPP_TAG_OPERATION, IPP_CONST_TAG(IPP_TAG_LANGUAGE), "attributes-natural-language", NULL, language->language); + // Return the new request... return (request); } -/* - * 'ippNewResponse()' - Allocate a new IPP response message. - * - * The new response message is initialized with the same "version-number", - * "request-id", "attributes-charset", and "attributes-natural-language" as the - * provided request message. If the "attributes-charset" or - * "attributes-natural-language" attributes are missing from the request, - * 'utf-8' and a value derived from the current locale are substituted, - * respectively. - * - * @since CUPS 1.7/macOS 10.9@ - */ - -ipp_t * /* O - IPP response message */ -ippNewResponse(ipp_t *request) /* I - IPP request message */ +// +// 'ippNewResponse()' - Allocate a new IPP response message. +// +// The new response message is initialized with the same "version-number", +// "request-id", "attributes-charset", and "attributes-natural-language" as the +// provided request message. If the "attributes-charset" or +// "attributes-natural-language" attributes are missing from the request, +// 'utf-8' and a value derived from the current locale are substituted, +// respectively. +// +// @since CUPS 1.7/macOS 10.9@ +// + +ipp_t * // O - IPP response message +ippNewResponse(ipp_t *request) // I - IPP request message { - ipp_t *response; /* IPP response message */ - ipp_attribute_t *attr; /* Current attribute */ - + ipp_t *response; // IPP response message + ipp_attribute_t *attr; // Current attribute - /* - * Range check input... - */ + // Range check input... if (!request) return (NULL); - /* - * Create a new IPP message... - */ - + // Create a new IPP message... if ((response = ippNew()) == NULL) return (NULL); - /* - * Copy the request values over to the response... - */ - + // Copy the request values over to the response... response->request.status.version[0] = request->request.op.version[0]; response->request.status.version[1] = request->request.op.version[1]; response->request.status.request_id = request->request.op.request_id; - /* - * The first attribute MUST be attributes-charset... - */ - + // The first attribute MUST be attributes-charset... attr = request->attrs; - if (attr && attr->name && !strcmp(attr->name, "attributes-charset") && - attr->group_tag == IPP_TAG_OPERATION && - attr->value_tag == IPP_TAG_CHARSET && - attr->num_values == 1) + if (attr && attr->name && !strcmp(attr->name, "attributes-charset") && attr->group_tag == IPP_TAG_OPERATION && attr->value_tag == IPP_TAG_CHARSET && attr->num_values == 1) { - /* - * Copy charset from request... - */ - - ippAddString(response, IPP_TAG_OPERATION, IPP_TAG_CHARSET, - "attributes-charset", NULL, attr->values[0].string.text); + // Copy charset from request... + ippAddString(response, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, attr->values[0].string.text); } else { - /* - * Use "utf-8" as the default... - */ - - ippAddString(response, IPP_TAG_OPERATION, IPP_TAG_CHARSET, - "attributes-charset", NULL, "utf-8"); + // Use "utf-8" as the default... + ippAddString(response, IPP_TAG_OPERATION, IPP_CONST_TAG(IPP_TAG_CHARSET), "attributes-charset", NULL, "utf-8"); } - /* - * Then attributes-natural-language... - */ - + // Then attributes-natural-language... if (attr) attr = attr->next; - if (attr && attr->name && - !strcmp(attr->name, "attributes-natural-language") && - attr->group_tag == IPP_TAG_OPERATION && - attr->value_tag == IPP_TAG_LANGUAGE && - attr->num_values == 1) + if (attr && attr->name && !strcmp(attr->name, "attributes-natural-language") && attr->group_tag == IPP_TAG_OPERATION && attr->value_tag == IPP_TAG_LANGUAGE && attr->num_values == 1) { - /* - * Copy language from request... - */ - - ippAddString(response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, - "attributes-natural-language", NULL, - attr->values[0].string.text); + // Copy language from request... + ippAddString(response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "attributes-natural-language", NULL, attr->values[0].string.text); } else { - /* - * Use the language from the current locale... - */ - + // Use the language from the current locale... cups_lang_t *language = cupsLangDefault(); - /* Current locale */ + // Current locale - ippAddString(response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, - "attributes-natural-language", NULL, language->language); + ippAddString(response, IPP_TAG_OPERATION, IPP_CONST_TAG(IPP_TAG_LANGUAGE), "attributes-natural-language", NULL, language->language); } return (response); } -/* - * 'ippRead()' - Read data for an IPP message from a HTTP connection. - */ +// +// 'ippRead()' - Read data for an IPP message from a HTTP connection. +// -ipp_state_t /* O - Current state */ -ippRead(http_t *http, /* I - HTTP connection */ - ipp_t *ipp) /* I - IPP data */ +ipp_state_t // O - Current state +ippRead(http_t *http, // I - HTTP connection + ipp_t *ipp) // I - IPP data { DEBUG_printf("ippRead(http=%p, ipp=%p), data_remaining=" CUPS_LLFMT, (void *)http, (void *)ipp, CUPS_LLCAST (http ? http->data_remaining : -1)); @@ -2823,50 +2564,49 @@ ippRead(http_t *http, /* I - HTTP connection */ DEBUG_printf("2ippRead: http->state=%d, http->used=%d", http->state, http->used); - return (ippReadIO(http, (ipp_iocb_t)ipp_read_http, http->blocking, NULL, - ipp)); + return (ippReadIO(http, (ipp_io_cb_t)ipp_read_http, http->blocking, NULL, ipp)); } -/* - * 'ippReadFile()' - Read data for an IPP message from a file. - * - * @since CUPS 1.1.19/macOS 10.3@ - */ +// +// 'ippReadFile()' - Read data for an IPP message from a file. +// +// @since CUPS 1.1.19/macOS 10.3@ +// -ipp_state_t /* O - Current state */ -ippReadFile(int fd, /* I - HTTP data */ - ipp_t *ipp) /* I - IPP data */ +ipp_state_t // O - Current state +ippReadFile(int fd, // I - HTTP data + ipp_t *ipp) // I - IPP data { DEBUG_printf("ippReadFile(fd=%d, ipp=%p)", fd, (void *)ipp); - return (ippReadIO(&fd, (ipp_iocb_t)ipp_read_file, 1, NULL, ipp)); + return (ippReadIO(&fd, (ipp_io_cb_t)ipp_read_file, 1, NULL, ipp)); } -/* - * 'ippReadIO()' - Read data for an IPP message. - * - * @since CUPS 1.2/macOS 10.5@ - */ +// +// 'ippReadIO()' - Read data for an IPP message. +// +// @since CUPS 1.2/macOS 10.5@ +// -ipp_state_t /* O - Current state */ -ippReadIO(void *src, /* I - Data source */ - ipp_iocb_t cb, /* I - Read callback function */ - int blocking, /* I - Use blocking IO? */ - ipp_t *parent, /* I - Parent request, if any */ - ipp_t *ipp) /* I - IPP data */ +ipp_state_t // O - Current state +ippReadIO(void *src, // I - Data source + ipp_io_cb_t cb, // I - Read callback function + int blocking, // I - Use blocking IO? + ipp_t *parent, // I - Parent request, if any + ipp_t *ipp) // I - IPP data { - int n; /* Length of data */ - unsigned char *buffer, /* Data buffer */ + int n; // Length of data + unsigned char *buffer, // Data buffer string[IPP_MAX_TEXT], - /* Small string buffer */ - *bufptr, /* Pointer into buffer */ - *bufend; /* End of buffer */ - ipp_attribute_t *attr = NULL; /* Current attribute */ - ipp_tag_t tag; /* Current tag */ - ipp_tag_t value_tag; /* Current value tag */ - _ipp_value_t *value; /* Current value */ + // Small string buffer + *bufptr, // Pointer into buffer + *bufend; // End of buffer + ipp_attribute_t *attr = NULL; // Current attribute + ipp_tag_t tag; // Current tag + ipp_tag_t value_tag; // Current value tag + _ipp_value_t *value; // Current value DEBUG_printf("ippReadIO(src=%p, cb=%p, blocking=%d, parent=%p, ipp=%p)", (void *)src, (void *)cb, blocking, (void *)parent, (void *)ipp); @@ -2884,29 +2624,23 @@ ippReadIO(void *src, /* I - Data source */ switch (ipp->state) { case IPP_STATE_IDLE : - ipp->state ++; /* Avoid common problem... */ + ipp->state ++; // Avoid common problem... case IPP_STATE_HEADER : if (parent == NULL) { - /* - * Get the request header... - */ - + // Get the request header... if ((*cb)(src, buffer, 8) < 8) { DEBUG_puts("1ippReadIO: Unable to read header."); goto rollback; } - /* - * Then copy the request header over... - */ - + // Then copy the request header over... ipp->request.any.version[0] = buffer[0]; ipp->request.any.version[1] = buffer[1]; - ipp->request.any.op_status = (buffer[2] << 8) | buffer[3]; - ipp->request.any.request_id = (buffer[4] << 24) | (buffer[5] << 16) | (buffer[6] << 8) | buffer[7]; + ipp->request.any.op_status = (buffer[2] << 8) | buffer[3]; + ipp->request.any.request_id = (buffer[4] << 24) | (buffer[5] << 16) | (buffer[6] << 8) | buffer[7]; DEBUG_printf("2ippReadIO: version=%d.%d", buffer[0], buffer[1]); DEBUG_printf("2ippReadIO: op_status=%04x", ipp->request.any.op_status); @@ -2918,10 +2652,7 @@ ippReadIO(void *src, /* I - Data source */ ipp->curtag = IPP_TAG_ZERO; ipp->prev = ipp->last; - /* - * If blocking is disabled, stop here... - */ - + // If blocking is disabled, stop here... if (!blocking) break; @@ -2936,17 +2667,11 @@ ippReadIO(void *src, /* I - Data source */ DEBUG_printf("2ippReadIO: ipp->current=%p, ipp->prev=%p", (void *)ipp->current, (void *)ipp->prev); - /* - * Read this attribute... - */ - + // Read this attribute... tag = (ipp_tag_t)buffer[0]; if (tag == IPP_TAG_EXTENSION) { - /* - * Read 32-bit "extension" tag... - */ - + // Read 32-bit "extension" tag... if ((*cb)(src, buffer, 4) < 4) { DEBUG_puts("1ippReadIO: Callback returned EOF/error"); @@ -2957,10 +2682,7 @@ ippReadIO(void *src, /* I - Data source */ if (tag & IPP_TAG_CUPS_CONST) { - /* - * Fail if the high bit is set in the tag... - */ - + // Fail if the high bit is set in the tag... _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP extension tag larger than 0x7FFFFFFF."), 1); DEBUG_printf("1ippReadIO: bad tag 0x%x.", tag); goto rollback; @@ -2969,10 +2691,7 @@ ippReadIO(void *src, /* I - Data source */ if (tag == IPP_TAG_END) { - /* - * No more attributes left... - */ - + // No more attributes left... DEBUG_puts("2ippReadIO: IPP_TAG_END."); ipp->state = IPP_STATE_DATA; @@ -2986,10 +2705,7 @@ ippReadIO(void *src, /* I - Data source */ } else if (tag < IPP_TAG_UNSUPPORTED_VALUE) { - /* - * Group tag... Set the current group and continue... - */ - + // Group tag... Set the current group and continue... if (parent) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid group tag."), 1); @@ -2997,9 +2713,13 @@ ippReadIO(void *src, /* I - Data source */ goto rollback; } else if (ipp->curtag == tag) + { ipp->prev = ippAddSeparator(ipp); + } else if (ipp->current) + { ipp->prev = ipp->current; + } ipp->curtag = tag; ipp->current = NULL; @@ -3010,10 +2730,7 @@ ippReadIO(void *src, /* I - Data source */ DEBUG_printf("2ippReadIO: value tag=%x(%s)", tag, ippTagString(tag)); - /* - * Get the name... - */ - + // Get the name... if ((*cb)(src, buffer, 2) < 2) { DEBUG_puts("1ippReadIO: unable to read name length."); @@ -3039,10 +2756,7 @@ ippReadIO(void *src, /* I - Data source */ } else if (n == 0 && tag != IPP_TAG_MEMBERNAME && tag != IPP_TAG_END_COLLECTION) { - /* - * More values for current attribute... - */ - + // More values for current attribute... if (ipp->current == NULL) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP attribute has no name."), 1); @@ -3053,36 +2767,18 @@ ippReadIO(void *src, /* I - Data source */ attr = ipp->current; value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_CUPS_MASK); - /* - * Make sure we aren't adding a new value of a different - * type... - */ - + // Make sure we aren't adding a new value of a different type... if (value_tag == IPP_TAG_ZERO) { - /* - * Setting the value of a collection member... - */ - + // Setting the value of a collection member... attr->value_tag = tag; } - else if (value_tag == IPP_TAG_TEXTLANG || - value_tag == IPP_TAG_NAMELANG || - (value_tag >= IPP_TAG_TEXT && - value_tag <= IPP_TAG_MIMETYPE)) + else if (value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_NAMELANG || (value_tag >= IPP_TAG_TEXT && value_tag <= IPP_TAG_MIMETYPE)) { - /* - * String values can sometimes come across in different - * forms; accept sets of differing values... - */ - - if (tag != IPP_TAG_TEXTLANG && tag != IPP_TAG_NAMELANG && - (tag < IPP_TAG_TEXT || tag > IPP_TAG_MIMETYPE) && - tag != IPP_TAG_NOVALUE) + // String values can sometimes come across in different forms; accept sets of differing values... + if (tag != IPP_TAG_TEXTLANG && tag != IPP_TAG_NAMELANG && (tag < IPP_TAG_TEXT || tag > IPP_TAG_MIMETYPE) && tag != IPP_TAG_NOVALUE) { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP 1setOf attribute with incompatible value " - "tags."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP 1setOf attribute with incompatible value tags."), 1); DEBUG_printf("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)", value_tag, ippTagString(value_tag), tag, ippTagString(tag)); goto rollback; } @@ -3093,55 +2789,37 @@ ippReadIO(void *src, /* I - Data source */ ippSetValueTag(ipp, &attr, tag); } } - else if (value_tag == IPP_TAG_INTEGER || - value_tag == IPP_TAG_RANGE) + else if (value_tag == IPP_TAG_INTEGER || value_tag == IPP_TAG_RANGE) { - /* - * Integer and rangeOfInteger values can sometimes be mixed; accept - * sets of differing values... - */ - + // Integer and rangeOfInteger values can sometimes be mixed; accept sets of differing values... if (tag != IPP_TAG_INTEGER && tag != IPP_TAG_RANGE) { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP 1setOf attribute with incompatible value " - "tags."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP 1setOf attribute with incompatible value tags."), 1); DEBUG_printf("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)", value_tag, ippTagString(value_tag), tag, ippTagString(tag)); goto rollback; } if (value_tag == IPP_TAG_INTEGER && tag == IPP_TAG_RANGE) { - /* - * Convert integer values to rangeOfInteger values... - */ - + // Convert integer values to rangeOfInteger values... DEBUG_printf("1ippReadIO: Converting %s attribute to rangeOfInteger.", attr->name); ippSetValueTag(ipp, &attr, IPP_TAG_RANGE); } } else if (value_tag != tag) { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP 1setOf attribute with incompatible value " - "tags."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP 1setOf attribute with incompatible value tags."), 1); DEBUG_printf("1ippReadIO: value tag %x(%s) != %x(%s)", value_tag, ippTagString(value_tag), tag, ippTagString(tag)); goto rollback; } - /* - * Finally, reallocate the attribute array as needed... - */ - + // Finally, reallocate the attribute array as needed... if ((value = ipp_set_value(ipp, &attr, attr->num_values)) == NULL) goto rollback; } else if (tag == IPP_TAG_MEMBERNAME) { - /* - * Name must be length 0! - */ - + // Name must be length 0! if (n) { _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP member name is not empty."), 1); @@ -3172,10 +2850,7 @@ ippReadIO(void *src, /* I - Data source */ } else if (tag != IPP_TAG_END_COLLECTION) { - /* - * New attribute; read the name and add it... - */ - + // New attribute; read the name and add it... if ((*cb)(src, buffer, (size_t)n) < n) { DEBUG_puts("1ippReadIO: unable to read name."); @@ -3187,8 +2862,7 @@ ippReadIO(void *src, /* I - Data source */ if (ipp->current) ipp->prev = ipp->current; - if ((attr = ipp->current = ipp_add_attr(ipp, (char *)buffer, ipp->curtag, tag, - 1)) == NULL) + if ((attr = ipp->current = ipp_add_attr(ipp, (char *)buffer, ipp->curtag, tag, 1)) == NULL) { _cupsSetHTTPError(HTTP_STATUS_ERROR); DEBUG_puts("1ippReadIO: unable to allocate attribute."); @@ -3216,8 +2890,7 @@ ippReadIO(void *src, /* I - Data source */ if (n >= IPP_BUF_SIZE) { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP value larger than 32767 bytes."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP value larger than 32767 bytes."), 1); DEBUG_printf("1ippReadIO: bad value length %d.", n); goto rollback; } @@ -3229,11 +2902,9 @@ ippReadIO(void *src, /* I - Data source */ if (n != 4) { if (tag == IPP_TAG_INTEGER) - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP integer value not 4 bytes."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP integer value not 4 bytes."), 1); else - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP enum value not 4 bytes."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP enum value not 4 bytes."), 1); DEBUG_printf("1ippReadIO: bad integer value length %d.", n); goto rollback; } @@ -3255,8 +2926,7 @@ ippReadIO(void *src, /* I - Data source */ case IPP_TAG_BOOLEAN : if (n != 1) { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP boolean value not 1 byte."), - 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP boolean value not 1 byte."), 1); DEBUG_printf("1ippReadIO: bad boolean value length %d.", n); goto rollback; } @@ -3277,12 +2947,9 @@ ippReadIO(void *src, /* I - Data source */ case IPP_TAG_NOTSETTABLE : case IPP_TAG_DELETEATTR : case IPP_TAG_ADMINDEFINE : - /* - * These value types are not supposed to have values, however - * some vendors (Brother) do not implement IPP correctly and so - * we need to map non-empty values to text... - */ - + // These value types are not supposed to have values, however + // some vendors (Brother) do not implement IPP correctly and so + // we need to map non-empty values to text... if (attr->value_tag == tag) { if (n == 0) @@ -3332,8 +2999,7 @@ ippReadIO(void *src, /* I - Data source */ case IPP_TAG_RESOLUTION : if (n != 9) { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP resolution value not 9 bytes."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP resolution value not 9 bytes."), 1); DEBUG_printf("1ippReadIO: bad resolution value length %d.", n); goto rollback; } @@ -3372,50 +3038,40 @@ ippReadIO(void *src, /* I - Data source */ if (n < 4) { if (tag == IPP_TAG_TEXTLANG) - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP textWithLanguage value less than " - "minimum 4 bytes."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP textWithLanguage value less than minimum 4 bytes."), 1); else - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP nameWithLanguage value less than " - "minimum 4 bytes."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP nameWithLanguage value less than minimum 4 bytes."), 1); DEBUG_printf("1ippReadIO: bad stringWithLanguage value length %d.", n); goto rollback; } if ((*cb)(src, buffer, (size_t)n) < n) { - DEBUG_puts("1ippReadIO: Unable to read string w/language " - "value."); + DEBUG_puts("1ippReadIO: Unable to read string w/language value."); goto rollback; } bufptr = buffer; bufend = buffer + n; - /* - * text-with-language and name-with-language are composite - * values: - * - * language-length - * language - * text-length - * text - */ - + // textWithLanguage and nameWithLanguage are composite + // values: + // + // language-length + // language + // text-length + // text n = (bufptr[0] << 8) | bufptr[1]; if ((bufptr + 2 + n + 2) > bufend || n >= (int)sizeof(string)) { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP language length overflows value."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP language length overflows value."), 1); DEBUG_printf("1ippReadIO: bad language value length %d.", n); goto rollback; } else if (n >= IPP_MAX_LANGUAGE) { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP language length too large."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP language length too large."), 1); DEBUG_printf("1ippReadIO: bad language value length %d.", n); goto rollback; } @@ -3430,8 +3086,7 @@ ippReadIO(void *src, /* I - Data source */ if ((bufptr + 2 + n) > bufend) { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP string length overflows value."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP string length overflows value."), 1); DEBUG_printf("1ippReadIO: bad string value length %d.", n); goto rollback; } @@ -3441,18 +3096,13 @@ ippReadIO(void *src, /* I - Data source */ break; case IPP_TAG_BEGIN_COLLECTION : - /* - * Oh, boy, here comes a collection value, so read it... - */ - + // Oh boy, here comes a collection value, so read it... value->collection = ippNew(); if (n > 0) { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP begCollection value not 0 bytes."), 1); - DEBUG_puts("1ippReadIO: begCollection tag with value length " - "> 0."); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP begCollection value not 0 bytes."), 1); + DEBUG_puts("1ippReadIO: begCollection tag with value length > 0."); goto rollback; } @@ -3466,10 +3116,8 @@ ippReadIO(void *src, /* I - Data source */ case IPP_TAG_END_COLLECTION : if (n > 0) { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP endCollection value not 0 bytes."), 1); - DEBUG_puts("1ippReadIO: endCollection tag with value length " - "> 0."); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP endCollection value not 0 bytes."), 1); + DEBUG_puts("1ippReadIO: endCollection tag with value length > 0."); goto rollback; } @@ -3479,22 +3127,16 @@ ippReadIO(void *src, /* I - Data source */ return (ipp->state = IPP_STATE_DATA); case IPP_TAG_MEMBERNAME : - /* - * The value the name of the member in the collection, which - * we need to carry over... - */ - + // The value the name of the member in the collection, which we need to carry over... if (!attr) { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP memberName with no attribute."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP memberName with no attribute."), 1); DEBUG_puts("1ippReadIO: Member name without attribute."); goto rollback; } else if (n == 0) { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP memberName value is empty."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP memberName value is empty."), 1); DEBUG_puts("1ippReadIO: Empty member name value."); goto rollback; } @@ -3507,23 +3149,18 @@ ippReadIO(void *src, /* I - Data source */ buffer[n] = '\0'; attr->name = _cupsStrAlloc((char *)buffer); - /* - * Since collection members are encoded differently than - * regular attributes, make sure we don't start with an - * empty value... - */ - + // Since collection members are encoded differently than regular + // attributes, make sure we don't start with an empty value... attr->num_values --; DEBUG_printf("2ippReadIO: member name=\"%s\"", attr->name); break; case IPP_TAG_STRING : - default : /* Other unsupported values */ + default : // Other unsupported values if (tag == IPP_TAG_STRING && n > IPP_MAX_LENGTH) { - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP octetString length too large."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP octetString length too large."), 1); DEBUG_printf("1ippReadIO: bad octetString value length %d.", n); goto rollback; } @@ -3546,14 +3183,13 @@ ippReadIO(void *src, /* I - Data source */ } } else + { value->unknown.data = NULL; + } break; } - /* - * If blocking is disabled, stop here... - */ - + // If blocking is disabled, stop here... if (!blocking) break; } @@ -3563,7 +3199,7 @@ ippReadIO(void *src, /* I - Data source */ break; default : - break; /* anti-compiler-warning-code */ + break; // anti-compiler-warning-code } DEBUG_printf("1ippReadIO: returning ipp->state=%d.", ipp->state); @@ -3584,41 +3220,70 @@ ippReadIO(void *src, /* I - Data source */ } -/* - * 'ippSetBoolean()' - Set a boolean value in an attribute. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code attr@ parameter may be modified as a result of setting the value. - * - * The @code element@ parameter specifies which value to set from 0 to - * @code ippGetCount(attr)@. - * - * @since CUPS 1.6/macOS 10.8@ - */ - -int /* O - 1 on success, 0 on failure */ -ippSetBoolean(ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - IPP attribute */ - int element, /* I - Value number (0-based) */ - int boolvalue)/* I - Boolean value */ +// +// 'ippRestore()' - Restore a previously saved find position. +// +// @since CUPS 2.5@ +// + +void +ippRestore(ipp_t *ipp) // I - IPP message { - _ipp_value_t *value; /* Current value */ + if (ipp) + { + if (ipp->find > ipp->fstack) + ipp->find --; + else + ipp->find = NULL; + } +} - /* - * Range check input... - */ +// +// 'ippSave()' - Save the current find position. +// +// @since CUPS 2.5@ +// + +void +ippSave(ipp_t *ipp) // I - IPP message +{ + if (ipp && ipp->find < (ipp->fstack + _IPP_MAX_FIND)) + { + ipp->find[1] = ipp->find[0]; + ipp->find ++; + } +} - if (!ipp || !attr || !*attr || (*attr)->value_tag != IPP_TAG_BOOLEAN || - element < 0 || element > (*attr)->num_values) - return (0); - /* - * Set the value and return... - */ +// +// 'ippSetBoolean()' - Set a boolean value in an attribute. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "attr" parameter may be modified as a result of setting the value. +// +// The "element" parameter specifies which value to set from 0 to +// @code ippGetCount(attr)@. +// +// @since CUPS 1.6/macOS 10.8@ +// + +int // O - 1 on success, 0 on failure +ippSetBoolean(ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - IPP attribute + int element, // I - Value number (0-based) + int boolvalue)// I - Boolean value +{ + _ipp_value_t *value; // Current value + + + // Range check input... + if (!ipp || !attr || !*attr || (*attr)->value_tag != IPP_TAG_BOOLEAN || element < 0 || element > (*attr)->num_values) + return (0); + // Set the value and return... if ((value = ipp_set_value(ipp, attr, element)) != NULL) value->boolean = (char)boolvalue; @@ -3626,42 +3291,35 @@ ippSetBoolean(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippSetCollection()' - Set a collection value in an attribute. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code attr@ parameter may be modified as a result of setting the value. - * - * The @code element@ parameter specifies which value to set from 0 to - * @code ippGetCount(attr)@. - * - * @since CUPS 1.6/macOS 10.8@ - */ - -int /* O - 1 on success, 0 on failure */ +// +// 'ippSetCollection()' - Set a collection value in an attribute. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "attr" parameter may be modified as a result of setting the value. +// +// The "element" parameter specifies which value to set from 0 to +// @code ippGetCount(attr)@. +// +// @since CUPS 1.6/macOS 10.8@ +// + +int // O - 1 on success, 0 on failure ippSetCollection( - ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - IPP attribute */ - int element, /* I - Value number (0-based) */ - ipp_t *colvalue) /* I - Collection value */ + ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - IPP attribute + int element, // I - Value number (0-based) + ipp_t *colvalue) // I - Collection value { - _ipp_value_t *value; /* Current value */ + _ipp_value_t *value; // Current value - /* - * Range check input... - */ - - if (!ipp || !attr || !*attr || (*attr)->value_tag != IPP_TAG_BEGIN_COLLECTION || - element < 0 || element > (*attr)->num_values || !colvalue) + // Range check input... + if (!ipp || !attr || !*attr || (*attr)->value_tag != IPP_TAG_BEGIN_COLLECTION || element < 0 || element > (*attr)->num_values || !colvalue) return (0); - /* - * Set the value and return... - */ - + // Set the value and return... if ((value = ipp_set_value(ipp, attr, element)) != NULL) { if (value->collection) @@ -3675,123 +3333,106 @@ ippSetCollection( } -/* - * 'ippSetDate()' - Set a dateTime value in an attribute. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code attr@ parameter may be modified as a result of setting the value. - * - * The @code element@ parameter specifies which value to set from 0 to - * @code ippGetCount(attr)@. - * - * @since CUPS 1.6/macOS 10.8@ - */ - -int /* O - 1 on success, 0 on failure */ -ippSetDate(ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - IPP attribute */ - int element, /* I - Value number (0-based) */ - const ipp_uchar_t *datevalue)/* I - dateTime value */ +// +// 'ippSetDate()' - Set a dateTime value in an attribute. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "attr" parameter may be modified as a result of setting the value. +// +// The "element" parameter specifies which value to set from 0 to +// @code ippGetCount(attr)@. +// +// @since CUPS 1.6/macOS 10.8@ +// + +int // O - 1 on success, 0 on failure +ippSetDate(ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - IPP attribute + int element, // I - Value number (0-based) + const ipp_uchar_t *datevalue)// I - dateTime value { - _ipp_value_t *value; /* Current value */ - + _ipp_value_t *value; // Current value - /* - * Range check input... - */ + // Range check input... if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_DATE && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values || !datevalue) return (0); - /* - * Set the value and return... - */ - + // Set the value and return... if ((value = ipp_set_value(ipp, attr, element)) != NULL) + { + (*attr)->value_tag = IPP_TAG_DATE; memcpy(value->date, datevalue, sizeof(value->date)); + } return (value != NULL); } -/* - * 'ippSetGroupTag()' - Set the group tag of an attribute. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code attr@ parameter may be modified as a result of setting the value. - * - * The @code group@ parameter specifies the IPP attribute group tag: none - * (@code IPP_TAG_ZERO@, for member attributes), document (@code IPP_TAG_DOCUMENT@), - * event notification (@code IPP_TAG_EVENT_NOTIFICATION@), operation - * (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription - * (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@). - * - * @since CUPS 1.6/macOS 10.8@ - */ - -int /* O - 1 on success, 0 on failure */ +// +// 'ippSetGroupTag()' - Set the group tag of an attribute. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "attr" parameter may be modified as a result of setting the value. +// +// The "group" parameter specifies the IPP attribute group tag: none +// (`IPP_TAG_ZERO`, for member attributes), document (`IPP_TAG_DOCUMENT`), +// event notification (`IPP_TAG_EVENT_NOTIFICATION`), operation +// (`IPP_TAG_OPERATION`), printer (`IPP_TAG_PRINTER`), subscription +// (`IPP_TAG_SUBSCRIPTION`), or unsupported (`IPP_TAG_UNSUPPORTED_GROUP`). +// +// @since CUPS 1.6/macOS 10.8@ +// + +int // O - 1 on success, 0 on failure ippSetGroupTag( - ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - Attribute */ - ipp_tag_t group_tag) /* I - Group tag */ + ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - Attribute + ipp_tag_t group_tag) // I - Group tag { - /* - * Range check input - group tag must be 0x01 to 0x0F, per RFC 8011... - */ - - if (!ipp || !attr || !*attr || - group_tag < IPP_TAG_ZERO || group_tag == IPP_TAG_END || - group_tag >= IPP_TAG_UNSUPPORTED_VALUE) + // Range check input - group tag must be 0x01 to 0x0F, per RFC 8011... + if (!ipp || !attr || !*attr || group_tag < IPP_TAG_ZERO || group_tag == IPP_TAG_END || group_tag >= IPP_TAG_UNSUPPORTED_VALUE) return (0); - /* - * Set the group tag and return... - */ - + // Set the group tag and return... (*attr)->group_tag = group_tag; return (1); } -/* - * 'ippSetInteger()' - Set an integer or enum value in an attribute. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code attr@ parameter may be modified as a result of setting the value. - * - * The @code element@ parameter specifies which value to set from 0 to - * @code ippGetCount(attr)@. - * - * @since CUPS 1.6/macOS 10.8@ - */ - -int /* O - 1 on success, 0 on failure */ -ippSetInteger(ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - IPP attribute */ - int element, /* I - Value number (0-based) */ - int intvalue) /* I - Integer/enum value */ +// +// 'ippSetInteger()' - Set an integer or enum value in an attribute. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "attr" parameter may be modified as a result of setting the value. +// +// The "element" parameter specifies which value to set from 0 to +// @code ippGetCount(attr)@. +// +// @since CUPS 1.6/macOS 10.8@ +// + +int // O - 1 on success, 0 on failure +ippSetInteger(ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - IPP attribute + int element, // I - Value number (0-based) + int intvalue) // I - Integer/enum value { - _ipp_value_t *value; /* Current value */ - + _ipp_value_t *value; // Current value - /* - * Range check input... - */ + // Range check input... if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_INTEGER && (*attr)->value_tag != IPP_TAG_ENUM && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values) return (0); - /* - * Set the value and return... - */ - + // Set the value and return... if ((value = ipp_set_value(ipp, attr, element)) != NULL) { if ((*attr)->value_tag != IPP_TAG_ENUM) @@ -3804,36 +3445,30 @@ ippSetInteger(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippSetName()' - Set the name of an attribute. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code attr@ parameter may be modified as a result of setting the value. - * - * @since CUPS 1.6/macOS 10.8@ - */ - -int /* O - 1 on success, 0 on failure */ -ippSetName(ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - IPP attribute */ - const char *name) /* I - Attribute name */ +// +// 'ippSetName()' - Set the name of an attribute. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "attr" parameter may be modified as a result of setting the value. +// +// @since CUPS 1.6/macOS 10.8@ +// + +int // O - 1 on success, 0 on failure +ippSetName(ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - IPP attribute + const char *name) // I - Attribute name { - char *temp; /* Temporary name value */ - + char *temp; // Temporary name value - /* - * Range check input... - */ + // Range check input... if (!ipp || !attr || !*attr) return (0); - /* - * Set the value and return... - */ - + // Set the value and return... if ((temp = _cupsStrAlloc(name)) != NULL) { if ((*attr)->name) @@ -3846,67 +3481,52 @@ ippSetName(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippSetOctetString()' - Set an octetString value in an IPP attribute. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code attr@ parameter may be modified as a result of setting the value. - * - * The @code element@ parameter specifies which value to set from 0 to - * @code ippGetCount(attr)@. - * - * @since CUPS 1.7/macOS 10.9@ - */ - -int /* O - 1 on success, 0 on failure */ +// +// 'ippSetOctetString()' - Set an octetString value in an IPP attribute. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "attr" parameter may be modified as a result of setting the value. +// +// The "element" parameter specifies which value to set from 0 to +// @code ippGetCount(attr)@. +// +// @since CUPS 1.7/macOS 10.9@ +// + +int // O - 1 on success, 0 on failure ippSetOctetString( - ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - IPP attribute */ - int element, /* I - Value number (0-based) */ - const void *data, /* I - Pointer to octetString data */ - int datalen) /* I - Length of octetString data */ + ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - IPP attribute + int element, // I - Value number (0-based) + const void *data, // I - Pointer to octetString data + int datalen) // I - Length of octetString data { - _ipp_value_t *value; /* Current value */ - + _ipp_value_t *value; // Current value - /* - * Range check input... - */ + // Range check input... if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_STRING && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values || datalen < 0 || datalen > IPP_MAX_LENGTH) return (0); - /* - * Set the value and return... - */ - + // Set the value and return... if ((value = ipp_set_value(ipp, attr, element)) != NULL) { if ((int)((*attr)->value_tag) & IPP_TAG_CUPS_CONST) { - /* - * Just copy the pointer... - */ - + // Just copy the pointer... value->unknown.data = (void *)data; value->unknown.length = datalen; } else { - /* - * Copy the data... - */ - + // Copy the data... (*attr)->value_tag = IPP_TAG_STRING; if (value->unknown.data) { - /* - * Free previous data... - */ - + // Free previous data... free(value->unknown.data); value->unknown.data = NULL; @@ -3915,7 +3535,7 @@ ippSetOctetString( if (datalen > 0) { - void *temp; /* Temporary data pointer */ + void *temp; // Temporary data pointer if ((temp = malloc((size_t)datalen)) != NULL) { @@ -3925,7 +3545,9 @@ ippSetOctetString( value->unknown.length = datalen; } else + { return (0); + } } } } @@ -3934,71 +3556,59 @@ ippSetOctetString( } -/* - * 'ippSetOperation()' - Set the operation ID in an IPP request message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippSetOperation()' - Set the operation ID in an IPP request message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// @since CUPS 1.6/macOS 10.8@ +// -int /* O - 1 on success, 0 on failure */ -ippSetOperation(ipp_t *ipp, /* I - IPP request message */ - ipp_op_t op) /* I - Operation ID */ +int // O - 1 on success, 0 on failure +ippSetOperation(ipp_t *ipp, // I - IPP request message + ipp_op_t op) // I - Operation ID { - /* - * Range check input... - */ - + // Range check input... if (!ipp) return (0); - /* - * Set the operation and return... - */ - + // Set the operation and return... ipp->request.op.operation_id = op; return (1); } -/* - * 'ippSetRange()' - Set a rangeOfInteger value in an attribute. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code attr@ parameter may be modified as a result of setting the value. - * - * The @code element@ parameter specifies which value to set from 0 to - * @code ippGetCount(attr)@. - * - * @since CUPS 1.6/macOS 10.8@ - */ - -int /* O - 1 on success, 0 on failure */ -ippSetRange(ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - IPP attribute */ - int element, /* I - Value number (0-based) */ - int lowervalue, /* I - Lower bound for range */ - int uppervalue) /* I - Upper bound for range */ +// +// 'ippSetRange()' - Set a rangeOfInteger value in an attribute. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "attr" parameter may be modified as a result of setting the value. +// +// The "element" parameter specifies which value to set from 0 to +// @code ippGetCount(attr)@. +// +// @since CUPS 1.6/macOS 10.8@ +// + +int // O - 1 on success, 0 on failure +ippSetRange(ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - IPP attribute + int element, // I - Value number (0-based) + int lowervalue, // I - Lower bound for range + int uppervalue) // I - Upper bound for range { - _ipp_value_t *value; /* Current value */ - + _ipp_value_t *value; // Current value - /* - * Range check input... - */ + // Range check input... if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_RANGE && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values || lowervalue > uppervalue) return (0); - /* - * Set the value and return... - */ - + // Set the value and return... if ((value = ipp_set_value(ipp, attr, element)) != NULL) { (*attr)->value_tag = IPP_TAG_RANGE; @@ -4010,77 +3620,65 @@ ippSetRange(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippSetRequestId()' - Set the request ID in an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code request_id@ parameter must be greater than 0. - * - * @since CUPS 1.6/macOS 10.8@ - */ - -int /* O - 1 on success, 0 on failure */ -ippSetRequestId(ipp_t *ipp, /* I - IPP message */ - int request_id) /* I - Request ID */ +// +// 'ippSetRequestId()' - Set the request ID in an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The @code request_id@ parameter must be greater than 0. +// +// @since CUPS 1.6/macOS 10.8@ +// + +int // O - 1 on success, 0 on failure +ippSetRequestId(ipp_t *ipp, // I - IPP message + int request_id) // I - Request ID { - /* - * Range check input; not checking request_id values since ipptool wants to send - * invalid values for conformance testing and a bad request_id does not affect the - * encoding of a message... - */ - + // Range check input; not checking request_id values since ipptool wants to + // send invalid values for conformance testing and a bad request_id does not + // affect the encoding of a message... if (!ipp) return (0); - /* - * Set the request ID and return... - */ - + // Set the request ID and return... ipp->request.any.request_id = request_id; return (1); } -/* - * 'ippSetResolution()' - Set a resolution value in an attribute. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code attr@ parameter may be modified as a result of setting the value. - * - * The @code element@ parameter specifies which value to set from 0 to - * @code ippGetCount(attr)@. - * - * @since CUPS 1.6/macOS 10.8@ - */ - -int /* O - 1 on success, 0 on failure */ +// +// 'ippSetResolution()' - Set a resolution value in an attribute. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "attr" parameter may be modified as a result of setting the value. +// +// The "element" parameter specifies which value to set from 0 to +// @code ippGetCount(attr)@. +// +// @since CUPS 1.6/macOS 10.8@ +// + +int // O - 1 on success, 0 on failure ippSetResolution( - ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - IPP attribute */ - int element, /* I - Value number (0-based) */ - ipp_res_t unitsvalue, /* I - Resolution units */ - int xresvalue, /* I - Horizontal/cross feed resolution */ - int yresvalue) /* I - Vertical/feed resolution */ + ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - IPP attribute + int element, // I - Value number (0-based) + ipp_res_t unitsvalue, // I - Resolution units + int xresvalue, // I - Horizontal/cross feed resolution + int yresvalue) // I - Vertical/feed resolution { - _ipp_value_t *value; /* Current value */ + _ipp_value_t *value; // Current value - /* - * Range check input... - */ - + // Range check input... if (!ipp || !attr || !*attr || ((*attr)->value_tag != IPP_TAG_RESOLUTION && (*attr)->value_tag != IPP_TAG_NOVALUE && (*attr)->value_tag != IPP_TAG_UNKNOWN) || element < 0 || element > (*attr)->num_values || xresvalue <= 0 || yresvalue <= 0 || unitsvalue < IPP_RES_PER_INCH || unitsvalue > IPP_RES_PER_CM) return (0); - /* - * Set the value and return... - */ - + // Set the value and return... if ((value = ipp_set_value(ipp, attr, element)) != NULL) { (*attr)->value_tag = IPP_TAG_RESOLUTION; @@ -4093,27 +3691,21 @@ ippSetResolution( } -/* - * 'ippSetState()' - Set the current state of the IPP message. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippSetState()' - Set the current state of the IPP message. +// +// @since CUPS 1.6/macOS 10.8@ +// -int /* O - 1 on success, 0 on failure */ -ippSetState(ipp_t *ipp, /* I - IPP message */ - ipp_state_t state) /* I - IPP state value */ +int // O - 1 on success, 0 on failure +ippSetState(ipp_t *ipp, // I - IPP message + ipp_state_t state) // I - IPP state value { - /* - * Range check input... - */ - + // Range check input... if (!ipp) return (0); - /* - * Set the state and return... - */ - + // Set the state and return... ipp->state = state; ipp->current = NULL; @@ -4121,65 +3713,56 @@ ippSetState(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippSetStatusCode()' - Set the status code in an IPP response or event message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * @since CUPS 1.6/macOS 10.8@ - */ +// +// 'ippSetStatusCode()' - Set the status code in an IPP response or event message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// @since CUPS 1.6/macOS 10.8@ +// -int /* O - 1 on success, 0 on failure */ -ippSetStatusCode(ipp_t *ipp, /* I - IPP response or event message */ - ipp_status_t status) /* I - Status code */ +int // O - 1 on success, 0 on failure +ippSetStatusCode(ipp_t *ipp, // I - IPP response or event message + ipp_status_t status) // I - Status code { - /* - * Range check input... - */ - + // Range check input... if (!ipp) return (0); - /* - * Set the status code and return... - */ - + // Set the status code and return... ipp->request.status.status_code = status; return (1); } -/* - * 'ippSetString()' - Set a string value in an attribute. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code attr@ parameter may be modified as a result of setting the value. - * - * The @code element@ parameter specifies which value to set from 0 to - * @code ippGetCount(attr)@. - * - * @since CUPS 1.6/macOS 10.8@ - */ - -int /* O - 1 on success, 0 on failure */ -ippSetString(ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - IPP attribute */ - int element, /* I - Value number (0-based) */ - const char *strvalue) /* I - String value */ +// +// 'ippSetString()' - Set a string value in an attribute. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "attr" parameter may be modified as a result of setting the value. +// +// The "element" parameter specifies which value to set from 0 to +// @code ippGetCount(attr)@. +// +// @since CUPS 1.6/macOS 10.8@ +// + +int // O - 1 on success, 0 on failure +ippSetString(ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - IPP attribute + int element, // I - Value number (0-based) + const char *strvalue) // I - String value { - char *temp; /* Temporary string */ - _ipp_value_t *value; /* Current value */ - ipp_tag_t value_tag; /* Value tag */ - + char *temp; // Temporary string + _ipp_value_t *value; // Current value + ipp_tag_t value_tag; // Value tag - /* - * Range check input... - */ + // Range check input... if (attr && *attr) value_tag = (*attr)->value_tag & IPP_TAG_CUPS_MASK; else @@ -4188,10 +3771,7 @@ ippSetString(ipp_t *ipp, /* I - IPP message */ if (!ipp || !attr || !*attr || (value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG && value_tag != IPP_TAG_NAMELANG && value_tag != IPP_TAG_NOVALUE && value_tag != IPP_TAG_UNKNOWN) || value_tag > IPP_TAG_MIMETYPE || element < 0 || element > (*attr)->num_values || !strvalue) return (0); - /* - * Set the value and return... - */ - + // Set the value and return... if ((value = ipp_set_value(ipp, attr, element)) != NULL) { if (value_tag == IPP_TAG_NOVALUE || value_tag == IPP_TAG_UNKNOWN) @@ -4201,7 +3781,9 @@ ippSetString(ipp_t *ipp, /* I - IPP message */ value->string.language = (*attr)->values[0].string.language; if ((int)((*attr)->value_tag) & IPP_TAG_CUPS_CONST) + { value->string.text = (char *)strvalue; + } else if ((temp = _cupsStrAlloc(strvalue)) != NULL) { if (value->string.text) @@ -4210,41 +3792,43 @@ ippSetString(ipp_t *ipp, /* I - IPP message */ value->string.text = temp; } else + { return (0); + } } return (value != NULL); } -/* - * 'ippSetStringf()' - Set a formatted string value of an attribute. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code attr@ parameter may be modified as a result of setting the value. - * - * The @code element@ parameter specifies which value to set from 0 to - * @code ippGetCount(attr)@. - * - * The @code format@ parameter uses formatting characters compatible with the - * printf family of standard functions. Additional arguments follow it as - * needed. The formatted string is truncated as needed to the maximum length of - * the corresponding value type. - * - * @since CUPS 1.7/macOS 10.9@ - */ - -int /* O - 1 on success, 0 on failure */ -ippSetStringf(ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - IPP attribute */ - int element, /* I - Value number (0-based) */ - const char *format, /* I - Printf-style format string */ - ...) /* I - Additional arguments as needed */ +// +// 'ippSetStringf()' - Set a formatted string value of an attribute. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "attr" parameter may be modified as a result of setting the value. +// +// The "element" parameter specifies which value to set from 0 to +// @code ippGetCount(attr)@. +// +// The "format" parameter uses formatting characters compatible with the +// printf family of standard functions. Additional arguments follow it as +// needed. The formatted string is truncated as needed to the maximum length of +// the corresponding value type. +// +// @since CUPS 1.7/macOS 10.9@ +// + +int // O - 1 on success, 0 on failure +ippSetStringf(ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - IPP attribute + int element, // I - Value number (0-based) + const char *format, // I - Printf-style format string + ...) // I - Additional arguments as needed { - int ret; /* Return value */ - va_list ap; /* Pointer to additional arguments */ + int ret; // Return value + va_list ap; // Pointer to additional arguments va_start(ap, format); @@ -4255,43 +3839,40 @@ ippSetStringf(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippSetStringf()' - Set a formatted string value of an attribute. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code attr@ parameter may be modified as a result of setting the value. - * - * The @code element@ parameter specifies which value to set from 0 to - * @code ippGetCount(attr)@. - * - * The @code format@ parameter uses formatting characters compatible with the - * printf family of standard functions. Additional arguments follow it as - * needed. The formatted string is truncated as needed to the maximum length of - * the corresponding value type. - * - * @since CUPS 1.7/macOS 10.9@ - */ - -int /* O - 1 on success, 0 on failure */ -ippSetStringfv(ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - IPP attribute */ - int element, /* I - Value number (0-based) */ - const char *format, /* I - Printf-style format string */ - va_list ap) /* I - Pointer to additional arguments */ +// +// 'ippSetStringf()' - Set a formatted string value of an attribute. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "attr" parameter may be modified as a result of setting the value. +// +// The "element" parameter specifies which value to set from 0 to +// @code ippGetCount(attr)@. +// +// The "format" parameter uses formatting characters compatible with the +// printf family of standard functions. Additional arguments follow it as +// needed. The formatted string is truncated as needed to the maximum length of +// the corresponding value type. +// +// @since CUPS 1.7/macOS 10.9@ +// + +int // O - 1 on success, 0 on failure +ippSetStringfv(ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - IPP attribute + int element, // I - Value number (0-based) + const char *format, // I - Printf-style format string + va_list ap) // I - Pointer to additional arguments { - ipp_tag_t value_tag; /* Value tag */ + ipp_tag_t value_tag; // Value tag char buffer[IPP_MAX_TEXT + 4]; - /* Formatted text string */ - ssize_t bytes, /* Length of formatted value */ - max_bytes; /* Maximum number of bytes for value */ - + // Formatted text string + ssize_t bytes, // Length of formatted value + max_bytes; // Maximum number of bytes for value - /* - * Range check input... - */ + // Range check input... if (attr && *attr) value_tag = (*attr)->value_tag & IPP_TAG_CUPS_MASK; else @@ -4300,16 +3881,10 @@ ippSetStringfv(ipp_t *ipp, /* I - IPP message */ if (!ipp || !attr || !*attr || (value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG && value_tag != IPP_TAG_NAMELANG && value_tag != IPP_TAG_NOVALUE && value_tag != IPP_TAG_UNKNOWN) || value_tag > IPP_TAG_MIMETYPE || !format) return (0); - /* - * Format the string... - */ - + // Format the string... if (!strcmp(format, "%s")) { - /* - * Optimize the simple case... - */ - + // Optimize the simple case... const char *s = va_arg(ap, char *); if (!s) @@ -4320,18 +3895,12 @@ ippSetStringfv(ipp_t *ipp, /* I - IPP message */ } else { - /* - * Do a full formatting of the message... - */ - + // Do a full formatting of the message... if ((bytes = vsnprintf(buffer, sizeof(buffer), format, ap)) < 0) return (0); } - /* - * Limit the length of the string... - */ - + // Limit the length of the string... switch (value_tag) { default : @@ -4374,8 +3943,8 @@ ippSetStringfv(ipp_t *ipp, /* I - IPP message */ if (bytes >= max_bytes) { - char *bufmax, /* Buffer at max_bytes */ - *bufptr; /* Pointer into buffer */ + char *bufmax, // Buffer at max_bytes + *bufptr; // Pointer into buffer bufptr = buffer + strlen(buffer) - 1; bufmax = buffer + max_bytes - 1; @@ -4394,71 +3963,59 @@ ippSetStringfv(ipp_t *ipp, /* I - IPP message */ *bufptr = '\0'; } - /* - * Set the formatted string and return... - */ - + // Set the formatted string and return... return (ippSetString(ipp, attr, element, buffer)); } -/* - * 'ippSetValueTag()' - Set the value tag of an attribute. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The @code attr@ parameter may be modified as a result of setting the value. - * - * Integer (@code IPP_TAG_INTEGER@) values can be promoted to rangeOfInteger - * (@code IPP_TAG_RANGE@) values, the various string tags can be promoted to name - * (@code IPP_TAG_NAME@) or nameWithLanguage (@code IPP_TAG_NAMELANG@) values, text - * (@code IPP_TAG_TEXT@) values can be promoted to textWithLanguage - * (@code IPP_TAG_TEXTLANG@) values, and all values can be demoted to the various - * out-of-band value tags such as no-value (@code IPP_TAG_NOVALUE@). All other changes - * will be rejected. - * - * Promoting a string attribute to nameWithLanguage or textWithLanguage adds the language - * code in the "attributes-natural-language" attribute or, if not present, the language - * code for the current locale. - * - * @since CUPS 1.6/macOS 10.8@ - */ - -int /* O - 1 on success, 0 on failure */ +// +// 'ippSetValueTag()' - Set the value tag of an attribute. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The "attr" parameter may be modified as a result of setting the value. +// +// Integer (`IPP_TAG_INTEGER`) values can be promoted to rangeOfInteger +// (`IPP_TAG_RANGE`) values, the various string tags can be promoted to name +// (`IPP_TAG_NAME`) or nameWithLanguage (`IPP_TAG_NAMELANG`) values, text +// (`IPP_TAG_TEXT`) values can be promoted to textWithLanguage +// (`IPP_TAG_TEXTLANG`) values, and all values can be demoted to the various +// out-of-band value tags such as no-value (`IPP_TAG_NOVALUE`). All other +// changes will be rejected. +// +// Promoting a string attribute to nameWithLanguage or textWithLanguage adds the language +// code in the "attributes-natural-language" attribute or, if not present, the language +// code for the current locale. +// +// @since CUPS 1.6/macOS 10.8@ +// + +int // O - 1 on success, 0 on failure ippSetValueTag( - ipp_t *ipp, /* I - IPP message */ - ipp_attribute_t **attr, /* IO - IPP attribute */ - ipp_tag_t value_tag) /* I - Value tag */ + ipp_t *ipp, // I - IPP message + ipp_attribute_t **attr, // IO - IPP attribute + ipp_tag_t value_tag) // I - Value tag { - int i; /* Looping var */ - _ipp_value_t *value; /* Current value */ - int integer; /* Current integer value */ - cups_lang_t *language; /* Current language */ - char code[32]; /* Language code */ - ipp_tag_t temp_tag; /* Temporary value tag */ - + int i; // Looping var + _ipp_value_t *value; // Current value + int integer; // Current integer value + cups_lang_t *language; // Current language + char code[32]; // Language code + ipp_tag_t temp_tag; // Temporary value tag - /* - * Range check input... - */ + // Range check input... if (!ipp || !attr || !*attr) return (0); - /* - * If there is no change, return immediately... - */ + // If there is no change, return immediately... + temp_tag = (ipp_tag_t)((int)((*attr)->value_tag) & IPP_TAG_CUPS_MASK); - if (value_tag == (*attr)->value_tag) + if (value_tag == temp_tag) return (1); - /* - * Otherwise implement changes as needed... - */ - - temp_tag = (ipp_tag_t)((int)((*attr)->value_tag) & IPP_TAG_CUPS_MASK); - + // Otherwise implement changes as needed... switch (value_tag) { case IPP_TAG_UNSUPPORTED_VALUE : @@ -4468,17 +4025,11 @@ ippSetValueTag( case IPP_TAG_NOTSETTABLE : case IPP_TAG_DELETEATTR : case IPP_TAG_ADMINDEFINE : - /* - * Free any existing values... - */ - + // Free any existing values... if ((*attr)->num_values > 0) ipp_free_values(*attr, 0, (*attr)->num_values); - /* - * Set out-of-band value... - */ - + // Set out-of-band value... (*attr)->value_tag = value_tag; break; @@ -4486,9 +4037,7 @@ ippSetValueTag( if (temp_tag != IPP_TAG_INTEGER) return (0); - for (i = (*attr)->num_values, value = (*attr)->values; - i > 0; - i --, value ++) + for (i = (*attr)->num_values, value = (*attr)->values; i > 0; i --, value ++) { integer = value->integer; value->range.lower = value->range.upper = integer; @@ -4512,42 +4061,25 @@ ippSetValueTag( if (value_tag == IPP_TAG_TEXTLANG && temp_tag != IPP_TAG_TEXT) return (0); - if (ipp->attrs && ipp->attrs->next && ipp->attrs->next->name && - !strcmp(ipp->attrs->next->name, "attributes-natural-language") && (ipp->attrs->next->value_tag & IPP_TAG_CUPS_MASK) == IPP_TAG_LANGUAGE) + if (ipp->attrs && ipp->attrs->next && ipp->attrs->next->name && !strcmp(ipp->attrs->next->name, "attributes-natural-language") && (ipp->attrs->next->value_tag & IPP_TAG_CUPS_MASK) == IPP_TAG_LANGUAGE) { - /* - * Use the language code from the IPP message... - */ - - (*attr)->values[0].string.language = - _cupsStrAlloc(ipp->attrs->next->values[0].string.text); + // Use the language code from the IPP message... + (*attr)->values[0].string.language = _cupsStrAlloc(ipp->attrs->next->values[0].string.text); } else { - /* - * Otherwise, use the language code corresponding to the locale... - */ - + // Otherwise, use the language code corresponding to the locale... language = cupsLangDefault(); - (*attr)->values[0].string.language = _cupsStrAlloc(ipp_lang_code(language->language, - code, - sizeof(code))); + (*attr)->values[0].string.language = _cupsStrAlloc(ipp_lang_code(language->language, code, sizeof(code))); } - for (i = (*attr)->num_values - 1, value = (*attr)->values + 1; - i > 0; - i --, value ++) + for (i = (*attr)->num_values - 1, value = (*attr)->values + 1; i > 0; i --, value ++) value->string.language = (*attr)->values[0].string.language; if ((int)(*attr)->value_tag & IPP_TAG_CUPS_CONST) { - /* - * Make copies of all values... - */ - - for (i = (*attr)->num_values, value = (*attr)->values; - i > 0; - i --, value ++) + // Make copies of all values... + for (i = (*attr)->num_values, value = (*attr)->values; i > 0; i --, value ++) value->string.text = _cupsStrAlloc(value->string.text); } @@ -4556,7 +4088,7 @@ ippSetValueTag( case IPP_TAG_KEYWORD : if (temp_tag == IPP_TAG_NAME || temp_tag == IPP_TAG_NAMELANG) - break; /* Silently "allow" name -> keyword */ + break; // Silently "allow" name -> keyword default : return (0); @@ -4566,33 +4098,27 @@ ippSetValueTag( } -/* - * 'ippSetVersion()' - Set the version number in an IPP message. - * - * The @code ipp@ parameter refers to an IPP message previously created using - * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. - * - * The valid version numbers are currently 1.0, 1.1, 2.0, 2.1, and 2.2. - * - * @since CUPS 1.6/macOS 10.8@ - */ - -int /* O - 1 on success, 0 on failure */ -ippSetVersion(ipp_t *ipp, /* I - IPP message */ - int major, /* I - Major version number (major.minor) */ - int minor) /* I - Minor version number (major.minor) */ +// +// 'ippSetVersion()' - Set the version number in an IPP message. +// +// The "ipp" parameter refers to an IPP message previously created using +// the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions. +// +// The valid version numbers are currently 1.0, 1.1, 2.0, 2.1, and 2.2. +// +// @since CUPS 1.6/macOS 10.8@ +// + +int // O - 1 on success, 0 on failure +ippSetVersion(ipp_t *ipp, // I - IPP message + int major, // I - Major version number (major.minor) + int minor) // I - Minor version number (major.minor) { - /* - * Range check input... - */ - + // Range check input... if (!ipp || major < 0 || minor < 0) return (0); - /* - * Set the version number... - */ - + // Set the version number... ipp->request.any.version[0] = (ipp_uchar_t)major; ipp->request.any.version[1] = (ipp_uchar_t)minor; @@ -4600,35 +4126,32 @@ ippSetVersion(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ippTimeToDate()' - Convert from time in seconds to RFC 2579 format. - */ +// +// 'ippTimeToDate()' - Convert from time in seconds to RFC 2579 format. +// -const ipp_uchar_t * /* O - RFC-2579 date/time data */ -ippTimeToDate(time_t t) /* I - Time in seconds */ +const ipp_uchar_t * // O - RFC-2579 date/time data +ippTimeToDate(time_t t) // I - Time in seconds { - struct tm unixdate; /* UNIX unixdate/time info */ + struct tm unixdate; // UNIX unixdate/time info ipp_uchar_t *date = _cupsGlobals()->ipp_date; - /* RFC-2579 date/time data */ - - - /* - * RFC-2579 date/time format is: - * - * Byte(s) Description - * ------- ----------- - * 0-1 Year (0 to 65535) - * 2 Month (1 to 12) - * 3 Day (1 to 31) - * 4 Hours (0 to 23) - * 5 Minutes (0 to 59) - * 6 Seconds (0 to 60, 60 = "leap second") - * 7 Deciseconds (0 to 9) - * 8 +/- UTC - * 9 UTC hours (0 to 11) - * 10 UTC minutes (0 to 59) - */ - + // RFC-2579 date/time data + + + // RFC-2579 date/time format is: + // + // Byte(s) Description + // ------- ----------- + // 0-1 Year (0 to 65535) + // 2 Month (1 to 12) + // 3 Day (1 to 31) + // 4 Hours (0 to 23) + // 5 Minutes (0 to 59) + // 6 Seconds (0 to 60, 60 = "leap second") + // 7 Deciseconds (0 to 9) + // 8 +/- UTC + // 9 UTC hours (0 to 11) + // 10 UTC minutes (0 to 59) gmtime_r(&t, &unixdate); unixdate.tm_year += 1900; @@ -4648,47 +4171,44 @@ ippTimeToDate(time_t t) /* I - Time in seconds */ } -/* - * 'ippValidateAttribute()' - Validate the contents of an attribute. - * - * This function validates the contents of an attribute based on the name and - * value tag. 1 is returned if the attribute is valid, 0 otherwise. On - * failure, @link cupsGetErrorString@ is set to a human-readable message. - * - * @since CUPS 1.7/macOS 10.9@ - */ +// +// 'ippValidateAttribute()' - Validate the contents of an attribute. +// +// This function validates the contents of an attribute based on the name and +// value tag. 1 is returned if the attribute is valid, 0 otherwise. On +// failure, @link cupsGetErrorString@ is set to a human-readable message. +// +// @since CUPS 1.7/macOS 10.9@ +// -int /* O - 1 if valid, 0 otherwise */ +int // O - 1 if valid, 0 otherwise ippValidateAttribute( - ipp_attribute_t *attr) /* I - Attribute */ + ipp_attribute_t *attr) // I - Attribute { - int i; /* Looping var */ - char scheme[64], /* Scheme from URI */ - userpass[256], /* Username/password from URI */ - hostname[256], /* Hostname from URI */ - resource[1024]; /* Resource from URI */ - int port, /* Port number from URI */ - uri_status; /* URI separation status */ - const char *ptr; /* Pointer into string */ - ipp_attribute_t *colattr; /* Collection attribute */ - regex_t re; /* Regular expression */ - ipp_uchar_t *date; /* Current date value */ - - - /* - * Skip separators. - */ - + int i, // Looping var + r; // regcomp() error code + char scheme[64], // Scheme from URI + userpass[256], // Username/password from URI + hostname[256], // Hostname from URI + resource[1024]; // Resource from URI + int port, // Port number from URI + uri_status; // URI separation status + const char *ptr; // Pointer into string + ipp_attribute_t *colattr; // Collection attribute + regex_t re; // Regular expression + ipp_uchar_t *date; // Current date value + + + // Skip separators. if (!attr->name) return (1); - /* - * Validate the attribute name. - */ - + // Validate the attribute name. for (ptr = attr->name; *ptr; ptr ++) + { if (!isalnum(*ptr & 255) && *ptr != '-' && *ptr != '.' && *ptr != '_') break; + } if (*ptr || ptr == attr->name) { @@ -4710,8 +4230,7 @@ ippValidateAttribute( case IPP_TAG_BOOLEAN : for (i = 0; i < attr->num_values; i ++) { - if (attr->values[i].boolean != 0 && - attr->values[i].boolean != 1) + if (attr->values[i].boolean != 0 && attr->values[i].boolean != 1) { ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)."), attr->name, attr->values[i].boolean); return (0); @@ -4877,9 +4396,13 @@ ippValidateAttribute( ptr += 3; } else if (*ptr & 0x80) + { break; + } else if ((*ptr < ' ' && *ptr != '\n' && *ptr != '\r' && *ptr != '\t') || *ptr == 0x7f) + { break; + } } if (*ptr) @@ -4932,9 +4455,13 @@ ippValidateAttribute( ptr += 3; } else if (*ptr & 0x80) + { break; + } else if (*ptr < ' ' || *ptr == 0x7f) + { break; + } } if (*ptr) @@ -4964,8 +4491,7 @@ ippValidateAttribute( { for (ptr = attr->values[i].string.text; *ptr; ptr ++) { - if (!isalnum(*ptr & 255) && *ptr != '-' && *ptr != '.' && - *ptr != '_') + if (!isalnum(*ptr & 255) && *ptr != '-' && *ptr != '.' && *ptr != '_') break; } @@ -5009,8 +4535,7 @@ ippValidateAttribute( { for (ptr ++; *ptr; ptr ++) { - if (!islower(*ptr & 255) && !isdigit(*ptr & 255) && - *ptr != '+' && *ptr != '-' && *ptr != '.') + if (!islower(*ptr & 255) && !isdigit(*ptr & 255) && *ptr != '+' && *ptr != '-' && *ptr != '.') break; } } @@ -5034,8 +4559,7 @@ ippValidateAttribute( { for (ptr = attr->values[i].string.text; *ptr; ptr ++) { - if (!isprint(*ptr & 255) || isupper(*ptr & 255) || - isspace(*ptr & 255)) + if (!isprint(*ptr & 255) || isupper(*ptr & 255) || isspace(*ptr & 255)) break; } @@ -5054,31 +4578,28 @@ ippValidateAttribute( break; case IPP_TAG_LANGUAGE : - /* - * The following regular expression is derived from the ABNF for - * language tags in RFC 4646. All I can say is that this is the - * easiest way to check the values... - */ - - if ((i = regcomp(&re, + // The following regular expression is derived from the ABNF for + // language tags in RFC 4646. All I can say is that this is the + // easiest way to check the values... + if ((r = regcomp(&re, "^(" "(([a-z]{2,3}(-[a-z][a-z][a-z]){0,3})|[a-z]{4,8})" - /* language */ - "(-[a-z][a-z][a-z][a-z]){0,1}" /* script */ - "(-([a-z][a-z]|[0-9][0-9][0-9])){0,1}" /* region */ - "(-([a-z]{5,8}|[0-9][0-9][0-9]))*" /* variant */ - "(-[a-wy-z](-[a-z0-9]{2,8})+)*" /* extension */ - "(-x(-[a-z0-9]{1,8})+)*" /* privateuse */ + // language + "(-[a-z][a-z][a-z][a-z]){0,1}" // script + "(-([a-z][a-z]|[0-9][0-9][0-9])){0,1}" // region + "(-([a-z]{5,8}|[0-9][0-9][0-9]))*" // variant + "(-[a-wy-z](-[a-z0-9]{2,8})+)*" // extension + "(-x(-[a-z0-9]{1,8})+)*" // privateuse "|" - "x(-[a-z0-9]{1,8})+" /* privateuse */ + "x(-[a-z0-9]{1,8})+" // privateuse "|" - "[a-z]{1,3}(-[a-z][0-9]{2,8}){1,2}" /* grandfathered */ + "[a-z]{1,3}(-[a-z][0-9]{2,8}){1,2}" // grandfathered ")$", REG_NOSUB | REG_EXTENDED)) != 0) { - char temp[256]; /* Temporary error string */ + char temp[256]; // Temporary error string - regerror(i, &re, temp, sizeof(temp)); + regerror(r, &re, temp, sizeof(temp)); ipp_set_error(IPP_STATUS_ERROR_INTERNAL, _("Unable to compile naturalLanguage regular expression: %s."), temp); return (0); } @@ -5104,26 +4625,23 @@ ippValidateAttribute( break; case IPP_TAG_MIMETYPE : - /* - * The following regular expression is derived from the ABNF for - * MIME media types in RFC 2045 and 4288. All I can say is that this is - * the easiest way to check the values... - */ - - if ((i = regcomp(&re, + // The following regular expression is derived from the ABNF for + // MIME media types in RFC 2045 and 4288. All I can say is that this is + // the easiest way to check the values... + if ((r = regcomp(&re, "^" - "[-a-zA-Z0-9!#$&.+^_]{1,127}" /* type-name */ + "[-a-zA-Z0-9!#$&.+^_]{1,127}" // type-name "/" - "[-a-zA-Z0-9!#$&.+^_]{1,127}" /* subtype-name */ - "(;[-a-zA-Z0-9!#$&.+^_]{1,127}=" /* parameter= */ + "[-a-zA-Z0-9!#$&.+^_]{1,127}" // subtype-name + "(;[-a-zA-Z0-9!#$&.+^_]{1,127}=" // parameter= "([-a-zA-Z0-9!#$&.+^_]{1,127}|\"[^\"]*\"))*" - /* value */ + // value "$", REG_NOSUB | REG_EXTENDED)) != 0) { - char temp[256]; /* Temporary error string */ + char temp[256]; // Temporary error string - regerror(i, &re, temp, sizeof(temp)); + regerror(r, &re, temp, sizeof(temp)); ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("Unable to compile mimeMediaType regular expression: %s."), temp); return (0); } @@ -5156,40 +4674,42 @@ ippValidateAttribute( } -/* - * 'ippValidateAttributes()' - Validate all attributes in an IPP message. - * - * This function validates the contents of the IPP message, including each - * attribute. Like @link ippValidateAttribute@, @link cupsGetErrorString@ is - * set to a human-readable message on failure. - * - * @since CUPS 1.7/macOS 10.9@ - */ +// +// 'ippValidateAttributes()' - Validate all attributes in an IPP message. +// +// This function validates the contents of the IPP message, including each +// attribute. Like @link ippValidateAttribute@, @link cupsGetErrorString@ is +// set to a human-readable message on failure. +// +// @since CUPS 1.7/macOS 10.9@ +// -int /* O - 1 if valid, 0 otherwise */ -ippValidateAttributes(ipp_t *ipp) /* I - IPP message */ +int // O - 1 if valid, 0 otherwise +ippValidateAttributes(ipp_t *ipp) // I - IPP message { - ipp_attribute_t *attr; /* Current attribute */ + ipp_attribute_t *attr; // Current attribute if (!ipp) return (1); for (attr = ipp->attrs; attr; attr = attr->next) + { if (!ippValidateAttribute(attr)) return (0); + } return (1); } -/* - * 'ippWrite()' - Write data for an IPP message to a HTTP connection. - */ +// +// 'ippWrite()' - Write data for an IPP message to a HTTP connection. +// -ipp_state_t /* O - Current state */ -ippWrite(http_t *http, /* I - HTTP connection */ - ipp_t *ipp) /* I - IPP data */ +ipp_state_t // O - Current state +ippWrite(http_t *http, // I - HTTP connection + ipp_t *ipp) // I - IPP data { DEBUG_printf("ippWrite(http=%p, ipp=%p)", (void *)http, (void *)ipp); @@ -5200,15 +4720,15 @@ ippWrite(http_t *http, /* I - HTTP connection */ } -/* - * 'ippWriteFile()' - Write data for an IPP message to a file. - * - * @since CUPS 1.1.19/macOS 10.3@ - */ +// +// 'ippWriteFile()' - Write data for an IPP message to a file. +// +// @since CUPS 1.1.19/macOS 10.3@ +// -ipp_state_t /* O - Current state */ -ippWriteFile(int fd, /* I - HTTP data */ - ipp_t *ipp) /* I - IPP data */ +ipp_state_t // O - Current state +ippWriteFile(int fd, // I - HTTP data + ipp_t *ipp) // I - IPP data { DEBUG_printf("ippWriteFile(fd=%d, ipp=%p)", fd, (void *)ipp); @@ -5218,25 +4738,25 @@ ippWriteFile(int fd, /* I - HTTP data */ } -/* - * 'ippWriteIO()' - Write data for an IPP message. - * - * @since CUPS 1.2/macOS 10.5@ - */ +// +// 'ippWriteIO()' - Write data for an IPP message. +// +// @since CUPS 1.2/macOS 10.5@ +// -ipp_state_t /* O - Current state */ -ippWriteIO(void *dst, /* I - Destination */ - ipp_iocb_t cb, /* I - Write callback function */ - int blocking, /* I - Use blocking IO? */ - ipp_t *parent, /* I - Parent IPP message */ - ipp_t *ipp) /* I - IPP data */ +ipp_state_t // O - Current state +ippWriteIO(void *dst, // I - Destination + ipp_io_cb_t cb, // I - Write callback function + int blocking, // I - Use blocking IO? + ipp_t *parent, // I - Parent IPP message + ipp_t *ipp) // I - IPP data { - int i; /* Looping var */ - int n; /* Length of data */ - unsigned char *buffer, /* Data buffer */ - *bufptr; /* Pointer into buffer */ - ipp_attribute_t *attr; /* Current attribute */ - _ipp_value_t *value; /* Current value */ + int i; // Looping var + int n; // Length of data + unsigned char *buffer, // Data buffer + *bufptr; // Pointer into buffer + ipp_attribute_t *attr; // Current attribute + _ipp_value_t *value; // Current value DEBUG_printf("ippWriteIO(dst=%p, cb=%p, blocking=%d, parent=%p, ipp=%p)", (void *)dst, (void *)cb, blocking, (void *)parent, (void *)ipp); @@ -5253,20 +4773,17 @@ ippWriteIO(void *dst, /* I - Destination */ switch (ipp->state) { case IPP_STATE_IDLE : - ipp->state ++; /* Avoid common problem... */ + ipp->state ++; // Avoid common problem... case IPP_STATE_HEADER : if (parent == NULL) { - /* - * Send the request header: - * - * Version = 2 bytes - * Operation/Status Code = 2 bytes - * Request ID = 4 bytes - * Total = 8 bytes - */ - + // Send the request header: + // + // Version = 2 bytes + // Operation/Status Code = 2 bytes + // Request ID = 4 bytes + // Total = 8 bytes bufptr = buffer; *bufptr++ = ipp->request.any.version[0]; @@ -5290,31 +4807,22 @@ ippWriteIO(void *dst, /* I - Destination */ } } - /* - * Reset the state engine to point to the first attribute - * in the request/response, with no current group. - */ - + // Reset the state engine to point to the first attribute + // in the request/response, with no current group. ipp->state = IPP_STATE_ATTRIBUTE; ipp->current = ipp->attrs; ipp->curtag = IPP_TAG_ZERO; DEBUG_printf("1ippWriteIO: ipp->current=%p", (void *)ipp->current); - /* - * If blocking is disabled, stop here... - */ - + // If blocking is disabled, stop here... if (!blocking) break; case IPP_STATE_ATTRIBUTE : while (ipp->current != NULL) { - /* - * Write this attribute... - */ - + // Write this attribute... bufptr = buffer; attr = ipp->current; @@ -5324,10 +4832,7 @@ ippWriteIO(void *dst, /* I - Destination */ { if (ipp->curtag != attr->group_tag) { - /* - * Send a group tag byte... - */ - + // Send a group tag byte... ipp->curtag = attr->group_tag; if (attr->group_tag == IPP_TAG_ZERO) @@ -5337,27 +4842,22 @@ ippWriteIO(void *dst, /* I - Destination */ *bufptr++ = (ipp_uchar_t)attr->group_tag; } else if (attr->group_tag == IPP_TAG_ZERO) + { continue; + } } DEBUG_printf("1ippWriteIO: %s (%s%s)", attr->name, attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag)); - /* - * Write the attribute tag and name. - * - * The attribute name length does not include the trailing nul - * character in the source string. - * - * Collection values (parent != NULL) are written differently... - */ - + // Write the attribute tag and name. + // + // The attribute name length does not include the trailing nul + // character in the source string. + // + // Collection values (parent != NULL) are written differently... if (parent == NULL) { - /* - * Get the length of the attribute name, and make sure it won't - * overflow the buffer... - */ - + // Get the length of the attribute name, and make sure it won't overflow the buffer... if ((n = (int)strlen(attr->name)) > (IPP_BUF_SIZE - 8)) { DEBUG_printf("1ippWriteIO: Attribute name too long (%d)", n); @@ -5365,10 +4865,7 @@ ippWriteIO(void *dst, /* I - Destination */ return (IPP_STATE_ERROR); } - /* - * Write the value tag, name length, and name string... - */ - + // Write the value tag, name length, and name string... DEBUG_printf("2ippWriteIO: writing value tag=%x(%s)", attr->value_tag, ippTagString(attr->value_tag)); DEBUG_printf("2ippWriteIO: writing name=%d,\"%s\"", n, attr->name); @@ -5381,7 +4878,9 @@ ippWriteIO(void *dst, /* I - Destination */ *bufptr++ = (ipp_uchar_t)attr->value_tag; } else + { *bufptr++ = (ipp_uchar_t)attr->value_tag; + } *bufptr++ = (ipp_uchar_t)(n >> 8); *bufptr++ = (ipp_uchar_t)n; @@ -5390,11 +4889,7 @@ ippWriteIO(void *dst, /* I - Destination */ } else { - /* - * Get the length of the attribute name, and make sure it won't - * overflow the buffer... - */ - + // Get the length of the attribute name, and make sure it won't overflow the buffer... if ((n = (int)strlen(attr->name)) > (IPP_BUF_SIZE - 12)) { DEBUG_printf("1ippWriteIO: Attribute name too long (%d)", n); @@ -5402,11 +4897,8 @@ ippWriteIO(void *dst, /* I - Destination */ return (IPP_STATE_ERROR); } - /* - * Write the member name tag, name length, name string, value tag, - * and empty name for the collection member attribute... - */ - + // Write the member name tag, name length, name string, value tag, + // and empty name for the collection member attribute... DEBUG_printf("2ippWriteIO: writing value tag=%x(memberName)", IPP_TAG_MEMBERNAME); DEBUG_printf("2ippWriteIO: writing name=%d,\"%s\"", n, attr->name); DEBUG_printf("2ippWriteIO: writing value tag=%x(%s)", attr->value_tag, ippTagString(attr->value_tag)); @@ -5429,16 +4921,15 @@ ippWriteIO(void *dst, /* I - Destination */ *bufptr++ = (ipp_uchar_t)attr->value_tag; } else + { *bufptr++ = (ipp_uchar_t)attr->value_tag; + } *bufptr++ = 0; *bufptr++ = 0; } - /* - * Now write the attribute value(s)... - */ - + // Now write the attribute value(s)... switch (attr->value_tag & ~IPP_TAG_CUPS_CONST) { case IPP_TAG_UNSUPPORTED_VALUE : @@ -5454,16 +4945,13 @@ ippWriteIO(void *dst, /* I - Destination */ case IPP_TAG_INTEGER : case IPP_TAG_ENUM : - for (i = 0, value = attr->values; - i < attr->num_values; - i ++, value ++) + for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if ((IPP_BUF_SIZE - (bufptr - buffer)) < 9) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { - DEBUG_puts("1ippWriteIO: Could not write IPP " - "attribute..."); + DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } @@ -5473,23 +4961,16 @@ ippWriteIO(void *dst, /* I - Destination */ if (i) { - /* - * Arrays and sets are done by sending additional - * values with a zero-length name... - */ - + // Arrays and sets are done by sending additional values with a zero-length name... *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } - /* - * Integers and enumerations are both 4-byte signed - * (twos-complement) values. - * - * Put the 2-byte length and 4-byte value into the buffer... - */ - + // Integers and enumerations are both 4-byte signed + // (twos-complement) values. + // + // Put the 2-byte length and 4-byte value into the buffer... *bufptr++ = 0; *bufptr++ = 4; *bufptr++ = (ipp_uchar_t)(value->integer >> 24); @@ -5500,16 +4981,13 @@ ippWriteIO(void *dst, /* I - Destination */ break; case IPP_TAG_BOOLEAN : - for (i = 0, value = attr->values; - i < attr->num_values; - i ++, value ++) + for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if ((IPP_BUF_SIZE - (bufptr - buffer)) < 6) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { - DEBUG_puts("1ippWriteIO: Could not write IPP " - "attribute..."); + DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } @@ -5519,22 +4997,15 @@ ippWriteIO(void *dst, /* I - Destination */ if (i) { - /* - * Arrays and sets are done by sending additional - * values with a zero-length name... - */ - + // Arrays and sets are done by sending additional values with a zero-length name... *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } - /* - * Boolean values are 1-byte; 0 = false, 1 = true. - * - * Put the 2-byte length and 1-byte value into the buffer... - */ - + // Boolean values are 1-byte; 0 = false, 1 = true. + // + // Put the 2-byte length and 1-byte value into the buffer... *bufptr++ = 0; *bufptr++ = 1; *bufptr++ = (ipp_uchar_t)value->boolean; @@ -5549,17 +5020,11 @@ ippWriteIO(void *dst, /* I - Destination */ case IPP_TAG_CHARSET : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : - for (i = 0, value = attr->values; - i < attr->num_values; - i ++, value ++) + for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if (i) { - /* - * Arrays and sets are done by sending additional - * values with a zero-length name... - */ - + // Arrays and sets are done by sending additional values with a zero-length name... DEBUG_printf("2ippWriteIO: writing value tag=%x(%s)", attr->value_tag, ippTagString(attr->value_tag)); DEBUG_printf("2ippWriteIO: writing name=0,\"\""); @@ -5567,8 +5032,7 @@ ippWriteIO(void *dst, /* I - Destination */ { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { - DEBUG_puts("1ippWriteIO: Could not write IPP " - "attribute..."); + DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } @@ -5599,8 +5063,7 @@ ippWriteIO(void *dst, /* I - Destination */ { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { - DEBUG_puts("1ippWriteIO: Could not write IPP " - "attribute..."); + DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } @@ -5608,16 +5071,13 @@ ippWriteIO(void *dst, /* I - Destination */ bufptr = buffer; } - /* - * All simple strings consist of the 2-byte length and - * character data without the trailing nul normally found - * in C strings. Also, strings cannot be longer than IPP_MAX_LENGTH - * bytes since the 2-byte length is a signed (twos-complement) - * value. - * - * Put the 2-byte length and string characters in the buffer. - */ - + // All simple strings consist of the 2-byte length and + // character data without the trailing nul normally found + // in C strings. Also, strings cannot be longer than IPP_MAX_LENGTH + // bytes since the 2-byte length is a signed (twos-complement) + // value. + // + // Put the 2-byte length and string characters in the buffer. *bufptr++ = (ipp_uchar_t)(n >> 8); *bufptr++ = (ipp_uchar_t)n; @@ -5630,16 +5090,13 @@ ippWriteIO(void *dst, /* I - Destination */ break; case IPP_TAG_DATE : - for (i = 0, value = attr->values; - i < attr->num_values; - i ++, value ++) + for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if ((IPP_BUF_SIZE - (bufptr - buffer)) < 16) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { - DEBUG_puts("1ippWriteIO: Could not write IPP " - "attribute..."); + DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } @@ -5649,24 +5106,17 @@ ippWriteIO(void *dst, /* I - Destination */ if (i) { - /* - * Arrays and sets are done by sending additional - * values with a zero-length name... - */ - + // Arrays and sets are done by sending additional values with a zero-length name... *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } - /* - * Date values consist of a 2-byte length and an - * 11-byte date/time structure defined by RFC 1903. - * - * Put the 2-byte length and 11-byte date/time - * structure in the buffer. - */ - + // Date values consist of a 2-byte length and an + // 11-byte date/time structure defined by RFC 1903. + // + // Put the 2-byte length and 11-byte date/time + // structure in the buffer. *bufptr++ = 0; *bufptr++ = 11; memcpy(bufptr, value->date, 11); @@ -5675,16 +5125,13 @@ ippWriteIO(void *dst, /* I - Destination */ break; case IPP_TAG_RESOLUTION : - for (i = 0, value = attr->values; - i < attr->num_values; - i ++, value ++) + for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if ((IPP_BUF_SIZE - (bufptr - buffer)) < 14) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { - DEBUG_puts("1ippWriteIO: Could not write IPP " - "attribute..."); + DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } @@ -5694,25 +5141,18 @@ ippWriteIO(void *dst, /* I - Destination */ if (i) { - /* - * Arrays and sets are done by sending additional - * values with a zero-length name... - */ - + // Arrays and sets are done by sending additional values with a zero-length name... *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } - /* - * Resolution values consist of a 2-byte length, - * 4-byte horizontal resolution value, 4-byte vertical - * resolution value, and a 1-byte units value. - * - * Put the 2-byte length and resolution value data - * into the buffer. - */ - + // Resolution values consist of a 2-byte length, + // 4-byte horizontal resolution value, 4-byte vertical + // resolution value, and a 1-byte units value. + // + // Put the 2-byte length and resolution value data + // into the buffer. *bufptr++ = 0; *bufptr++ = 9; *bufptr++ = (ipp_uchar_t)(value->resolution.xres >> 24); @@ -5728,16 +5168,13 @@ ippWriteIO(void *dst, /* I - Destination */ break; case IPP_TAG_RANGE : - for (i = 0, value = attr->values; - i < attr->num_values; - i ++, value ++) + for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if ((IPP_BUF_SIZE - (bufptr - buffer)) < 13) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { - DEBUG_puts("1ippWriteIO: Could not write IPP " - "attribute..."); + DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } @@ -5747,24 +5184,17 @@ ippWriteIO(void *dst, /* I - Destination */ if (i) { - /* - * Arrays and sets are done by sending additional - * values with a zero-length name... - */ - + // Arrays and sets are done by sending additional values with a zero-length name... *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } - /* - * Range values consist of a 2-byte length, - * 4-byte lower value, and 4-byte upper value. - * - * Put the 2-byte length and range value data - * into the buffer. - */ - + // Range values consist of a 2-byte length, + // 4-byte lower value, and 4-byte upper value. + // + // Put the 2-byte length and range value data + // into the buffer. *bufptr++ = 0; *bufptr++ = 8; *bufptr++ = (ipp_uchar_t)(value->range.lower >> 24); @@ -5780,23 +5210,16 @@ ippWriteIO(void *dst, /* I - Destination */ case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : - for (i = 0, value = attr->values; - i < attr->num_values; - i ++, value ++) + for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if (i) { - /* - * Arrays and sets are done by sending additional - * values with a zero-length name... - */ - + // Arrays and sets are done by sending additional values with a zero-length name... if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { - DEBUG_puts("1ippWriteIO: Could not write IPP " - "attribute..."); + DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } @@ -5809,16 +5232,13 @@ ippWriteIO(void *dst, /* I - Destination */ *bufptr++ = 0; } - /* - * textWithLanguage and nameWithLanguage values consist - * of a 2-byte length for both strings and their - * individual lengths, a 2-byte length for the - * character string, the character string without the - * trailing nul, a 2-byte length for the character - * set string, and the character set string without - * the trailing nul. - */ - + // textWithLanguage and nameWithLanguage values consist + // of a 2-byte length for both strings and their + // individual lengths, a 2-byte length for the + // character string, the character string without the + // trailing nul, a 2-byte length for the character + // set string, and the character set string without + // the trailing nul. n = 4; if (value->string.language != NULL) @@ -5838,8 +5258,7 @@ ippWriteIO(void *dst, /* I - Destination */ { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { - DEBUG_puts("1ippWriteIO: Could not write IPP " - "attribute..."); + DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } @@ -5847,11 +5266,11 @@ ippWriteIO(void *dst, /* I - Destination */ bufptr = buffer; } - /* Length of entire value */ + // Length of entire value *bufptr++ = (ipp_uchar_t)(n >> 8); *bufptr++ = (ipp_uchar_t)n; - /* Length of language */ + // Length of language if (value->string.language != NULL) n = (int)strlen(value->string.language); else @@ -5860,14 +5279,14 @@ ippWriteIO(void *dst, /* I - Destination */ *bufptr++ = (ipp_uchar_t)(n >> 8); *bufptr++ = (ipp_uchar_t)n; - /* Language */ + // Language if (n > 0) { memcpy(bufptr, value->string.language, (size_t)n); bufptr += n; } - /* Length of text */ + // Length of text if (value->string.text != NULL) n = (int)strlen(value->string.text); else @@ -5876,7 +5295,7 @@ ippWriteIO(void *dst, /* I - Destination */ *bufptr++ = (ipp_uchar_t)(n >> 8); *bufptr++ = (ipp_uchar_t)n; - /* Text */ + // Text if (n > 0) { memcpy(bufptr, value->string.text, (size_t)n); @@ -5886,23 +5305,17 @@ ippWriteIO(void *dst, /* I - Destination */ break; case IPP_TAG_BEGIN_COLLECTION : - for (i = 0, value = attr->values; - i < attr->num_values; - i ++, value ++) + for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { - /* - * Collections are written with the begin-collection - * tag first with a value of 0 length, followed by the - * attributes in the collection, then the end-collection - * value... - */ - + // Collections are written with the begin-collection + // tag first with a value of 0 length, followed by the + // attributes in the collection, then the end-collection + // value... if ((IPP_BUF_SIZE - (bufptr - buffer)) < 5) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { - DEBUG_puts("1ippWriteIO: Could not write IPP " - "attribute..."); + DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } @@ -5912,41 +5325,29 @@ ippWriteIO(void *dst, /* I - Destination */ if (i) { - /* - * Arrays and sets are done by sending additional - * values with a zero-length name... - */ - + // Arrays and sets are done by sending additional values with a zero-length name... *bufptr++ = (ipp_uchar_t)attr->value_tag; *bufptr++ = 0; *bufptr++ = 0; } - /* - * Write a data length of 0 and flush the buffer... - */ - + // Write a data length of 0 and flush the buffer... *bufptr++ = 0; *bufptr++ = 0; if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { - DEBUG_puts("1ippWriteIO: Could not write IPP " - "attribute..."); + DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } bufptr = buffer; - /* - * Then write the collection attribute... - */ - + // Then write the collection attribute... value->collection->state = IPP_STATE_IDLE; - if (ippWriteIO(dst, cb, 1, ipp, - value->collection) == IPP_STATE_ERROR) + if (ippWriteIO(dst, cb, 1, ipp, value->collection) == IPP_STATE_ERROR) { DEBUG_puts("1ippWriteIO: Unable to write collection value"); _cupsBufferRelease((char *)buffer); @@ -5956,23 +5357,16 @@ ippWriteIO(void *dst, /* I - Destination */ break; default : - for (i = 0, value = attr->values; - i < attr->num_values; - i ++, value ++) + for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if (i) { - /* - * Arrays and sets are done by sending additional - * values with a zero-length name... - */ - + // Arrays and sets are done by sending additional values with a zero-length name... if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { - DEBUG_puts("1ippWriteIO: Could not write IPP " - "attribute..."); + DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } @@ -5985,13 +5379,10 @@ ippWriteIO(void *dst, /* I - Destination */ *bufptr++ = 0; } - /* - * An unknown value might some new value that a - * vendor has come up with. It consists of a - * 2-byte length and the bytes in the unknown - * value buffer. - */ - + // An unknown value might some new value that a + // vendor has come up with. It consists of a + // 2-byte length and the bytes in the unknown + // value buffer. n = value->unknown.length; if (n > (IPP_BUF_SIZE - 2)) @@ -6005,8 +5396,7 @@ ippWriteIO(void *dst, /* I - Destination */ { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) { - DEBUG_puts("1ippWriteIO: Could not write IPP " - "attribute..."); + DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); _cupsBufferRelease((char *)buffer); return (IPP_STATE_ERROR); } @@ -6014,11 +5404,11 @@ ippWriteIO(void *dst, /* I - Destination */ bufptr = buffer; } - /* Length of unknown value */ + // Length of unknown value *bufptr++ = (ipp_uchar_t)(n >> 8); *bufptr++ = (ipp_uchar_t)n; - /* Value */ + // Value if (n > 0) { memcpy(bufptr, value->unknown.data, (size_t)n); @@ -6028,10 +5418,7 @@ ippWriteIO(void *dst, /* I - Destination */ break; } - /* - * Write the data out... - */ - + // Write the data out... if (bufptr > buffer) { if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0) @@ -6044,22 +5431,14 @@ ippWriteIO(void *dst, /* I - Destination */ DEBUG_printf("2ippWriteIO: wrote %d bytes", (int)(bufptr - buffer)); } - /* - * If blocking is disabled and we aren't at the end of the attribute - * list, stop here... - */ - + // If blocking is disabled and we aren't at the end of the attribute list, stop here... if (!blocking && ipp->current) break; } if (ipp->current == NULL) { - /* - * Done with all of the attributes; add the end-of-attributes - * tag or end-collection attribute... - */ - + // Done with all of the attributes; add the end-of-attributes tag or end-collection attribute... if (parent == NULL) { buffer[0] = IPP_TAG_END; @@ -6068,9 +5447,9 @@ ippWriteIO(void *dst, /* I - Destination */ else { buffer[0] = IPP_TAG_END_COLLECTION; - buffer[1] = 0; /* empty name */ + buffer[1] = 0; // empty name buffer[2] = 0; - buffer[3] = 0; /* empty value */ + buffer[3] = 0; // empty value buffer[4] = 0; n = 5; } @@ -6090,7 +5469,7 @@ ippWriteIO(void *dst, /* I - Destination */ break; default : - break; /* anti-compiler-warning-code */ + break; // anti-compiler-warning-code } _cupsBufferRelease((char *)buffer); @@ -6099,34 +5478,28 @@ ippWriteIO(void *dst, /* I - Destination */ } -/* - * 'ipp_add_attr()' - Add a new attribute to the message. - */ +// +// 'ipp_add_attr()' - Add a new attribute to the message. +// -static ipp_attribute_t * /* O - New attribute */ -ipp_add_attr(ipp_t *ipp, /* I - IPP message */ - const char *name, /* I - Attribute name or NULL */ - ipp_tag_t group_tag, /* I - Group tag or IPP_TAG_ZERO */ - ipp_tag_t value_tag, /* I - Value tag or IPP_TAG_ZERO */ - int num_values) /* I - Number of values */ +static ipp_attribute_t * // O - New attribute +ipp_add_attr(ipp_t *ipp, // I - IPP message + const char *name, // I - Attribute name or NULL + ipp_tag_t group_tag, // I - Group tag or IPP_TAG_ZERO + ipp_tag_t value_tag, // I - Value tag or IPP_TAG_ZERO + int num_values) // I - Number of values { - int alloc_values; /* Number of values to allocate */ - ipp_attribute_t *attr; /* New attribute */ + int alloc_values; // Number of values to allocate + ipp_attribute_t *attr; // New attribute DEBUG_printf("4ipp_add_attr(ipp=%p, name=\"%s\", group_tag=0x%x, value_tag=0x%x, num_values=%d)", (void *)ipp, name, group_tag, value_tag, num_values); - /* - * Range check input... - */ - + // Range check input... if (!ipp || num_values < 0) return (NULL); - /* - * Allocate memory, rounding the allocation up as needed... - */ - + // Allocate memory, rounding the allocation up as needed... if (num_values <= 1) alloc_values = 1; else @@ -6137,10 +5510,7 @@ ipp_add_attr(ipp_t *ipp, /* I - IPP message */ if (attr) { - /* - * Initialize attribute... - */ - + // Initialize attribute... DEBUG_printf("4debug_alloc: %p %s %s%s (%d values)", (void *)attr, name, num_values > 1 ? "1setOf " : "", ippTagString(value_tag), num_values); if (name) @@ -6150,10 +5520,7 @@ ipp_add_attr(ipp_t *ipp, /* I - IPP message */ attr->value_tag = value_tag; attr->num_values = num_values; - /* - * Add it to the end of the linked list... - */ - + // Add it to the end of the linked list... if (ipp->last) ipp->last->next = attr; else @@ -6169,38 +5536,34 @@ ipp_add_attr(ipp_t *ipp, /* I - IPP message */ } -/* - * 'ipp_free_values()' - Free attribute values. - */ +// +// 'ipp_free_values()' - Free attribute values. +// static void -ipp_free_values(ipp_attribute_t *attr, /* I - Attribute to free values from */ - int element,/* I - First value to free */ - int count) /* I - Number of values to free */ +ipp_free_values(ipp_attribute_t *attr, // I - Attribute to free values from + int element,// I - First value to free + int count) // I - Number of values to free { - int i; /* Looping var */ - _ipp_value_t *value; /* Current value */ + int i; // Looping var + _ipp_value_t *value; // Current value DEBUG_printf("4ipp_free_values(attr=%p, element=%d, count=%d)", (void *)attr, element, count); if (!(attr->value_tag & IPP_TAG_CUPS_CONST)) { - /* - * Free values as needed... - */ - + // Free values as needed... switch (attr->value_tag) { case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : - if (element == 0 && count == attr->num_values && - attr->values[0].string.language) + if (element == 0 && count == attr->num_values && attr->values[0].string.language) { _cupsStrFree(attr->values[0].string.language); attr->values[0].string.language = NULL; } - /* Fall through to other string values */ + // Fall through to other string values case IPP_TAG_TEXT : case IPP_TAG_NAME : @@ -6211,9 +5574,7 @@ ipp_free_values(ipp_attribute_t *attr, /* I - Attribute to free values from */ case IPP_TAG_CHARSET : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : - for (i = count, value = attr->values + element; - i > 0; - i --, value ++) + for (i = count, value = attr->values + element; i > 0; i --, value ++) { _cupsStrFree(value->string.text); value->string.text = NULL; @@ -6236,9 +5597,7 @@ ipp_free_values(ipp_attribute_t *attr, /* I - Attribute to free values from */ break; case IPP_TAG_BEGIN_COLLECTION : - for (i = count, value = attr->values + element; - i > 0; - i --, value ++) + for (i = count, value = attr->values + element; i > 0; i --, value ++) { ippDelete(value->collection); value->collection = NULL; @@ -6247,9 +5606,7 @@ ipp_free_values(ipp_attribute_t *attr, /* I - Attribute to free values from */ case IPP_TAG_STRING : default : - for (i = count, value = attr->values + element; - i > 0; - i --, value ++) + for (i = count, value = attr->values + element; i > 0; i --, value ++) { if (value->unknown.data) { @@ -6261,95 +5618,83 @@ ipp_free_values(ipp_attribute_t *attr, /* I - Attribute to free values from */ } } - /* - * If we are not freeing values from the end, move the remaining values up... - */ - + // If we are not freeing values from the end, move the remaining values up... if ((element + count) < attr->num_values) - memmove(attr->values + element, attr->values + element + count, - (size_t)(attr->num_values - count - element) * sizeof(_ipp_value_t)); + memmove(attr->values + element, attr->values + element + count, (size_t)(attr->num_values - count - element) * sizeof(_ipp_value_t)); attr->num_values -= count; } -/* - * 'ipp_get_code()' - Convert a C locale/charset name into an IPP language/charset code. - * - * This typically converts strings of the form "ll_CC", "ll-REGION", and "CHARSET_NUMBER" - * to "ll-cc", "ll-region", and "charset-number", respectively. - */ +// +// 'ipp_get_code()' - Convert a C locale/charset name into an IPP language/charset code. +// +// This typically converts strings of the form "ll_CC", "ll-REGION", and "CHARSET_NUMBER" +// to "ll-cc", "ll-region", and "charset-number", respectively. +// -static char * /* O - Language code string */ -ipp_get_code(const char *value, /* I - Locale/charset string */ - char *buffer, /* I - String buffer */ - size_t bufsize) /* I - Size of string buffer */ +static char * // O - Language code string +ipp_get_code(const char *value, // I - Locale/charset string + char *buffer, // I - String buffer + size_t bufsize) // I - Size of string buffer { - char *bufptr, /* Pointer into buffer */ - *bufend; /* End of buffer */ - + char *bufptr, // Pointer into buffer + *bufend; // End of buffer - /* - * Convert values to lowercase and change _ to - as needed... - */ - for (bufptr = buffer, bufend = buffer + bufsize - 1; - *value && bufptr < bufend; - value ++) + // Convert values to lowercase and change _ to - as needed... + for (bufptr = buffer, bufend = buffer + bufsize - 1; *value && bufptr < bufend; value ++) + { if (*value == '_') *bufptr++ = '-'; else *bufptr++ = (char)_cups_tolower(*value); - + } *bufptr = '\0'; - /* - * Return the converted string... - */ - + // Return the converted string... return (buffer); } -/* - * 'ipp_lang_code()' - Convert a C locale name into an IPP language code. - * - * This typically converts strings of the form "ll_CC" and "ll-REGION" to "ll-cc" and - * "ll-region", respectively. It also converts the "C" (POSIX) locale to "en". - */ +// +// 'ipp_lang_code()' - Convert a C locale name into an IPP language code. +// +// This typically converts strings of the form "ll_CC" and "ll-REGION" to "ll-cc" and +// "ll-region", respectively. It also converts the "C" (POSIX) locale to "en". +// -static char * /* O - Language code string */ -ipp_lang_code(const char *locale, /* I - Locale string */ - char *buffer, /* I - String buffer */ - size_t bufsize) /* I - Size of string buffer */ +static char * // O - Language code string +ipp_lang_code(const char *locale, // I - Locale string + char *buffer, // I - String buffer + size_t bufsize) // I - Size of string buffer { - /* - * Map POSIX ("C") locale to generic English, otherwise convert the locale string as-is. - */ - + // Map POSIX ("C") locale to generic English, otherwise convert the locale string as-is. if (!_cups_strcasecmp(locale, "c")) { cupsCopyString(buffer, "en", bufsize); return (buffer); } else + { return (ipp_get_code(locale, buffer, bufsize)); + } } -/* - * 'ipp_length()' - Compute the length of an IPP message or collection value. - */ +// +// 'ipp_length()' - Compute the length of an IPP message or collection value. +// -static size_t /* O - Size of IPP message */ -ipp_length(ipp_t *ipp, /* I - IPP message or collection */ - int collection) /* I - 1 if a collection, 0 otherwise */ +static size_t // O - Size of IPP message +ipp_length(ipp_t *ipp, // I - IPP message or collection + int collection) // I - 1 if a collection, 0 otherwise { - int i; /* Looping var */ - size_t bytes; /* Number of bytes */ - ipp_attribute_t *attr; /* Current attribute */ - ipp_tag_t group; /* Current group */ - _ipp_value_t *value; /* Current value */ + int i; // Looping var + size_t bytes; // Number of bytes + ipp_attribute_t *attr; // Current attribute + ipp_tag_t group; // Current group + _ipp_value_t *value; // Current value DEBUG_printf("3ipp_length(ipp=%p, collection=%d)", (void *)ipp, collection); @@ -6360,16 +5705,10 @@ ipp_length(ipp_t *ipp, /* I - IPP message or collection */ return (0); } - /* - * Start with 8 bytes for the IPP message header... - */ - + // Start with 8 bytes for the IPP message header... bytes = collection ? 0 : 8; - /* - * Then add the lengths of each attribute... - */ - + // Then add the lengths of each attribute... group = IPP_TAG_ZERO; for (attr = ipp->attrs; attr != NULL; attr = attr->next) @@ -6380,7 +5719,7 @@ ipp_length(ipp_t *ipp, /* I - IPP message or collection */ if (group == IPP_TAG_ZERO) continue; - bytes ++; /* Group tag */ + bytes ++; // Group tag } if (!attr->name) @@ -6389,18 +5728,18 @@ ipp_length(ipp_t *ipp, /* I - IPP message or collection */ DEBUG_printf("5ipp_length: attr->name=\"%s\", attr->num_values=%d, bytes=" CUPS_LLFMT, attr->name, attr->num_values, CUPS_LLCAST bytes); if ((attr->value_tag & ~IPP_TAG_CUPS_CONST) < IPP_TAG_EXTENSION) - bytes += (size_t)attr->num_values;/* Value tag for each value */ + bytes += (size_t)attr->num_values;// Value tag for each value else bytes += (size_t)(5 * attr->num_values); - /* Value tag for each value */ + // Value tag for each value bytes += (size_t)(2 * attr->num_values); - /* Name lengths */ - bytes += strlen(attr->name); /* Name */ + // Name lengths + bytes += strlen(attr->name); // Name bytes += (size_t)(2 * attr->num_values); - /* Value lengths */ + // Value lengths if (collection) - bytes += 5; /* Add membername overhead */ + bytes += 5; // Add membername overhead switch (attr->value_tag & ~IPP_TAG_CUPS_CONST) { @@ -6430,11 +5769,11 @@ ipp_length(ipp_t *ipp, /* I - IPP message or collection */ case IPP_TAG_CHARSET : case IPP_TAG_LANGUAGE : case IPP_TAG_MIMETYPE : - for (i = 0, value = attr->values; - i < attr->num_values; - i ++, value ++) + for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) + { if (value->string.text) bytes += strlen(value->string.text); + } break; case IPP_TAG_DATE : @@ -6452,11 +5791,9 @@ ipp_length(ipp_t *ipp, /* I - IPP message or collection */ case IPP_TAG_TEXTLANG : case IPP_TAG_NAMELANG : bytes += (size_t)(4 * attr->num_values); - /* Charset + text length */ + // Charset + text length - for (i = 0, value = attr->values; - i < attr->num_values; - i ++, value ++) + for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) { if (value->string.language) bytes += strlen(value->string.language); @@ -6467,26 +5804,18 @@ ipp_length(ipp_t *ipp, /* I - IPP message or collection */ break; case IPP_TAG_BEGIN_COLLECTION : - for (i = 0, value = attr->values; - i < attr->num_values; - i ++, value ++) + for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) bytes += ipp_length(value->collection, 1); break; default : - for (i = 0, value = attr->values; - i < attr->num_values; - i ++, value ++) + for (i = 0, value = attr->values; i < attr->num_values; i ++, value ++) bytes += (size_t)value->unknown.length; break; } } - /* - * Finally, add 1 byte for the "end of attributes" tag or 5 bytes - * for the "end of collection" tag and return... - */ - + // Finally, add 1 byte for the "end of attributes" tag or 5 bytes for the "end of collection" tag and return... if (collection) bytes += 5; else @@ -6498,28 +5827,23 @@ ipp_length(ipp_t *ipp, /* I - IPP message or collection */ } -/* - * 'ipp_read_http()' - Semi-blocking read on a HTTP connection... - */ +// +// 'ipp_read_http()' - Semi-blocking read on a HTTP connection... +// -static ssize_t /* O - Number of bytes read */ -ipp_read_http(http_t *http, /* I - Client connection */ - ipp_uchar_t *buffer, /* O - Buffer for data */ - size_t length) /* I - Total length */ +static ssize_t // O - Number of bytes read +ipp_read_http(http_t *http, // I - Client connection + ipp_uchar_t *buffer, // O - Buffer for data + size_t length) // I - Total length { - ssize_t tbytes, /* Total bytes read */ - bytes; /* Bytes read this pass */ + ssize_t tbytes, // Total bytes read + bytes; // Bytes read this pass DEBUG_printf("7ipp_read_http(http=%p, buffer=%p, length=%d)", (void *)http, (void *)buffer, (int)length); - /* - * Loop until all bytes are read... - */ - - for (tbytes = 0, bytes = 0; - tbytes < (int)length; - tbytes += bytes, buffer += bytes) + // Loop until all bytes are read... + for (tbytes = 0, bytes = 0; tbytes < (int)length; tbytes += bytes, buffer += bytes) { DEBUG_printf("9ipp_read_http: tbytes=" CUPS_LLFMT ", http->state=%d", CUPS_LLCAST tbytes, http->state); @@ -6528,32 +5852,20 @@ ipp_read_http(http_t *http, /* I - Client connection */ if (http->used == 0 && !http->blocking) { - /* - * Wait up to 10 seconds for more data on non-blocking sockets... - */ - + // Wait up to 10 seconds for more data on non-blocking sockets... if (!httpWait(http, 10000)) { - /* - * Signal no data... - */ - + // Signal no data... bytes = -1; break; } } else if (http->used == 0 && http->timeout_value > 0) { - /* - * Wait up to timeout seconds for more data on blocking sockets... - */ - + // Wait up to timeout seconds for more data on blocking sockets... if (!httpWait(http, (int)(1000 * http->timeout_value))) { - /* - * Signal no data... - */ - + // Signal no data... bytes = -1; break; } @@ -6568,16 +5880,15 @@ ipp_read_http(http_t *http, /* I - Client connection */ break; bytes = 0; -#endif /* _WIN32 */ +#endif // _WIN32 } else if (bytes == 0) + { break; + } } - /* - * Return the number of bytes read... - */ - + // Return the number of bytes read... if (tbytes == 0 && bytes < 0) tbytes = -1; @@ -6587,36 +5898,36 @@ ipp_read_http(http_t *http, /* I - Client connection */ } -/* - * 'ipp_read_file()' - Read IPP data from a file. - */ +// +// 'ipp_read_file()' - Read IPP data from a file. +// -static ssize_t /* O - Number of bytes read */ -ipp_read_file(int *fd, /* I - File descriptor */ - ipp_uchar_t *buffer, /* O - Read buffer */ - size_t length) /* I - Number of bytes to read */ +static ssize_t // O - Number of bytes read +ipp_read_file(int *fd, // I - File descriptor + ipp_uchar_t *buffer, // O - Read buffer + size_t length) // I - Number of bytes to read { #ifdef _WIN32 return ((ssize_t)read(*fd, buffer, (unsigned)length)); #else return (read(*fd, buffer, length)); -#endif /* _WIN32 */ +#endif // _WIN32 } -/* - * 'ipp_set_error()' - Set a formatted, localized error string. - */ +// +// 'ipp_set_error()' - Set a formatted, localized error string. +// static void -ipp_set_error(ipp_status_t status, /* I - Status code */ - const char *format, /* I - Printf-style error string */ - ...) /* I - Additional arguments as needed */ +ipp_set_error(ipp_status_t status, // I - Status code + const char *format, // I - Printf-style error string + ...) // I - Additional arguments as needed { - va_list ap; /* Pointer to additional args */ - char buffer[2048]; /* Message buffer */ + va_list ap; // Pointer to additional args + char buffer[2048]; // Message buffer cups_lang_t *lang = cupsLangDefault(); - /* Current language */ + // Current language va_start(ap, format); @@ -6627,33 +5938,29 @@ ipp_set_error(ipp_status_t status, /* I - Status code */ } -/* - * 'ipp_set_value()' - Get the value element from an attribute, expanding it as - * needed. - */ +// +// 'ipp_set_value()' - Get the value element from an attribute, expanding it as +// needed. +// -static _ipp_value_t * /* O - IPP value element or NULL on error */ -ipp_set_value(ipp_t *ipp, /* IO - IPP message */ - ipp_attribute_t **attr, /* IO - IPP attribute */ - int element) /* I - Value number (0-based) */ +static _ipp_value_t * // O - IPP value element or NULL on error +ipp_set_value(ipp_t *ipp, // IO - IPP message + ipp_attribute_t **attr, // IO - IPP attribute + int element) // I - Value number (0-based) { - ipp_attribute_t *temp, /* New attribute pointer */ - *current, /* Current attribute in list */ - *prev; /* Previous attribute in list */ - int alloc_values; /* Allocated values */ - + ipp_attribute_t *temp, // New attribute pointer + *current, // Current attribute in list + *prev; // Previous attribute in list + int alloc_values; // Allocated values - /* - * If we are setting an existing value element, return it... - */ + // If we are setting an existing value element, return it... temp = *attr; if (temp->num_values <= 1) alloc_values = 1; else - alloc_values = (temp->num_values + IPP_MAX_VALUES - 1) & - ~(IPP_MAX_VALUES - 1); + alloc_values = (temp->num_values + IPP_MAX_VALUES - 1) & ~(IPP_MAX_VALUES - 1); if (element < alloc_values) { @@ -6663,11 +5970,7 @@ ipp_set_value(ipp_t *ipp, /* IO - IPP message */ return (temp->values + element); } - /* - * Otherwise re-allocate the attribute - we allocate in groups of IPP_MAX_VALUE - * values when num_values > 1. - */ - + // Otherwise re-allocate the attribute - we allocate in groups of IPP_MAX_VALUE values when num_values > 1. if (alloc_values < IPP_MAX_VALUES) alloc_values = IPP_MAX_VALUES; else @@ -6675,10 +5978,7 @@ ipp_set_value(ipp_t *ipp, /* IO - IPP message */ DEBUG_printf("4ipp_set_value: Reallocating for up to %d values.", alloc_values); - /* - * Reallocate memory... - */ - + // Reallocate memory... if ((temp = realloc(temp, sizeof(ipp_attribute_t) + (size_t)(alloc_values - 1) * sizeof(_ipp_value_t))) == NULL) { _cupsSetHTTPError(HTTP_STATUS_ERROR); @@ -6686,50 +5986,33 @@ ipp_set_value(ipp_t *ipp, /* IO - IPP message */ return (NULL); } - /* - * Zero the new memory... - */ - + // Zero the new memory... memset(temp->values + temp->num_values, 0, (size_t)(alloc_values - temp->num_values) * sizeof(_ipp_value_t)); if (temp != *attr) { - /* - * Reset pointers in the list... - */ - + // Reset pointers in the list... #ifndef __clang_analyzer__ DEBUG_printf("4debug_free: %p %s", (void *)*attr, temp->name); -#endif /* !__clang_analyzer__ */ +#endif // !__clang_analyzer__ DEBUG_printf("4debug_alloc: %p %s %s%s (%d)", (void *)temp, temp->name, temp->num_values > 1 ? "1setOf " : "", ippTagString(temp->value_tag), temp->num_values); if (ipp->current == *attr && ipp->prev) { - /* - * Use current "previous" pointer... - */ - + // Use current "previous" pointer... prev = ipp->prev; } else { - /* - * Find this attribute in the linked list... - */ - - for (prev = NULL, current = ipp->attrs; - current && current != *attr; - prev = current, current = current->next); + // Find this attribute in the linked list... + for (prev = NULL, current = ipp->attrs; current && current != *attr; prev = current, current = current->next) + ; // Loop until we find the attribute if (!current) { - /* - * This is a serious error! - */ - + // This is a serious error! *attr = temp; - _cupsSetError(IPP_STATUS_ERROR_INTERNAL, - _("IPP attribute is not a member of the message."), 1); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP attribute is not a member of the message."), 1); DEBUG_puts("4ipp_set_value: Unable to find attribute in message."); return (NULL); } @@ -6749,10 +6032,7 @@ ipp_set_value(ipp_t *ipp, /* IO - IPP message */ *attr = temp; } - /* - * Return the value element... - */ - + // Return the value element... if (element >= temp->num_values) temp->num_values = element + 1; @@ -6760,18 +6040,18 @@ ipp_set_value(ipp_t *ipp, /* IO - IPP message */ } -/* - * 'ipp_write_file()' - Write IPP data to a file. - */ +// +// 'ipp_write_file()' - Write IPP data to a file. +// -static ssize_t /* O - Number of bytes written */ -ipp_write_file(int *fd, /* I - File descriptor */ - ipp_uchar_t *buffer, /* I - Data to write */ - size_t length) /* I - Number of bytes to write */ +static ssize_t // O - Number of bytes written +ipp_write_file(int *fd, // I - File descriptor + ipp_uchar_t *buffer, // I - Data to write + size_t length) // I - Number of bytes to write { #ifdef _WIN32 return ((ssize_t)write(*fd, buffer, (unsigned)length)); #else return (write(*fd, buffer, length)); -#endif /* _WIN32 */ +#endif // _WIN32 } diff --git a/cups/ipp.h b/cups/ipp.h index b7412a40c4..cec7a34664 100644 --- a/cups/ipp.h +++ b/cups/ipp.h @@ -1,947 +1,667 @@ -/* - * Internet Printing Protocol 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. - */ +// +// Internet Printing Protocol definitions for CUPS. +// +// Copyright © 2023 by OpenPrinting. +// 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_H_ # define _CUPS_IPP_H_ - -/* - * Include necessary headers... - */ - # include "http.h" # include - - -/* - * C++ magic... - */ - # ifdef __cplusplus extern "C" { -# endif /* __cplusplus */ +# endif // __cplusplus -/* - * IPP version string... - */ - -# define IPP_VERSION "\002\001" - -/* - * IPP registered port number... - * - * Note: Applications should never use IPP_PORT, but instead use the - * ippPort() function to allow overrides via the IPP_PORT environment - * variable and services file if needed! - */ - -# define IPP_PORT 631 - -/* - * Common limits... - */ - -# define IPP_MAX_CHARSET 64 /* Maximum length of charset values w/nul */ -# define IPP_MAX_KEYWORD 256 /* Maximum length of keyword values w/nul */ -# define IPP_MAX_LANGUAGE 64 /* Maximum length of naturalLanguage values w/nul */ -# define IPP_MAX_LENGTH 32767 /* Maximum size of any single value */ -# define IPP_MAX_MIMETYPE 256 /* Maximum length of mimeMediaType values w/nul */ -# define IPP_MAX_NAME 256 /* Maximum length of common name values w/nul */ -# define IPP_MAX_OCTETSTRING 1023 /* Maximum length of octetString values w/o nul */ -# define IPP_MAX_TEXT 1024 /* Maximum length of text values w/nul */ -# define IPP_MAX_URI 1024 /* Maximum length of uri values w/nul */ -# define IPP_MAX_URISCHEME 64 /* Maximum length of uriScheme values w/nul */ -# define IPP_MAX_VALUES 8 /* Power-of-2 allocation increment */ - -/* - * Macro to flag a text string attribute as "const" (static storage) vs. - * allocated. - */ +// +// Constants... +// # define IPP_CONST_TAG(x) (ipp_tag_t)(IPP_TAG_CUPS_CONST | (x)) + // Flag a text string attribute as "const" (static storage) vs. allocated. +# define IPP_MAX_CHARSET 64 // Maximum length of charset values w/nul +# define IPP_MAX_KEYWORD 256 // Maximum length of keyword values w/nul +# define IPP_MAX_LANGUAGE 64 // Maximum length of naturalLanguage values w/nul +# define IPP_MAX_LENGTH 32767 // Maximum size of any single value +# define IPP_MAX_MIMETYPE 256 // Maximum length of mimeMediaType values w/nul +# define IPP_MAX_NAME 256 // Maximum length of common name values w/nul +# define IPP_MAX_OCTETSTRING 1023 // Maximum length of octetString values w/o nul +# define IPP_MAX_TEXT 1024 // Maximum length of text values w/nul +# define IPP_MAX_URI 1024 // Maximum length of uri values w/nul +# define IPP_MAX_URISCHEME 64 // Maximum length of uriScheme values w/nul +# define IPP_MAX_VALUES 8 // Power-of-2 allocation increment +# define IPP_PORT 631 // Registered port number; use @link ippGetPort@ instead +# define IPP_VERSION "\002\001" + // IPP version string... -/* - * Types and structures... - */ +// +// Types and structures... +// -typedef enum ipp_dstate_e /**** Document states @exclude all@ ****/ +typedef enum ipp_dstate_e // Document states @exclude all@ { - IPP_DSTATE_PENDING = 3, /* Document is pending */ - IPP_DSTATE_PROCESSING = 5, /* Document is processing */ - IPP_DSTATE_CANCELED = 7, /* Document is canceled */ - IPP_DSTATE_ABORTED, /* Document is aborted */ - IPP_DSTATE_COMPLETED /* Document is completed */ - -# ifndef _CUPS_NO_DEPRECATED -# define IPP_DOCUMENT_PENDING IPP_DSTATE_PENDING -# define IPP_DOCUMENT_PROCESSING IPP_DSTATE_PROCESSING -# define IPP_DOCUMENT_CANCELED IPP_DSTATE_CANCELED -# define IPP_DOCUMENT_ABORTED IPP_DSTATE_ABORTED -# define IPP_DOCUMENT_COMPLETED IPP_DSTATE_COMPLETED -# endif /* !_CUPS_NO_DEPRECATED */ + IPP_DSTATE_PENDING = 3, // Document is pending + IPP_DSTATE_PROCESSING = 5, // Document is processing + IPP_DSTATE_CANCELED = 7, // Document is canceled + IPP_DSTATE_ABORTED, // Document is aborted + IPP_DSTATE_COMPLETED // Document is completed } ipp_dstate_t; -typedef enum ipp_finishings_e /**** Finishings values ****/ +typedef enum ipp_finishings_e // Finishings values { - IPP_FINISHINGS_NONE = 3, /* No finishing */ - IPP_FINISHINGS_STAPLE, /* Staple (any location/method) */ - IPP_FINISHINGS_PUNCH, /* Punch (any location/count) */ - IPP_FINISHINGS_COVER, /* Add cover */ - IPP_FINISHINGS_BIND, /* Bind */ - IPP_FINISHINGS_SADDLE_STITCH, /* Staple interior */ - IPP_FINISHINGS_EDGE_STITCH, /* Stitch along any side */ - IPP_FINISHINGS_FOLD, /* Fold (any type) */ - IPP_FINISHINGS_TRIM, /* Trim (any type) */ - IPP_FINISHINGS_BALE, /* Bale (any type) */ - IPP_FINISHINGS_BOOKLET_MAKER, /* Fold to make booklet */ - IPP_FINISHINGS_JOG_OFFSET, /* Offset for binding (any type) */ - IPP_FINISHINGS_COAT, /* Apply protective liquid or powder coating */ - IPP_FINISHINGS_LAMINATE, /* Apply protective (solid) material */ - IPP_FINISHINGS_STAPLE_TOP_LEFT = 20, /* Staple top left corner */ - IPP_FINISHINGS_STAPLE_BOTTOM_LEFT, /* Staple bottom left corner */ - IPP_FINISHINGS_STAPLE_TOP_RIGHT, /* Staple top right corner */ - IPP_FINISHINGS_STAPLE_BOTTOM_RIGHT, /* Staple bottom right corner */ - IPP_FINISHINGS_EDGE_STITCH_LEFT, /* Stitch along left side */ - IPP_FINISHINGS_EDGE_STITCH_TOP, /* Stitch along top edge */ - IPP_FINISHINGS_EDGE_STITCH_RIGHT, /* Stitch along right side */ - IPP_FINISHINGS_EDGE_STITCH_BOTTOM, /* Stitch along bottom edge */ - IPP_FINISHINGS_STAPLE_DUAL_LEFT, /* Two staples on left */ - IPP_FINISHINGS_STAPLE_DUAL_TOP, /* Two staples on top */ - IPP_FINISHINGS_STAPLE_DUAL_RIGHT, /* Two staples on right */ - IPP_FINISHINGS_STAPLE_DUAL_BOTTOM, /* Two staples on bottom */ - IPP_FINISHINGS_STAPLE_TRIPLE_LEFT, /* Three staples on left */ - IPP_FINISHINGS_STAPLE_TRIPLE_TOP, /* Three staples on top */ - IPP_FINISHINGS_STAPLE_TRIPLE_RIGHT, /* Three staples on right */ - IPP_FINISHINGS_STAPLE_TRIPLE_BOTTOM, /* Three staples on bottom */ - IPP_FINISHINGS_BIND_LEFT = 50, /* Bind on left */ - IPP_FINISHINGS_BIND_TOP, /* Bind on top */ - IPP_FINISHINGS_BIND_RIGHT, /* Bind on right */ - IPP_FINISHINGS_BIND_BOTTOM, /* Bind on bottom */ - IPP_FINISHINGS_TRIM_AFTER_PAGES = 60, /* Trim output after each page */ - IPP_FINISHINGS_TRIM_AFTER_DOCUMENTS, /* Trim output after each document */ - IPP_FINISHINGS_TRIM_AFTER_COPIES, /* Trim output after each copy */ - IPP_FINISHINGS_TRIM_AFTER_JOB, /* Trim output after job */ - IPP_FINISHINGS_PUNCH_TOP_LEFT = 70, /* Punch 1 hole top left */ - IPP_FINISHINGS_PUNCH_BOTTOM_LEFT, /* Punch 1 hole bottom left */ - IPP_FINISHINGS_PUNCH_TOP_RIGHT, /* Punch 1 hole top right */ - IPP_FINISHINGS_PUNCH_BOTTOM_RIGHT, /* Punch 1 hole bottom right */ - IPP_FINISHINGS_PUNCH_DUAL_LEFT, /* Punch 2 holes left side */ - IPP_FINISHINGS_PUNCH_DUAL_TOP, /* Punch 2 holes top edge */ - IPP_FINISHINGS_PUNCH_DUAL_RIGHT, /* Punch 2 holes right side */ - IPP_FINISHINGS_PUNCH_DUAL_BOTTOM, /* Punch 2 holes bottom edge */ - IPP_FINISHINGS_PUNCH_TRIPLE_LEFT, /* Punch 3 holes left side */ - IPP_FINISHINGS_PUNCH_TRIPLE_TOP, /* Punch 3 holes top edge */ - IPP_FINISHINGS_PUNCH_TRIPLE_RIGHT, /* Punch 3 holes right side */ - IPP_FINISHINGS_PUNCH_TRIPLE_BOTTOM, /* Punch 3 holes bottom edge */ - IPP_FINISHINGS_PUNCH_QUAD_LEFT, /* Punch 4 holes left side */ - IPP_FINISHINGS_PUNCH_QUAD_TOP, /* Punch 4 holes top edge */ - IPP_FINISHINGS_PUNCH_QUAD_RIGHT, /* Punch 4 holes right side */ - IPP_FINISHINGS_PUNCH_QUAD_BOTTOM, /* Punch 4 holes bottom edge */ - IPP_FINISHINGS_PUNCH_MULTIPLE_LEFT, /* Punch multiple holes left side */ - IPP_FINISHINGS_PUNCH_MULTIPLE_TOP, /* Punch multiple holes top edge */ - IPP_FINISHINGS_PUNCH_MULTIPLE_RIGHT, /* Punch multiple holes right side */ - IPP_FINISHINGS_PUNCH_MULTIPLE_BOTTOM, /* Punch multiple holes bottom edge */ - IPP_FINISHINGS_FOLD_ACCORDION = 90, /* Accordion-fold the paper vertically into four sections */ - IPP_FINISHINGS_FOLD_DOUBLE_GATE, /* Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically */ - IPP_FINISHINGS_FOLD_GATE, /* Fold the top and bottom quarters of the paper towards the midline */ - IPP_FINISHINGS_FOLD_HALF, /* Fold the paper in half vertically */ - IPP_FINISHINGS_FOLD_HALF_Z, /* Fold the paper in half horizontally, then Z-fold the paper vertically */ - IPP_FINISHINGS_FOLD_LEFT_GATE, /* Fold the top quarter of the paper towards the midline */ + IPP_FINISHINGS_NONE = 3, // No finishing + IPP_FINISHINGS_STAPLE, // Staple (any location/method) + IPP_FINISHINGS_PUNCH, // Punch (any location/count) + IPP_FINISHINGS_COVER, // Add cover + IPP_FINISHINGS_BIND, // Bind + IPP_FINISHINGS_SADDLE_STITCH, // Staple interior + IPP_FINISHINGS_EDGE_STITCH, // Stitch along any side + IPP_FINISHINGS_FOLD, // Fold (any type) + IPP_FINISHINGS_TRIM, // Trim (any type) + IPP_FINISHINGS_BALE, // Bale (any type) + IPP_FINISHINGS_BOOKLET_MAKER, // Fold to make booklet + IPP_FINISHINGS_JOG_OFFSET, // Offset for binding (any type) + IPP_FINISHINGS_COAT, // Apply protective liquid or powder coating + IPP_FINISHINGS_LAMINATE, // Apply protective (solid) material + IPP_FINISHINGS_STAPLE_TOP_LEFT = 20, // Staple top left corner + IPP_FINISHINGS_STAPLE_BOTTOM_LEFT, // Staple bottom left corner + IPP_FINISHINGS_STAPLE_TOP_RIGHT, // Staple top right corner + IPP_FINISHINGS_STAPLE_BOTTOM_RIGHT, // Staple bottom right corner + IPP_FINISHINGS_EDGE_STITCH_LEFT, // Stitch along left side + IPP_FINISHINGS_EDGE_STITCH_TOP, // Stitch along top edge + IPP_FINISHINGS_EDGE_STITCH_RIGHT, // Stitch along right side + IPP_FINISHINGS_EDGE_STITCH_BOTTOM, // Stitch along bottom edge + IPP_FINISHINGS_STAPLE_DUAL_LEFT, // Two staples on left + IPP_FINISHINGS_STAPLE_DUAL_TOP, // Two staples on top + IPP_FINISHINGS_STAPLE_DUAL_RIGHT, // Two staples on right + IPP_FINISHINGS_STAPLE_DUAL_BOTTOM, // Two staples on bottom + IPP_FINISHINGS_STAPLE_TRIPLE_LEFT, // Three staples on left + IPP_FINISHINGS_STAPLE_TRIPLE_TOP, // Three staples on top + IPP_FINISHINGS_STAPLE_TRIPLE_RIGHT, // Three staples on right + IPP_FINISHINGS_STAPLE_TRIPLE_BOTTOM, // Three staples on bottom + IPP_FINISHINGS_BIND_LEFT = 50, // Bind on left + IPP_FINISHINGS_BIND_TOP, // Bind on top + IPP_FINISHINGS_BIND_RIGHT, // Bind on right + IPP_FINISHINGS_BIND_BOTTOM, // Bind on bottom + IPP_FINISHINGS_TRIM_AFTER_PAGES = 60, // Trim output after each page + IPP_FINISHINGS_TRIM_AFTER_DOCUMENTS, // Trim output after each document + IPP_FINISHINGS_TRIM_AFTER_COPIES, // Trim output after each copy + IPP_FINISHINGS_TRIM_AFTER_JOB, // Trim output after job + IPP_FINISHINGS_PUNCH_TOP_LEFT = 70, // Punch 1 hole top left + IPP_FINISHINGS_PUNCH_BOTTOM_LEFT, // Punch 1 hole bottom left + IPP_FINISHINGS_PUNCH_TOP_RIGHT, // Punch 1 hole top right + IPP_FINISHINGS_PUNCH_BOTTOM_RIGHT, // Punch 1 hole bottom right + IPP_FINISHINGS_PUNCH_DUAL_LEFT, // Punch 2 holes left side + IPP_FINISHINGS_PUNCH_DUAL_TOP, // Punch 2 holes top edge + IPP_FINISHINGS_PUNCH_DUAL_RIGHT, // Punch 2 holes right side + IPP_FINISHINGS_PUNCH_DUAL_BOTTOM, // Punch 2 holes bottom edge + IPP_FINISHINGS_PUNCH_TRIPLE_LEFT, // Punch 3 holes left side + IPP_FINISHINGS_PUNCH_TRIPLE_TOP, // Punch 3 holes top edge + IPP_FINISHINGS_PUNCH_TRIPLE_RIGHT, // Punch 3 holes right side + IPP_FINISHINGS_PUNCH_TRIPLE_BOTTOM, // Punch 3 holes bottom edge + IPP_FINISHINGS_PUNCH_QUAD_LEFT, // Punch 4 holes left side + IPP_FINISHINGS_PUNCH_QUAD_TOP, // Punch 4 holes top edge + IPP_FINISHINGS_PUNCH_QUAD_RIGHT, // Punch 4 holes right side + IPP_FINISHINGS_PUNCH_QUAD_BOTTOM, // Punch 4 holes bottom edge + IPP_FINISHINGS_PUNCH_MULTIPLE_LEFT, // Punch multiple holes left side + IPP_FINISHINGS_PUNCH_MULTIPLE_TOP, // Punch multiple holes top edge + IPP_FINISHINGS_PUNCH_MULTIPLE_RIGHT, // Punch multiple holes right side + IPP_FINISHINGS_PUNCH_MULTIPLE_BOTTOM, // Punch multiple holes bottom edge + IPP_FINISHINGS_FOLD_ACCORDION = 90, // Accordion-fold the paper vertically into four sections + IPP_FINISHINGS_FOLD_DOUBLE_GATE, // Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically + IPP_FINISHINGS_FOLD_GATE, // Fold the top and bottom quarters of the paper towards the midline + IPP_FINISHINGS_FOLD_HALF, // Fold the paper in half vertically + IPP_FINISHINGS_FOLD_HALF_Z, // Fold the paper in half horizontally, then Z-fold the paper vertically + IPP_FINISHINGS_FOLD_LEFT_GATE, // Fold the top quarter of the paper towards the midline IPP_FINISHINGS_FOLD_LETTER, /* Fold the paper into three sections vertically; sometimes also known as a C fold*/ - IPP_FINISHINGS_FOLD_PARALLEL, /* Fold the paper in half vertically two times, yielding four sections */ - IPP_FINISHINGS_FOLD_POSTER, /* Fold the paper in half horizontally and vertically; sometimes also called a cross fold */ - IPP_FINISHINGS_FOLD_RIGHT_GATE, /* Fold the bottom quarter of the paper towards the midline */ - IPP_FINISHINGS_FOLD_Z, /* Fold the paper vertically into three sections, forming a Z */ - IPP_FINISHINGS_FOLD_ENGINEERING_Z, /* Fold the paper vertically into two small sections and one larger, forming an elongated Z */ + IPP_FINISHINGS_FOLD_PARALLEL, // Fold the paper in half vertically two times, yielding four sections + IPP_FINISHINGS_FOLD_POSTER, // Fold the paper in half horizontally and vertically; sometimes also called a cross fold + IPP_FINISHINGS_FOLD_RIGHT_GATE, // Fold the bottom quarter of the paper towards the midline + IPP_FINISHINGS_FOLD_Z, // Fold the paper vertically into three sections, forming a Z + IPP_FINISHINGS_FOLD_ENGINEERING_Z, // Fold the paper vertically into two small sections and one larger, forming an elongated Z - /* CUPS extensions for finishings (pre-standard versions of values above) */ + // CUPS extensions for finishings (pre-standard versions of values above) IPP_FINISHINGS_CUPS_PUNCH_TOP_LEFT = 0x40000046, - /* Punch 1 hole top left @exclude all@ */ - IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_LEFT,/* Punch 1 hole bottom left @exclude all@ */ - IPP_FINISHINGS_CUPS_PUNCH_TOP_RIGHT, /* Punch 1 hole top right @exclude all@ */ + // Punch 1 hole top left @exclude all@ + IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_LEFT,// Punch 1 hole bottom left @exclude all@ + IPP_FINISHINGS_CUPS_PUNCH_TOP_RIGHT, // Punch 1 hole top right @exclude all@ IPP_FINISHINGS_CUPS_PUNCH_BOTTOM_RIGHT, - /* Punch 1 hole bottom right @exclude all@ */ - IPP_FINISHINGS_CUPS_PUNCH_DUAL_LEFT, /* Punch 2 holes left side @exclude all@ */ - IPP_FINISHINGS_CUPS_PUNCH_DUAL_TOP, /* Punch 2 holes top edge @exclude all@ */ - IPP_FINISHINGS_CUPS_PUNCH_DUAL_RIGHT, /* Punch 2 holes right side @exclude all@ */ - IPP_FINISHINGS_CUPS_PUNCH_DUAL_BOTTOM,/* Punch 2 holes bottom edge @exclude all@ */ - IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_LEFT,/* Punch 3 holes left side @exclude all@ */ - IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_TOP, /* Punch 3 holes top edge @exclude all@ */ + // Punch 1 hole bottom right @exclude all@ + IPP_FINISHINGS_CUPS_PUNCH_DUAL_LEFT, // Punch 2 holes left side @exclude all@ + IPP_FINISHINGS_CUPS_PUNCH_DUAL_TOP, // Punch 2 holes top edge @exclude all@ + IPP_FINISHINGS_CUPS_PUNCH_DUAL_RIGHT, // Punch 2 holes right side @exclude all@ + IPP_FINISHINGS_CUPS_PUNCH_DUAL_BOTTOM,// Punch 2 holes bottom edge @exclude all@ + IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_LEFT,// Punch 3 holes left side @exclude all@ + IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_TOP, // Punch 3 holes top edge @exclude all@ IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_RIGHT, - /* Punch 3 holes right side @exclude all@ */ + // Punch 3 holes right side @exclude all@ IPP_FINISHINGS_CUPS_PUNCH_TRIPLE_BOTTOM, - /* Punch 3 holes bottom edge @exclude all@ */ - IPP_FINISHINGS_CUPS_PUNCH_QUAD_LEFT, /* Punch 4 holes left side @exclude all@ */ - IPP_FINISHINGS_CUPS_PUNCH_QUAD_TOP, /* Punch 4 holes top edge @exclude all@ */ - IPP_FINISHINGS_CUPS_PUNCH_QUAD_RIGHT, /* Punch 4 holes right side @exclude all@ */ - IPP_FINISHINGS_CUPS_PUNCH_QUAD_BOTTOM,/* Punch 4 holes bottom edge @exclude all@ */ + // Punch 3 holes bottom edge @exclude all@ + IPP_FINISHINGS_CUPS_PUNCH_QUAD_LEFT, // Punch 4 holes left side @exclude all@ + IPP_FINISHINGS_CUPS_PUNCH_QUAD_TOP, // Punch 4 holes top edge @exclude all@ + IPP_FINISHINGS_CUPS_PUNCH_QUAD_RIGHT, // Punch 4 holes right side @exclude all@ + IPP_FINISHINGS_CUPS_PUNCH_QUAD_BOTTOM,// Punch 4 holes bottom edge @exclude all@ IPP_FINISHINGS_CUPS_FOLD_ACCORDION = 0x4000005A, - /* Accordion-fold the paper vertically into four sections @exclude all@ */ - IPP_FINISHINGS_CUPS_FOLD_DOUBLE_GATE, /* Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically @exclude all@ */ - IPP_FINISHINGS_CUPS_FOLD_GATE, /* Fold the top and bottom quarters of the paper towards the midline @exclude all@ */ - IPP_FINISHINGS_CUPS_FOLD_HALF, /* Fold the paper in half vertically @exclude all@ */ - IPP_FINISHINGS_CUPS_FOLD_HALF_Z, /* Fold the paper in half horizontally, then Z-fold the paper vertically @exclude all@ */ - IPP_FINISHINGS_CUPS_FOLD_LEFT_GATE, /* Fold the top quarter of the paper towards the midline @exclude all@ */ - IPP_FINISHINGS_CUPS_FOLD_LETTER, /* Fold the paper into three sections vertically; sometimes also known as a C fold @exclude all@ */ - IPP_FINISHINGS_CUPS_FOLD_PARALLEL, /* Fold the paper in half vertically two times, yielding four sections @exclude all@ */ - IPP_FINISHINGS_CUPS_FOLD_POSTER, /* Fold the paper in half horizontally and vertically; sometimes also called a cross fold @exclude all@ */ - IPP_FINISHINGS_CUPS_FOLD_RIGHT_GATE, /* Fold the bottom quarter of the paper towards the midline @exclude all@ */ - IPP_FINISHINGS_CUPS_FOLD_Z /* Fold the paper vertically into three sections, forming a Z @exclude all@ */ + // Accordion-fold the paper vertically into four sections @exclude all@ + IPP_FINISHINGS_CUPS_FOLD_DOUBLE_GATE, // Fold the top and bottom quarters of the paper towards the midline, then fold in half vertically @exclude all@ + IPP_FINISHINGS_CUPS_FOLD_GATE, // Fold the top and bottom quarters of the paper towards the midline @exclude all@ + IPP_FINISHINGS_CUPS_FOLD_HALF, // Fold the paper in half vertically @exclude all@ + IPP_FINISHINGS_CUPS_FOLD_HALF_Z, // Fold the paper in half horizontally, then Z-fold the paper vertically @exclude all@ + IPP_FINISHINGS_CUPS_FOLD_LEFT_GATE, // Fold the top quarter of the paper towards the midline @exclude all@ + IPP_FINISHINGS_CUPS_FOLD_LETTER, // Fold the paper into three sections vertically; sometimes also known as a C fold @exclude all@ + IPP_FINISHINGS_CUPS_FOLD_PARALLEL, // Fold the paper in half vertically two times, yielding four sections @exclude all@ + IPP_FINISHINGS_CUPS_FOLD_POSTER, // Fold the paper in half horizontally and vertically; sometimes also called a cross fold @exclude all@ + IPP_FINISHINGS_CUPS_FOLD_RIGHT_GATE, // Fold the bottom quarter of the paper towards the midline @exclude all@ + IPP_FINISHINGS_CUPS_FOLD_Z // Fold the paper vertically into three sections, forming a Z @exclude all@ } ipp_finishings_t; -# ifndef _CUPS_NO_DEPRECATED -# define IPP_FINISHINGS_CUPS_FOLD_ACCORDIAN IPP_FINISHINGS_CUPS_FOLD_ACCORDION -# define IPP_FINISHINGS_FOLD_ACCORDIAN IPP_FINISHINGS_FOLD_ACCORDION -# define IPP_FINISHINGS_JOB_OFFSET IPP_FINISHINGS_JOG_OFFSET - /* Long-time misspellings... */ -typedef enum ipp_finishings_e ipp_finish_t; -# endif /* !_CUPS_NO_DEPRECATED */ - -typedef enum ipp_jcollate_e /**** Job collation types @deprecated@ @exclude all@ ****/ + +typedef enum ipp_jcollate_e // Job collation types @deprecated@ @exclude all@ { IPP_JCOLLATE_UNCOLLATED_SHEETS = 3, IPP_JCOLLATE_COLLATED_DOCUMENTS, IPP_JCOLLATE_UNCOLLATED_DOCUMENTS - -# ifndef _CUPS_NO_DEPRECATED -# define IPP_JOB_UNCOLLATED_SHEETS IPP_JCOLLATE_UNCOLLATED_SHEETS -# define IPP_JOB_COLLATED_DOCUMENTS IPP_JCOLLATE_COLLATED_DOCUMENTS -# define IPP_JOB_UNCOLLATED_DOCUMENTS IPP_JCOLLATE_UNCOLLATED_DOCUMENTS -# endif /* !_CUPS_NO_DEPRECATED */ } ipp_jcollate_t; -typedef enum ipp_jstate_e /**** Job states ****/ +typedef enum ipp_jstate_e // Job states { - IPP_JSTATE_PENDING = 3, /* Job is waiting to be printed */ - IPP_JSTATE_HELD, /* Job is held for printing */ - IPP_JSTATE_PROCESSING, /* Job is currently printing */ - IPP_JSTATE_STOPPED, /* Job has been stopped */ - IPP_JSTATE_CANCELED, /* Job has been canceled */ - IPP_JSTATE_ABORTED, /* Job has aborted due to error */ - IPP_JSTATE_COMPLETED /* Job has completed successfully */ - -# ifndef _CUPS_NO_DEPRECATED -# define IPP_JOB_PENDING IPP_JSTATE_PENDING -# define IPP_JOB_HELD IPP_JSTATE_HELD -# define IPP_JOB_PROCESSING IPP_JSTATE_PROCESSING -# define IPP_JOB_STOPPED IPP_JSTATE_STOPPED -# define IPP_JOB_CANCELED IPP_JSTATE_CANCELED -# define IPP_JOB_ABORTED IPP_JSTATE_ABORTED -# define IPP_JOB_COMPLETED IPP_JSTATE_COMPLETED - /* Legacy name for canceled state */ -# define IPP_JOB_CANCELLED IPP_JSTATE_CANCELED -# endif /* !_CUPS_NO_DEPRECATED */ + IPP_JSTATE_PENDING = 3, // Job is waiting to be printed + IPP_JSTATE_HELD, // Job is held for printing + IPP_JSTATE_PROCESSING, // Job is currently printing + IPP_JSTATE_STOPPED, // Job has been stopped + IPP_JSTATE_CANCELED, // Job has been canceled + IPP_JSTATE_ABORTED, // Job has aborted due to error + IPP_JSTATE_COMPLETED // Job has completed successfully } ipp_jstate_t; -typedef enum ipp_op_e /**** IPP operations ****/ +typedef enum ipp_op_e // IPP operations { - IPP_OP_CUPS_INVALID = -1, /* Invalid operation name for @link ippOpValue@ */ - IPP_OP_CUPS_NONE = 0, /* No operation @private@ */ - IPP_OP_PRINT_JOB = 0x0002, /* Print-Job: Print a single file */ - IPP_OP_PRINT_URI, /* Print-URI: Print a single URL @exclude all@ */ - IPP_OP_VALIDATE_JOB, /* Validate-Job: Validate job values prior to submission */ - IPP_OP_CREATE_JOB, /* Create-Job: Create an empty print job */ - IPP_OP_SEND_DOCUMENT, /* Send-Document: Add a file to a job */ - IPP_OP_SEND_URI, /* Send-URI: Add a URL to a job @exclude all@ */ - IPP_OP_CANCEL_JOB, /* Cancel-Job: Cancel a job */ - IPP_OP_GET_JOB_ATTRIBUTES, /* Get-Job-Attribute: Get information about a job */ - IPP_OP_GET_JOBS, /* Get-Jobs: Get a list of jobs */ - IPP_OP_GET_PRINTER_ATTRIBUTES, /* Get-Printer-Attributes: Get information about a printer */ - IPP_OP_HOLD_JOB, /* Hold-Job: Hold a job for printing */ - IPP_OP_RELEASE_JOB, /* Release-Job: Release a job for printing */ - IPP_OP_RESTART_JOB, /* Restart-Job: Reprint a job @deprecated@ */ - IPP_OP_PAUSE_PRINTER = 0x0010, /* Pause-Printer: Stop a printer */ - IPP_OP_RESUME_PRINTER, /* Resume-Printer: Start a printer */ - IPP_OP_PURGE_JOBS, /* Purge-Jobs: Delete all jobs @deprecated@ @exclude all@ */ - IPP_OP_SET_PRINTER_ATTRIBUTES, /* Set-Printer-Attributes: Set printer values */ - IPP_OP_SET_JOB_ATTRIBUTES, /* Set-Job-Attributes: Set job values */ - IPP_OP_GET_PRINTER_SUPPORTED_VALUES, /* Get-Printer-Supported-Values: Get supported values */ - IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS, /* Create-Printer-Subscriptions: Create one or more printer subscriptions @since CUPS 1.2/macOS 10.5@ */ - IPP_OP_CREATE_JOB_SUBSCRIPTIONS, /* Create-Job-Subscriptions: Create one of more job subscriptions @since CUPS 1.2/macOS 10.5@ */ - IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES, /* Get-Subscription-Attributes: Get subscription information @since CUPS 1.2/macOS 10.5@ */ - IPP_OP_GET_SUBSCRIPTIONS, /* Get-Subscriptions: Get list of subscriptions @since CUPS 1.2/macOS 10.5@ */ - IPP_OP_RENEW_SUBSCRIPTION, /* Renew-Subscription: Renew a printer subscription @since CUPS 1.2/macOS 10.5@ */ - IPP_OP_CANCEL_SUBSCRIPTION, /* Cancel-Subscription: Cancel a subscription @since CUPS 1.2/macOS 10.5@ */ - IPP_OP_GET_NOTIFICATIONS, /* Get-Notifications: Get notification events @since CUPS 1.2/macOS 10.5@ */ - IPP_OP_SEND_NOTIFICATIONS, /* Send-Notifications: Send notification events @private@ */ - IPP_OP_GET_RESOURCE_ATTRIBUTES, /* Get-Resource-Attributes: Get resource information @private@ */ - IPP_OP_GET_RESOURCE_DATA, /* Get-Resource-Data: Get resource data @private@ @deprecated@ */ - IPP_OP_GET_RESOURCES, /* Get-Resources: Get list of resources @private@ */ - IPP_OP_GET_PRINT_SUPPORT_FILES, /* Get-Printer-Support-Files: Get printer support files @private@ */ - IPP_OP_ENABLE_PRINTER, /* Enable-Printer: Accept new jobs for a printer */ - IPP_OP_DISABLE_PRINTER, /* Disable-Printer: Reject new jobs for a printer */ + IPP_OP_CUPS_INVALID = -1, // Invalid operation name for @link ippOpValue@ + IPP_OP_CUPS_NONE = 0, // No operation @private@ + IPP_OP_PRINT_JOB = 0x0002, // Print-Job: Print a single file + IPP_OP_PRINT_URI, // Print-URI: Print a single URL @exclude all@ + IPP_OP_VALIDATE_JOB, // Validate-Job: Validate job values prior to submission + IPP_OP_CREATE_JOB, // Create-Job: Create an empty print job + IPP_OP_SEND_DOCUMENT, // Send-Document: Add a file to a job + IPP_OP_SEND_URI, // Send-URI: Add a URL to a job @exclude all@ + IPP_OP_CANCEL_JOB, // Cancel-Job: Cancel a job + IPP_OP_GET_JOB_ATTRIBUTES, // Get-Job-Attribute: Get information about a job + IPP_OP_GET_JOBS, // Get-Jobs: Get a list of jobs + IPP_OP_GET_PRINTER_ATTRIBUTES, // Get-Printer-Attributes: Get information about a printer + IPP_OP_HOLD_JOB, // Hold-Job: Hold a job for printing + IPP_OP_RELEASE_JOB, // Release-Job: Release a job for printing + IPP_OP_RESTART_JOB, // Restart-Job: Reprint a job @deprecated@ + IPP_OP_PAUSE_PRINTER = 0x0010, // Pause-Printer: Stop a printer + IPP_OP_RESUME_PRINTER, // Resume-Printer: Start a printer + IPP_OP_PURGE_JOBS, // Purge-Jobs: Delete all jobs @deprecated@ @exclude all@ + IPP_OP_SET_PRINTER_ATTRIBUTES, // Set-Printer-Attributes: Set printer values + IPP_OP_SET_JOB_ATTRIBUTES, // Set-Job-Attributes: Set job values + IPP_OP_GET_PRINTER_SUPPORTED_VALUES, // Get-Printer-Supported-Values: Get supported values + IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS, // Create-Printer-Subscriptions: Create one or more printer subscriptions @since CUPS 1.2/macOS 10.5@ + IPP_OP_CREATE_JOB_SUBSCRIPTIONS, // Create-Job-Subscriptions: Create one of more job subscriptions @since CUPS 1.2/macOS 10.5@ + IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES, // Get-Subscription-Attributes: Get subscription information @since CUPS 1.2/macOS 10.5@ + IPP_OP_GET_SUBSCRIPTIONS, // Get-Subscriptions: Get list of subscriptions @since CUPS 1.2/macOS 10.5@ + IPP_OP_RENEW_SUBSCRIPTION, // Renew-Subscription: Renew a printer subscription @since CUPS 1.2/macOS 10.5@ + IPP_OP_CANCEL_SUBSCRIPTION, // Cancel-Subscription: Cancel a subscription @since CUPS 1.2/macOS 10.5@ + IPP_OP_GET_NOTIFICATIONS, // Get-Notifications: Get notification events @since CUPS 1.2/macOS 10.5@ + IPP_OP_SEND_NOTIFICATIONS, // Send-Notifications: Send notification events @private@ + IPP_OP_GET_RESOURCE_ATTRIBUTES, // Get-Resource-Attributes: Get resource information @private@ + IPP_OP_GET_RESOURCE_DATA, // Get-Resource-Data: Get resource data @private@ @deprecated@ + IPP_OP_GET_RESOURCES, // Get-Resources: Get list of resources @private@ + IPP_OP_GET_PRINT_SUPPORT_FILES, // Get-Printer-Support-Files: Get printer support files @private@ + IPP_OP_ENABLE_PRINTER, // Enable-Printer: Accept new jobs for a printer + IPP_OP_DISABLE_PRINTER, // Disable-Printer: Reject new jobs for a printer IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB, - /* Pause-Printer-After-Current-Job: Stop printer after the current job */ - IPP_OP_HOLD_NEW_JOBS, /* Hold-New-Jobs: Hold new jobs */ - IPP_OP_RELEASE_HELD_NEW_JOBS, /* Release-Held-New-Jobs: Release new jobs that were previously held */ - IPP_OP_DEACTIVATE_PRINTER, /* Deactivate-Printer: Stop a printer and do not accept jobs @deprecated@ @exclude all@ */ - IPP_OP_ACTIVATE_PRINTER, /* Activate-Printer: Start a printer and accept jobs @deprecated@ @exclude all@ */ - IPP_OP_RESTART_PRINTER, /* Restart-Printer: Restart a printer @exclude all@ */ - IPP_OP_SHUTDOWN_PRINTER, /* Shutdown-Printer: Turn a printer off @exclude all@ */ - IPP_OP_STARTUP_PRINTER, /* Startup-Printer: Turn a printer on @exclude all@ */ + // Pause-Printer-After-Current-Job: Stop printer after the current job + IPP_OP_HOLD_NEW_JOBS, // Hold-New-Jobs: Hold new jobs + IPP_OP_RELEASE_HELD_NEW_JOBS, // Release-Held-New-Jobs: Release new jobs that were previously held + IPP_OP_DEACTIVATE_PRINTER, // Deactivate-Printer: Stop a printer and do not accept jobs @deprecated@ @exclude all@ + IPP_OP_ACTIVATE_PRINTER, // Activate-Printer: Start a printer and accept jobs @deprecated@ @exclude all@ + IPP_OP_RESTART_PRINTER, // Restart-Printer: Restart a printer @exclude all@ + IPP_OP_SHUTDOWN_PRINTER, // Shutdown-Printer: Turn a printer off @exclude all@ + IPP_OP_STARTUP_PRINTER, // Startup-Printer: Turn a printer on @exclude all@ IPP_OP_REPROCESS_JOB, /* Reprocess-Job: Reprint a job @deprecated@ @exclude all@*/ - IPP_OP_CANCEL_CURRENT_JOB, /* Cancel-Current-Job: Cancel the current job */ - IPP_OP_SUSPEND_CURRENT_JOB, /* Suspend-Current-Job: Suspend the current job */ - IPP_OP_RESUME_JOB, /* Resume-Job: Resume the current job */ - IPP_OP_PROMOTE_JOB, /* Promote-Job: Promote a job to print sooner */ - IPP_OP_SCHEDULE_JOB_AFTER, /* Schedule-Job-After: Schedule a job to print after another */ - IPP_OP_CANCEL_DOCUMENT = 0x0033, /* Cancel-Document: Cancel a document @exclude all@ */ - IPP_OP_GET_DOCUMENT_ATTRIBUTES, /* Get-Document-Attributes: Get document information @exclude all@ */ - IPP_OP_GET_DOCUMENTS, /* Get-Documents: Get a list of documents in a job @exclude all@ */ - IPP_OP_DELETE_DOCUMENT, /* Delete-Document: Delete a document @deprecated@ @exclude all@ */ - IPP_OP_SET_DOCUMENT_ATTRIBUTES, /* Set-Document-Attributes: Set document values @exclude all@ */ - IPP_OP_CANCEL_JOBS, /* Cancel-Jobs: Cancel all jobs (administrative) */ - IPP_OP_CANCEL_MY_JOBS, /* Cancel-My-Jobs: Cancel a user's jobs */ - IPP_OP_RESUBMIT_JOB, /* Resubmit-Job: Copy and reprint a job @exclude all@ */ - IPP_OP_CLOSE_JOB, /* Close-Job: Close a job and start printing */ - IPP_OP_IDENTIFY_PRINTER, /* Identify-Printer: Make the printer beep, flash, or display a message for identification */ - IPP_OP_VALIDATE_DOCUMENT, /* Validate-Document: Validate document values prior to submission @exclude all@ */ - IPP_OP_ADD_DOCUMENT_IMAGES, /* Add-Document-Images: Add image(s) from the specified scanner source @exclude all@ */ - IPP_OP_ACKNOWLEDGE_DOCUMENT, /* Acknowledge-Document: Acknowledge processing of a document @exclude all@ */ - IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER, /* Acknowledge-Identify-Printer: Acknowledge action on an Identify-Printer request @exclude all@ */ - IPP_OP_ACKNOWLEDGE_JOB, /* Acknowledge-Job: Acknowledge processing of a job @exclude all@ */ - IPP_OP_FETCH_DOCUMENT, /* Fetch-Document: Fetch a document for processing @exclude all@ */ - IPP_OP_FETCH_JOB, /* Fetch-Job: Fetch a job for processing @exclude all@ */ - IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES, /* Get-Output-Device-Attributes: Get printer information for a specific output device @exclude all@ */ - IPP_OP_UPDATE_ACTIVE_JOBS, /* Update-Active-Jobs: Update the list of active jobs that a proxy has processed @exclude all@ */ - IPP_OP_DEREGISTER_OUTPUT_DEVICE, /* Deregister-Output-Device: Remove an output device @exclude all@ */ - IPP_OP_UPDATE_DOCUMENT_STATUS, /* Update-Document-Status: Update document values @exclude all@ */ - IPP_OP_UPDATE_JOB_STATUS, /* Update-Job-Status: Update job values @exclude all@ */ + IPP_OP_CANCEL_CURRENT_JOB, // Cancel-Current-Job: Cancel the current job + IPP_OP_SUSPEND_CURRENT_JOB, // Suspend-Current-Job: Suspend the current job + IPP_OP_RESUME_JOB, // Resume-Job: Resume the current job + IPP_OP_PROMOTE_JOB, // Promote-Job: Promote a job to print sooner + IPP_OP_SCHEDULE_JOB_AFTER, // Schedule-Job-After: Schedule a job to print after another + IPP_OP_CANCEL_DOCUMENT = 0x0033, // Cancel-Document: Cancel a document @exclude all@ + IPP_OP_GET_DOCUMENT_ATTRIBUTES, // Get-Document-Attributes: Get document information @exclude all@ + IPP_OP_GET_DOCUMENTS, // Get-Documents: Get a list of documents in a job @exclude all@ + IPP_OP_DELETE_DOCUMENT, // Delete-Document: Delete a document @deprecated@ @exclude all@ + IPP_OP_SET_DOCUMENT_ATTRIBUTES, // Set-Document-Attributes: Set document values @exclude all@ + IPP_OP_CANCEL_JOBS, // Cancel-Jobs: Cancel all jobs (administrative) + IPP_OP_CANCEL_MY_JOBS, // Cancel-My-Jobs: Cancel a user's jobs + IPP_OP_RESUBMIT_JOB, // Resubmit-Job: Copy and reprint a job @exclude all@ + IPP_OP_CLOSE_JOB, // Close-Job: Close a job and start printing + IPP_OP_IDENTIFY_PRINTER, // Identify-Printer: Make the printer beep, flash, or display a message for identification + IPP_OP_VALIDATE_DOCUMENT, // Validate-Document: Validate document values prior to submission @exclude all@ + IPP_OP_ADD_DOCUMENT_IMAGES, // Add-Document-Images: Add image(s) from the specified scanner source @exclude all@ + IPP_OP_ACKNOWLEDGE_DOCUMENT, // Acknowledge-Document: Acknowledge processing of a document @exclude all@ + IPP_OP_ACKNOWLEDGE_IDENTIFY_PRINTER, // Acknowledge-Identify-Printer: Acknowledge action on an Identify-Printer request @exclude all@ + IPP_OP_ACKNOWLEDGE_JOB, // Acknowledge-Job: Acknowledge processing of a job @exclude all@ + IPP_OP_FETCH_DOCUMENT, // Fetch-Document: Fetch a document for processing @exclude all@ + IPP_OP_FETCH_JOB, // Fetch-Job: Fetch a job for processing @exclude all@ + IPP_OP_GET_OUTPUT_DEVICE_ATTRIBUTES, // Get-Output-Device-Attributes: Get printer information for a specific output device @exclude all@ + IPP_OP_UPDATE_ACTIVE_JOBS, // Update-Active-Jobs: Update the list of active jobs that a proxy has processed @exclude all@ + IPP_OP_DEREGISTER_OUTPUT_DEVICE, // Deregister-Output-Device: Remove an output device @exclude all@ + IPP_OP_UPDATE_DOCUMENT_STATUS, // Update-Document-Status: Update document values @exclude all@ + IPP_OP_UPDATE_JOB_STATUS, // Update-Job-Status: Update job values @exclude all@ IPP_OP_UPDATE_OUTPUT_DEVICE_ATTRIBUTES, - /* Update-Output-Device-Attributes: Update output device values @exclude all@ */ - IPP_OP_GET_NEXT_DOCUMENT_DATA, /* Get-Next-Document-Data: Scan more document data @exclude all@ */ - IPP_OP_ALLOCATE_PRINTER_RESOURCES, /* Allocate-Printer-Resources: Use resources for a printer. */ - IPP_OP_CREATE_PRINTER, /* Create-Printer: Create a new service. */ - IPP_OP_DEALLOCATE_PRINTER_RESOURCES, /* Deallocate-Printer-Resources: Stop using resources for a printer. */ - IPP_OP_DELETE_PRINTER, /* Delete-Printer: Delete an existing service. */ - IPP_OP_GET_PRINTERS, /* Get-Printers: Get a list of services. */ - IPP_OP_SHUTDOWN_ONE_PRINTER, /* Shutdown-One-Printer: Shutdown a service. */ - IPP_OP_STARTUP_ONE_PRINTER, /* Startup-One-Printer: Start a service. */ - IPP_OP_CANCEL_RESOURCE, /* Cancel-Resource: Uninstall a resource. */ - IPP_OP_CREATE_RESOURCE, /* Create-Resource: Create a new (empty) resource. */ - IPP_OP_INSTALL_RESOURCE, /* Install-Resource: Install a resource. */ - IPP_OP_SEND_RESOURCE_DATA, /* Send-Resource-Data: Upload the data for a resource. */ - IPP_OP_SET_RESOURCE_ATTRIBUTES, /* Set-Resource-Attributes: Set resource object attributes. */ - IPP_OP_CREATE_RESOURCE_SUBSCRIPTIONS, /* Create-Resource-Subscriptions: Create event subscriptions for a resource. */ - IPP_OP_CREATE_SYSTEM_SUBSCRIPTIONS, /* Create-System-Subscriptions: Create event subscriptions for a system. */ - IPP_OP_DISABLE_ALL_PRINTERS, /* Disable-All-Printers: Stop accepting new jobs on all services. */ - IPP_OP_ENABLE_ALL_PRINTERS, /* Enable-All-Printers: Start accepting new jobs on all services. */ - IPP_OP_GET_SYSTEM_ATTRIBUTES, /* Get-System-Attributes: Get system object attributes. */ - IPP_OP_GET_SYSTEM_SUPPORTED_VALUES, /* Get-System-Supported-Values: Get supported values for system object attributes. */ - IPP_OP_PAUSE_ALL_PRINTERS, /* Pause-All-Printers: Stop all services immediately. */ + // Update-Output-Device-Attributes: Update output device values @exclude all@ + IPP_OP_GET_NEXT_DOCUMENT_DATA, // Get-Next-Document-Data: Scan more document data @exclude all@ + IPP_OP_ALLOCATE_PRINTER_RESOURCES, // Allocate-Printer-Resources: Use resources for a printer. + IPP_OP_CREATE_PRINTER, // Create-Printer: Create a new service. + IPP_OP_DEALLOCATE_PRINTER_RESOURCES, // Deallocate-Printer-Resources: Stop using resources for a printer. + IPP_OP_DELETE_PRINTER, // Delete-Printer: Delete an existing service. + IPP_OP_GET_PRINTERS, // Get-Printers: Get a list of services. + IPP_OP_SHUTDOWN_ONE_PRINTER, // Shutdown-One-Printer: Shutdown a service. + IPP_OP_STARTUP_ONE_PRINTER, // Startup-One-Printer: Start a service. + IPP_OP_CANCEL_RESOURCE, // Cancel-Resource: Uninstall a resource. + IPP_OP_CREATE_RESOURCE, // Create-Resource: Create a new (empty) resource. + IPP_OP_INSTALL_RESOURCE, // Install-Resource: Install a resource. + IPP_OP_SEND_RESOURCE_DATA, // Send-Resource-Data: Upload the data for a resource. + IPP_OP_SET_RESOURCE_ATTRIBUTES, // Set-Resource-Attributes: Set resource object attributes. + IPP_OP_CREATE_RESOURCE_SUBSCRIPTIONS, // Create-Resource-Subscriptions: Create event subscriptions for a resource. + IPP_OP_CREATE_SYSTEM_SUBSCRIPTIONS, // Create-System-Subscriptions: Create event subscriptions for a system. + IPP_OP_DISABLE_ALL_PRINTERS, // Disable-All-Printers: Stop accepting new jobs on all services. + IPP_OP_ENABLE_ALL_PRINTERS, // Enable-All-Printers: Start accepting new jobs on all services. + IPP_OP_GET_SYSTEM_ATTRIBUTES, // Get-System-Attributes: Get system object attributes. + IPP_OP_GET_SYSTEM_SUPPORTED_VALUES, // Get-System-Supported-Values: Get supported values for system object attributes. + IPP_OP_PAUSE_ALL_PRINTERS, // Pause-All-Printers: Stop all services immediately. IPP_OP_PAUSE_ALL_PRINTERS_AFTER_CURRENT_JOB, - /* Pause-All-Printers-After-Current-Job: Stop all services after processing the current jobs. */ - IPP_OP_REGISTER_OUTPUT_DEVICE, /* Register-Output-Device: Register a remote service. */ - IPP_OP_RESTART_SYSTEM, /* Restart-System: Restart all services. */ - IPP_OP_RESUME_ALL_PRINTERS, /* Resume-All-Printers: Start job processing on all services. */ - IPP_OP_SET_SYSTEM_ATTRIBUTES, /* Set-System-Attributes: Set system object attributes. */ - IPP_OP_SHUTDOWN_ALL_PRINTERS, /* Shutdown-All-Printers: Shutdown all services. */ - IPP_OP_STARTUP_ALL_PRINTERS, /* Startup-All-Printers: Startup all services. */ - - IPP_OP_PRIVATE = 0x4000, /* Reserved @private@ */ - IPP_OP_CUPS_GET_DEFAULT, /* CUPS-Get-Default: Get the default printer */ - IPP_OP_CUPS_GET_PRINTERS, /* CUPS-Get-Printers: Get a list of printers and/or classes */ - IPP_OP_CUPS_ADD_MODIFY_PRINTER, /* CUPS-Add-Modify-Printer: Add or modify a printer */ - IPP_OP_CUPS_DELETE_PRINTER, /* CUPS-Delete-Printer: Delete a printer */ - IPP_OP_CUPS_GET_CLASSES, /* CUPS-Get-Classes: Get a list of classes @deprecated@ @exclude all@ */ - IPP_OP_CUPS_ADD_MODIFY_CLASS, /* CUPS-Add-Modify-Class: Add or modify a class */ - IPP_OP_CUPS_DELETE_CLASS, /* CUPS-Delete-Class: Delete a class */ - IPP_OP_CUPS_ACCEPT_JOBS, /* CUPS-Accept-Jobs: Accept new jobs on a printer @exclude all@ */ - IPP_OP_CUPS_REJECT_JOBS, /* CUPS-Reject-Jobs: Reject new jobs on a printer @exclude all@ */ - IPP_OP_CUPS_SET_DEFAULT, /* CUPS-Set-Default: Set the default printer */ - IPP_OP_CUPS_GET_DEVICES, /* CUPS-Get-Devices: Get a list of supported devices @deprecated@ */ - IPP_OP_CUPS_GET_PPDS, /* CUPS-Get-PPDs: Get a list of supported drivers @deprecated@ */ - IPP_OP_CUPS_MOVE_JOB, /* CUPS-Move-Job: Move a job to a different printer */ - IPP_OP_CUPS_AUTHENTICATE_JOB, /* CUPS-Authenticate-Job: Authenticate a job @since CUPS 1.2/macOS 10.5@ */ - IPP_OP_CUPS_GET_PPD, /* CUPS-Get-PPD: Get a PPD file @deprecated@ */ - IPP_OP_CUPS_GET_DOCUMENT = 0x4027, /* CUPS-Get-Document: Get a document file @since CUPS 1.4/macOS 10.6@ */ - IPP_OP_CUPS_CREATE_LOCAL_PRINTER /* CUPS-Create-Local-Printer: Create a local (temporary) printer @since CUPS 2.2@ */ - -# ifndef _CUPS_NO_DEPRECATED -# define IPP_PRINT_JOB IPP_OP_PRINT_JOB -# define IPP_PRINT_URI IPP_OP_PRINT_URI -# define IPP_VALIDATE_JOB IPP_OP_VALIDATE_JOB -# define IPP_CREATE_JOB IPP_OP_CREATE_JOB -# define IPP_SEND_DOCUMENT IPP_OP_SEND_DOCUMENT -# define IPP_SEND_URI IPP_OP_SEND_URI -# define IPP_CANCEL_JOB IPP_OP_CANCEL_JOB -# define IPP_GET_JOB_ATTRIBUTES IPP_OP_GET_JOB_ATTRIBUTES -# define IPP_GET_JOBS IPP_OP_GET_JOBS -# define IPP_GET_PRINTER_ATTRIBUTES IPP_OP_GET_PRINTER_ATTRIBUTES -# define IPP_HOLD_JOB IPP_OP_HOLD_JOB -# define IPP_RELEASE_JOB IPP_OP_RELEASE_JOB -# define IPP_RESTART_JOB IPP_OP_RESTART_JOB -# define IPP_PAUSE_PRINTER IPP_OP_PAUSE_PRINTER -# define IPP_RESUME_PRINTER IPP_OP_RESUME_PRINTER -# define IPP_PURGE_JOBS IPP_OP_PURGE_JOBS -# define IPP_SET_PRINTER_ATTRIBUTES IPP_OP_SET_PRINTER_ATTRIBUTES -# define IPP_SET_JOB_ATTRIBUTES IPP_OP_SET_JOB_ATTRIBUTES -# define IPP_GET_PRINTER_SUPPORTED_VALUES IPP_OP_GET_PRINTER_SUPPORTED_VALUES -# define IPP_CREATE_PRINTER_SUBSCRIPTION IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS -# define IPP_CREATE_JOB_SUBSCRIPTION IPP_OP_CREATE_JOB_SUBSCRIPTIONS -# define IPP_OP_CREATE_PRINTER_SUBSCRIPTION IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS -# define IPP_OP_CREATE_JOB_SUBSCRIPTION IPP_OP_CREATE_JOB_SUBSCRIPTIONS -# define IPP_GET_SUBSCRIPTION_ATTRIBUTES IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES -# define IPP_GET_SUBSCRIPTIONS IPP_OP_GET_SUBSCRIPTIONS -# define IPP_RENEW_SUBSCRIPTION IPP_OP_RENEW_SUBSCRIPTION -# define IPP_CANCEL_SUBSCRIPTION IPP_OP_CANCEL_SUBSCRIPTION -# define IPP_GET_NOTIFICATIONS IPP_OP_GET_NOTIFICATIONS -# define IPP_SEND_NOTIFICATIONS IPP_OP_SEND_NOTIFICATIONS -# define IPP_GET_RESOURCE_ATTRIBUTES IPP_OP_GET_RESOURCE_ATTRIBUTES -# define IPP_GET_RESOURCE_DATA IPP_OP_GET_RESOURCE_DATA -# define IPP_GET_RESOURCES IPP_OP_GET_RESOURCES -# define IPP_GET_PRINT_SUPPORT_FILES IPP_OP_GET_PRINT_SUPPORT_FILES -# define IPP_ENABLE_PRINTER IPP_OP_ENABLE_PRINTER -# define IPP_DISABLE_PRINTER IPP_OP_DISABLE_PRINTER -# define IPP_PAUSE_PRINTER_AFTER_CURRENT_JOB IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB -# define IPP_HOLD_NEW_JOBS IPP_OP_HOLD_NEW_JOBS -# define IPP_RELEASE_HELD_NEW_JOBS IPP_OP_RELEASE_HELD_NEW_JOBS -# define IPP_DEACTIVATE_PRINTER IPP_OP_DEACTIVATE_PRINTER -# define IPP_ACTIVATE_PRINTER IPP_OP_ACTIVATE_PRINTER -# define IPP_RESTART_PRINTER IPP_OP_RESTART_PRINTER -# define IPP_SHUTDOWN_PRINTER IPP_OP_SHUTDOWN_PRINTER -# define IPP_STARTUP_PRINTER IPP_OP_STARTUP_PRINTER -# define IPP_REPROCESS_JOB IPP_OP_REPROCESS_JOB -# define IPP_CANCEL_CURRENT_JOB IPP_OP_CANCEL_CURRENT_JOB -# define IPP_SUSPEND_CURRENT_JOB IPP_OP_SUSPEND_CURRENT_JOB -# define IPP_RESUME_JOB IPP_OP_RESUME_JOB -# define IPP_PROMOTE_JOB IPP_OP_PROMOTE_JOB -# define IPP_SCHEDULE_JOB_AFTER IPP_OP_SCHEDULE_JOB_AFTER -# define IPP_CANCEL_DOCUMENT IPP_OP_CANCEL_DOCUMENT -# define IPP_GET_DOCUMENT_ATTRIBUTES IPP_OP_GET_DOCUMENT_ATTRIBUTES -# define IPP_GET_DOCUMENTS IPP_OP_GET_DOCUMENTS -# define IPP_DELETE_DOCUMENT IPP_OP_DELETE_DOCUMENT -# define IPP_SET_DOCUMENT_ATTRIBUTES IPP_OP_SET_DOCUMENT_ATTRIBUTES -# define IPP_CANCEL_JOBS IPP_OP_CANCEL_JOBS -# define IPP_CANCEL_MY_JOBS IPP_OP_CANCEL_MY_JOBS -# define IPP_RESUBMIT_JOB IPP_OP_RESUBMIT_JOB -# define IPP_CLOSE_JOB IPP_OP_CLOSE_JOB -# define IPP_IDENTIFY_PRINTER IPP_OP_IDENTIFY_PRINTER -# define IPP_VALIDATE_DOCUMENT IPP_OP_VALIDATE_DOCUMENT -# define IPP_OP_SEND_HARDCOPY_DOCUMENT IPP_OP_ADD_DOCUMENT_IMAGES -# define IPP_PRIVATE IPP_OP_PRIVATE -# define CUPS_GET_DEFAULT IPP_OP_CUPS_GET_DEFAULT -# define CUPS_GET_PRINTERS IPP_OP_CUPS_GET_PRINTERS -# define CUPS_ADD_MODIFY_PRINTER IPP_OP_CUPS_ADD_MODIFY_PRINTER -# define CUPS_DELETE_PRINTER IPP_OP_CUPS_DELETE_PRINTER -# define CUPS_GET_CLASSES IPP_OP_CUPS_GET_CLASSES -# define CUPS_ADD_MODIFY_CLASS IPP_OP_CUPS_ADD_MODIFY_CLASS -# define CUPS_DELETE_CLASS IPP_OP_CUPS_DELETE_CLASS -# define CUPS_ACCEPT_JOBS IPP_OP_CUPS_ACCEPT_JOBS -# define CUPS_REJECT_JOBS IPP_OP_CUPS_REJECT_JOBS -# define CUPS_SET_DEFAULT IPP_OP_CUPS_SET_DEFAULT -# define CUPS_GET_DEVICES IPP_OP_CUPS_GET_DEVICES -# define CUPS_GET_PPDS IPP_OP_CUPS_GET_PPDS -# define CUPS_MOVE_JOB IPP_OP_CUPS_MOVE_JOB -# define CUPS_AUTHENTICATE_JOB IPP_OP_CUPS_AUTHENTICATE_JOB -# define CUPS_GET_PPD IPP_OP_CUPS_GET_PPD -# define CUPS_GET_DOCUMENT IPP_OP_CUPS_GET_DOCUMENT - /* Legacy names */ -# define CUPS_ADD_PRINTER IPP_OP_CUPS_ADD_MODIFY_PRINTER -# define CUPS_ADD_CLASS IPP_OP_CUPS_ADD_MODIFY_CLASS -# endif /* !_CUPS_NO_DEPRECATED */ + // Pause-All-Printers-After-Current-Job: Stop all services after processing the current jobs. + IPP_OP_REGISTER_OUTPUT_DEVICE, // Register-Output-Device: Register a remote service. + IPP_OP_RESTART_SYSTEM, // Restart-System: Restart all services. + IPP_OP_RESUME_ALL_PRINTERS, // Resume-All-Printers: Start job processing on all services. + IPP_OP_SET_SYSTEM_ATTRIBUTES, // Set-System-Attributes: Set system object attributes. + IPP_OP_SHUTDOWN_ALL_PRINTERS, // Shutdown-All-Printers: Shutdown all services. + IPP_OP_STARTUP_ALL_PRINTERS, // Startup-All-Printers: Startup all services. + + IPP_OP_PRIVATE = 0x4000, // Reserved @private@ + IPP_OP_CUPS_GET_DEFAULT, // CUPS-Get-Default: Get the default printer + IPP_OP_CUPS_GET_PRINTERS, // CUPS-Get-Printers: Get a list of printers and/or classes + IPP_OP_CUPS_ADD_MODIFY_PRINTER, // CUPS-Add-Modify-Printer: Add or modify a printer + IPP_OP_CUPS_DELETE_PRINTER, // CUPS-Delete-Printer: Delete a printer + IPP_OP_CUPS_GET_CLASSES, // CUPS-Get-Classes: Get a list of classes @deprecated@ @exclude all@ + IPP_OP_CUPS_ADD_MODIFY_CLASS, // CUPS-Add-Modify-Class: Add or modify a class + IPP_OP_CUPS_DELETE_CLASS, // CUPS-Delete-Class: Delete a class + IPP_OP_CUPS_ACCEPT_JOBS, // CUPS-Accept-Jobs: Accept new jobs on a printer @exclude all@ + IPP_OP_CUPS_REJECT_JOBS, // CUPS-Reject-Jobs: Reject new jobs on a printer @exclude all@ + IPP_OP_CUPS_SET_DEFAULT, // CUPS-Set-Default: Set the default printer + IPP_OP_CUPS_GET_DEVICES, // CUPS-Get-Devices: Get a list of supported devices @deprecated@ + IPP_OP_CUPS_GET_PPDS, // CUPS-Get-PPDs: Get a list of supported drivers @deprecated@ + IPP_OP_CUPS_MOVE_JOB, // CUPS-Move-Job: Move a job to a different printer + IPP_OP_CUPS_AUTHENTICATE_JOB, // CUPS-Authenticate-Job: Authenticate a job @since CUPS 1.2/macOS 10.5@ + IPP_OP_CUPS_GET_PPD, // CUPS-Get-PPD: Get a PPD file @deprecated@ + IPP_OP_CUPS_GET_DOCUMENT = 0x4027, // CUPS-Get-Document: Get a document file @since CUPS 1.4/macOS 10.6@ + IPP_OP_CUPS_CREATE_LOCAL_PRINTER // CUPS-Create-Local-Printer: Create a local (temporary) printer @since CUPS 2.2@ } ipp_op_t; -typedef enum ipp_orient_e /**** Orientation values ****/ +typedef enum ipp_orient_e // Orientation values { - IPP_ORIENT_PORTRAIT = 3, /* No rotation */ - IPP_ORIENT_LANDSCAPE, /* 90 degrees counter-clockwise */ - IPP_ORIENT_REVERSE_LANDSCAPE, /* 90 degrees clockwise */ - IPP_ORIENT_REVERSE_PORTRAIT, /* 180 degrees */ - IPP_ORIENT_NONE /* No rotation */ - -# ifndef _CUPS_NO_DEPRECATED -# define IPP_PORTRAIT IPP_ORIENT_PORTRAIT -# define IPP_LANDSCAPE IPP_ORIENT_LANDSCAPE -# define IPP_REVERSE_LANDSCAPE IPP_ORIENT_REVERSE_LANDSCAPE -# define IPP_REVERSE_PORTRAIT IPP_ORIENT_REVERSE_PORTRAIT -# endif /* !_CUPS_NO_DEPRECATED */ + IPP_ORIENT_PORTRAIT = 3, // No rotation + IPP_ORIENT_LANDSCAPE, // 90 degrees counter-clockwise + IPP_ORIENT_REVERSE_LANDSCAPE, // 90 degrees clockwise + IPP_ORIENT_REVERSE_PORTRAIT, // 180 degrees + IPP_ORIENT_NONE // No rotation } ipp_orient_t; -typedef enum ipp_pstate_e /**** Printer state values ****/ +typedef enum ipp_pstate_e // Printer state values { - IPP_PSTATE_IDLE = 3, /* Printer is idle */ - IPP_PSTATE_PROCESSING, /* Printer is working */ - IPP_PSTATE_STOPPED /* Printer is stopped */ - -# ifndef _CUPS_NO_DEPRECATED -# define IPP_PRINTER_IDLE IPP_PSTATE_IDLE -# define IPP_PRINTER_PROCESSING IPP_PSTATE_PROCESSING -# define IPP_PRINTER_STOPPED IPP_PSTATE_STOPPED -# endif /* _CUPS_NO_DEPRECATED */ + IPP_PSTATE_IDLE = 3, // Printer is idle + IPP_PSTATE_PROCESSING, // Printer is working + IPP_PSTATE_STOPPED // Printer is stopped } ipp_pstate_t; -typedef enum ipp_quality_e /**** Print quality values ****/ +typedef enum ipp_quality_e // Print quality values { - IPP_QUALITY_DRAFT = 3, /* Draft quality */ - IPP_QUALITY_NORMAL, /* Normal quality */ - IPP_QUALITY_HIGH /* High quality */ + IPP_QUALITY_DRAFT = 3, // Draft quality + IPP_QUALITY_NORMAL, // Normal quality + IPP_QUALITY_HIGH // High quality } ipp_quality_t; -typedef enum ipp_res_e /**** Resolution units ****/ +typedef enum ipp_res_e // Resolution units { - IPP_RES_PER_INCH = 3, /* Pixels per inch */ - IPP_RES_PER_CM /* Pixels per centimeter */ + IPP_RES_PER_INCH = 3, // Pixels per inch + IPP_RES_PER_CM // Pixels per centimeter } ipp_res_t; -typedef enum ipp_rstate_e /**** resource-state values ****/ +typedef enum ipp_rstate_e // resource-state values { - IPP_RSTATE_PENDING = 3, /* Resource is created but has no data yet. */ - IPP_RSTATE_AVAILABLE, /* Resource is available for installation. */ - IPP_RSTATE_INSTALLED, /* Resource is installed. */ - IPP_RSTATE_CANCELED, /* Resource has been canceled and is pending deletion. */ - IPP_RSTATE_ABORTED /* Resource has been aborted and is pending deletion. */ + IPP_RSTATE_PENDING = 3, // Resource is created but has no data yet. + IPP_RSTATE_AVAILABLE, // Resource is available for installation. + IPP_RSTATE_INSTALLED, // Resource is installed. + IPP_RSTATE_CANCELED, // Resource has been canceled and is pending deletion. + IPP_RSTATE_ABORTED // Resource has been aborted and is pending deletion. } ipp_rstate_t; -typedef enum ipp_sstate_e /**** system-state values ****/ +typedef enum ipp_sstate_e // system-state values { - IPP_SSTATE_IDLE = 3, /* At least one printer is idle and none are processing a job. */ - IPP_SSTATE_PROCESSING, /* At least one printer is processing a job. */ - IPP_SSTATE_STOPPED /* All printers are stopped. */ + IPP_SSTATE_IDLE = 3, // At least one printer is idle and none are processing a job. + IPP_SSTATE_PROCESSING, // At least one printer is processing a job. + IPP_SSTATE_STOPPED // All printers are stopped. } ipp_sstate_t; -typedef enum ipp_state_e /**** ipp_t state values ****/ +typedef enum ipp_state_e // ipp_t state values { - IPP_STATE_ERROR = -1, /* An error occurred */ - IPP_STATE_IDLE, /* Nothing is happening/request completed */ - IPP_STATE_HEADER, /* The request header needs to be sent/received */ - IPP_STATE_ATTRIBUTE, /* One or more attributes need to be sent/received */ - IPP_STATE_DATA /* IPP request data needs to be sent/received */ - -# ifndef _CUPS_NO_DEPRECATED -# define IPP_ERROR IPP_STATE_ERROR -# define IPP_IDLE IPP_STATE_IDLE -# define IPP_HEADER IPP_STATE_HEADER -# define IPP_ATTRIBUTE IPP_STATE_ATTRIBUTE -# define IPP_DATA IPP_STATE_DATA -# endif /* !_CUPS_NO_DEPRECATED */ + IPP_STATE_ERROR = -1, // An error occurred + IPP_STATE_IDLE, // Nothing is happening/request completed + IPP_STATE_HEADER, // The request header needs to be sent/received + IPP_STATE_ATTRIBUTE, // One or more attributes need to be sent/received + IPP_STATE_DATA // IPP request data needs to be sent/received } ipp_state_t; -typedef enum ipp_status_e /**** IPP status code values ****/ +typedef enum ipp_status_e // IPP status code values { - IPP_STATUS_CUPS_INVALID = -1, /* Invalid status name for @link ippErrorValue@ */ - IPP_STATUS_OK = 0x0000, /* successful-ok */ - IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED, /* successful-ok-ignored-or-substituted-attributes */ - IPP_STATUS_OK_CONFLICTING, /* successful-ok-conflicting-attributes */ - IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS, /* successful-ok-ignored-subscriptions */ - IPP_STATUS_OK_IGNORED_NOTIFICATIONS, /* successful-ok-ignored-notifications @private@ */ - IPP_STATUS_OK_TOO_MANY_EVENTS, /* successful-ok-too-many-events */ - IPP_STATUS_OK_BUT_CANCEL_SUBSCRIPTION,/* successful-ok-but-cancel-subscription @private@ */ - IPP_STATUS_OK_EVENTS_COMPLETE, /* successful-ok-events-complete */ + IPP_STATUS_CUPS_INVALID = -1, // Invalid status name for @link ippErrorValue@ + IPP_STATUS_OK = 0x0000, // successful-ok + IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED, // successful-ok-ignored-or-substituted-attributes + IPP_STATUS_OK_CONFLICTING, // successful-ok-conflicting-attributes + IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS, // successful-ok-ignored-subscriptions + IPP_STATUS_OK_IGNORED_NOTIFICATIONS, // successful-ok-ignored-notifications @private@ + IPP_STATUS_OK_TOO_MANY_EVENTS, // successful-ok-too-many-events + IPP_STATUS_OK_BUT_CANCEL_SUBSCRIPTION,// successful-ok-but-cancel-subscription @private@ + IPP_STATUS_OK_EVENTS_COMPLETE, // successful-ok-events-complete IPP_STATUS_REDIRECTION_OTHER_SITE = 0x0200, - /* redirection-other-site @private@ */ - IPP_STATUS_CUPS_SEE_OTHER = 0x0280, /* cups-see-other @private@ */ - IPP_STATUS_ERROR_BAD_REQUEST = 0x0400,/* client-error-bad-request */ - IPP_STATUS_ERROR_FORBIDDEN, /* client-error-forbidden */ - IPP_STATUS_ERROR_NOT_AUTHENTICATED, /* client-error-not-authenticated */ - IPP_STATUS_ERROR_NOT_AUTHORIZED, /* client-error-not-authorized */ - IPP_STATUS_ERROR_NOT_POSSIBLE, /* client-error-not-possible */ - IPP_STATUS_ERROR_TIMEOUT, /* client-error-timeout */ - IPP_STATUS_ERROR_NOT_FOUND, /* client-error-not-found */ - IPP_STATUS_ERROR_GONE, /* client-error-gone */ - IPP_STATUS_ERROR_REQUEST_ENTITY, /* client-error-request-entity-too-large */ - IPP_STATUS_ERROR_REQUEST_VALUE, /* client-error-request-value-too-long */ + // redirection-other-site @private@ + IPP_STATUS_CUPS_SEE_OTHER = 0x0280, // cups-see-other @private@ + IPP_STATUS_ERROR_BAD_REQUEST = 0x0400,// client-error-bad-request + IPP_STATUS_ERROR_FORBIDDEN, // client-error-forbidden + IPP_STATUS_ERROR_NOT_AUTHENTICATED, // client-error-not-authenticated + IPP_STATUS_ERROR_NOT_AUTHORIZED, // client-error-not-authorized + IPP_STATUS_ERROR_NOT_POSSIBLE, // client-error-not-possible + IPP_STATUS_ERROR_TIMEOUT, // client-error-timeout + IPP_STATUS_ERROR_NOT_FOUND, // client-error-not-found + IPP_STATUS_ERROR_GONE, // client-error-gone + IPP_STATUS_ERROR_REQUEST_ENTITY, // client-error-request-entity-too-large + IPP_STATUS_ERROR_REQUEST_VALUE, // client-error-request-value-too-long IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED, - /* client-error-document-format-not-supported */ - IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES,/* client-error-attributes-or-values-not-supported */ - IPP_STATUS_ERROR_URI_SCHEME, /* client-error-uri-scheme-not-supported */ - IPP_STATUS_ERROR_CHARSET, /* client-error-charset-not-supported */ - IPP_STATUS_ERROR_CONFLICTING, /* client-error-conflicting-attributes */ + // client-error-document-format-not-supported + IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES,// client-error-attributes-or-values-not-supported + IPP_STATUS_ERROR_URI_SCHEME, // client-error-uri-scheme-not-supported + IPP_STATUS_ERROR_CHARSET, // client-error-charset-not-supported + IPP_STATUS_ERROR_CONFLICTING, // client-error-conflicting-attributes IPP_STATUS_ERROR_COMPRESSION_NOT_SUPPORTED, - /* client-error-compression-not-supported */ - IPP_STATUS_ERROR_COMPRESSION_ERROR, /* client-error-compression-error */ + // client-error-compression-not-supported + IPP_STATUS_ERROR_COMPRESSION_ERROR, // client-error-compression-error IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR, - /* client-error-document-format-error */ - IPP_STATUS_ERROR_DOCUMENT_ACCESS, /* client-error-document-access-error */ + // client-error-document-format-error + IPP_STATUS_ERROR_DOCUMENT_ACCESS, // client-error-document-access-error IPP_STATUS_ERROR_ATTRIBUTES_NOT_SETTABLE, - /* client-error-attributes-not-settable */ + // client-error-attributes-not-settable IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS, - /* client-error-ignored-all-subscriptions */ + // client-error-ignored-all-subscriptions IPP_STATUS_ERROR_TOO_MANY_SUBSCRIPTIONS, - /* client-error-too-many-subscriptions */ + // client-error-too-many-subscriptions IPP_STATUS_ERROR_IGNORED_ALL_NOTIFICATIONS, - /* client-error-ignored-all-notifications @private@ */ + // client-error-ignored-all-notifications @private@ IPP_STATUS_ERROR_PRINT_SUPPORT_FILE_NOT_FOUND, - /* client-error-print-support-file-not-found @private@ */ - IPP_STATUS_ERROR_DOCUMENT_PASSWORD, /* client-error-document-password-error */ - IPP_STATUS_ERROR_DOCUMENT_PERMISSION, /* client-error-document-permission-error */ - IPP_STATUS_ERROR_DOCUMENT_SECURITY, /* client-error-document-security-error */ - IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE,/* client-error-document-unprintable-error */ - IPP_STATUS_ERROR_ACCOUNT_INFO_NEEDED, /* client-error-account-info-needed */ - IPP_STATUS_ERROR_ACCOUNT_CLOSED, /* client-error-account-closed */ + // client-error-print-support-file-not-found @private@ + IPP_STATUS_ERROR_DOCUMENT_PASSWORD, // client-error-document-password-error + IPP_STATUS_ERROR_DOCUMENT_PERMISSION, // client-error-document-permission-error + IPP_STATUS_ERROR_DOCUMENT_SECURITY, // client-error-document-security-error + IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE,// client-error-document-unprintable-error + IPP_STATUS_ERROR_ACCOUNT_INFO_NEEDED, // client-error-account-info-needed + IPP_STATUS_ERROR_ACCOUNT_CLOSED, // client-error-account-closed IPP_STATUS_ERROR_ACCOUNT_LIMIT_REACHED, - /* client-error-account-limit-reached */ + // client-error-account-limit-reached IPP_STATUS_ERROR_ACCOUNT_AUTHORIZATION_FAILED, - /* client-error-account-authorization-failed */ - IPP_STATUS_ERROR_NOT_FETCHABLE, /* client-error-not-fetchable */ + // client-error-account-authorization-failed + IPP_STATUS_ERROR_NOT_FETCHABLE, // client-error-not-fetchable - /* Legacy status codes for paid printing */ + // Legacy status codes for paid printing IPP_STATUS_ERROR_CUPS_ACCOUNT_INFO_NEEDED = 0x049C, - /* cups-error-account-info-needed @deprecated@ */ - IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED, /* cups-error-account-closed @deprecate@ */ + // cups-error-account-info-needed @deprecated@ + IPP_STATUS_ERROR_CUPS_ACCOUNT_CLOSED, // cups-error-account-closed @deprecate@ IPP_STATUS_ERROR_CUPS_ACCOUNT_LIMIT_REACHED, - /* cups-error-account-limit-reached @deprecated@ */ + // cups-error-account-limit-reached @deprecated@ IPP_STATUS_ERROR_CUPS_ACCOUNT_AUTHORIZATION_FAILED, - /* cups-error-account-authorization-failed @deprecated@ */ + // cups-error-account-authorization-failed @deprecated@ - IPP_STATUS_ERROR_INTERNAL = 0x0500, /* server-error-internal-error */ + IPP_STATUS_ERROR_INTERNAL = 0x0500, // server-error-internal-error IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED, - /* server-error-operation-not-supported */ - IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, /* server-error-service-unavailable */ + // server-error-operation-not-supported + IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, // server-error-service-unavailable IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED, - /* server-error-version-not-supported */ - IPP_STATUS_ERROR_DEVICE, /* server-error-device-error */ - IPP_STATUS_ERROR_TEMPORARY, /* server-error-temporary-error */ - IPP_STATUS_ERROR_NOT_ACCEPTING_JOBS, /* server-error-not-accepting-jobs */ - IPP_STATUS_ERROR_BUSY, /* server-error-busy */ - IPP_STATUS_ERROR_JOB_CANCELED, /* server-error-job-canceled */ + // server-error-version-not-supported + IPP_STATUS_ERROR_DEVICE, // server-error-device-error + IPP_STATUS_ERROR_TEMPORARY, // server-error-temporary-error + IPP_STATUS_ERROR_NOT_ACCEPTING_JOBS, // server-error-not-accepting-jobs + IPP_STATUS_ERROR_BUSY, // server-error-busy + IPP_STATUS_ERROR_JOB_CANCELED, // server-error-job-canceled IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, - /* server-error-multiple-document-jobs-not-supported */ + // server-error-multiple-document-jobs-not-supported IPP_STATUS_ERROR_PRINTER_IS_DEACTIVATED, - /* server-error-printer-is-deactivated */ - IPP_STATUS_ERROR_TOO_MANY_JOBS, /* server-error-too-many-jobs */ - IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS, /* server-error-too-many-documents */ + // server-error-printer-is-deactivated + IPP_STATUS_ERROR_TOO_MANY_JOBS, // server-error-too-many-jobs + IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS, // server-error-too-many-documents - /* These are internal and never sent over the wire... */ + // These are internal and never sent over the wire... IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED = 0x1000, - /* cups-authentication-canceled - Authentication canceled by user @since CUPS 1.5/macOS 10.7@ */ - IPP_STATUS_ERROR_CUPS_PKI, /* cups-pki-error - Error negotiating a secure connection @since CUPS 1.5/macOS 10.7@ */ - IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED/* cups-upgrade-required - TLS upgrade required @since CUPS 1.5/macOS 10.7@ */ - -# ifndef _CUPS_NO_DEPRECATED -# define IPP_OK IPP_STATUS_OK -# define IPP_OK_SUBST IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED -# define IPP_OK_CONFLICT IPP_STATUS_OK_CONFLICTING -# define IPP_OK_IGNORED_SUBSCRIPTIONS IPP_STATUS_OK_IGNORED_SUBSCRIPTIONS -# define IPP_OK_IGNORED_NOTIFICATIONS IPP_STATUS_OK_IGNORED_NOTIFICATIONS -# define IPP_OK_TOO_MANY_EVENTS IPP_STATUS_OK_TOO_MANY_EVENTS -# define IPP_OK_BUT_CANCEL_SUBSCRIPTION IPP_STATUS_OK_BUT_CANCEL_SUBSCRIPTION -# define IPP_OK_EVENTS_COMPLETE IPP_STATUS_OK_EVENTS_COMPLETE -# define IPP_REDIRECTION_OTHER_SITE IPP_STATUS_REDIRECTION_OTHER_SITE -# define CUPS_SEE_OTHER IPP_STATUS_CUPS_SEE_OTHER -# define IPP_BAD_REQUEST IPP_STATUS_ERROR_BAD_REQUEST -# define IPP_FORBIDDEN IPP_STATUS_ERROR_FORBIDDEN -# define IPP_NOT_AUTHENTICATED IPP_STATUS_ERROR_NOT_AUTHENTICATED -# define IPP_NOT_AUTHORIZED IPP_STATUS_ERROR_NOT_AUTHORIZED -# define IPP_NOT_POSSIBLE IPP_STATUS_ERROR_NOT_POSSIBLE -# define IPP_TIMEOUT IPP_STATUS_ERROR_TIMEOUT -# define IPP_NOT_FOUND IPP_STATUS_ERROR_NOT_FOUND -# define IPP_GONE IPP_STATUS_ERROR_GONE -# define IPP_REQUEST_ENTITY IPP_STATUS_ERROR_REQUEST_ENTITY -# define IPP_REQUEST_VALUE IPP_STATUS_ERROR_REQUEST_VALUE -# define IPP_DOCUMENT_FORMAT IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED -# define IPP_ATTRIBUTES IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES -# define IPP_URI_SCHEME IPP_STATUS_ERROR_URI_SCHEME -# define IPP_CHARSET IPP_STATUS_ERROR_CHARSET -# define IPP_CONFLICT IPP_STATUS_ERROR_CONFLICTING -# define IPP_COMPRESSION_NOT_SUPPORTED IPP_STATUS_ERROR_COMPRESSION_NOT_SUPPORTED -# define IPP_COMPRESSION_ERROR IPP_STATUS_ERROR_COMPRESSION_ERROR -# define IPP_DOCUMENT_FORMAT_ERROR IPP_STATUS_ERROR_DOCUMENT_FORMAT_ERROR -# define IPP_DOCUMENT_ACCESS_ERROR IPP_STATUS_ERROR_DOCUMENT_ACCESS -# define IPP_ATTRIBUTES_NOT_SETTABLE IPP_STATUS_ERROR_ATTRIBUTES_NOT_SETTABLE -# define IPP_IGNORED_ALL_SUBSCRIPTIONS IPP_STATUS_ERROR_IGNORED_ALL_SUBSCRIPTIONS -# define IPP_TOO_MANY_SUBSCRIPTIONS IPP_STATUS_ERROR_TOO_MANY_SUBSCRIPTIONS -# define IPP_IGNORED_ALL_NOTIFICATIONS IPP_STATUS_ERROR_IGNORED_ALL_NOTIFICATIONS -# define IPP_PRINT_SUPPORT_FILE_NOT_FOUND IPP_STATUS_ERROR_PRINT_SUPPORT_FILE_NOT_FOUND -# define IPP_DOCUMENT_PASSWORD_ERROR IPP_STATUS_ERROR_DOCUMENT_PASSWORD -# define IPP_DOCUMENT_PERMISSION_ERROR IPP_STATUS_ERROR_DOCUMENT_PERMISSION -# define IPP_DOCUMENT_SECURITY_ERROR IPP_STATUS_ERROR_DOCUMENT_SECURITY -# define IPP_DOCUMENT_UNPRINTABLE_ERROR IPP_STATUS_ERROR_DOCUMENT_UNPRINTABLE -# define IPP_INTERNAL_ERROR IPP_STATUS_ERROR_INTERNAL -# define IPP_OPERATION_NOT_SUPPORTED IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED -# define IPP_SERVICE_UNAVAILABLE IPP_STATUS_ERROR_SERVICE_UNAVAILABLE -# define IPP_VERSION_NOT_SUPPORTED IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED -# define IPP_DEVICE_ERROR IPP_STATUS_ERROR_DEVICE -# define IPP_TEMPORARY_ERROR IPP_STATUS_ERROR_TEMPORARY -# define IPP_NOT_ACCEPTING IPP_STATUS_ERROR_NOT_ACCEPTING_JOBS -# define IPP_PRINTER_BUSY IPP_STATUS_ERROR_BUSY -# define IPP_ERROR_JOB_CANCELED IPP_STATUS_ERROR_JOB_CANCELED -# define IPP_MULTIPLE_JOBS_NOT_SUPPORTED IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED -# define IPP_PRINTER_IS_DEACTIVATED IPP_STATUS_ERROR_PRINTER_IS_DEACTIVATED -# define IPP_TOO_MANY_JOBS IPP_STATUS_ERROR_TOO_MANY_JOBS -# define IPP_TOO_MANY_DOCUMENTS IPP_STATUS_ERROR_TOO_MANY_DOCUMENTS -# define IPP_AUTHENTICATION_CANCELED IPP_STATUS_ERROR_CUPS_AUTHENTICATION_CANCELED -# define IPP_PKI_ERROR IPP_STATUS_ERROR_CUPS_PKI -# define IPP_UPGRADE_REQUIRED IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED - /* Legacy name for canceled status */ -# define IPP_ERROR_JOB_CANCELLED IPP_STATUS_ERROR_JOB_CANCELED -# endif /* _CUPS_NO_DEPRECATED */ + // cups-authentication-canceled - Authentication canceled by user @since CUPS 1.5/macOS 10.7@ + IPP_STATUS_ERROR_CUPS_PKI, // cups-pki-error - Error negotiating a secure connection @since CUPS 1.5/macOS 10.7@ + IPP_STATUS_ERROR_CUPS_UPGRADE_REQUIRED// cups-upgrade-required - TLS upgrade required @since CUPS 1.5/macOS 10.7@ } ipp_status_t; -typedef enum ipp_tag_e /**** Value and group tag values for attributes ****/ +typedef enum ipp_tag_e // Value and group tag values for attributes { - IPP_TAG_CUPS_INVALID = -1, /* Invalid tag name for @link ippTagValue@ */ - IPP_TAG_ZERO = 0x00, /* Zero tag - used for separators */ - IPP_TAG_OPERATION, /* Operation group */ - IPP_TAG_JOB, /* Job group */ - IPP_TAG_END, /* End-of-attributes */ - IPP_TAG_PRINTER, /* Printer group */ - IPP_TAG_UNSUPPORTED_GROUP, /* Unsupported attributes group */ - IPP_TAG_SUBSCRIPTION, /* Subscription group */ - IPP_TAG_EVENT_NOTIFICATION, /* Event group */ - IPP_TAG_RESOURCE, /* Resource group */ - IPP_TAG_DOCUMENT, /* Document group */ - IPP_TAG_SYSTEM, /* System group */ - IPP_TAG_UNSUPPORTED_VALUE = 0x10, /* Unsupported value */ - IPP_TAG_DEFAULT, /* Default value */ - IPP_TAG_UNKNOWN, /* Unknown value */ - IPP_TAG_NOVALUE, /* No-value value */ - IPP_TAG_NOTSETTABLE = 0x15, /* Not-settable value */ - IPP_TAG_DELETEATTR, /* Delete-attribute value */ - IPP_TAG_ADMINDEFINE, /* Admin-defined value */ - IPP_TAG_INTEGER = 0x21, /* Integer value */ - IPP_TAG_BOOLEAN, /* Boolean value */ - IPP_TAG_ENUM, /* Enumeration value */ - IPP_TAG_STRING = 0x30, /* Octet string value */ - IPP_TAG_DATE, /* Date/time value */ - IPP_TAG_RESOLUTION, /* Resolution value */ - IPP_TAG_RANGE, /* Range value */ - IPP_TAG_BEGIN_COLLECTION, /* Beginning of collection value @exclude all@ */ - IPP_TAG_TEXTLANG, /* Text-with-language value */ - IPP_TAG_NAMELANG, /* Name-with-language value */ - IPP_TAG_END_COLLECTION, /* End of collection value @exclude all@ */ - IPP_TAG_TEXT = 0x41, /* Text value */ - IPP_TAG_NAME, /* Name value */ - IPP_TAG_RESERVED_STRING, /* Reserved for future string value @private@ */ - IPP_TAG_KEYWORD, /* Keyword value */ - IPP_TAG_URI, /* URI value */ - IPP_TAG_URISCHEME, /* URI scheme value */ - IPP_TAG_CHARSET, /* Character set value */ - IPP_TAG_LANGUAGE, /* Language value */ - IPP_TAG_MIMETYPE, /* MIME media type value */ - IPP_TAG_MEMBERNAME, /* Collection member name value @exclude all@ */ - IPP_TAG_EXTENSION = 0x7f, /* Extension point for 32-bit tags @exclude all@ */ - IPP_TAG_CUPS_MASK = 0x7fffffff, /* Mask for copied attribute values @private@ */ - /* The following expression is used to avoid compiler warnings with +/-0x80000000 */ - IPP_TAG_CUPS_CONST = -0x7fffffff-1 /* Bitflag for copied/const attribute values @private@ */ - -# ifndef _CUPS_NO_DEPRECATED -# define IPP_TAG_MASK IPP_TAG_CUPS_MASK -# define IPP_TAG_COPY IPP_TAG_CUPS_CONST -# endif /* !_CUPS_NO_DEPRECATED */ + IPP_TAG_CUPS_INVALID = -1, // Invalid tag name for @link ippTagValue@ + IPP_TAG_ZERO = 0x00, // Zero tag - used for separators + IPP_TAG_OPERATION, // Operation group + IPP_TAG_JOB, // Job group + IPP_TAG_END, // End-of-attributes + IPP_TAG_PRINTER, // Printer group + IPP_TAG_UNSUPPORTED_GROUP, // Unsupported attributes group + IPP_TAG_SUBSCRIPTION, // Subscription group + IPP_TAG_EVENT_NOTIFICATION, // Event group + IPP_TAG_RESOURCE, // Resource group + IPP_TAG_DOCUMENT, // Document group + IPP_TAG_SYSTEM, // System group + IPP_TAG_UNSUPPORTED_VALUE = 0x10, // Unsupported value + IPP_TAG_DEFAULT, // Default value + IPP_TAG_UNKNOWN, // Unknown value + IPP_TAG_NOVALUE, // No-value value + IPP_TAG_NOTSETTABLE = 0x15, // Not-settable value + IPP_TAG_DELETEATTR, // Delete-attribute value + IPP_TAG_ADMINDEFINE, // Admin-defined value + IPP_TAG_INTEGER = 0x21, // Integer value + IPP_TAG_BOOLEAN, // Boolean value + IPP_TAG_ENUM, // Enumeration value + IPP_TAG_STRING = 0x30, // Octet string value + IPP_TAG_DATE, // Date/time value + IPP_TAG_RESOLUTION, // Resolution value + IPP_TAG_RANGE, // Range value + IPP_TAG_BEGIN_COLLECTION, // Beginning of collection value @exclude all@ + IPP_TAG_TEXTLANG, // Text-with-language value + IPP_TAG_NAMELANG, // Name-with-language value + IPP_TAG_END_COLLECTION, // End of collection value @exclude all@ + IPP_TAG_TEXT = 0x41, // Text value + IPP_TAG_NAME, // Name value + IPP_TAG_RESERVED_STRING, // Reserved for future string value @private@ + IPP_TAG_KEYWORD, // Keyword value + IPP_TAG_URI, // URI value + IPP_TAG_URISCHEME, // URI scheme value + IPP_TAG_CHARSET, // Character set value + IPP_TAG_LANGUAGE, // Language value + IPP_TAG_MIMETYPE, // MIME media type value + IPP_TAG_MEMBERNAME, // Collection member name value @exclude all@ + IPP_TAG_EXTENSION = 0x7f, // Extension point for 32-bit tags @exclude all@ + IPP_TAG_CUPS_MASK = 0x7fffffff, // Mask for copied attribute values @private@ + // The following expression is used to avoid compiler warnings with +/-0x80000000 + IPP_TAG_CUPS_CONST = -0x7fffffff-1 // Bitflag for copied/const attribute values @private@ } ipp_tag_t; -typedef unsigned char ipp_uchar_t; /**** Unsigned 8-bit integer/character @exclude all@ ****/ -typedef struct _ipp_s ipp_t; /**** IPP request/response data ****/ +typedef unsigned char ipp_uchar_t; // Unsigned 8-bit integer/character @exclude all@ +typedef struct _ipp_s ipp_t; // IPP request/response data typedef struct _ipp_attribute_s ipp_attribute_t; - /**** IPP attribute ****/ - -/**** New in CUPS 1.2/macOS 10.5 ****/ -typedef ssize_t (*ipp_iocb_t)(void *context, ipp_uchar_t *buffer, size_t bytes); - /**** ippReadIO/ippWriteIO callback function @since CUPS 1.2/macOS 10.5@ ****/ - -/**** New in CUPS 1.6/macOS 10.8 ****/ -typedef int (*ipp_copycb_t)(void *context, ipp_t *dst, ipp_attribute_t *attr); - /**** ippCopyAttributes callback function @since CUPS 1.6/macOS 10.8 ****/ - - -/* - * Prototypes... - */ - -extern ipp_attribute_t *ippAddBoolean(ipp_t *ipp, ipp_tag_t group, - const char *name, char value) _CUPS_PUBLIC; -extern ipp_attribute_t *ippAddBooleans(ipp_t *ipp, ipp_tag_t group, - const char *name, int num_values, - const char *values) _CUPS_PUBLIC; -extern ipp_attribute_t *ippAddDate(ipp_t *ipp, ipp_tag_t group, - const char *name, const ipp_uchar_t *value) _CUPS_PUBLIC; -extern ipp_attribute_t *ippAddInteger(ipp_t *ipp, ipp_tag_t group, - ipp_tag_t value_tag, const char *name, - int value) _CUPS_PUBLIC; -extern ipp_attribute_t *ippAddIntegers(ipp_t *ipp, ipp_tag_t group, - ipp_tag_t value_tag, const char *name, - int num_values, const int *values) _CUPS_PUBLIC; -extern ipp_attribute_t *ippAddRange(ipp_t *ipp, ipp_tag_t group, - const char *name, int lower, int upper) _CUPS_PUBLIC; -extern ipp_attribute_t *ippAddRanges(ipp_t *ipp, ipp_tag_t group, - const char *name, int num_values, - const int *lower, const int *upper) _CUPS_PUBLIC; -extern ipp_attribute_t *ippAddResolution(ipp_t *ipp, ipp_tag_t group, - const char *name, ipp_res_t units, - int xres, int yres) _CUPS_PUBLIC; -extern ipp_attribute_t *ippAddResolutions(ipp_t *ipp, ipp_tag_t group, - const char *name, int num_values, - ipp_res_t units, const int *xres, - const int *yres) _CUPS_PUBLIC; + // IPP attribute + +typedef int (*ipp_copy_cb_t)(void *context, ipp_t *dst, ipp_attribute_t *attr); + // ippCopyAttributes callback function @since CUPS 1.6/macOS 10.8 +#define ipp_copycb_t ipp_copy_cb_t // Old name + +typedef struct _ipp_file_s ipp_file_t; // IPP data file +typedef bool (*ipp_fattr_cb_t)(ipp_file_t *file, void *cb_data, const char *name); + // IPP data file attribute callback +typedef bool (*ipp_ferror_cb_t)(ipp_file_t *file, void *cb_data, const char *error); + // IPP data file error callback +typedef bool (*ipp_ftoken_cb_t)(ipp_file_t *file, void *cb_data, const char *token); + // IPP data file token callback + +typedef ssize_t (*ipp_io_cb_t)(void *context, ipp_uchar_t *buffer, size_t bytes); + // ippReadIO/ippWriteIO callback function @since CUPS 1.2/macOS 10.5@ +#define ipp_iocb_t ipp_io_cb_t // Old name + + +// +// Functions... +// + +extern ipp_attribute_t *ippAddBoolean(ipp_t *ipp, ipp_tag_t group, const char *name, char value) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddBooleans(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const char *values) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddCollection(ipp_t *ipp, ipp_tag_t group, const char *name, ipp_t *value) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddCollections(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const ipp_t **values) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddDate(ipp_t *ipp, ipp_tag_t group, const char *name, const ipp_uchar_t *value) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddInteger(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, int value) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddIntegers(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, int num_values, const int *values) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddOctetString(ipp_t *ipp, ipp_tag_t group, const char *name, const void *data, int datalen) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddOutOfBand(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddRange(ipp_t *ipp, ipp_tag_t group, const char *name, int lower, int upper) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddRanges(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const int *lower, const int *upper) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddResolution(ipp_t *ipp, ipp_tag_t group, const char *name, ipp_res_t units, int xres, int yres) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddResolutions(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, ipp_res_t units, const int *xres, const int *yres) _CUPS_PUBLIC; extern ipp_attribute_t *ippAddSeparator(ipp_t *ipp) _CUPS_PUBLIC; -extern ipp_attribute_t *ippAddString(ipp_t *ipp, ipp_tag_t group, - ipp_tag_t value_tag, const char *name, - const char *language, const char *value) _CUPS_PUBLIC; -extern ipp_attribute_t *ippAddStrings(ipp_t *ipp, ipp_tag_t group, - ipp_tag_t value_tag, const char *name, - int num_values, const char *language, - const char * const *values) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddString(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, const char *language, const char *value) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddStringf(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, const char *language, const char *format, ...) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddStringfv(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, const char *language, const char *format, va_list ap) _CUPS_PUBLIC; +extern ipp_attribute_t *ippAddStrings(ipp_t *ipp, ipp_tag_t group, ipp_tag_t value_tag, const char *name, int num_values, const char *language, const char * const *values) _CUPS_PUBLIC; +extern size_t ippAttributeString(ipp_attribute_t *attr, char *buffer, size_t bufsize) _CUPS_PUBLIC; + +extern int ippContainsInteger(ipp_attribute_t *attr, int value) _CUPS_PUBLIC; +extern int ippContainsString(ipp_attribute_t *attr, const char *value) _CUPS_PUBLIC; +extern ipp_attribute_t *ippCopyAttribute(ipp_t *dst, ipp_attribute_t *attr, int quickcopy) _CUPS_PUBLIC; +extern int ippCopyAttributes(ipp_t *dst, ipp_t *src, int quickcopy, ipp_copy_cb_t cb, void *context) _CUPS_PUBLIC; +extern cups_array_t *ippCreateRequestedArray(ipp_t *request) _CUPS_PUBLIC; + extern time_t ippDateToTime(const ipp_uchar_t *date) _CUPS_PUBLIC; extern void ippDelete(ipp_t *ipp) _CUPS_PUBLIC; +extern void ippDeleteAttribute(ipp_t *ipp, ipp_attribute_t *attr) _CUPS_PUBLIC; +extern int ippDeleteValues(ipp_t *ipp, ipp_attribute_t **attr, int element, int count) _CUPS_PUBLIC; + +extern const char *ippEnumString(const char *attrname, int enumvalue) _CUPS_PUBLIC; +extern int ippEnumValue(const char *attrname, const char *enumstring) _CUPS_PUBLIC; extern const char *ippErrorString(ipp_status_t error) _CUPS_PUBLIC; -extern ipp_attribute_t *ippFindAttribute(ipp_t *ipp, const char *name, - ipp_tag_t value_tag) _CUPS_PUBLIC; -extern ipp_attribute_t *ippFindNextAttribute(ipp_t *ipp, const char *name, - ipp_tag_t value_tag) _CUPS_PUBLIC; -extern size_t ippLength(ipp_t *ipp) _CUPS_PUBLIC; +extern ipp_status_t ippErrorValue(const char *name) _CUPS_PUBLIC; + +extern bool ippFileClose(ipp_file_t *file) _CUPS_PUBLIC; +extern bool ippFileDelete(ipp_file_t *file) _CUPS_PUBLIC; +extern size_t ippFileExpandVars(ipp_file_t *file, char *dst, const char *src, size_t dstsize) _CUPS_PUBLIC; +extern ipp_attribute_t *ippFileGetAttribute(ipp_file_t *file, const char *name, ipp_tag_t value_tag) _CUPS_PUBLIC; +extern ipp_t *ippFileGetAttributes(ipp_file_t *file) _CUPS_PUBLIC; +extern const char *ippFileGetFilename(ipp_file_t *file) _CUPS_PUBLIC; +extern int ippFileGetLineNumber(ipp_file_t *file) _CUPS_PUBLIC; +extern const char *ippFileGetVar(ipp_file_t *file, const char *name) _CUPS_PUBLIC; +extern ipp_file_t *ippFileNew(ipp_file_t *parent, ipp_fattr_cb_t attr_cb, ipp_ferror_cb_t error_cb, void *cb_data) _CUPS_PUBLIC; +extern bool ippFileOpen(ipp_file_t *file, const char *filename, const char *mode) _CUPS_PUBLIC; +extern bool ippFileRead(ipp_file_t *file, ipp_ftoken_cb_t token_cb, bool with_groups) _CUPS_PUBLIC; +extern ipp_t *ippFileReadCollection(ipp_file_t *file) _CUPS_PUBLIC; +extern bool ippFileReadToken(ipp_file_t *file, char *token, size_t tokensize) _CUPS_PUBLIC; +extern bool ippFileRestorePosition(ipp_file_t *file) _CUPS_PUBLIC; +extern bool ippFileSavePosition(ipp_file_t *file) _CUPS_PUBLIC; +extern bool ippFileSetAttributes(ipp_file_t *file, ipp_t *attrs) _CUPS_PUBLIC; +extern bool ippFileSetGroupTag(ipp_file_t *file, ipp_tag_t group_tag) _CUPS_PUBLIC; +extern bool ippFileSetVar(ipp_file_t *file, const char *name, const char *value) _CUPS_PUBLIC; +extern bool ippFileSetVarf(ipp_file_t *file, const char *name, const char *value, ...) _CUPS_FORMAT(3,4) _CUPS_PUBLIC; +extern bool ippFileWriteAttributes(ipp_file_t *file, ipp_t *ipp, bool with_groups) _CUPS_PUBLIC; +extern bool ippFileWriteComment(ipp_file_t *file, const char *comment, ...) _CUPS_FORMAT(2,3) _CUPS_PUBLIC; +extern bool ippFileWriteToken(ipp_file_t *file, const char *token) _CUPS_PUBLIC; +extern bool ippFileWriteTokenf(ipp_file_t *file, const char *token, ...) _CUPS_FORMAT(2,3) _CUPS_PUBLIC; +extern ipp_attribute_t *ippFindAttribute(ipp_t *ipp, const char *name, ipp_tag_t value_tag) _CUPS_PUBLIC; +extern ipp_attribute_t *ippFindNextAttribute(ipp_t *ipp, const char *name, ipp_tag_t value_tag) _CUPS_PUBLIC; +extern ipp_attribute_t *ippFirstAttribute(ipp_t *ipp) _CUPS_DEPRECATED_MSG("Use ippGetFirstAttribute instead."); + +extern int ippGetBoolean(ipp_attribute_t *attr, int element) _CUPS_PUBLIC; +extern ipp_t *ippGetCollection(ipp_attribute_t *attr, int element) _CUPS_PUBLIC; +extern int ippGetCount(ipp_attribute_t *attr) _CUPS_PUBLIC; +extern const ipp_uchar_t *ippGetDate(ipp_attribute_t *attr, int element) _CUPS_PUBLIC; +extern ipp_attribute_t *ippGetFirstAttribute(ipp_t *ipp) _CUPS_PUBLIC; +extern ipp_tag_t ippGetGroupTag(ipp_attribute_t *attr) _CUPS_PUBLIC; +extern int ippGetInteger(ipp_attribute_t *attr, int element) _CUPS_PUBLIC; +extern size_t ippGetLength(ipp_t *ipp) _CUPS_PUBLIC; +extern const char *ippGetName(ipp_attribute_t *attr) _CUPS_PUBLIC; +extern ipp_attribute_t *ippGetNextAttribute(ipp_t *ipp) _CUPS_PUBLIC; +extern void *ippGetOctetString(ipp_attribute_t *attr, int element, int *datalen) _CUPS_PUBLIC; +extern ipp_op_t ippGetOperation(ipp_t *ipp) _CUPS_PUBLIC; +extern int ippGetPort(void) _CUPS_PUBLIC; +extern int ippGetRange(ipp_attribute_t *attr, int element, int *upper) _CUPS_PUBLIC; +extern int ippGetRequestId(ipp_t *ipp) _CUPS_PUBLIC; +extern int ippGetResolution(ipp_attribute_t *attr, int element, int *yres, ipp_res_t *units) _CUPS_PUBLIC; +extern ipp_state_t ippGetState(ipp_t *ipp) _CUPS_PUBLIC; +extern ipp_status_t ippGetStatusCode(ipp_t *ipp) _CUPS_PUBLIC; +extern const char *ippGetString(ipp_attribute_t *attr, int element, const char **language) _CUPS_PUBLIC; +extern ipp_tag_t ippGetValueTag(ipp_attribute_t *attr) _CUPS_PUBLIC; +extern int ippGetVersion(ipp_t *ipp, int *minor) _CUPS_PUBLIC; + +extern size_t ippLength(ipp_t *ipp) _CUPS_DEPRECATED_MSG("Use ippGetLength instead."); + extern ipp_t *ippNew(void) _CUPS_PUBLIC; +extern ipp_t *ippNewRequest(ipp_op_t op) _CUPS_PUBLIC; +extern ipp_t *ippNewResponse(ipp_t *request) _CUPS_PUBLIC; +extern ipp_attribute_t *ippNextAttribute(ipp_t *ipp) _CUPS_DEPRECATED_MSG("Use ippGetNextAttribute instead."); + +extern const char *ippOpString(ipp_op_t op) _CUPS_PUBLIC; +extern ipp_op_t ippOpValue(const char *name) _CUPS_PUBLIC; + +extern int ippPort(void) _CUPS_DEPRECATED_MSG("Use ippGetPort instead."); + extern ipp_state_t ippRead(http_t *http, ipp_t *ipp) _CUPS_PUBLIC; +extern ipp_state_t ippReadFile(int fd, ipp_t *ipp) _CUPS_PUBLIC; +extern ipp_state_t ippReadIO(void *src, ipp_io_cb_t cb, int blocking, ipp_t *parent, ipp_t *ipp) _CUPS_PUBLIC; +extern void ippRestore(ipp_t *ipp) _CUPS_PUBLIC; + +extern void ippSave(ipp_t *ipp) _CUPS_PUBLIC; +extern int ippSetBoolean(ipp_t *ipp, ipp_attribute_t **attr, int element, int boolvalue) _CUPS_PUBLIC; +extern int ippSetCollection(ipp_t *ipp, ipp_attribute_t **attr, int element, ipp_t *colvalue) _CUPS_PUBLIC; +extern int ippSetDate(ipp_t *ipp, ipp_attribute_t **attr, int element, const ipp_uchar_t *datevalue) _CUPS_PUBLIC; +extern int ippSetGroupTag(ipp_t *ipp, ipp_attribute_t **attr, ipp_tag_t group_tag) _CUPS_PUBLIC; +extern int ippSetInteger(ipp_t *ipp, ipp_attribute_t **attr, int element, int intvalue) _CUPS_PUBLIC; +extern int ippSetName(ipp_t *ipp, ipp_attribute_t **attr, const char *name) _CUPS_PUBLIC; +extern int ippSetOctetString(ipp_t *ipp, ipp_attribute_t **attr, int element, const void *data, int datalen) _CUPS_PUBLIC; +extern int ippSetOperation(ipp_t *ipp, ipp_op_t op) _CUPS_PUBLIC; +extern void ippSetPort(int p) _CUPS_PUBLIC; +extern int ippSetRange(ipp_t *ipp, ipp_attribute_t **attr, int element, int lowervalue, int uppervalue) _CUPS_PUBLIC; +extern int ippSetRequestId(ipp_t *ipp, int request_id) _CUPS_PUBLIC; +extern int ippSetResolution(ipp_t *ipp, ipp_attribute_t **attr, int element, ipp_res_t unitsvalue, int xresvalue, int yresvalue) _CUPS_PUBLIC; +extern int ippSetState(ipp_t *ipp, ipp_state_t state) _CUPS_PUBLIC; +extern int ippSetStatusCode(ipp_t *ipp, ipp_status_t status) _CUPS_PUBLIC; +extern int ippSetString(ipp_t *ipp, ipp_attribute_t **attr, int element, const char *strvalue) _CUPS_PUBLIC; +extern int ippSetStringf(ipp_t *ipp, ipp_attribute_t **attr, int element, const char *format, ...) _CUPS_PUBLIC; +extern int ippSetStringfv(ipp_t *ipp, ipp_attribute_t **attr, int element, const char *format, va_list ap) _CUPS_PUBLIC; +extern int ippSetValueTag(ipp_t *ipp, ipp_attribute_t **attr, ipp_tag_t value_tag) _CUPS_PUBLIC; +extern int ippSetVersion(ipp_t *ipp, int major, int minor) _CUPS_PUBLIC; +extern const char *ippStateString(ipp_state_t state) _CUPS_PUBLIC; + +extern const char *ippTagString(ipp_tag_t tag) _CUPS_PUBLIC; +extern ipp_tag_t ippTagValue(const char *name) _CUPS_PUBLIC; extern const ipp_uchar_t *ippTimeToDate(time_t t) _CUPS_PUBLIC; + +extern int ippValidateAttribute(ipp_attribute_t *attr) _CUPS_PUBLIC; +extern int ippValidateAttributes(ipp_t *ipp) _CUPS_PUBLIC; + extern ipp_state_t ippWrite(http_t *http, ipp_t *ipp) _CUPS_PUBLIC; -extern int ippPort(void) _CUPS_PUBLIC; -extern void ippSetPort(int p) _CUPS_PUBLIC; +extern ipp_state_t ippWriteFile(int fd, ipp_t *ipp) _CUPS_PUBLIC; +extern ipp_state_t ippWriteIO(void *dst, ipp_io_cb_t cb, int blocking, ipp_t *parent, ipp_t *ipp) _CUPS_PUBLIC; -/**** New in CUPS 1.1.19 ****/ -extern ipp_attribute_t *ippAddCollection(ipp_t *ipp, ipp_tag_t group, - const char *name, ipp_t *value) _CUPS_API_1_1_19; -extern ipp_attribute_t *ippAddCollections(ipp_t *ipp, ipp_tag_t group, - const char *name, int num_values, - const ipp_t **values) _CUPS_API_1_1_19; -extern void ippDeleteAttribute(ipp_t *ipp, ipp_attribute_t *attr) _CUPS_API_1_1_19; -extern ipp_state_t ippReadFile(int fd, ipp_t *ipp) _CUPS_API_1_1_19; -extern ipp_state_t ippWriteFile(int fd, ipp_t *ipp) _CUPS_API_1_1_19; - -/**** New in CUPS 1.2/macOS 10.5 ****/ -extern ipp_attribute_t *ippAddOctetString(ipp_t *ipp, ipp_tag_t group, - const char *name, - const void *data, int datalen) _CUPS_API_1_2; -extern ipp_status_t ippErrorValue(const char *name) _CUPS_API_1_2; -extern ipp_t *ippNewRequest(ipp_op_t op) _CUPS_API_1_2; -extern const char *ippOpString(ipp_op_t op) _CUPS_API_1_2; -extern ipp_op_t ippOpValue(const char *name) _CUPS_API_1_2; -extern ipp_state_t ippReadIO(void *src, ipp_iocb_t cb, int blocking, - ipp_t *parent, ipp_t *ipp) _CUPS_API_1_2; -extern ipp_state_t ippWriteIO(void *dst, ipp_iocb_t cb, int blocking, - ipp_t *parent, ipp_t *ipp) _CUPS_API_1_2; - -/**** New in CUPS 1.4/macOS 10.6 ****/ -extern const char *ippTagString(ipp_tag_t tag) _CUPS_API_1_4; -extern ipp_tag_t ippTagValue(const char *name) _CUPS_API_1_4; - -/**** New in CUPS 1.6/macOS 10.8 ****/ -extern ipp_attribute_t *ippAddOutOfBand(ipp_t *ipp, ipp_tag_t group, - ipp_tag_t value_tag, const char *name) - _CUPS_API_1_6; -extern size_t ippAttributeString(ipp_attribute_t *attr, char *buffer, - size_t bufsize) _CUPS_API_1_6; -extern ipp_attribute_t *ippCopyAttribute(ipp_t *dst, ipp_attribute_t *attr, - int quickcopy) _CUPS_API_1_6; -extern int ippCopyAttributes(ipp_t *dst, ipp_t *src, - int quickcopy, ipp_copycb_t cb, - void *context) _CUPS_API_1_6; -extern int ippDeleteValues(ipp_t *ipp, ipp_attribute_t **attr, - int element, int count) _CUPS_API_1_6; -extern const char *ippEnumString(const char *attrname, int enumvalue) - _CUPS_API_1_6; -extern int ippEnumValue(const char *attrname, - const char *enumstring) _CUPS_API_1_6; -extern ipp_attribute_t *ippFirstAttribute(ipp_t *ipp) _CUPS_API_1_6; -extern int ippGetBoolean(ipp_attribute_t *attr, int element) - _CUPS_API_1_6; -extern ipp_t *ippGetCollection(ipp_attribute_t *attr, - int element) _CUPS_API_1_6; -extern int ippGetCount(ipp_attribute_t *attr) _CUPS_API_1_6; -extern const ipp_uchar_t *ippGetDate(ipp_attribute_t *attr, int element) - _CUPS_API_1_6; -extern ipp_tag_t ippGetGroupTag(ipp_attribute_t *attr) _CUPS_API_1_6; -extern int ippGetInteger(ipp_attribute_t *attr, int element) - _CUPS_API_1_6; -extern const char *ippGetName(ipp_attribute_t *attr) _CUPS_API_1_6; -extern ipp_op_t ippGetOperation(ipp_t *ipp) _CUPS_API_1_6; -extern int ippGetRange(ipp_attribute_t *attr, int element, - int *upper) _CUPS_API_1_6; -extern int ippGetRequestId(ipp_t *ipp) _CUPS_API_1_6; -extern int ippGetResolution(ipp_attribute_t *attr, int element, - int *yres, ipp_res_t *units) - _CUPS_API_1_6; -extern ipp_state_t ippGetState(ipp_t *ipp) _CUPS_API_1_6; -extern ipp_status_t ippGetStatusCode(ipp_t *ipp) _CUPS_API_1_6; -extern const char *ippGetString(ipp_attribute_t *attr, int element, - const char **language) _CUPS_API_1_6; -extern ipp_tag_t ippGetValueTag(ipp_attribute_t *attr) _CUPS_API_1_6; -extern int ippGetVersion(ipp_t *ipp, int *minor) _CUPS_API_1_6; -extern ipp_attribute_t *ippNextAttribute(ipp_t *ipp) _CUPS_API_1_6; -extern int ippSetBoolean(ipp_t *ipp, ipp_attribute_t **attr, - int element, int boolvalue) _CUPS_API_1_6; -extern int ippSetCollection(ipp_t *ipp, ipp_attribute_t **attr, - int element, ipp_t *colvalue) - _CUPS_API_1_6; -extern int ippSetDate(ipp_t *ipp, ipp_attribute_t **attr, - int element, const ipp_uchar_t *datevalue) - _CUPS_API_1_6; -extern int ippSetGroupTag(ipp_t *ipp, ipp_attribute_t **attr, - ipp_tag_t group_tag) _CUPS_API_1_6; -extern int ippSetInteger(ipp_t *ipp, ipp_attribute_t **attr, - int element, int intvalue) _CUPS_API_1_6; -extern int ippSetName(ipp_t *ipp, ipp_attribute_t **attr, - const char *name) _CUPS_API_1_6; -extern int ippSetOperation(ipp_t *ipp, ipp_op_t op) _CUPS_API_1_6; -extern int ippSetRange(ipp_t *ipp, ipp_attribute_t **attr, - int element, int lowervalue, int uppervalue) - _CUPS_API_1_6; -extern int ippSetRequestId(ipp_t *ipp, int request_id) - _CUPS_API_1_6; -extern int ippSetResolution(ipp_t *ipp, ipp_attribute_t **attr, - int element, ipp_res_t unitsvalue, - int xresvalue, int yresvalue) - _CUPS_API_1_6; -extern int ippSetState(ipp_t *ipp, ipp_state_t state) - _CUPS_API_1_6; -extern int ippSetStatusCode(ipp_t *ipp, ipp_status_t status) - _CUPS_API_1_6; -extern int ippSetString(ipp_t *ipp, ipp_attribute_t **attr, - int element, const char *strvalue) - _CUPS_API_1_6; -extern int ippSetValueTag(ipp_t *ipp, ipp_attribute_t **attr, - ipp_tag_t value_tag) _CUPS_API_1_6; -extern int ippSetVersion(ipp_t *ipp, int major, int minor) - _CUPS_API_1_6; - -/**** New in CUPS 1.7 ****/ -extern ipp_attribute_t *ippAddStringf(ipp_t *ipp, ipp_tag_t group, - ipp_tag_t value_tag, const char *name, - const char *language, const char *format, - ...) _CUPS_API_1_7; -extern ipp_attribute_t *ippAddStringfv(ipp_t *ipp, ipp_tag_t group, - ipp_tag_t value_tag, const char *name, - const char *language, - const char *format, va_list ap) - _CUPS_API_1_7; -extern int ippContainsInteger(ipp_attribute_t *attr, int value) - _CUPS_API_1_7; -extern int ippContainsString(ipp_attribute_t *attr, - const char *value) _CUPS_API_1_7; -extern cups_array_t *ippCreateRequestedArray(ipp_t *request) _CUPS_API_1_7; -extern void *ippGetOctetString(ipp_attribute_t *attr, int element, - int *datalen) _CUPS_API_1_7; -extern ipp_t *ippNewResponse(ipp_t *request) _CUPS_API_1_7; -extern int ippSetOctetString(ipp_t *ipp, ipp_attribute_t **attr, - int element, const void *data, - int datalen) _CUPS_API_1_7; -extern int ippSetStringf(ipp_t *ipp, ipp_attribute_t **attr, - int element, const char *format, - ...) _CUPS_API_1_7; -extern int ippSetStringfv(ipp_t *ipp, ipp_attribute_t **attr, - int element, const char *format, - va_list ap) _CUPS_API_1_7; -extern int ippValidateAttribute(ipp_attribute_t *attr) - _CUPS_API_1_7; -extern int ippValidateAttributes(ipp_t *ipp) _CUPS_API_1_7; - - -/**** New in CUPS 2.0 ****/ -extern const char *ippStateString(ipp_state_t state) _CUPS_API_2_0; - - -/* - * C++ magic... - */ # ifdef __cplusplus } -# endif /* __cplusplus */ -#endif /* !_CUPS_IPP_H_ */ +# endif // __cplusplus +#endif // !_CUPS_IPP_H_ diff --git a/cups/raster-error.c b/cups/raster-error.c index 6bc0124685..169dc0270d 100644 --- a/cups/raster-error.c +++ b/cups/raster-error.c @@ -109,15 +109,15 @@ _cupsRasterClearError(void) /* - * '_cupsRasterErrorString()' - Return the last error from a raster function. + * 'cupsRasterGetErrorString()' - Return the last error from a raster function. * * If there are no recent errors, NULL is returned. * - * @since CUPS 1.3/macOS 10.5@ + * @since CUPS 2.5@ */ const char * /* O - Last error */ -_cupsRasterErrorString(void) +cupsRasterGetErrorString(void) { _cups_globals_t *cg = _cupsGlobals(); /* Thread globals */ diff --git a/cups/raster-stream.c b/cups/raster-stream.c index c3e9f06e65..6d51a97ad0 100644 --- a/cups/raster-stream.c +++ b/cups/raster-stream.c @@ -1,39 +1,34 @@ -/* - * Raster file routines for CUPS. - * - * Copyright 2007-2019 by Apple Inc. - * Copyright 1997-2006 by Easy Software Products. - * - * This file is part of the CUPS Imaging library. - * - * Licensed under Apache License v2.0. See the file "LICENSE" for more - * information. - */ - -/* - * Include necessary headers... - */ +// +// Raster file routines for CUPS. +// +// Copyright © 2021-2023 by OpenPrinting. +// Copyright © 2007-2019 by Apple Inc. +// Copyright © 1997-2006 by Easy Software Products. +// +// Licensed under Apache License v2.0. See the file "LICENSE" for more +// information. +// #include "raster-private.h" #include "debug-internal.h" #ifdef HAVE_STDINT_H # include -#endif /* HAVE_STDINT_H */ +#endif // HAVE_STDINT_H -/* - * Private structures... - */ +// +// Private structures... +// typedef void (*_cups_copyfunc_t)(void *dst, const void *src, size_t bytes); -/* - * Local globals... - */ +// +// Local globals... +// static const char * const apple_media_types[] = -{ /* media-type values for Apple Raster */ +{ // media-type values for Apple Raster "auto", "stationery", "transparency", @@ -52,19 +47,19 @@ static const char * const apple_media_types[] = #ifdef DEBUG static const char * const cups_modes[] = -{ /* Open modes */ +{ // Open modes "CUPS_RASTER_READ", "CUPS_RASTER_WRITE", "CUPS_RASTER_WRITE_COMPRESSED", "CUPS_RASTER_WRITE_PWG", "CUPS_RASTER_WRITE_APPLE" }; -#endif /* DEBUG */ +#endif // DEBUG -/* - * Local functions... - */ +// +// Local functions... +// static ssize_t cups_raster_io(cups_raster_t *r, unsigned char *buf, size_t bytes); static ssize_t cups_raster_read(cups_raster_t *r, unsigned char *buf, size_t bytes); @@ -74,17 +69,17 @@ static void cups_swap(unsigned char *buf, size_t bytes); static void cups_swap_copy(unsigned char *dst, const unsigned char *src, size_t bytes); -/* - * '_cupsRasterColorSpaceString()' - Return the colorspace name for a - * cupsColorSpace value. - */ +// +// '_cupsRasterColorSpaceString()' - Return the colorspace name for a +// cupsColorSpace value. +// const char * _cupsRasterColorSpaceString( - cups_cspace_t cspace) /* I - cupsColorSpace value */ + cups_cspace_t cspace) // I - cupsColorSpace value { static const char * const cups_color_spaces[] = - { /* Color spaces */ + { // Color spaces "W", "RGB", "RGBA", @@ -157,15 +152,15 @@ _cupsRasterColorSpaceString( } -/* - * '_cupsRasterDelete()' - Free a raster stream. - * - * The file descriptor associated with the raster stream must be closed - * separately as needed. - */ +// +// '_cupsRasterDelete()' - Free a raster stream. +// +// The file descriptor associated with the raster stream must be closed +// separately as needed. +// void -_cupsRasterDelete(cups_raster_t *r) /* I - Stream to free */ +_cupsRasterDelete(cups_raster_t *r) // I - Stream to free { if (r != NULL) { @@ -180,32 +175,372 @@ _cupsRasterDelete(cups_raster_t *r) /* I - Stream to free */ } -/* - * '_cupsRasterInitPWGHeader()' - Initialize a page header for PWG Raster output. - * - * The "media" argument specifies the media to use. - * - * The "type" argument specifies a "pwg-raster-document-type-supported" value - * that controls the color space and bit depth of the raster data. - * - * The "xres" and "yres" arguments specify the raster resolution in dots per - * inch. - * - * The "sheet_back" argument specifies a "pwg-raster-document-sheet-back" value - * to apply for the back side of a page. Pass @code NULL@ for the front side. - * - * @since CUPS 2.2/macOS 10.12@ - */ - -int /* O - 1 on success, 0 on failure */ +// +// 'cupsRasterInitHeader()' - Initialize a page header for PWG Raster output. +// +// The "media" argument specifies the media to use. The "optimize", "quality", +// "intent", "orientation", and "sides" arguments specify additional IPP Job +// Template attribute values that are reflected in the raster header. +// +// The "type" argument specifies a "pwg-raster-document-type-supported" value +// that controls the color space and bit depth of the raster data. Supported +// values include: +// +// - "adobe-rgb_8": 8-bit per component (24-bit) AdobeRGB +// - "adobe-rgb_16": 16-bit per component (48-bit) AdobeRGB +// - "black_1": 1-bit black (K) +// - "black_8": 8-bit black (K) +// - "black_16": 16-bit black (K) +// - "cmyk_8": 8-bit per component (32-bit) CMYK +// - "cmyk_16": 16-bit per component (64-bit) CMYK +// - "device1_8" to "device15_8": 8-bit per component DeviceN +// - "device1_16" to "device15_16": 16-bit per component DeviceN +// - "rgb_8": 8-bit per component (24-bit) DeviceRGB +// - "rgb_16": 16-bit per component (32-bit) DeviceRGB +// - "sgray_1": 1-bit sGray +// - "sgray_8": 8-bit sGray +// - "sgray_16": 16-bit sGray +// - "srgb_8": 8-bit per component (24-bit) sRGB +// - "srgb_16": 16-bit per component (48-bit) sRGB +// +// The "xres" and "yres" arguments specify the raster resolution in dots per +// inch. +// +// The "sheet_back" argument specifies a "pwg-raster-document-sheet-back" value +// to apply for the back side of a page. Pass `NULL` for the front side. +// +// @since CUPS 2.5@ +// + +bool // O - `true` on success, `false` on failure +cupsRasterInitHeader( + cups_page_header2_t *h, // I - Page header + cups_media_t *media, // I - Media information + const char *optimize, // I - IPP "print-content-optimize" value + ipp_quality_t quality, // I - IPP "print-quality" value + const char *intent, // I - IPP "print-rendering-intent" value + ipp_orient_t orientation, // I - IPP "orientation-requested" value + const char *sides, // I - IPP "sides" value + const char *type, // I - PWG raster type string + int xdpi, // I - Cross-feed direction (horizontal) resolution + int ydpi, // I - Feed direction (vertical) resolution + const char *sheet_back) // I - Transform for back side or `NULL` for none +{ + unsigned i; // Looping var + static const char * const media_positions[] = + { // "media-source" to MediaPosition mapping + "auto", + "main", + "alternate", + "large-capacity", + "manual", + "envelope", + "disc", + "photo", + "hagaki", + "main-roll", + "alternate-roll", + "top", + "middle", + "bottom", + "side", + "left", + "right", + "center", + "rear", + "by-pass-tray", + "tray-1", + "tray-2", + "tray-3", + "tray-4", + "tray-5", + "tray-6", + "tray-7", + "tray-8", + "tray-9", + "tray-10", + "tray-11", + "tray-12", + "tray-13", + "tray-14", + "tray-15", + "tray-16", + "tray-17", + "tray-18", + "tray-19", + "tray-20", + "roll-1", + "roll-2", + "roll-3", + "roll-4", + "roll-5", + "roll-6", + "roll-7", + "roll-8", + "roll-9", + "roll-10" + }; + + + if (!h || !media || !type || xdpi <= 0 || ydpi <= 0) + { + _cupsRasterAddError("%s", strerror(EINVAL)); + return (false); + } + + // Initialize the page header... + memset(h, 0, sizeof(cups_page_header_t)); + + cupsCopyString(h->MediaClass, "PwgRaster", sizeof(h->MediaClass)); + cupsCopyString(h->MediaColor, media->color, sizeof(h->MediaColor)); + cupsCopyString(h->MediaType, media->type, sizeof(h->MediaType)); + + for (i = 0; i < (sizeof(media_positions) / sizeof(media_positions[0])); i ++) + { + if (!strcmp(media->source, media_positions[i])) + { + h->MediaPosition = i; + break; + } + } + + if (optimize) + cupsCopyString(h->OutputType, optimize, sizeof(h->OutputType)); + + switch (orientation) + { + default : + h->Orientation = CUPS_ORIENT_0; + break; + case IPP_ORIENT_LANDSCAPE : + h->Orientation = CUPS_ORIENT_90; + break; + case IPP_ORIENT_REVERSE_PORTRAIT : + h->Orientation = CUPS_ORIENT_180; + break; + case IPP_ORIENT_REVERSE_LANDSCAPE : + h->Orientation = CUPS_ORIENT_270; + break; + } + + cupsCopyString(h->cupsPageSizeName, media->media, sizeof(h->cupsPageSizeName)); + + if (intent) + cupsCopyString(h->cupsRenderingIntent, intent, sizeof(h->cupsRenderingIntent)); + + h->cupsInteger[CUPS_RASTER_PWG_PrintQuality] = (unsigned)quality; + + h->PageSize[0] = (unsigned)(72 * media->width / 2540); + h->PageSize[1] = (unsigned)(72 * media->length / 2540); + + // This never gets written but is needed for some applications + h->cupsPageSize[0] = 72.0f * media->width / 2540.0f; + h->cupsPageSize[1] = 72.0f * media->length / 2540.0f; + + h->ImagingBoundingBox[0] = (unsigned)(72 * media->left / 2540); + h->ImagingBoundingBox[1] = (unsigned)(72 * media->bottom / 2540); + h->ImagingBoundingBox[2] = (unsigned)(72 * (media->width - media->right) / 2540); + h->ImagingBoundingBox[3] = (unsigned)(72 * (media->length - media->top) / 2540); + + h->HWResolution[0] = (unsigned)xdpi; + h->HWResolution[1] = (unsigned)ydpi; + + h->cupsWidth = (unsigned)(media->width * xdpi / 2540); + h->cupsHeight = (unsigned)(media->length * ydpi / 2540); + + if (h->cupsWidth > 0x00ffffff || h->cupsHeight > 0x00ffffff) + { + _cupsRasterAddError("Raster dimensions too large."); + return (false); + } + + h->cupsInteger[CUPS_RASTER_PWG_ImageBoxBottom] = (unsigned)(ydpi * (media->length - media->bottom) / 2540); + h->cupsInteger[CUPS_RASTER_PWG_ImageBoxLeft] = (unsigned)(xdpi * media->left / 2540); + h->cupsInteger[CUPS_RASTER_PWG_ImageBoxRight] = (unsigned)(xdpi * (media->width - media->right) / 2540 - 1); + h->cupsInteger[CUPS_RASTER_PWG_ImageBoxTop] = (unsigned)(ydpi * media->top / 2540 - 1); + + // Colorspace and bytes per line... + if (!strcmp(type, "adobe-rgb_8")) + { + h->cupsBitsPerColor = 8; + h->cupsBitsPerPixel = 24; + h->cupsColorSpace = CUPS_CSPACE_ADOBERGB; + } + else if (!strcmp(type, "adobe-rgb_16")) + { + h->cupsBitsPerColor = 16; + h->cupsBitsPerPixel = 48; + h->cupsColorSpace = CUPS_CSPACE_ADOBERGB; + } + else if (!strcmp(type, "black_1")) + { + h->cupsBitsPerColor = 1; + h->cupsBitsPerPixel = 1; + h->cupsColorSpace = CUPS_CSPACE_K; + } + else if (!strcmp(type, "black_8")) + { + h->cupsBitsPerColor = 8; + h->cupsBitsPerPixel = 8; + h->cupsColorSpace = CUPS_CSPACE_K; + } + else if (!strcmp(type, "black_16")) + { + h->cupsBitsPerColor = 16; + h->cupsBitsPerPixel = 16; + h->cupsColorSpace = CUPS_CSPACE_K; + } + else if (!strcmp(type, "cmyk_8")) + { + h->cupsBitsPerColor = 8; + h->cupsBitsPerPixel = 32; + h->cupsColorSpace = CUPS_CSPACE_CMYK; + } + else if (!strcmp(type, "cmyk_16")) + { + h->cupsBitsPerColor = 16; + h->cupsBitsPerPixel = 64; + h->cupsColorSpace = CUPS_CSPACE_CMYK; + } + else if (!strncmp(type, "device", 6) && type[6] >= '1' && type[6] <= '9') + { + int ncolors, bits; // Number of colors and bits + + if (sscanf(type, "device%d_%d", &ncolors, &bits) != 2 || ncolors > 15 || (bits != 8 && bits != 16)) + { + _cupsRasterAddError("Unsupported raster type \'%s\'.", type); + return (false); + } + + h->cupsBitsPerColor = (unsigned)bits; + h->cupsBitsPerPixel = (unsigned)(ncolors * bits); + h->cupsColorSpace = (cups_cspace_t)(CUPS_CSPACE_DEVICE1 + ncolors - 1); + } + else if (!strcmp(type, "rgb_8")) + { + h->cupsBitsPerColor = 8; + h->cupsBitsPerPixel = 24; + h->cupsColorSpace = CUPS_CSPACE_RGB; + } + else if (!strcmp(type, "rgb_16")) + { + h->cupsBitsPerColor = 16; + h->cupsBitsPerPixel = 48; + h->cupsColorSpace = CUPS_CSPACE_RGB; + } + else if (!strcmp(type, "sgray_1")) + { + h->cupsBitsPerColor = 1; + h->cupsBitsPerPixel = 1; + h->cupsColorSpace = CUPS_CSPACE_SW; + } + else if (!strcmp(type, "sgray_8")) + { + h->cupsBitsPerColor = 8; + h->cupsBitsPerPixel = 8; + h->cupsColorSpace = CUPS_CSPACE_SW; + } + else if (!strcmp(type, "sgray_16")) + { + h->cupsBitsPerColor = 16; + h->cupsBitsPerPixel = 16; + h->cupsColorSpace = CUPS_CSPACE_SW; + } + else if (!strcmp(type, "srgb_8")) + { + h->cupsBitsPerColor = 8; + h->cupsBitsPerPixel = 24; + h->cupsColorSpace = CUPS_CSPACE_SRGB; + } + else if (!strcmp(type, "srgb_16")) + { + h->cupsBitsPerColor = 16; + h->cupsBitsPerPixel = 48; + h->cupsColorSpace = CUPS_CSPACE_SRGB; + } + else + { + _cupsRasterAddError("Unsupported raster type \'%s\'.", type); + return (false); + } + + h->cupsColorOrder = CUPS_ORDER_CHUNKED; + h->cupsNumColors = h->cupsBitsPerPixel / h->cupsBitsPerColor; + h->cupsBytesPerLine = (h->cupsWidth * h->cupsBitsPerPixel + 7) / 8; + + // Duplex support... + h->cupsInteger[CUPS_RASTER_PWG_CrossFeedTransform] = 1; + h->cupsInteger[CUPS_RASTER_PWG_FeedTransform] = 1; + + if (sides) + { + if (!strcmp(sides, "two-sided-long-edge")) + { + h->Duplex = 1; + } + else if (!strcmp(sides, "two-sided-short-edge")) + { + h->Duplex = 1; + h->Tumble = 1; + } + else if (strcmp(sides, "one-sided")) + { + _cupsRasterAddError("Unsupported sides value '%s'.", sides); + return (false); + } + + if (sheet_back) + { + if (!strcmp(sheet_back, "flipped")) + { + if (h->Tumble) + h->cupsInteger[CUPS_RASTER_PWG_CrossFeedTransform] = 0xffffffffU; + else + h->cupsInteger[CUPS_RASTER_PWG_FeedTransform] = 0xffffffffU; + } + else if ((!strcmp(sheet_back, "manual-tumble") && h->Tumble) || (!strcmp(sheet_back, "rotated") || !h->Tumble)) + { + h->cupsInteger[CUPS_RASTER_PWG_CrossFeedTransform] = 0xffffffffU; + h->cupsInteger[CUPS_RASTER_PWG_FeedTransform] = 0xffffffffU; + } + else if (strcmp(sheet_back, "normal")) + { + _cupsRasterAddError("Unsupported sheet_back value '%s'.", sheet_back); + return (false); + } + } + } + + return (true); +} + + +// +// '_cupsRasterInitPWGHeader()' - Initialize a page header for PWG Raster output. +// +// The "media" argument specifies the media to use. +// +// The "type" argument specifies a "pwg-raster-document-type-supported" value +// that controls the color space and bit depth of the raster data. +// +// The "xres" and "yres" arguments specify the raster resolution in dots per +// inch. +// +// The "sheet_back" argument specifies a "pwg-raster-document-sheet-back" value +// to apply for the back side of a page. Pass `NULL` for the front side. +// +// @since CUPS 2.2/macOS 10.12@ +// + +int // O - 1 on success, 0 on failure _cupsRasterInitPWGHeader( - cups_page_header2_t *h, /* I - Page header */ - pwg_media_t *media, /* I - PWG media information */ - const char *type, /* I - PWG raster type string */ - int xdpi, /* I - Cross-feed direction (horizontal) resolution */ - int ydpi, /* I - Feed direction (vertical) resolution */ - const char *sides, /* I - IPP "sides" option value */ - const char *sheet_back) /* I - Transform for back side or @code NULL@ for none */ + cups_page_header2_t *h, // I - Page header + pwg_media_t *media, // I - PWG media information + const char *type, // I - PWG raster type string + int xdpi, // I - Cross-feed direction (horizontal) resolution + int ydpi, // I - Feed direction (vertical) resolution + const char *sides, // I - IPP "sides" option value + const char *sheet_back) // I - Transform for back side or `NULL` for none { if (!h || !media || !type || xdpi <= 0 || ydpi <= 0) { @@ -213,10 +548,7 @@ _cupsRasterInitPWGHeader( return (0); } - /* - * Initialize the page header... - */ - + // Initialize the page header... memset(h, 0, sizeof(cups_page_header2_t)); cupsCopyString(h->cupsPageSizeName, media->pwg, sizeof(h->cupsPageSizeName)); @@ -224,7 +556,7 @@ _cupsRasterInitPWGHeader( h->PageSize[0] = (unsigned)(72 * media->width / 2540); h->PageSize[1] = (unsigned)(72 * media->length / 2540); - /* This never gets written but is needed for some applications */ + // This never gets written but is needed for some applications h->cupsPageSize[0] = 72.0f * media->width / 2540.0f; h->cupsPageSize[1] = 72.0f * media->length / 2540.0f; @@ -246,10 +578,7 @@ _cupsRasterInitPWGHeader( h->cupsInteger[CUPS_RASTER_PWG_ImageBoxRight] = h->cupsWidth; h->cupsInteger[CUPS_RASTER_PWG_ImageBoxBottom] = h->cupsHeight; - /* - * Colorspace and bytes per line... - */ - + // Colorspace and bytes per line... if (!strcmp(type, "adobe-rgb_8")) { h->cupsBitsPerColor = 8; @@ -294,7 +623,7 @@ _cupsRasterInitPWGHeader( } else if (!strncmp(type, "device", 6) && type[6] >= '1' && type[6] <= '9') { - int ncolors, bits; /* Number of colors and bits */ + int ncolors, bits; // Number of colors and bits if (sscanf(type, "device%d_%d", &ncolors, &bits) != 2 || ncolors > 15 || (bits != 8 && bits != 16)) @@ -359,10 +688,7 @@ _cupsRasterInitPWGHeader( h->cupsNumColors = h->cupsBitsPerPixel / h->cupsBitsPerColor; h->cupsBytesPerLine = (h->cupsWidth * h->cupsBitsPerPixel + 7) / 8; - /* - * Duplex support... - */ - + // Duplex support... h->cupsInteger[CUPS_RASTER_PWG_CrossFeedTransform] = 1; h->cupsInteger[CUPS_RASTER_PWG_FeedTransform] = 1; @@ -420,28 +746,25 @@ _cupsRasterInitPWGHeader( } -/* - * '_cupsRasterNew()' - Create a raster stream using a callback function. - * - * This function associates a raster stream with the given callback function and - * context pointer. - * - * When writing raster data, the @code CUPS_RASTER_WRITE@, - * @code CUPS_RASTER_WRITE_COMPRESS@, or @code CUPS_RASTER_WRITE_PWG@ mode can - * be used - compressed and PWG output is generally 25-50% smaller but adds a - * 100-300% execution time overhead. - */ +// +// '_cupsRasterNew()' - Create a raster stream using a callback function. +// +// This function associates a raster stream with the given callback function and +// context pointer. +// +// When writing raster data, the `CUPS_RASTER_WRITE`, +// `CUPS_RASTER_WRITE_COMPRESS`, or `CUPS_RASTER_WRITE_PWG` mode can +// be used - compressed and PWG output is generally 25-50% smaller but adds a +// 100-300% execution time overhead. +// -cups_raster_t * /* O - New stream */ +cups_raster_t * // O - New stream _cupsRasterNew( - cups_raster_iocb_t iocb, /* I - Read/write callback */ - void *ctx, /* I - Context pointer for callback */ - cups_mode_t mode) /* I - Mode - @code CUPS_RASTER_READ@, - @code CUPS_RASTER_WRITE@, - @code CUPS_RASTER_WRITE_COMPRESSED@, - or @code CUPS_RASTER_WRITE_PWG@ */ + cups_raster_cb_t iocb, // I - Read/write callback + void *ctx, // I - Context pointer for callback + cups_raster_mode_t mode) // I - Mode - `CUPS_RASTER_READ`, `CUPS_RASTER_WRITE`, `CUPS_RASTER_WRITE_COMPRESSED`, or `CUPS_RASTER_WRITE_PWG` { - cups_raster_t *r; /* New stream */ + cups_raster_t *r; // New stream DEBUG_printf("_cupsRasterOpenIO(iocb=%p, ctx=%p, mode=%s)", (void *)iocb, ctx, cups_modes[mode]); @@ -450,8 +773,7 @@ _cupsRasterNew( if ((r = calloc(1, sizeof(cups_raster_t))) == NULL) { - _cupsRasterAddError("Unable to allocate memory for raster stream: %s\n", - strerror(errno)); + _cupsRasterAddError("Unable to allocate memory for raster stream: %s\n", strerror(errno)); DEBUG_puts("1_cupsRasterOpenIO: Returning NULL."); return (NULL); } @@ -462,28 +784,16 @@ _cupsRasterNew( if (mode == CUPS_RASTER_READ) { - /* - * Open for read - get sync word... - */ - - if (cups_raster_io(r, (unsigned char *)&(r->sync), sizeof(r->sync)) != - sizeof(r->sync)) + // Open for read - get sync word... + if (cups_raster_io(r, (unsigned char *)&(r->sync), sizeof(r->sync)) != sizeof(r->sync)) { - _cupsRasterAddError("Unable to read header from raster stream: %s\n", - strerror(errno)); + _cupsRasterAddError("Unable to read header from raster stream: %s\n", strerror(errno)); free(r); DEBUG_puts("1_cupsRasterOpenIO: Unable to read header, returning NULL."); return (NULL); } - if (r->sync != CUPS_RASTER_SYNC && - r->sync != CUPS_RASTER_REVSYNC && - r->sync != CUPS_RASTER_SYNCv1 && - r->sync != CUPS_RASTER_REVSYNCv1 && - r->sync != CUPS_RASTER_SYNCv2 && - r->sync != CUPS_RASTER_REVSYNCv2 && - r->sync != CUPS_RASTER_SYNCapple && - r->sync != CUPS_RASTER_REVSYNCapple) + if (r->sync != CUPS_RASTER_SYNC && r->sync != CUPS_RASTER_REVSYNC && r->sync != CUPS_RASTER_SYNCv1 && r->sync != CUPS_RASTER_REVSYNCv1 && r->sync != CUPS_RASTER_SYNCv2 && r->sync != CUPS_RASTER_REVSYNCv2 && r->sync != CUPS_RASTER_SYNCapple && r->sync != CUPS_RASTER_REVSYNCapple) { _cupsRasterAddError("Unknown raster format %08x!\n", r->sync); free(r); @@ -491,30 +801,21 @@ _cupsRasterNew( return (NULL); } - if (r->sync == CUPS_RASTER_SYNCv2 || - r->sync == CUPS_RASTER_REVSYNCv2 || - r->sync == CUPS_RASTER_SYNCapple || - r->sync == CUPS_RASTER_REVSYNCapple) + if (r->sync == CUPS_RASTER_SYNCv2 || r->sync == CUPS_RASTER_REVSYNCv2 || r->sync == CUPS_RASTER_SYNCapple || r->sync == CUPS_RASTER_REVSYNCapple) r->compressed = 1; DEBUG_printf("1_cupsRasterOpenIO: sync=%08x", r->sync); - if (r->sync == CUPS_RASTER_REVSYNC || - r->sync == CUPS_RASTER_REVSYNCv1 || - r->sync == CUPS_RASTER_REVSYNCv2 || - r->sync == CUPS_RASTER_REVSYNCapple) + if (r->sync == CUPS_RASTER_REVSYNC || r->sync == CUPS_RASTER_REVSYNCv1 || r->sync == CUPS_RASTER_REVSYNCv2 || r->sync == CUPS_RASTER_REVSYNCapple) r->swapped = 1; - if (r->sync == CUPS_RASTER_SYNCapple || - r->sync == CUPS_RASTER_REVSYNCapple) + if (r->sync == CUPS_RASTER_SYNCapple || r->sync == CUPS_RASTER_REVSYNCapple) { - unsigned char header[8]; /* File header */ + unsigned char header[8]; // File header - if (cups_raster_io(r, (unsigned char *)header, sizeof(header)) != - sizeof(header)) + if (cups_raster_io(r, (unsigned char *)header, sizeof(header)) != sizeof(header)) { - _cupsRasterAddError("Unable to read header from raster stream: %s\n", - strerror(errno)); + _cupsRasterAddError("Unable to read header from raster stream: %s\n", strerror(errno)); free(r); DEBUG_puts("1_cupsRasterOpenIO: Unable to read header, returning NULL."); return (NULL); @@ -523,14 +824,11 @@ _cupsRasterNew( #ifdef DEBUG r->iostart = r->iocount; -#endif /* DEBUG */ +#endif // DEBUG } else { - /* - * Open for write - put sync word... - */ - + // Open for write - put sync word... switch (mode) { default : @@ -559,8 +857,7 @@ _cupsRasterNew( if (cups_raster_io(r, (unsigned char *)&(r->sync), sizeof(r->sync)) < (ssize_t)sizeof(r->sync)) { - _cupsRasterAddError("Unable to write raster stream header: %s\n", - strerror(errno)); + _cupsRasterAddError("Unable to write raster stream header: %s\n", strerror(errno)); free(r); DEBUG_puts("1_cupsRasterOpenIO: Unable to write header, returning NULL."); return (NULL); @@ -573,15 +870,15 @@ _cupsRasterNew( } -/* - * '_cupsRasterReadHeader()' - Read a raster page header. - */ +// +// '_cupsRasterReadHeader()' - Read a raster page header. +// -unsigned /* O - 1 on success, 0 on fail */ +unsigned // O - 1 on success, 0 on fail _cupsRasterReadHeader( - cups_raster_t *r) /* I - Raster stream */ + cups_raster_t *r) // I - Raster stream { - size_t len; /* Length for read/swap */ + size_t len; // Length for read/swap DEBUG_printf("3_cupsRasterReadHeader(r=%p), r->mode=%s", (void *)r, r ? cups_modes[r->mode] : ""); @@ -593,17 +890,11 @@ _cupsRasterReadHeader( memset(&(r->header), 0, sizeof(r->header)); - /* - * Read the header... - */ - + // Read the header... switch (r->sync) { default : - /* - * Get the length of the raster header... - */ - + // Get the length of the raster header... if (r->sync == CUPS_RASTER_SYNCv1 || r->sync == CUPS_RASTER_REVSYNCv1) len = sizeof(cups_page_header_t); else @@ -611,37 +902,25 @@ _cupsRasterReadHeader( DEBUG_printf("4_cupsRasterReadHeader: len=%d", (int)len); - /* - * Read it... - */ - + // Read it... if (cups_raster_read(r, (unsigned char *)&(r->header), len) < (ssize_t)len) { DEBUG_printf("4_cupsRasterReadHeader: EOF, r->iocount=" CUPS_LLFMT, CUPS_LLCAST r->iocount); return (0); } - /* - * Swap bytes as needed... - */ - + // Swap bytes as needed... if (r->swapped) { - unsigned *s, /* Current word */ - temp; /* Temporary copy */ - + unsigned *s, // Current word + temp; // Temporary copy DEBUG_puts("4_cupsRasterReadHeader: Swapping header bytes."); - for (len = 81, s = &(r->header.AdvanceDistance); - len > 0; - len --, s ++) + for (len = 81, s = &(r->header.AdvanceDistance); len > 0; len --, s ++) { temp = *s; - *s = ((temp & 0xff) << 24) | - ((temp & 0xff00) << 8) | - ((temp & 0xff0000) >> 8) | - ((temp & 0xff000000) >> 24); + *s = ((temp & 0xff) << 24) | ((temp & 0xff00) << 8) | ((temp & 0xff0000) >> 8) | ((temp & 0xff000000) >> 24); DEBUG_printf("4_cupsRasterReadHeader: %08x => %08x", temp, *s); } @@ -651,7 +930,7 @@ _cupsRasterReadHeader( case CUPS_RASTER_SYNCapple : case CUPS_RASTER_REVSYNCapple : { - unsigned char appleheader[32]; /* Raw header */ + unsigned char appleheader[32]; // Raw header static const unsigned rawcspace[] = { CUPS_CSPACE_SW, @@ -680,7 +959,7 @@ _cupsRasterReadHeader( } cupsCopyString(r->header.MediaClass, "PwgRaster", sizeof(r->header.MediaClass)); - /* PwgRaster */ + // PwgRaster r->header.cupsBitsPerPixel = appleheader[0]; r->header.cupsColorSpace = appleheader[1] >= (sizeof(rawcspace) / sizeof(rawcspace[0])) ? CUPS_CSPACE_DEVICE1 : rawcspace[appleheader[1]]; r->header.cupsNumColors = appleheader[1] >= (sizeof(rawnumcolors) / sizeof(rawnumcolors[0])) ? 1 : rawnumcolors[appleheader[1]]; @@ -717,10 +996,7 @@ _cupsRasterReadHeader( break; } - /* - * Update the header and row count... - */ - + // Update the header and row count... if (!cups_raster_update(r)) return (0); @@ -736,27 +1012,27 @@ _cupsRasterReadHeader( } -/* - * '_cupsRasterReadPixels()' - Read raster pixels. - * - * For best performance, filters should read one or more whole lines. - * The "cupsBytesPerLine" value from the page header can be used to allocate - * the line buffer and as the number of bytes to read. - */ +// +// '_cupsRasterReadPixels()' - Read raster pixels. +// +// For best performance, filters should read one or more whole lines. +// The "cupsBytesPerLine" value from the page header can be used to allocate +// the line buffer and as the number of bytes to read. +// -unsigned /* O - Number of bytes read */ +unsigned // O - Number of bytes read _cupsRasterReadPixels( - cups_raster_t *r, /* I - Raster stream */ - unsigned char *p, /* I - Pointer to pixel buffer */ - unsigned len) /* I - Number of bytes to read */ + cups_raster_t *r, // I - Raster stream + unsigned char *p, // I - Pointer to pixel buffer + unsigned len) // I - Number of bytes to read { - ssize_t bytes; /* Bytes read */ - unsigned cupsBytesPerLine; /* cupsBytesPerLine value */ - unsigned remaining; /* Bytes remaining */ - unsigned char *ptr, /* Pointer to read buffer */ - byte, /* Byte from file */ - *temp; /* Pointer into buffer */ - unsigned count; /* Repetition count */ + ssize_t bytes; // Bytes read + unsigned cupsBytesPerLine; // cupsBytesPerLine value + unsigned remaining; // Bytes remaining + unsigned char *ptr, // Pointer to read buffer + byte, // Byte from file + *temp; // Pointer into buffer + unsigned count; // Repetition count DEBUG_printf("_cupsRasterReadPixels(r=%p, p=%p, len=%u)", (void *)r, (void *)p, len); @@ -772,10 +1048,7 @@ _cupsRasterReadPixels( if (!r->compressed) { - /* - * Read without compression... - */ - + // Read without compression... r->remaining -= len / r->header.cupsBytesPerLine; if (cups_raster_io(r, p, len) < (ssize_t)len) @@ -784,29 +1057,20 @@ _cupsRasterReadPixels( return (0); } - /* - * Swap bytes as needed... - */ - + // Swap bytes as needed... if (r->swapped && (r->header.cupsBitsPerColor == 16 || r->header.cupsBitsPerPixel == 12 || r->header.cupsBitsPerPixel == 16)) cups_swap(p, len); - /* - * Return... - */ - + // Return... DEBUG_printf("1_cupsRasterReadPixels: Returning %u", len); return (len); } - /* - * Read compressed data... - */ - + // Read compressed data... remaining = len; cupsBytesPerLine = r->header.cupsBytesPerLine; @@ -814,19 +1078,13 @@ _cupsRasterReadPixels( { if (r->count == 0) { - /* - * Need to read a new row... - */ - + // Need to read a new row... if (remaining == cupsBytesPerLine) ptr = p; else ptr = r->pixels; - /* - * Read using a modified PackBits compression... - */ - + // Read using a modified PackBits compression... if (!cups_raster_read(r, &byte, 1)) { DEBUG_puts("1_cupsRasterReadPixels: Read error, returning 0."); @@ -843,10 +1101,7 @@ _cupsRasterReadPixels( while (bytes > 0) { - /* - * Get a new repeat count... - */ - + // Get a new repeat count... if (!cups_raster_read(r, &byte, 1)) { DEBUG_puts("1_cupsRasterReadPixels: Read error, returning 0."); @@ -855,10 +1110,7 @@ _cupsRasterReadPixels( if (byte == 128) { - /* - * Clear to end of line... - */ - + // Clear to end of line... switch (r->header.cupsColorSpace) { case CUPS_CSPACE_W : @@ -879,10 +1131,7 @@ _cupsRasterReadPixels( } else if (byte & 128) { - /* - * Copy N literal pixels... - */ - + // Copy N literal pixels... count = (unsigned)(257 - byte) * r->bpp; if (count > (unsigned)bytes) @@ -899,10 +1148,7 @@ _cupsRasterReadPixels( } else { - /* - * Repeat the next N bytes... - */ - + // Repeat the next N bytes... count = ((unsigned)byte + 1) * r->bpp; if (count > (unsigned)bytes) count = (unsigned)bytes; @@ -930,10 +1176,7 @@ _cupsRasterReadPixels( } } - /* - * Swap bytes as needed... - */ - + // Swap bytes as needed... if ((r->header.cupsBitsPerColor == 16 || r->header.cupsBitsPerPixel == 12 || r->header.cupsBitsPerPixel == 16) && @@ -943,10 +1186,7 @@ _cupsRasterReadPixels( cups_swap(ptr, (size_t)cupsBytesPerLine); } - /* - * Update pointers... - */ - + // Update pointers... if (remaining >= cupsBytesPerLine) { bytes = (ssize_t)cupsBytesPerLine; @@ -960,19 +1200,13 @@ _cupsRasterReadPixels( r->pcurrent = r->pixels + bytes; } - /* - * Copy data as needed... - */ - + // Copy data as needed... if (ptr != p) memcpy(p, ptr, (size_t)bytes); } else { - /* - * Copy fragment from buffer... - */ - + // Copy fragment from buffer... if ((unsigned)(bytes = (int)(r->pend - r->pcurrent)) > remaining) bytes = (ssize_t)remaining; @@ -997,13 +1231,13 @@ _cupsRasterReadPixels( } -/* - * '_cupsRasterWriteHeader()' - Write a raster page header. - */ +// +// '_cupsRasterWriteHeader()' - Write a raster page header. +// -unsigned /* O - 1 on success, 0 on failure */ +unsigned // O - 1 on success, 0 on failure _cupsRasterWriteHeader( - cups_raster_t *r) /* I - Raster stream */ + cups_raster_t *r) // I - Raster stream { DEBUG_printf("_cupsRasterWriteHeader(r=%p)", (void *)r); @@ -1014,10 +1248,7 @@ _cupsRasterWriteHeader( DEBUG_printf("1_cupsRasterWriteHeader: cupsWidth=%u", r->header.cupsWidth); DEBUG_printf("1_cupsRasterWriteHeader: cupsHeight=%u", r->header.cupsHeight); - /* - * Compute the number of raster lines in the page image... - */ - + // Compute the number of raster lines in the page image... if (!cups_raster_update(r)) { DEBUG_puts("1_cupsRasterWriteHeader: Unable to update parameters, returning 0."); @@ -1034,18 +1265,11 @@ _cupsRasterWriteHeader( else r->rowheight = 1; - /* - * Write the raster header... - */ - + // Write the raster header... if (r->mode == CUPS_RASTER_WRITE_PWG) { - /* - * PWG raster data is always network byte order with much of the page header - * zeroed. - */ - - cups_page_header2_t fh; /* File page header */ + // PWG raster data is always network byte order with much of the page header zeroed. + cups_page_header2_t fh; // File page header memset(&fh, 0, sizeof(fh)); cupsCopyString(fh.MediaClass, "PwgRaster", sizeof(fh.MediaClass)); @@ -1097,22 +1321,15 @@ _cupsRasterWriteHeader( } else if (r->mode == CUPS_RASTER_WRITE_APPLE) { - /* - * Raw raster data is always network byte order with most of the page header - * zeroed. - */ - - int i; /* Looping var */ - unsigned char appleheader[32];/* Raw page header */ + // Raw raster data is always network byte order with most of the page header zeroed. + int i; // Looping var + unsigned char appleheader[32];// Raw page header unsigned height = r->header.cupsHeight * r->rowheight; - /* Computed page height */ + // Computed page height if (r->apple_page_count == 0xffffffffU) { - /* - * Write raw page count from raster page header... - */ - + // Write raw page count from raster page header... r->apple_page_count = r->header.cupsInteger[0]; appleheader[0] = 'A'; @@ -1170,22 +1387,22 @@ _cupsRasterWriteHeader( } -/* - * '_cupsRasterWritePixels()' - Write raster pixels. - * - * For best performance, filters should write one or more whole lines. - * The "cupsBytesPerLine" value from the page header can be used to allocate - * the line buffer and as the number of bytes to write. - */ +// +// '_cupsRasterWritePixels()' - Write raster pixels. +// +// For best performance, filters should write one or more whole lines. +// The "cupsBytesPerLine" value from the page header can be used to allocate +// the line buffer and as the number of bytes to write. +// -unsigned /* O - Number of bytes written */ +unsigned // O - Number of bytes written _cupsRasterWritePixels( - cups_raster_t *r, /* I - Raster stream */ - unsigned char *p, /* I - Bytes to write */ - unsigned len) /* I - Number of bytes to write */ + cups_raster_t *r, // I - Raster stream + unsigned char *p, // I - Bytes to write + unsigned len) // I - Number of bytes to write { - ssize_t bytes; /* Bytes read */ - unsigned remaining; /* Bytes remaining */ + ssize_t bytes; // Bytes read + unsigned remaining; // Bytes remaining DEBUG_printf("_cupsRasterWritePixels(r=%p, p=%p, len=%u), remaining=%u", (void *)r, (void *)p, len, r->remaining); @@ -1195,11 +1412,7 @@ _cupsRasterWritePixels( if (!r->compressed) { - /* - * Without compression, just write the raster data raw unless the data needs - * to be swapped... - */ - + // Without compression, just write the raster data raw unless the data needs to be swapped... r->remaining -= len / r->header.cupsBytesPerLine; if (r->swapped && @@ -1207,12 +1420,9 @@ _cupsRasterWritePixels( r->header.cupsBitsPerPixel == 12 || r->header.cupsBitsPerPixel == 16)) { - unsigned char *bufptr; /* Pointer into write buffer */ - - /* - * Allocate a write buffer as needed... - */ + unsigned char *bufptr; // Pointer into write buffer + // Allocate a write buffer as needed... if ((size_t)len > r->bufsize) { if (r->buffer) @@ -1227,10 +1437,7 @@ _cupsRasterWritePixels( r->bufsize = len; } - /* - * Byte swap the pixels and write them... - */ - + // Byte swap the pixels and write them... cups_swap_copy(r->buffer, p, len); bytes = cups_raster_io(r, r->buffer, len); @@ -1244,25 +1451,16 @@ _cupsRasterWritePixels( return (len); } - /* - * Otherwise, compress each line... - */ - + // Otherwise, compress each line... for (remaining = len; remaining > 0; remaining -= (unsigned)bytes, p += bytes) { - /* - * Figure out the number of remaining bytes on the current line... - */ - + // Figure out the number of remaining bytes on the current line... if ((bytes = (ssize_t)remaining) > (ssize_t)(r->pend - r->pcurrent)) bytes = (ssize_t)(r->pend - r->pcurrent); if (r->count > 0) { - /* - * Check to see if this line is the same as the previous line... - */ - + // Check to see if this line is the same as the previous line... if (memcmp(p, r->pcurrent, (size_t)bytes)) { if (cups_raster_write(r, r->pixels) <= 0) @@ -1272,25 +1470,16 @@ _cupsRasterWritePixels( } else { - /* - * Mark more bytes as the same... - */ - + // Mark more bytes as the same... r->pcurrent += bytes; if (r->pcurrent >= r->pend) { - /* - * Increase the repeat count... - */ - + // Increase the repeat count... r->count += r->rowheight; r->pcurrent = r->pixels; - /* - * Flush out this line if it is the last one... - */ - + // Flush out this line if it is the last one... r->remaining --; if (r->remaining == 0) @@ -1315,27 +1504,18 @@ _cupsRasterWritePixels( if (r->count == 0) { - /* - * Copy the raster data to the buffer... - */ - + // Copy the raster data to the buffer... memcpy(r->pcurrent, p, (size_t)bytes); r->pcurrent += bytes; if (r->pcurrent >= r->pend) { - /* - * Increase the repeat count... - */ - + // Increase the repeat count... r->count += r->rowheight; r->pcurrent = r->pixels; - /* - * Flush out this line if it is the last one... - */ - + // Flush out this line if it is the last one... r->remaining --; if (r->remaining == 0) @@ -1351,17 +1531,17 @@ _cupsRasterWritePixels( } -/* - * 'cups_raster_io()' - Read/write bytes from a context, handling interruptions. - */ +// +// 'cups_raster_io()' - Read/write bytes from a context, handling interruptions. +// -static ssize_t /* O - Bytes read/write or -1 */ -cups_raster_io(cups_raster_t *r, /* I - Raster stream */ - unsigned char *buf, /* I - Buffer for read/write */ - size_t bytes) /* I - Number of bytes to read/write */ +static ssize_t // O - Bytes read/write or -1 +cups_raster_io(cups_raster_t *r, // I - Raster stream + unsigned char *buf, // I - Buffer for read/write + size_t bytes) // I - Number of bytes to read/write { - ssize_t count, /* Number of bytes read/written */ - total; /* Total bytes read/written */ + ssize_t count, // Number of bytes read/written + total; // Total bytes read/written DEBUG_printf("5cups_raster_io(r=%p, buf=%p, bytes=" CUPS_LLFMT ")", (void *)r, (void *)buf, CUPS_LLCAST bytes); @@ -1385,7 +1565,7 @@ cups_raster_io(cups_raster_t *r, /* I - Raster stream */ #ifdef DEBUG r->iocount += (size_t)count; -#endif /* DEBUG */ +#endif // DEBUG } DEBUG_printf("6cups_raster_io: iocount=" CUPS_LLFMT, CUPS_LLCAST r->iocount); @@ -1395,18 +1575,18 @@ cups_raster_io(cups_raster_t *r, /* I - Raster stream */ } -/* - * 'cups_raster_read()' - Read through the raster buffer. - */ +// +// 'cups_raster_read()' - Read through the raster buffer. +// -static ssize_t /* O - Number of bytes read */ -cups_raster_read(cups_raster_t *r, /* I - Raster stream */ - unsigned char *buf, /* I - Buffer */ - size_t bytes) /* I - Number of bytes to read */ +static ssize_t // O - Number of bytes read +cups_raster_read(cups_raster_t *r, // I - Raster stream + unsigned char *buf, // I - Buffer + size_t bytes) // I - Number of bytes to read { - ssize_t count, /* Number of bytes read */ - remaining, /* Remaining bytes in buffer */ - total; /* Total bytes read */ + ssize_t count, // Number of bytes read + remaining, // Remaining bytes in buffer + total; // Total bytes read DEBUG_printf("4cups_raster_read(r=%p, buf=%p, bytes=" CUPS_LLFMT "), offset=" CUPS_LLFMT, (void *)r, (void *)buf, CUPS_LLCAST bytes, CUPS_LLCAST (r->iostart + (ssize_t)(r->bufptr - r->buffer))); @@ -1414,10 +1594,7 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */ if (!r->compressed) return (cups_raster_io(r, buf, bytes)); - /* - * Allocate a read buffer as needed... - */ - + // Allocate a read buffer as needed... count = (ssize_t)(2 * r->header.cupsBytesPerLine); if (count < 65536) count = 65536; @@ -1425,9 +1602,9 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */ if ((size_t)count > r->bufsize) { ssize_t offset = r->bufptr - r->buffer; - /* Offset to current start of buffer */ - ssize_t end = r->bufend - r->buffer;/* Offset to current end of buffer */ - unsigned char *rptr; /* Pointer in read buffer */ + // Offset to current start of buffer + ssize_t end = r->bufend - r->buffer;// Offset to current end of buffer + unsigned char *rptr; // Pointer in read buffer if (r->buffer) rptr = realloc(r->buffer, (size_t)count); @@ -1443,10 +1620,7 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */ r->bufsize = (size_t)count; } - /* - * Loop until we have read everything... - */ - + // Loop until we have read everything... for (total = 0, remaining = (int)(r->bufend - r->bufptr); total < (ssize_t)bytes; total += count, buf += count) @@ -1459,13 +1633,10 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */ { if (count < 16) { - /* - * Read into the raster buffer and then copy... - */ - + // Read into the raster buffer and then copy... #ifdef DEBUG r->iostart += (size_t)(r->bufend - r->buffer); -#endif /* DEBUG */ +#endif // DEBUG remaining = (*r->iocb)(r->ctx, r->buffer, r->bufsize); if (remaining <= 0) @@ -1476,14 +1647,11 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */ #ifdef DEBUG r->iocount += (size_t)remaining; -#endif /* DEBUG */ +#endif // DEBUG } else { - /* - * Read directly into "buf"... - */ - + // Read directly into "buf"... count = (*r->iocb)(r->ctx, buf, (size_t)count); if (count <= 0) @@ -1492,37 +1660,28 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */ #ifdef DEBUG r->iostart += (size_t)count; r->iocount += (size_t)count; -#endif /* DEBUG */ +#endif // DEBUG continue; } } - /* - * Copy bytes from raster buffer to "buf"... - */ - + // Copy bytes from raster buffer to "buf"... if (count > remaining) count = remaining; if (count == 1) { - /* - * Copy 1 byte... - */ - + // Copy 1 byte... *buf = *(r->bufptr)++; remaining --; } else if (count < 128) { - /* - * Copy up to 127 bytes without using memcpy(); this is - * faster because it avoids an extra function call and is - * often further optimized by the compiler... - */ - - unsigned char *bufptr; /* Temporary buffer pointer */ + // Copy up to 127 bytes without using memcpy(); this is faster because it + // avoids an extra function call and is often further optimized by the + // compiler... + unsigned char *bufptr; // Temporary buffer pointer remaining -= count; @@ -1533,10 +1692,7 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */ } else { - /* - * Use memcpy() for a large read... - */ - + // Use memcpy() for a large read... memcpy(buf, r->bufptr, (size_t)count); r->bufptr += count; remaining -= count; @@ -1549,21 +1705,18 @@ cups_raster_read(cups_raster_t *r, /* I - Raster stream */ } -/* - * 'cups_raster_update()' - Update the raster header and row count for the - * current page. - */ +// +// 'cups_raster_update()' - Update the raster header and row count for the +// current page. +// -static int /* O - 1 on success, 0 on failure */ -cups_raster_update(cups_raster_t *r) /* I - Raster stream */ +static int // O - 1 on success, 0 on failure +cups_raster_update(cups_raster_t *r) // I - Raster stream { if (r->sync == CUPS_RASTER_SYNCv1 || r->sync == CUPS_RASTER_REVSYNCv1 || r->header.cupsNumColors == 0) { - /* - * Set the "cupsNumColors" field according to the colorspace... - */ - + // Set the "cupsNumColors" field according to the colorspace... switch (r->header.cupsColorSpace) { case CUPS_CSPACE_W : @@ -1637,15 +1790,12 @@ cups_raster_update(cups_raster_t *r) /* I - Raster stream */ break; default : - /* Unknown color space */ + // Unknown color space return (0); } } - /* - * Set the number of bytes per pixel/color... - */ - + // Set the number of bytes per pixel/color... if (r->header.cupsColorOrder == CUPS_ORDER_CHUNKED) r->bpp = (r->header.cupsBitsPerPixel + 7) / 8; else @@ -1654,19 +1804,13 @@ cups_raster_update(cups_raster_t *r) /* I - Raster stream */ if (r->bpp == 0) r->bpp = 1; - /* - * Set the number of remaining rows... - */ - + // Set the number of remaining rows... if (r->header.cupsColorOrder == CUPS_ORDER_PLANAR) r->remaining = r->header.cupsHeight * r->header.cupsNumColors; else r->remaining = r->header.cupsHeight; - /* - * Allocate the compression buffer... - */ - + // Allocate the compression buffer... if (r->compressed) { if (r->pixels != NULL) @@ -1690,31 +1834,28 @@ cups_raster_update(cups_raster_t *r) /* I - Raster stream */ } -/* - * 'cups_raster_write()' - Write a row of compressed raster data... - */ +// +// 'cups_raster_write()' - Write a row of compressed raster data... +// -static ssize_t /* O - Number of bytes written */ +static ssize_t // O - Number of bytes written cups_raster_write( - cups_raster_t *r, /* I - Raster stream */ - const unsigned char *pixels) /* I - Pixel data to write */ + cups_raster_t *r, // I - Raster stream + const unsigned char *pixels) // I - Pixel data to write { - const unsigned char *start, /* Start of sequence */ - *ptr, /* Current pointer in sequence */ - *pend, /* End of raster buffer */ - *plast; /* Pointer to last pixel */ - unsigned char *wptr; /* Pointer into write buffer */ - unsigned bpp, /* Bytes per pixel */ - count; /* Count */ - _cups_copyfunc_t cf; /* Copy function */ + const unsigned char *start, // Start of sequence + *ptr, // Current pointer in sequence + *pend, // End of raster buffer + *plast; // Pointer to last pixel + unsigned char *wptr; // Pointer into write buffer + unsigned bpp, // Bytes per pixel + count; // Count + _cups_copyfunc_t cf; // Copy function DEBUG_printf("3cups_raster_write(r=%p, pixels=%p)", (void *)r, (void *)pixels); - /* - * Determine whether we need to swap bytes... - */ - + // Determine whether we need to swap bytes... if (r->swapped && (r->header.cupsBitsPerColor == 16 || r->header.cupsBitsPerPixel == 12 || r->header.cupsBitsPerPixel == 16)) { DEBUG_puts("4cups_raster_write: Swapping bytes when writing."); @@ -1723,10 +1864,7 @@ cups_raster_write( else cf = (_cups_copyfunc_t)memcpy; - /* - * Allocate a write buffer as needed... - */ - + // Allocate a write buffer as needed... count = r->header.cupsBytesPerLine * 2; if (count < 65536) count = 65536; @@ -1748,20 +1886,14 @@ cups_raster_write( r->bufsize = count; } - /* - * Write the row repeat count... - */ - + // Write the row repeat count... bpp = r->bpp; pend = pixels + r->header.cupsBytesPerLine; plast = pend - bpp; wptr = r->buffer; *wptr++ = (unsigned char)(r->count - 1); - /* - * Write using a modified PackBits compression... - */ - + // Write using a modified PackBits compression... for (ptr = pixels; ptr < pend;) { start = ptr; @@ -1769,20 +1901,14 @@ cups_raster_write( if (ptr == pend) { - /* - * Encode a single pixel at the end... - */ - + // Encode a single pixel at the end... *wptr++ = 0; (*cf)(wptr, start, bpp); wptr += bpp; } else if (!memcmp(start, ptr, bpp)) { - /* - * Encode a sequence of repeating pixels... - */ - + // Encode a sequence of repeating pixels... for (count = 2; count < 128 && ptr < plast; count ++, ptr += bpp) if (memcmp(ptr, ptr + bpp, bpp)) break; @@ -1794,10 +1920,7 @@ cups_raster_write( } else { - /* - * Encode a sequence of non-repeating pixels... - */ - + // Encode a sequence of non-repeating pixels... for (count = 1; count < 128 && ptr < plast; count ++, ptr += bpp) if (!memcmp(ptr, ptr + bpp, bpp)) break; @@ -1822,15 +1945,15 @@ cups_raster_write( } -/* - * 'cups_swap()' - Swap bytes in raster data... - */ +// +// 'cups_swap()' - Swap bytes in raster data... +// static void -cups_swap(unsigned char *buf, /* I - Buffer to swap */ - size_t bytes) /* I - Number of bytes to swap */ +cups_swap(unsigned char *buf, // I - Buffer to swap + size_t bytes) // I - Number of bytes to swap { - unsigned char even, odd; /* Temporary variables */ + unsigned char even, odd; // Temporary variables bytes /= 2; @@ -1848,15 +1971,15 @@ cups_swap(unsigned char *buf, /* I - Buffer to swap */ } -/* - * 'cups_swap_copy()' - Copy and swap bytes in raster data... - */ +// +// 'cups_swap_copy()' - Copy and swap bytes in raster data... +// static void cups_swap_copy( - unsigned char *dst, /* I - Destination */ - const unsigned char *src, /* I - Source */ - size_t bytes) /* I - Number of bytes to swap */ + unsigned char *dst, // I - Destination + const unsigned char *src, // I - Source + size_t bytes) // I - Number of bytes to swap { bytes /= 2; diff --git a/cups/raster-stubs.c b/cups/raster-stubs.c index 11e0a141e6..b5cfb3a573 100644 --- a/cups/raster-stubs.c +++ b/cups/raster-stubs.c @@ -49,13 +49,13 @@ cupsRasterClose(cups_raster_t *r) /* I - Stream to close */ * * If there are no recent errors, `NULL` is returned. * - * @since CUPS 1.3/macOS 10.5@ + * @deprecated@ @exclude all@ */ const char * /* O - Last error or `NULL` */ cupsRasterErrorString(void) { - return (_cupsRasterErrorString()); + return (cupsRasterGetErrorString()); } @@ -71,9 +71,9 @@ cupsRasterErrorString(void) * inch. * * The "sheet_back" argument specifies a "pwg-raster-document-sheet-back" value - * to apply for the back side of a page. Pass @code NULL@ for the front side. + * to apply for the back side of a page. Pass `NULL` for the front side. * - * @since CUPS 2.2/macOS 10.12@ + * @deprecated@ @exclude all@ */ int /* O - 1 on success, 0 on failure */ @@ -84,7 +84,7 @@ cupsRasterInitPWGHeader( int xdpi, /* I - Cross-feed direction (horizontal) resolution */ int ydpi, /* I - Feed direction (vertical) resolution */ const char *sides, /* I - IPP "sides" option value */ - const char *sheet_back) /* I - Transform for back side or @code NULL@ for none */ + const char *sheet_back) /* I - Transform for back side or `NULL` for none */ { return (_cupsRasterInitPWGHeader(h, media, type, xdpi, ydpi, sides, sheet_back)); } @@ -98,18 +98,18 @@ cupsRasterInitPWGHeader( * image processor (RIP) filters that generate raster data, "fd" will be 1 * (stdout). * - * When writing raster data, the @code CUPS_RASTER_WRITE@, - * @code CUPS_RASTER_WRITE_COMPRESS@, or @code CUPS_RASTER_WRITE_PWG@ mode can + * When writing raster data, the `CUPS_RASTER_WRITE`, + * `CUPS_RASTER_WRITE_COMPRESS`, or `CUPS_RASTER_WRITE_PWG` mode can * be used - compressed and PWG output is generally 25-50% smaller but adds a * 100-300% execution time overhead. */ cups_raster_t * /* O - New stream */ cupsRasterOpen(int fd, /* I - File descriptor */ - cups_mode_t mode) /* I - Mode - @code CUPS_RASTER_READ@, - @code CUPS_RASTER_WRITE@, - @code CUPS_RASTER_WRITE_COMPRESSED@, - or @code CUPS_RASTER_WRITE_PWG@ */ + cups_mode_t mode) /* I - Mode - `CUPS_RASTER_READ`, + `CUPS_RASTER_WRITE`, + `CUPS_RASTER_WRITE_COMPRESSED`, + or `CUPS_RASTER_WRITE_PWG` */ { if (mode == CUPS_RASTER_READ) return (_cupsRasterNew(cups_read_fd, (void *)((intptr_t)fd), mode)); @@ -124,20 +124,20 @@ cupsRasterOpen(int fd, /* I - File descriptor */ * This function associates a raster stream with the given callback function and * context pointer. * - * When writing raster data, the @code CUPS_RASTER_WRITE@, - * @code CUPS_RASTER_WRITE_COMPRESS@, or @code CUPS_RASTER_WRITE_PWG@ mode can + * When writing raster data, the `CUPS_RASTER_WRITE`, + * `CUPS_RASTER_WRITE_COMPRESS`, or `CUPS_RASTER_WRITE_PWG` mode can * be used - compressed and PWG output is generally 25-50% smaller but adds a * 100-300% execution time overhead. */ cups_raster_t * /* O - New stream */ cupsRasterOpenIO( - cups_raster_iocb_t iocb, /* I - Read/write callback */ + cups_raster_cb_t iocb, /* I - Read/write callback */ void *ctx, /* I - Context pointer for callback */ - cups_mode_t mode) /* I - Mode - @code CUPS_RASTER_READ@, - @code CUPS_RASTER_WRITE@, - @code CUPS_RASTER_WRITE_COMPRESSED@, - or @code CUPS_RASTER_WRITE_PWG@ */ + cups_raster_mode_t mode) /* I - Mode - `CUPS_RASTER_READ`, + `CUPS_RASTER_WRITE`, + `CUPS_RASTER_WRITE_COMPRESSED`, + or `CUPS_RASTER_WRITE_PWG` */ { return (_cupsRasterNew(iocb, ctx, mode)); } diff --git a/cups/raster-testpage.h b/cups/raster-testpage.h new file mode 100644 index 0000000000..75cff09030 --- /dev/null +++ b/cups/raster-testpage.h @@ -0,0 +1,1706 @@ +// +// Raster test page generator for CUPS. +// +// Copyright © 2020-2023 by OpenPrinting +// Copyright © 2017-2019 by Apple Inc. +// +// Licensed under Apache License v2.0. See the file "LICENSE" for more +// information. +// + +#include "raster-private.h" +#include +#include +#include + + +// +// 'cupsRasterWriteTest()' - Write a series of raster test pages. +// +// This function writes a series of raster test pages to the specified raster +// stream. You must call @link cupsRasterInitPWGHeader@ to create the raster +// page header and call @link cupsRasterOpen@ or @link cupsRasterOpenIO@ to create +// a stream for writing prior to calling this function. +// +// Each page consists of a black border (1/4 to 1/2" in width depending on the +// media size) with the text "TEST-PAGE ####" repeated down the page in +// different shades of gray or colors. When generating multiple pages, the +// proper back side transforms are applied for duplex printing as needed. +// + +static bool // O - `true` on success, `false` on failure +cupsRasterWriteTest( + cups_raster_t *ras, // I - Raster stream + cups_page_header2_t *header, // I - Raster page header (front side) + cups_page_header2_t *back_header, // I - Raster page header (back side) + const char *sheet_back, // I - Back side transform needed + ipp_orient_t orientation, // I - Output orientation + int num_copies, // I - Number of copies + int num_pages) // I - Number of pages +{ + int copy, // Current copy number + page; // Current page number + char pagestr[5], // Page number string + output[8][101]; // Output image + unsigned char *line, // Line of raster data + *bline, // Border line in raster data + *lineptr, // Pointer into line + *lineend, // Pointer to end of line + black, // Black pixel + white; // White pixel + unsigned bpp, // Bytes per pixel + x, y, // Current position on page + xcount, ycount, // Current count for X and Y + xrep, yrep, // Repeat count for X and Y + xborder, // X border + yborder, // Y border + xoff, yoff, // X and Y offsets + xend, yend, // End X and Y values + yend2, // End Y value for solid border + rows; // Number of rows + int col, row, // Column and row in output + color; // Template color + ipp_orient_t porientation; // Current page orientation + bool pflip; // Current page (vertical) flip + const char *outptr; // Pointer into output image line + const unsigned char *colorptr; // Current color + static const unsigned char colors[][3] = + { // Colors for test + { 0, 0, 0 }, + { 63, 63, 63 }, + { 127, 127, 127 }, + { 191, 191, 191 }, + { 255, 0, 0 }, + { 255, 127, 0 }, + { 255, 191, 0 }, + { 255, 255, 0 }, + { 191, 255, 0 }, + { 0, 255, 0 }, + { 0, 255, 191 }, + { 0, 255, 255 }, + { 0, 191, 255 }, + { 0, 0, 255 }, + { 127, 0, 255 }, + { 255, 0, 255 } + }; + static const char * const test_page[] = + { // "TEST-PAGE" template + " TTTTT EEEEE SSSSS TTTTT PPPPP AAAAA GGGGG EEEEE ", + " T E S S T P P A A G E ", + " T E S T P P A A G E ", + " T EEEE SSSSS T ----- PPPPP AAAAA G GG EEEE ", + " T E S T P A A G G E ", + " T E S S T P A A G G E ", + " T EEEEE SSSSS T P A A GGGGG EEEEE ", + " " + }; + static const char * const digits[] = // Digits template + { + "00000 1 22222 33333 4 55555 6666 77777 88888 99999 ", + "0 0 1 2 3 4 4 5 6 7 8 8 9 9 ", + "0 0 1 2 3 4 4 5 6 7 8 8 9 9 ", + "0 0 0 1 22222 3333 44444 55555 66666 7 88888 99999 ", + "0 0 1 2 3 4 5 6 6 7 8 8 9 ", + "0 0 1 2 3 4 5 6 6 7 8 8 9 ", + "00000 1 22222 33333 4 55555 66666 7 88888 9999 ", + " " + }; + + + // Update the page header->.. + header->cupsInteger[CUPS_RASTER_PWG_TotalPageCount] = (unsigned)(num_copies * num_pages); + + // Calculate the border sizes and offsets... + if (header->cupsWidth > (2 * header->HWResolution[0]) && header->cupsHeight > (2 * header->HWResolution[1])) + { + xborder = header->HWResolution[0] / 2; + yborder = header->HWResolution[1] / 2; + } + else + { + xborder = header->HWResolution[0] / 4; + yborder = header->HWResolution[1] / 4; + } + + if (orientation == IPP_ORIENT_PORTRAIT || orientation == IPP_ORIENT_REVERSE_PORTRAIT) + { + xrep = (header->cupsWidth - 2 * xborder) / 100; + yrep = xrep * header->HWResolution[1] / header->HWResolution[0]; + rows = (header->cupsHeight - 3 * yborder) / yrep / 8; + xoff = (header->cupsWidth - 100 * xrep) / 2; + + if (rows) + yoff = (header->cupsHeight - rows * 8 * yrep) / 2; + else + yoff = yborder + yrep / 2; + } + else + { + yrep = (header->cupsHeight - 2 * yborder) / 100; + xrep = yrep * header->HWResolution[0] / header->HWResolution[1]; + rows = (header->cupsWidth - 3 * xborder) / xrep / 8; + yoff = (header->cupsHeight - 100 * yrep) / 2; + + if (rows) + xoff = (header->cupsWidth - rows * 8 * xrep) / 2; + else + xoff = xborder + xrep / 2; + } + + xend = header->cupsWidth - xoff; + yend = header->cupsHeight - yoff; + yend2 = header->cupsHeight - yborder; + + // Allocate memory for the raster output... + if ((line = malloc(header->cupsBytesPerLine)) == NULL) + { + _cupsRasterAddError("Unable to allocate %u bytes for line: %s", header->cupsBytesPerLine, strerror(errno)); + return (false); + } + + if ((bline = malloc(header->cupsBytesPerLine)) == NULL) + { + _cupsRasterAddError("Unable to allocate %u bytes for line: %s", header->cupsBytesPerLine, strerror(errno)); + free(line); + return (false); + } + + switch (header->cupsColorSpace) + { + default : + black = 0x00; + white = 0xff; + break; + + case CUPS_CSPACE_K : + case CUPS_CSPACE_CMYK : + black = 0xff; + white = 0x00; + break; + } + + bpp = header->cupsBitsPerPixel / 8; + lineend = line + header->cupsBytesPerLine; + + // Loop to create all copies and pages... + for (copy = 0; copy < num_copies; copy ++) + { + for (page = 0; page < num_pages; page ++) + { + // Format the output rows for "TEST-PAGE ####" + memset(output, 0, sizeof(output)); + snprintf(pagestr, sizeof(pagestr), "%04d", page + 1); + + for (row = 0; row < 8; row ++) + { + // Base "TEST-PAGE" + memcpy(output[row], test_page[row], 72); + for (col = 0; col < 4; col ++) + memcpy(output[row] + 72 + col * 7, digits[row] + (pagestr[col] - '0') * 7, 7); + } + + // Start the page and show the borders... + if (page & 1) + cupsRasterWriteHeader2(ras, back_header); + else + cupsRasterWriteHeader2(ras, header); + + if (bpp == 4) + { + // 32-bit CMYK output + for (lineptr = line; lineptr < lineend;) + { + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0xff; + } + } + else if (bpp == 8) + { + // 64-bit CMYK output + for (lineptr = line; lineptr < lineend;) + { + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0xff; + *lineptr++ = 0xff; + } + } + else + { + // 1/8/16/24/32-bit bitmap/grayscale/color output... + memset(line, black, header->cupsBytesPerLine); + } + + for (y = 0; y < yborder; y ++) + cupsRasterWritePixels(ras, line, header->cupsBytesPerLine); + + memset(bline, white, header->cupsBytesPerLine); + if (bpp == 4) + { + // 32-bit CMYK output + for (lineptr = bline, xcount = xborder; xcount > 0; xcount --) + { + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0xff; + } + + for (lineptr = bline + header->cupsBytesPerLine - xborder * 4, xcount = xborder; xcount > 0; xcount --) + { + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0xff; + } + } + else if (bpp == 8) + { + // 64-bit CMYK output + for (lineptr = bline, xcount = xborder; xcount > 0; xcount --) + { + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0xff; + *lineptr++ = 0xff; + } + + for (lineptr = bline + header->cupsBytesPerLine - xborder * 8, xcount = xborder; xcount > 0; xcount --) + { + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0xff; + *lineptr++ = 0xff; + } + } + else if (bpp) + { + // 8/16/24/32-bit grayscale/color output... + memset(bline, black, xborder * bpp); + memset(bline + header->cupsBytesPerLine - xborder * bpp, black, xborder * bpp); + } + else + { + // Bitmap output... + if (xborder >= 8) + { + memset(bline, black, xborder / 8); + memset(bline + header->cupsBytesPerLine - xborder / 8, black, xborder / 8); + } + if (xborder & 7) + { + // Capture partial pixels + bline[xborder / 8] ^= (0xff << (xborder & 7)) & 0xff; + bline[header->cupsBytesPerLine - xborder / 8 - 1] ^= 0xff >> (xborder & 7); + } + } + + for (; y < yoff; y ++) + cupsRasterWritePixels(ras, bline, header->cupsBytesPerLine); + + // Generate the interior lines... + if (header->Duplex && (page & 1) != 0) + { + // Update orientation for back side + if (!strcmp(sheet_back, "normal")) + { + porientation = orientation; + pflip = false; + } + else if (!strcmp(sheet_back, "rotated")) + { + if (header->Tumble) + porientation = orientation; + else + porientation = (ipp_orient_t)(9 - orientation); + + pflip = false; + } + else if (!strcmp(sheet_back, "manual-tumble")) + { + if (header->Tumble) + porientation = (ipp_orient_t)(9 - orientation); + else + porientation = orientation; + + pflip = false; + } + else // flipped + { + porientation = orientation; + pflip = true; + } + } + else + { + // Use front side orientation + porientation = orientation; + pflip = false; + } + + if (pflip) + { + // Draw the test image from bottom to top + switch (porientation) + { + default : + case IPP_ORIENT_PORTRAIT : + color = (int)rows - 1; + if (bpp <= 2) + color &= 3; + else + color &= 15; + + for (row = 7; y < yend;) + { + // Write N scan lines... + for (ycount = yrep; ycount > 0 && y < yend; ycount --, y ++) + { + // Format the current line in the output row... + memcpy(line, bline, header->cupsBytesPerLine); + colorptr = colors[color]; + + for (outptr = output[row], x = xoff; *outptr; outptr ++, x += xrep) + { + unsigned char bit, // Current bit + pattern;// Shading pattern + + if (*outptr == ' ') + continue; + + switch (bpp) + { + case 0 : // 1-bit bitmap output + if (*colorptr < 63) + { + pattern = 0xff; + } + else if (*colorptr < 127) + { + pattern = (y & 1) ? 0x55 : 0xff; + } + else if (*colorptr < 191) + { + pattern = (y & 1) ? 0x55 : 0xaa; + } + else if (y & 1) + { + break; + } + else + { + pattern = 0xaa; + } + + lineptr = line + x / 8; + bit = 0x80 >> (x & 7); + + for (xcount = xrep; xcount > 0; xcount --) + { + *lineptr ^= bit & pattern; + if (bit > 1) + { + bit /= 2; + } + else + { + bit = 0x80; + lineptr ++; + } + } + break; + case 1 : // 8-bit grayscale/black + if (black) + memset(line + x, 255 - *colorptr, xrep); + else + memset(line + x, *colorptr, xrep); + break; + case 2 : // 16-bit grayscale/black + if (black) + memset(line + 2 * x, 255 - *colorptr, 2 * xrep); + else + memset(line + 2 * x, *colorptr, 2 * xrep); + break; + case 3 : // 24-bit RGB + for (lineptr = line + 3 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + } + break; + case 4 : // 32-bit CMYK + for (lineptr = line + 4 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + } + } + break; + case 6 : // 24-bit RGB + for (lineptr = line + 6 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + *lineptr++ = colorptr[2]; + } + break; + case 8 : // 64-bit CMYK + for (lineptr = line + 8 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + *lineptr++ = 0; + } + } + break; + } + } + + cupsRasterWritePixels(ras, line, header->cupsBytesPerLine); + } + + // Next row in the output image... + row --; + if (row < 0) + { + // New row of text with a new color/gray shade... + row = 7; + color --; + if (color < 0) + { + if (bpp > 2) + color = 15; + else + color = 3; + } + } + } + break; + + case IPP_ORIENT_LANDSCAPE : + for (col = 99; col >= 0; col --) + { + // Write N scan lines... + for (ycount = yrep; ycount > 0 && y < yend; ycount --, y ++) + { + memcpy(line, bline, header->cupsBytesPerLine); + + color = (int)rows - 1; + if (bpp <= 2) + color &= 3; + else + color &= 15; + + for (row = (rows - 1) & 7, x = xoff; x < xend; x += xrep) + { + // Format the current line in the output row... + unsigned char bit, // Current bit + pattern;// Shading pattern + + colorptr = colors[color]; + + if (output[row][col] != ' ') + { + switch (bpp) + { + case 0 : // 1-bit bitmap output + if (*colorptr < 63) + { + pattern = 0xff; + } + else if (*colorptr < 127) + { + pattern = (y & 1) ? 0x55 : 0xff; + } + else if (*colorptr < 191) + { + pattern = (y & 1) ? 0x55 : 0xaa; + } + else if (y & 1) + { + break; + } + else + { + pattern = 0xaa; + } + + lineptr = line + x / 8; + bit = 0x80 >> (x & 7); + + for (xcount = xrep; xcount > 0; xcount --) + { + *lineptr ^= bit & pattern; + if (bit > 1) + { + bit /= 2; + } + else + { + bit = 0x80; + lineptr ++; + } + } + break; + case 1 : // 8-bit grayscale/black + if (black) + memset(line + x, 255 - *colorptr, xrep); + else + memset(line + x, *colorptr, xrep); + break; + case 2 : // 16-bit grayscale/black + if (black) + memset(line + 2 * x, 255 - *colorptr, 2 * xrep); + else + memset(line + 2 * x, *colorptr, 2 * xrep); + break; + case 3 : // 24-bit RGB + for (lineptr = line + 3 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + } + break; + case 4 : // 32-bit CMYK + for (lineptr = line + 4 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + } + } + break; + case 6 : // 24-bit RGB + for (lineptr = line + 6 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + *lineptr++ = colorptr[2]; + } + break; + case 8 : // 64-bit CMYK + for (lineptr = line + 8 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + *lineptr++ = 0; + } + } + break; + } + } + + // Next row in the output image... + row --; + if (row < 0) + { + // New row of text with a new color/gray shade... + row = 7; + color --; + if (color < 0) + { + if (bpp > 2) + color = 15; + else + color = 3; + } + } + } + + cupsRasterWritePixels(ras, line, header->cupsBytesPerLine); + } + } + break; + + case IPP_ORIENT_REVERSE_PORTRAIT : + for (row = 0, color = 0; y < yend;) + { + // Write N scan lines... + for (ycount = yrep; ycount > 0 && y < yend; ycount --, y ++) + { + // Format the current line in the output row... + memcpy(line, bline, header->cupsBytesPerLine); + colorptr = colors[color]; + + for (outptr = output[row] + 99, x = xoff; outptr >= output[row]; outptr --, x += xrep) + { + unsigned char bit, // Current bit + pattern;// Shading pattern + + if (*outptr == ' ') + continue; + + switch (bpp) + { + case 0 : // 1-bit bitmap output + if (*colorptr < 63) + { + pattern = 0xff; + } + else if (*colorptr < 127) + { + pattern = (y & 1) ? 0x55 : 0xff; + } + else if (*colorptr < 191) + { + pattern = (y & 1) ? 0x55 : 0xaa; + } + else if (y & 1) + { + break; + } + else + { + pattern = 0xaa; + } + + lineptr = line + x / 8; + bit = 0x80 >> (x & 7); + + for (xcount = xrep; xcount > 0; xcount --) + { + *lineptr ^= bit & pattern; + if (bit > 1) + { + bit /= 2; + } + else + { + bit = 0x80; + lineptr ++; + } + } + break; + case 1 : // 8-bit grayscale/black + if (black) + memset(line + x, 255 - *colorptr, xrep); + else + memset(line + x, *colorptr, xrep); + break; + case 2 : // 16-bit grayscale/black + if (black) + memset(line + 2 * x, 255 - *colorptr, 2 * xrep); + else + memset(line + 2 * x, *colorptr, 2 * xrep); + break; + case 3 : // 24-bit RGB + for (lineptr = line + 3 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + } + break; + case 4 : // 32-bit CMYK + for (lineptr = line + 4 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + } + } + break; + case 6 : // 24-bit RGB + for (lineptr = line + 6 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + *lineptr++ = colorptr[2]; + } + break; + case 8 : // 64-bit CMYK + for (lineptr = line + 8 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + *lineptr++ = 0; + } + } + break; + } + } + + cupsRasterWritePixels(ras, line, header->cupsBytesPerLine); + } + + // Next row in the output image... + row ++; + if (row >= 8) + { + // New row of text with a new color/gray shade... + row = 0; + color ++; + if ((bpp > 2 && color >= 16) || (bpp <= 2 && color >= 4)) + color = 0; + } + } + break; + case IPP_ORIENT_REVERSE_LANDSCAPE : + for (col = 0; col < 100; col ++) + { + // Write N scan lines... + for (ycount = yrep; ycount > 0 && y < yend; ycount --, y ++) + { + memcpy(line, bline, header->cupsBytesPerLine); + + color = 0; + + for (row = 0, x = xoff; x < xend; x += xrep) + { + // Format the current line in the output row... + unsigned char bit, // Current bit + pattern;// Shading pattern + + colorptr = colors[color]; + + if (output[row][col] != ' ') + { + switch (bpp) + { + case 0 : // 1-bit bitmap output + if (*colorptr < 63) + { + pattern = 0xff; + } + else if (*colorptr < 127) + { + pattern = (y & 1) ? 0x55 : 0xff; + } + else if (*colorptr < 191) + { + pattern = (y & 1) ? 0x55 : 0xaa; + } + else if (y & 1) + { + break; + } + else + { + pattern = 0xaa; + } + + lineptr = line + x / 8; + bit = 0x80 >> (x & 7); + + for (xcount = xrep; xcount > 0; xcount --) + { + *lineptr ^= bit & pattern; + if (bit > 1) + { + bit /= 2; + } + else + { + bit = 0x80; + lineptr ++; + } + } + break; + case 1 : // 8-bit grayscale/black + if (black) + memset(line + x, 255 - *colorptr, xrep); + else + memset(line + x, *colorptr, xrep); + break; + case 2 : // 16-bit grayscale/black + if (black) + memset(line + 2 * x, 255 - *colorptr, 2 * xrep); + else + memset(line + 2 * x, *colorptr, 2 * xrep); + break; + case 3 : // 24-bit RGB + for (lineptr = line + 3 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + } + break; + case 4 : // 32-bit CMYK + for (lineptr = line + 4 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + } + } + break; + case 6 : // 24-bit RGB + for (lineptr = line + 6 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + *lineptr++ = colorptr[2]; + } + break; + case 8 : // 64-bit CMYK + for (lineptr = line + 8 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + *lineptr++ = 0; + } + } + break; + } + } + + // Next row in the output image... + row ++; + if (row > 7) + { + // New row of text with a new color/gray shade... + row = 0; + color ++; + if ((bpp > 2 && color >= 16) || (bpp <= 2 && color >= 4)) + color = 0; + } + } + + cupsRasterWritePixels(ras, line, header->cupsBytesPerLine); + } + } + break; + } + } + else + { + // Draw the test image from top to bottom + switch (porientation) + { + default : + case IPP_ORIENT_PORTRAIT : + for (row = 0, color = 0; y < yend;) + { + // Write N scan lines... + for (ycount = yrep; ycount > 0 && y < yend; ycount --, y ++) + { + // Format the current line in the output row... + memcpy(line, bline, header->cupsBytesPerLine); + colorptr = colors[color]; + + for (outptr = output[row], x = xoff; *outptr; outptr ++, x += xrep) + { + unsigned char bit, // Current bit + pattern;// Shading pattern + + if (*outptr == ' ') + continue; + + switch (bpp) + { + case 0 : // 1-bit bitmap output + if (*colorptr < 63) + { + pattern = 0xff; + } + else if (*colorptr < 127) + { + pattern = (y & 1) ? 0x55 : 0xff; + } + else if (*colorptr < 191) + { + pattern = (y & 1) ? 0x55 : 0xaa; + } + else if (y & 1) + { + break; + } + else + { + pattern = 0xaa; + } + + lineptr = line + x / 8; + bit = 0x80 >> (x & 7); + + for (xcount = xrep; xcount > 0; xcount --) + { + *lineptr ^= bit & pattern; + if (bit > 1) + { + bit /= 2; + } + else + { + bit = 0x80; + lineptr ++; + } + } + break; + case 1 : // 8-bit grayscale/black + if (black) + memset(line + x, 255 - *colorptr, xrep); + else + memset(line + x, *colorptr, xrep); + break; + case 2 : // 16-bit grayscale/black + if (black) + memset(line + 2 * x, 255 - *colorptr, 2 * xrep); + else + memset(line + 2 * x, *colorptr, 2 * xrep); + break; + case 3 : // 24-bit RGB + for (lineptr = line + 3 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + } + break; + case 4 : // 32-bit CMYK + for (lineptr = line + 4 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + } + } + break; + case 6 : // 24-bit RGB + for (lineptr = line + 6 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + *lineptr++ = colorptr[2]; + } + break; + case 8 : // 64-bit CMYK + for (lineptr = line + 8 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + *lineptr++ = 0; + } + } + break; + } + } + + cupsRasterWritePixels(ras, line, header->cupsBytesPerLine); + } + + // Next row in the output image... + row ++; + if (row >= 8) + { + // New row of text with a new color/gray shade... + row = 0; + color ++; + if ((bpp > 2 && color >= 16) || (bpp <= 2 && color >= 4)) + color = 0; + } + } + break; + + case IPP_ORIENT_LANDSCAPE : + for (col = 0; col < 100; col ++) + { + // Write N scan lines... + for (ycount = yrep; ycount > 0 && y < yend; ycount --, y ++) + { + memcpy(line, bline, header->cupsBytesPerLine); + + color = (int)rows - 1; + if (bpp <= 2) + color &= 3; + else + color &= 15; + + for (row = 7, x = xoff; x < xend; x += xrep) + { + // Format the current line in the output row... + unsigned char bit, // Current bit + pattern;// Shading pattern + + colorptr = colors[color]; + + if (output[row][col] != ' ') + { + switch (bpp) + { + case 0 : // 1-bit bitmap output + if (*colorptr < 63) + { + pattern = 0xff; + } + else if (*colorptr < 127) + { + pattern = (y & 1) ? 0x55 : 0xff; + } + else if (*colorptr < 191) + { + pattern = (y & 1) ? 0x55 : 0xaa; + } + else if (y & 1) + { + break; + } + else + { + pattern = 0xaa; + } + + lineptr = line + x / 8; + bit = 0x80 >> (x & 7); + + for (xcount = xrep; xcount > 0; xcount --) + { + *lineptr ^= bit & pattern; + if (bit > 1) + { + bit /= 2; + } + else + { + bit = 0x80; + lineptr ++; + } + } + break; + case 1 : // 8-bit grayscale/black + if (black) + memset(line + x, 255 - *colorptr, xrep); + else + memset(line + x, *colorptr, xrep); + break; + case 2 : // 16-bit grayscale/black + if (black) + memset(line + 2 * x, 255 - *colorptr, 2 * xrep); + else + memset(line + 2 * x, *colorptr, 2 * xrep); + break; + case 3 : // 24-bit RGB + for (lineptr = line + 3 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + } + break; + case 4 : // 32-bit CMYK + for (lineptr = line + 4 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + } + } + break; + case 6 : // 24-bit RGB + for (lineptr = line + 6 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + *lineptr++ = colorptr[2]; + } + break; + case 8 : // 64-bit CMYK + for (lineptr = line + 8 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + *lineptr++ = 0; + } + } + break; + } + } + + // Next row in the output image... + row --; + if (row < 0) + { + // New row of text with a new color/gray shade... + row = 7; + color --; + if (color < 0) + { + if (bpp > 2) + color = 15; + else + color = 3; + } + } + } + + cupsRasterWritePixels(ras, line, header->cupsBytesPerLine); + } + } + break; + + case IPP_ORIENT_REVERSE_PORTRAIT : + color = (int)rows - 1; + if (bpp <= 2) + color &= 3; + else + color &= 15; + + for (row = 7; y < yend;) + { + // Write N scan lines... + for (ycount = yrep; ycount > 0 && y < yend; ycount --, y ++) + { + // Format the current line in the output row... + memcpy(line, bline, header->cupsBytesPerLine); + colorptr = colors[color]; + + for (outptr = output[row] + 99, x = xoff; outptr >= output[row]; outptr --, x += xrep) + { + unsigned char bit, // Current bit + pattern;// Shading pattern + + if (*outptr == ' ') + continue; + + switch (bpp) + { + case 0 : // 1-bit bitmap output + if (*colorptr < 63) + { + pattern = 0xff; + } + else if (*colorptr < 127) + { + pattern = (y & 1) ? 0x55 : 0xff; + } + else if (*colorptr < 191) + { + pattern = (y & 1) ? 0x55 : 0xaa; + } + else if (y & 1) + { + break; + } + else + { + pattern = 0xaa; + } + + lineptr = line + x / 8; + bit = 0x80 >> (x & 7); + + for (xcount = xrep; xcount > 0; xcount --) + { + *lineptr ^= bit & pattern; + if (bit > 1) + { + bit /= 2; + } + else + { + bit = 0x80; + lineptr ++; + } + } + break; + case 1 : // 8-bit grayscale/black + if (black) + memset(line + x, 255 - *colorptr, xrep); + else + memset(line + x, *colorptr, xrep); + break; + case 2 : // 16-bit grayscale/black + if (black) + memset(line + 2 * x, 255 - *colorptr, 2 * xrep); + else + memset(line + 2 * x, *colorptr, 2 * xrep); + break; + case 3 : // 24-bit RGB + for (lineptr = line + 3 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + } + break; + case 4 : // 32-bit CMYK + for (lineptr = line + 4 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + } + } + break; + case 6 : // 24-bit RGB + for (lineptr = line + 6 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + *lineptr++ = colorptr[2]; + } + break; + case 8 : // 64-bit CMYK + for (lineptr = line + 8 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + *lineptr++ = 0; + } + } + break; + } + } + + cupsRasterWritePixels(ras, line, header->cupsBytesPerLine); + } + + // Next row in the output image... + row --; + if (row < 0) + { + // New row of text with a new color/gray shade... + row = 7; + color --; + if (color < 0) + { + if (bpp > 2) + color = 15; + else + color = 3; + } + } + } + break; + case IPP_ORIENT_REVERSE_LANDSCAPE : + for (col = 99; col >= 0; col --) + { + // Write N scan lines... + for (ycount = yrep; ycount > 0 && y < yend; ycount --, y ++) + { + memcpy(line, bline, header->cupsBytesPerLine); + + color = 0; + + for (row = 0, x = xoff; x < xend; x += xrep) + { + // Format the current line in the output row... + unsigned char bit, // Current bit + pattern;// Shading pattern + + colorptr = colors[color]; + + if (output[row][col] != ' ') + { + switch (bpp) + { + case 0 : // 1-bit bitmap output + if (*colorptr < 63) + { + pattern = 0xff; + } + else if (*colorptr < 127) + { + pattern = (y & 1) ? 0x55 : 0xff; + } + else if (*colorptr < 191) + { + pattern = (y & 1) ? 0x55 : 0xaa; + } + else if (y & 1) + { + break; + } + else + { + pattern = 0xaa; + } + + lineptr = line + x / 8; + bit = 0x80 >> (x & 7); + + for (xcount = xrep; xcount > 0; xcount --) + { + *lineptr ^= bit & pattern; + if (bit > 1) + { + bit /= 2; + } + else + { + bit = 0x80; + lineptr ++; + } + } + break; + case 1 : // 8-bit grayscale/black + if (black) + memset(line + x, 255 - *colorptr, xrep); + else + memset(line + x, *colorptr, xrep); + break; + case 2 : // 16-bit grayscale/black + if (black) + memset(line + 2 * x, 255 - *colorptr, 2 * xrep); + else + memset(line + 2 * x, *colorptr, 2 * xrep); + break; + case 3 : // 24-bit RGB + for (lineptr = line + 3 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + } + break; + case 4 : // 32-bit CMYK + for (lineptr = line + 4 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + } + } + break; + case 6 : // 24-bit RGB + for (lineptr = line + 6 * x, xcount = xrep; xcount > 0; xcount --) + { + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[0]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[1]; + *lineptr++ = colorptr[2]; + *lineptr++ = colorptr[2]; + } + break; + case 8 : // 64-bit CMYK + for (lineptr = line + 8 * x, xcount = xrep; xcount > 0; xcount --) + { + if (color < 4) + { + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 0; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + } + else + { + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[0]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[1]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 255 - colorptr[2]; + *lineptr++ = 0; + *lineptr++ = 0; + } + } + break; + } + } + + // Next row in the output image... + row ++; + if (row > 7) + { + // New row of text with a new color/gray shade... + row = 0; + color ++; + if ((bpp > 2 && color >= 16) || (bpp <= 2 && color >= 4)) + color = 0; + } + } + + cupsRasterWritePixels(ras, line, header->cupsBytesPerLine); + } + } + break; + } + } + + // Write out the last of the border lines + for (; y < yend2; y ++) + cupsRasterWritePixels(ras, bline, header->cupsBytesPerLine); + + if (bpp == 4) + { + // 32-bit CMYK output + for (lineptr = line; lineptr < lineend;) + { + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0xff; + } + } + else if (bpp == 8) + { + // 64-bit CMYK output + for (lineptr = line; lineptr < lineend;) + { + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0x00; + *lineptr++ = 0xff; + *lineptr++ = 0xff; + } + } + else + { + // 1/8/16/24/32-bit bitmap/grayscale/color output... + memset(line, black, header->cupsBytesPerLine); + } + + for (; y < header->cupsHeight; y ++) + cupsRasterWritePixels(ras, line, header->cupsBytesPerLine); + } + } + + // Free memory and return... + free(line); + free(bline); + + return (true); +} diff --git a/cups/raster.h b/cups/raster.h index 6ae004ecb1..139b34f7d3 100644 --- a/cups/raster.h +++ b/cups/raster.h @@ -1,89 +1,72 @@ -/* - * Raster file definitions for CUPS. - * - * Copyright © 2007-2018 by Apple Inc. - * Copyright © 1997-2006 by Easy Software Products. - * - * This file is part of the CUPS Imaging library. - * - * Licensed under Apache License v2.0. See the file "LICENSE" for more - * information. - */ +// +// Raster file definitions for CUPS. +// +// Copyright © 2021-2023 by OpenPrinting. +// 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_RASTER_H_ # define _CUPS_RASTER_H_ - -/* - * Include necessary headers... - */ - # include "cups.h" - - # ifdef __cplusplus extern "C" { -# endif /* __cplusplus */ +# endif // __cplusplus -/* - * Every non-PostScript printer driver that supports raster images - * should use the application/vnd.cups-raster image file format. - * Since both the PostScript RIP (pstoraster, based on GNU/GPL - * Ghostscript) and Image RIP (imagetoraster, located in the filter - * directory) use it, using this format saves you a lot of work. - * Also, the PostScript RIP passes any printer options that are in - * a PS file to your driver this way as well... - */ -/* - * Constants... - */ +// +// Constants... +// -# define CUPS_RASTER_SYNC 0x52615333 /* RaS3 */ -# define CUPS_RASTER_REVSYNC 0x33536152 /* 3SaR */ +# define CUPS_RASTER_SYNC 0x52615333 // RaS3 +# define CUPS_RASTER_REVSYNC 0x33536152 // 3SaR -# define CUPS_RASTER_SYNCv1 0x52615374 /* RaSt */ -# define CUPS_RASTER_REVSYNCv1 0x74536152 /* tSaR */ +# define CUPS_RASTER_SYNCv1 0x52615374 // RaSt +# define CUPS_RASTER_REVSYNCv1 0x74536152 // tSaR -# define CUPS_RASTER_SYNCv2 0x52615332 /* RaS2 */ -# define CUPS_RASTER_REVSYNCv2 0x32536152 /* 2SaR */ +# define CUPS_RASTER_SYNCv2 0x52615332 // RaS2 +# define CUPS_RASTER_REVSYNCv2 0x32536152 // 2SaR -# define CUPS_RASTER_SYNCapple 0x554E4952 /* UNIR */ -# define CUPS_RASTER_REVSYNCapple 0x52494E55 /* RINU */ +# define CUPS_RASTER_SYNCapple 0x554E4952 // UNIR +# define CUPS_RASTER_REVSYNCapple 0x52494E55 // RINU # define CUPS_RASTER_SYNC_PWG CUPS_RASTER_SYNCv2 -/* - * The following definition can be used to determine if the - * colorimetric colorspaces (CIEXYZ, CIELAB, and ICCn) are - * defined... - */ +// +// The following definition can be used to determine if the +// colorimetric colorspaces (CIEXYZ, CIELAB, and ICCn) are +// defined... +// # define CUPS_RASTER_HAVE_COLORIMETRIC 1 -/* - * The following definition can be used to determine if the - * device colorspaces (DEVICEn) are defined... - */ +// +// The following definition can be used to determine if the +// device colorspaces (DEVICEn) are defined... +// # define CUPS_RASTER_HAVE_DEVICE 1 -/* - * The following definition can be used to determine if PWG Raster is supported. - */ +// +// The following definition can be used to determine if PWG Raster is supported. +// # define CUPS_RASTER_HAVE_PWGRASTER 1 -/* - * The following definition can be used to determine if Apple Raster is - * supported (beta). - */ +// +// The following definition can be used to determine if Apple Raster is +// supported (beta). +// # define CUPS_RASTER_HAVE_APPLERASTER 1 -/* - * The following PWG 5102.4 definitions specify indices into the - * cupsInteger[] array in the raster header. - */ +// +// The following PWG 5102.4 definitions specify indices into the +// cupsInteger[] array in the raster header. +// # define CUPS_RASTER_PWG_TotalPageCount 0 # define CUPS_RASTER_PWG_CrossFeedTransform 1 @@ -98,302 +81,286 @@ extern "C" { # define CUPS_RASTER_PWG_VendorLength 15 +// +// Types... +// - -/* - * Types... - */ - -typedef enum cups_adv_e /**** AdvanceMedia attribute values ****/ +typedef enum cups_adv_e // AdvanceMedia attribute values { - CUPS_ADVANCE_NONE = 0, /* Never advance the roll */ - CUPS_ADVANCE_FILE = 1, /* Advance the roll after this file */ - CUPS_ADVANCE_JOB = 2, /* Advance the roll after this job */ - CUPS_ADVANCE_SET = 3, /* Advance the roll after this set */ - CUPS_ADVANCE_PAGE = 4 /* Advance the roll after this page */ + CUPS_ADVANCE_NONE = 0, // Never advance the roll + CUPS_ADVANCE_FILE = 1, // Advance the roll after this file + CUPS_ADVANCE_JOB = 2, // Advance the roll after this job + CUPS_ADVANCE_SET = 3, // Advance the roll after this set + CUPS_ADVANCE_PAGE = 4 // Advance the roll after this page } cups_adv_t; -typedef enum cups_bool_e /**** Boolean type ****/ +typedef enum cups_bool_e // Boolean type { - CUPS_FALSE = 0, /* Logical false */ - CUPS_TRUE = 1 /* Logical true */ + CUPS_FALSE = 0, // Logical false + CUPS_TRUE = 1 // Logical true } cups_bool_t; -typedef enum cups_cspace_e /**** cupsColorSpace attribute values ****/ +typedef enum cups_cspace_e // cupsColorSpace attribute values { - CUPS_CSPACE_W = 0, /* Luminance (DeviceGray, gamma 2.2 by default) */ - CUPS_CSPACE_RGB = 1, /* Red, green, blue (DeviceRGB, sRGB by default) */ - CUPS_CSPACE_RGBA = 2, /* Red, green, blue, alpha (DeviceRGB, sRGB by default) */ - CUPS_CSPACE_K = 3, /* Black (DeviceK) */ - CUPS_CSPACE_CMY = 4, /* Cyan, magenta, yellow (DeviceCMY) */ - CUPS_CSPACE_YMC = 5, /* Yellow, magenta, cyan @deprecated@ */ - CUPS_CSPACE_CMYK = 6, /* Cyan, magenta, yellow, black (DeviceCMYK) */ - CUPS_CSPACE_YMCK = 7, /* Yellow, magenta, cyan, black @deprecated@ */ - CUPS_CSPACE_KCMY = 8, /* Black, cyan, magenta, yellow @deprecated@ */ - CUPS_CSPACE_KCMYcm = 9, /* Black, cyan, magenta, yellow, light-cyan, light-magenta @deprecated@ */ - CUPS_CSPACE_GMCK = 10, /* Gold, magenta, yellow, black @deprecated@ */ - CUPS_CSPACE_GMCS = 11, /* Gold, magenta, yellow, silver @deprecated@ */ - CUPS_CSPACE_WHITE = 12, /* White ink (as black) @deprecated@ */ - CUPS_CSPACE_GOLD = 13, /* Gold foil @deprecated@ */ - CUPS_CSPACE_SILVER = 14, /* Silver foil @deprecated@ */ - - CUPS_CSPACE_CIEXYZ = 15, /* CIE XYZ @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_CIELab = 16, /* CIE Lab @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_RGBW = 17, /* Red, green, blue, white (DeviceRGB, sRGB by default) @since CUPS 1.2/macOS 10.5@ */ - CUPS_CSPACE_SW = 18, /* Luminance (gamma 2.2) @since CUPS 1.4.5@ */ - CUPS_CSPACE_SRGB = 19, /* Red, green, blue (sRGB) @since CUPS 1.4.5@ */ - CUPS_CSPACE_ADOBERGB = 20, /* Red, green, blue (Adobe RGB) @since CUPS 1.4.5@ */ - - CUPS_CSPACE_ICC1 = 32, /* ICC-based, 1 color @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_ICC2 = 33, /* ICC-based, 2 colors @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_ICC3 = 34, /* ICC-based, 3 colors @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_ICC4 = 35, /* ICC-based, 4 colors @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_ICC5 = 36, /* ICC-based, 5 colors @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_ICC6 = 37, /* ICC-based, 6 colors @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_ICC7 = 38, /* ICC-based, 7 colors @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_ICC8 = 39, /* ICC-based, 8 colors @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_ICC9 = 40, /* ICC-based, 9 colors @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_ICCA = 41, /* ICC-based, 10 colors @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_ICCB = 42, /* ICC-based, 11 colors @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_ICCC = 43, /* ICC-based, 12 colors @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_ICCD = 44, /* ICC-based, 13 colors @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_ICCE = 45, /* ICC-based, 14 colors @since CUPS 1.1.19/macOS 10.3@ */ - CUPS_CSPACE_ICCF = 46, /* ICC-based, 15 colors @since CUPS 1.1.19/macOS 10.3@ */ - - CUPS_CSPACE_DEVICE1 = 48, /* DeviceN, 1 color @since CUPS 1.4.5@ */ - CUPS_CSPACE_DEVICE2 = 49, /* DeviceN, 2 colors @since CUPS 1.4.5@ */ - CUPS_CSPACE_DEVICE3 = 50, /* DeviceN, 3 colors @since CUPS 1.4.5@ */ - CUPS_CSPACE_DEVICE4 = 51, /* DeviceN, 4 colors @since CUPS 1.4.5@ */ - CUPS_CSPACE_DEVICE5 = 52, /* DeviceN, 5 colors @since CUPS 1.4.5@ */ - CUPS_CSPACE_DEVICE6 = 53, /* DeviceN, 6 colors @since CUPS 1.4.5@ */ - CUPS_CSPACE_DEVICE7 = 54, /* DeviceN, 7 colors @since CUPS 1.4.5@ */ - CUPS_CSPACE_DEVICE8 = 55, /* DeviceN, 8 colors @since CUPS 1.4.5@ */ - CUPS_CSPACE_DEVICE9 = 56, /* DeviceN, 9 colors @since CUPS 1.4.5@ */ - CUPS_CSPACE_DEVICEA = 57, /* DeviceN, 10 colors @since CUPS 1.4.5@ */ - CUPS_CSPACE_DEVICEB = 58, /* DeviceN, 11 colors @since CUPS 1.4.5@ */ - CUPS_CSPACE_DEVICEC = 59, /* DeviceN, 12 colors @since CUPS 1.4.5@ */ - CUPS_CSPACE_DEVICED = 60, /* DeviceN, 13 colors @since CUPS 1.4.5@ */ - CUPS_CSPACE_DEVICEE = 61, /* DeviceN, 14 colors @since CUPS 1.4.5@ */ - CUPS_CSPACE_DEVICEF = 62 /* DeviceN, 15 colors @since CUPS 1.4.5@ */ + CUPS_CSPACE_W = 0, // Luminance (DeviceGray, gamma 2.2 by default) + CUPS_CSPACE_RGB = 1, // Red, green, blue (DeviceRGB, sRGB by default) + CUPS_CSPACE_RGBA = 2, // Red, green, blue, alpha (DeviceRGB, sRGB by default) + CUPS_CSPACE_K = 3, // Black (DeviceK) + CUPS_CSPACE_CMY = 4, // Cyan, magenta, yellow (DeviceCMY) + CUPS_CSPACE_YMC = 5, // Yellow, magenta, cyan @deprecated@ + CUPS_CSPACE_CMYK = 6, // Cyan, magenta, yellow, black (DeviceCMYK) + CUPS_CSPACE_YMCK = 7, // Yellow, magenta, cyan, black @deprecated@ + CUPS_CSPACE_KCMY = 8, // Black, cyan, magenta, yellow @deprecated@ + CUPS_CSPACE_KCMYcm = 9, // Black, cyan, magenta, yellow, light-cyan, light-magenta @deprecated@ + CUPS_CSPACE_GMCK = 10, // Gold, magenta, yellow, black @deprecated@ + CUPS_CSPACE_GMCS = 11, // Gold, magenta, yellow, silver @deprecated@ + CUPS_CSPACE_WHITE = 12, // White ink (as black) @deprecated@ + CUPS_CSPACE_GOLD = 13, // Gold foil @deprecated@ + CUPS_CSPACE_SILVER = 14, // Silver foil @deprecated@ + + CUPS_CSPACE_CIEXYZ = 15, // CIE XYZ @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_CIELab = 16, // CIE Lab @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_RGBW = 17, // Red, green, blue, white (DeviceRGB, sRGB by default) @since CUPS 1.2/macOS 10.5@ + CUPS_CSPACE_SW = 18, // Luminance (gamma 2.2) @since CUPS 1.4.5@ + CUPS_CSPACE_SRGB = 19, // Red, green, blue (sRGB) @since CUPS 1.4.5@ + CUPS_CSPACE_ADOBERGB = 20, // Red, green, blue (Adobe RGB) @since CUPS 1.4.5@ + + CUPS_CSPACE_ICC1 = 32, // ICC-based, 1 color @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_ICC2 = 33, // ICC-based, 2 colors @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_ICC3 = 34, // ICC-based, 3 colors @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_ICC4 = 35, // ICC-based, 4 colors @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_ICC5 = 36, // ICC-based, 5 colors @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_ICC6 = 37, // ICC-based, 6 colors @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_ICC7 = 38, // ICC-based, 7 colors @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_ICC8 = 39, // ICC-based, 8 colors @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_ICC9 = 40, // ICC-based, 9 colors @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_ICCA = 41, // ICC-based, 10 colors @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_ICCB = 42, // ICC-based, 11 colors @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_ICCC = 43, // ICC-based, 12 colors @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_ICCD = 44, // ICC-based, 13 colors @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_ICCE = 45, // ICC-based, 14 colors @since CUPS 1.1.19/macOS 10.3@ + CUPS_CSPACE_ICCF = 46, // ICC-based, 15 colors @since CUPS 1.1.19/macOS 10.3@ + + CUPS_CSPACE_DEVICE1 = 48, // DeviceN, 1 color @since CUPS 1.4.5@ + CUPS_CSPACE_DEVICE2 = 49, // DeviceN, 2 colors @since CUPS 1.4.5@ + CUPS_CSPACE_DEVICE3 = 50, // DeviceN, 3 colors @since CUPS 1.4.5@ + CUPS_CSPACE_DEVICE4 = 51, // DeviceN, 4 colors @since CUPS 1.4.5@ + CUPS_CSPACE_DEVICE5 = 52, // DeviceN, 5 colors @since CUPS 1.4.5@ + CUPS_CSPACE_DEVICE6 = 53, // DeviceN, 6 colors @since CUPS 1.4.5@ + CUPS_CSPACE_DEVICE7 = 54, // DeviceN, 7 colors @since CUPS 1.4.5@ + CUPS_CSPACE_DEVICE8 = 55, // DeviceN, 8 colors @since CUPS 1.4.5@ + CUPS_CSPACE_DEVICE9 = 56, // DeviceN, 9 colors @since CUPS 1.4.5@ + CUPS_CSPACE_DEVICEA = 57, // DeviceN, 10 colors @since CUPS 1.4.5@ + CUPS_CSPACE_DEVICEB = 58, // DeviceN, 11 colors @since CUPS 1.4.5@ + CUPS_CSPACE_DEVICEC = 59, // DeviceN, 12 colors @since CUPS 1.4.5@ + CUPS_CSPACE_DEVICED = 60, // DeviceN, 13 colors @since CUPS 1.4.5@ + CUPS_CSPACE_DEVICEE = 61, // DeviceN, 14 colors @since CUPS 1.4.5@ + CUPS_CSPACE_DEVICEF = 62 // DeviceN, 15 colors @since CUPS 1.4.5@ } cups_cspace_t; -typedef enum cups_cut_e /**** CutMedia attribute values ****/ +typedef enum cups_cut_e // CutMedia attribute values { - CUPS_CUT_NONE = 0, /* Never cut the roll */ - CUPS_CUT_FILE = 1, /* Cut the roll after this file */ - CUPS_CUT_JOB = 2, /* Cut the roll after this job */ - CUPS_CUT_SET = 3, /* Cut the roll after this set */ - CUPS_CUT_PAGE = 4 /* Cut the roll after this page */ + CUPS_CUT_NONE = 0, // Never cut the roll + CUPS_CUT_FILE = 1, // Cut the roll after this file + CUPS_CUT_JOB = 2, // Cut the roll after this job + CUPS_CUT_SET = 3, // Cut the roll after this set + CUPS_CUT_PAGE = 4 // Cut the roll after this page } cups_cut_t; -typedef enum cups_edge_e /**** LeadingEdge attribute values ****/ +typedef enum cups_edge_e // LeadingEdge attribute values { - CUPS_EDGE_TOP = 0, /* Leading edge is the top of the page */ - CUPS_EDGE_RIGHT = 1, /* Leading edge is the right of the page */ - CUPS_EDGE_BOTTOM = 2, /* Leading edge is the bottom of the page */ - CUPS_EDGE_LEFT = 3 /* Leading edge is the left of the page */ + CUPS_EDGE_TOP = 0, // Leading edge is the top of the page + CUPS_EDGE_RIGHT = 1, // Leading edge is the right of the page + CUPS_EDGE_BOTTOM = 2, // Leading edge is the bottom of the page + CUPS_EDGE_LEFT = 3 // Leading edge is the left of the page } cups_edge_t; -typedef enum cups_jog_e /**** Jog attribute values ****/ +typedef enum cups_jog_e // Jog attribute values { - CUPS_JOG_NONE = 0, /* Never move pages */ - CUPS_JOG_FILE = 1, /* Move pages after this file */ - CUPS_JOG_JOB = 2, /* Move pages after this job */ - CUPS_JOG_SET = 3 /* Move pages after this set */ + CUPS_JOG_NONE = 0, // Never move pages + CUPS_JOG_FILE = 1, // Move pages after this file + CUPS_JOG_JOB = 2, // Move pages after this job + CUPS_JOG_SET = 3 // Move pages after this set } cups_jog_t; -enum cups_mode_e /**** cupsRasterOpen modes ****/ +enum cups_raster_mode_e // cupsRasterOpen modes { - CUPS_RASTER_READ = 0, /* Open stream for reading */ - CUPS_RASTER_WRITE = 1, /* Open stream for writing */ - CUPS_RASTER_WRITE_COMPRESSED = 2, /* Open stream for compressed writing @since CUPS 1.3/macOS 10.5@ */ - CUPS_RASTER_WRITE_PWG = 3, /* Open stream for compressed writing in PWG Raster mode @since CUPS 1.5/macOS 10.7@ */ - CUPS_RASTER_WRITE_APPLE = 4 /* Open stream for compressed writing in AppleRaster mode (beta) @private@ */ + CUPS_RASTER_READ = 0, // Open stream for reading + CUPS_RASTER_WRITE = 1, // Open stream for writing + CUPS_RASTER_WRITE_COMPRESSED = 2, // Open stream for compressed writing @since CUPS 1.3/macOS 10.5@ + CUPS_RASTER_WRITE_PWG = 3, // Open stream for compressed writing in PWG Raster mode @since CUPS 1.5/macOS 10.7@ + CUPS_RASTER_WRITE_APPLE = 4 // Open stream for compressed writing in AppleRaster mode (beta) @private@ }; -typedef enum cups_mode_e cups_mode_t; /**** cupsRasterOpen modes ****/ +typedef enum cups_raster_mode_e cups_raster_mode_t; + // cupsRasterOpen modes +#define cups_mode_t cups_raster_mode_t // Old name -typedef enum cups_order_e /**** cupsColorOrder attribute values ****/ +typedef enum cups_order_e // cupsColorOrder attribute values { - CUPS_ORDER_CHUNKED = 0, /* CMYK CMYK CMYK ... */ - CUPS_ORDER_BANDED = 1, /* CCC MMM YYY KKK ... */ - CUPS_ORDER_PLANAR = 2 /* CCC ... MMM ... YYY ... KKK ... */ + CUPS_ORDER_CHUNKED = 0, // CMYK CMYK CMYK ... + CUPS_ORDER_BANDED = 1, // CCC MMM YYY KKK ... + CUPS_ORDER_PLANAR = 2 // CCC ... MMM ... YYY ... KKK ... } cups_order_t; -typedef enum cups_orient_e /**** Orientation attribute values ****/ +typedef enum cups_orient_e // Orientation attribute values { - CUPS_ORIENT_0 = 0, /* Don't rotate the page */ - CUPS_ORIENT_90 = 1, /* Rotate the page counter-clockwise */ - CUPS_ORIENT_180 = 2, /* Turn the page upside down */ - CUPS_ORIENT_270 = 3 /* Rotate the page clockwise */ + CUPS_ORIENT_0 = 0, // Don't rotate the page + CUPS_ORIENT_90 = 1, // Rotate the page counter-clockwise + CUPS_ORIENT_180 = 2, // Turn the page upside down + CUPS_ORIENT_270 = 3 // Rotate the page clockwise } cups_orient_t; -/* - * The page header structure contains the standard PostScript page device - * dictionary, along with some CUPS-specific parameters that are provided - * by the RIPs... - * - * The API supports a "version 1" (from CUPS 1.0 and 1.1) and a "version 2" - * (from CUPS 1.2 and higher) page header, for binary compatibility. - */ +// +// The page header structure contains the standard PostScript page device +// dictionary, along with some CUPS-specific parameters that are provided +// by the RIPs... +// +// The API supports a "version 1" (from CUPS 1.0 and 1.1) and a "version 2" +// (from CUPS 1.2 and higher) page header, for binary compatibility. +// -typedef struct cups_page_header_s /**** Version 1 page header @deprecated@ ****/ +typedef struct cups_page_header_s // Version 1 page header @deprecated@ { - /**** Standard Page Device Dictionary String Values ****/ - char MediaClass[64]; /* MediaClass string */ - char MediaColor[64]; /* MediaColor string */ - char MediaType[64]; /* MediaType string */ - char OutputType[64]; /* OutputType string */ - - /**** Standard Page Device Dictionary Integer Values ****/ - unsigned AdvanceDistance; /* AdvanceDistance value in points */ - cups_adv_t AdvanceMedia; /* AdvanceMedia value (@link cups_adv_t@) */ - cups_bool_t Collate; /* Collated copies value */ - cups_cut_t CutMedia; /* CutMedia value (@link cups_cut_t@) */ - cups_bool_t Duplex; /* Duplexed (double-sided) value */ - unsigned HWResolution[2]; /* Resolution in dots-per-inch */ - unsigned ImagingBoundingBox[4]; /* Pixel region that is painted (points, left, bottom, right, top) */ - cups_bool_t InsertSheet; /* InsertSheet value */ - cups_jog_t Jog; /* Jog value (@link cups_jog_t@) */ - cups_edge_t LeadingEdge; /* LeadingEdge value (@link cups_edge_t@) */ - unsigned Margins[2]; /* Lower-lefthand margins in points */ - cups_bool_t ManualFeed; /* ManualFeed value */ - unsigned MediaPosition; /* MediaPosition value */ - unsigned MediaWeight; /* MediaWeight value in grams/m^2 */ - cups_bool_t MirrorPrint; /* MirrorPrint value */ - cups_bool_t NegativePrint; /* NegativePrint value */ - unsigned NumCopies; /* Number of copies to produce */ - cups_orient_t Orientation; /* Orientation value (@link cups_orient_t@) */ - cups_bool_t OutputFaceUp; /* OutputFaceUp value */ - unsigned PageSize[2]; /* Width and length of page in points */ - cups_bool_t Separations; /* Separations value */ - cups_bool_t TraySwitch; /* TraySwitch value */ - cups_bool_t Tumble; /* Tumble value */ - - /**** CUPS Page Device Dictionary Values ****/ - unsigned cupsWidth; /* Width of page image in pixels */ - unsigned cupsHeight; /* Height of page image in pixels */ - unsigned cupsMediaType; /* Media type code */ - unsigned cupsBitsPerColor; /* Number of bits for each color */ - unsigned cupsBitsPerPixel; /* Number of bits for each pixel */ - unsigned cupsBytesPerLine; /* Number of bytes per line */ - cups_order_t cupsColorOrder; /* Order of colors */ - cups_cspace_t cupsColorSpace; /* True colorspace */ - unsigned cupsCompression; /* Device compression to use */ - unsigned cupsRowCount; /* Rows per band */ - unsigned cupsRowFeed; /* Feed between bands */ - unsigned cupsRowStep; /* Spacing between lines */ + // Standard Page Device Dictionary String Values + char MediaClass[64]; // MediaClass string + char MediaColor[64]; // MediaColor string + char MediaType[64]; // MediaType string + char OutputType[64]; // OutputType string + + // Standard Page Device Dictionary Integer Values + unsigned AdvanceDistance; // AdvanceDistance value in points + cups_adv_t AdvanceMedia; // AdvanceMedia value (@link cups_adv_t@) + cups_bool_t Collate; // Collated copies value + cups_cut_t CutMedia; // CutMedia value (@link cups_cut_t@) + cups_bool_t Duplex; // Duplexed (double-sided) value + unsigned HWResolution[2]; // Resolution in dots-per-inch + unsigned ImagingBoundingBox[4]; // Pixel region that is painted (points, left, bottom, right, top) + cups_bool_t InsertSheet; // InsertSheet value + cups_jog_t Jog; // Jog value (@link cups_jog_t@) + cups_edge_t LeadingEdge; // LeadingEdge value (@link cups_edge_t@) + unsigned Margins[2]; // Lower-lefthand margins in points + cups_bool_t ManualFeed; // ManualFeed value + unsigned MediaPosition; // MediaPosition value + unsigned MediaWeight; // MediaWeight value in grams/m^2 + cups_bool_t MirrorPrint; // MirrorPrint value + cups_bool_t NegativePrint; // NegativePrint value + unsigned NumCopies; // Number of copies to produce + cups_orient_t Orientation; // Orientation value (@link cups_orient_t@) + cups_bool_t OutputFaceUp; // OutputFaceUp value + unsigned PageSize[2]; // Width and length of page in points + cups_bool_t Separations; // Separations value + cups_bool_t TraySwitch; // TraySwitch value + cups_bool_t Tumble; // Tumble value + + // CUPS Page Device Dictionary Values + unsigned cupsWidth; // Width of page image in pixels + unsigned cupsHeight; // Height of page image in pixels + unsigned cupsMediaType; // Media type code + unsigned cupsBitsPerColor; // Number of bits for each color + unsigned cupsBitsPerPixel; // Number of bits for each pixel + unsigned cupsBytesPerLine; // Number of bytes per line + cups_order_t cupsColorOrder; // Order of colors + cups_cspace_t cupsColorSpace; // True colorspace + unsigned cupsCompression; // Device compression to use + unsigned cupsRowCount; // Rows per band + unsigned cupsRowFeed; // Feed between bands + unsigned cupsRowStep; // Spacing between lines } cups_page_header_t; -/**** New in CUPS 1.2 ****/ -typedef struct cups_page_header2_s /**** Version 2 page header @since CUPS 1.2/macOS 10.5@ ****/ +typedef struct cups_page_header2_s // Version 2 page header @since CUPS 1.2/macOS 10.5@ { - /**** Standard Page Device Dictionary String Values ****/ - char MediaClass[64]; /* MediaClass string */ - char MediaColor[64]; /* MediaColor string */ - char MediaType[64]; /* MediaType string */ - char OutputType[64]; /* OutputType string */ - - /**** Standard Page Device Dictionary Integer Values ****/ - unsigned AdvanceDistance; /* AdvanceDistance value in points */ - cups_adv_t AdvanceMedia; /* AdvanceMedia value (@link cups_adv_t@) */ - cups_bool_t Collate; /* Collated copies value */ - cups_cut_t CutMedia; /* CutMedia value (@link cups_cut_t@) */ - cups_bool_t Duplex; /* Duplexed (double-sided) value */ - unsigned HWResolution[2]; /* Resolution in dots-per-inch */ - unsigned ImagingBoundingBox[4]; /* Pixel region that is painted (points, left, bottom, right, top) */ - cups_bool_t InsertSheet; /* InsertSheet value */ - cups_jog_t Jog; /* Jog value (@link cups_jog_t@) */ - cups_edge_t LeadingEdge; /* LeadingEdge value (@link cups_edge_t@) */ - unsigned Margins[2]; /* Lower-lefthand margins in points */ - cups_bool_t ManualFeed; /* ManualFeed value */ - unsigned MediaPosition; /* MediaPosition value */ - unsigned MediaWeight; /* MediaWeight value in grams/m^2 */ - cups_bool_t MirrorPrint; /* MirrorPrint value */ - cups_bool_t NegativePrint; /* NegativePrint value */ - unsigned NumCopies; /* Number of copies to produce */ - cups_orient_t Orientation; /* Orientation value (@link cups_orient_t@) */ - cups_bool_t OutputFaceUp; /* OutputFaceUp value */ - unsigned PageSize[2]; /* Width and length of page in points */ - cups_bool_t Separations; /* Separations value */ - cups_bool_t TraySwitch; /* TraySwitch value */ - cups_bool_t Tumble; /* Tumble value */ - - /**** CUPS Page Device Dictionary Values ****/ - unsigned cupsWidth; /* Width of page image in pixels */ - unsigned cupsHeight; /* Height of page image in pixels */ - unsigned cupsMediaType; /* Media type code */ - unsigned cupsBitsPerColor; /* Number of bits for each color */ - unsigned cupsBitsPerPixel; /* Number of bits for each pixel */ - unsigned cupsBytesPerLine; /* Number of bytes per line */ - cups_order_t cupsColorOrder; /* Order of colors */ - cups_cspace_t cupsColorSpace; /* True colorspace */ - unsigned cupsCompression; /* Device compression to use */ - unsigned cupsRowCount; /* Rows per band */ - unsigned cupsRowFeed; /* Feed between bands */ - unsigned cupsRowStep; /* Spacing between lines */ - - /**** Version 2 Dictionary Values ****/ - unsigned cupsNumColors; /* Number of color components @since CUPS 1.2/macOS 10.5@ */ + // Standard Page Device Dictionary String Values + char MediaClass[64]; // MediaClass string + char MediaColor[64]; // MediaColor string + char MediaType[64]; // MediaType string + char OutputType[64]; // OutputType string + + // Standard Page Device Dictionary Integer Values + unsigned AdvanceDistance; // AdvanceDistance value in points + cups_adv_t AdvanceMedia; // AdvanceMedia value (@link cups_adv_t@) + cups_bool_t Collate; // Collated copies value + cups_cut_t CutMedia; // CutMedia value (@link cups_cut_t@) + cups_bool_t Duplex; // Duplexed (double-sided) value + unsigned HWResolution[2]; // Resolution in dots-per-inch + unsigned ImagingBoundingBox[4]; // Pixel region that is painted (points, left, bottom, right, top) + cups_bool_t InsertSheet; // InsertSheet value + cups_jog_t Jog; // Jog value (@link cups_jog_t@) + cups_edge_t LeadingEdge; // LeadingEdge value (@link cups_edge_t@) + unsigned Margins[2]; // Lower-lefthand margins in points + cups_bool_t ManualFeed; // ManualFeed value + unsigned MediaPosition; // MediaPosition value + unsigned MediaWeight; // MediaWeight value in grams/m^2 + cups_bool_t MirrorPrint; // MirrorPrint value + cups_bool_t NegativePrint; // NegativePrint value + unsigned NumCopies; // Number of copies to produce + cups_orient_t Orientation; // Orientation value (@link cups_orient_t@) + cups_bool_t OutputFaceUp; // OutputFaceUp value + unsigned PageSize[2]; // Width and length of page in points + cups_bool_t Separations; // Separations value + cups_bool_t TraySwitch; // TraySwitch value + cups_bool_t Tumble; // Tumble value + + // CUPS Page Device Dictionary Values + unsigned cupsWidth; // Width of page image in pixels + unsigned cupsHeight; // Height of page image in pixels + unsigned cupsMediaType; // Media type code + unsigned cupsBitsPerColor; // Number of bits for each color + unsigned cupsBitsPerPixel; // Number of bits for each pixel + unsigned cupsBytesPerLine; // Number of bytes per line + cups_order_t cupsColorOrder; // Order of colors + cups_cspace_t cupsColorSpace; // True colorspace + unsigned cupsCompression; // Device compression to use + unsigned cupsRowCount; // Rows per band + unsigned cupsRowFeed; // Feed between bands + unsigned cupsRowStep; // Spacing between lines + + // Version 2 Dictionary Values + unsigned cupsNumColors; // Number of color components @since CUPS 1.2/macOS 10.5@ float cupsBorderlessScalingFactor; - /* Scaling that was applied to page data @since CUPS 1.2/macOS 10.5@ */ + // Scaling that was applied to page data @since CUPS 1.2/macOS 10.5@ float cupsPageSize[2]; /* Floating point PageSize (scaling * * factor not applied) @since CUPS 1.2/macOS 10.5@ */ float cupsImagingBBox[4]; /* Floating point ImagingBoundingBox * (scaling factor not applied, left, * bottom, right, top) @since CUPS 1.2/macOS 10.5@ */ - unsigned cupsInteger[16]; /* User-defined integer values @since CUPS 1.2/macOS 10.5@ */ - float cupsReal[16]; /* User-defined floating-point values @since CUPS 1.2/macOS 10.5@ */ - char cupsString[16][64]; /* User-defined string values @since CUPS 1.2/macOS 10.5@ */ - char cupsMarkerType[64]; /* Ink/toner type @since CUPS 1.2/macOS 10.5@ */ - char cupsRenderingIntent[64];/* Color rendering intent @since CUPS 1.2/macOS 10.5@ */ - char cupsPageSizeName[64]; /* PageSize name @since CUPS 1.2/macOS 10.5@ */ + unsigned cupsInteger[16]; // User-defined integer values @since CUPS 1.2/macOS 10.5@ + float cupsReal[16]; // User-defined floating-point values @since CUPS 1.2/macOS 10.5@ + char cupsString[16][64]; // User-defined string values @since CUPS 1.2/macOS 10.5@ + char cupsMarkerType[64]; // Ink/toner type @since CUPS 1.2/macOS 10.5@ + char cupsRenderingIntent[64];// Color rendering intent @since CUPS 1.2/macOS 10.5@ + char cupsPageSizeName[64]; // PageSize name @since CUPS 1.2/macOS 10.5@ } cups_page_header2_t; typedef struct _cups_raster_s cups_raster_t; - /**** Raster stream data ****/ - -/**** New in CUPS 1.5 ****/ -typedef ssize_t (*cups_raster_iocb_t)(void *ctx, unsigned char *buffer, size_t length); - /**** cupsRasterOpenIO callback function - * - * This function is specified when - * creating a raster stream with - * @link cupsRasterOpenIO@ and handles - * generic reading and writing of raster - * data. It must return -1 on error or - * the number of bytes specified by - * "length" on success. - ****/ - - -/* - * Prototypes... - */ + // Raster stream data + +typedef ssize_t (*cups_raster_cb_t)(void *ctx, unsigned char *buffer, size_t length); + // cupsRasterOpenIO callback function +# define cups_raster_iocb_t cups_raster_cb_t + // Old name + +// +// Functions... +// extern void cupsRasterClose(cups_raster_t *r) _CUPS_PUBLIC; -extern cups_raster_t *cupsRasterOpen(int fd, cups_mode_t mode) _CUPS_PUBLIC; +extern const char *cupsRasterErrorString(void) _CUPS_DEPRECATED_MSG("Use cupsRasterGetErrorString instead."); +extern const char *cupsRasterGetErrorString(void) _CUPS_PUBLIC; +extern bool cupsRasterInitHeader(cups_page_header2_t *h, cups_media_t *media, const char *optimize, ipp_quality_t quality, const char *intent, ipp_orient_t orientation, const char *sides, const char *type, int xdpi, int ydpi, const char *sheet_back) _CUPS_PUBLIC; +extern int cupsRasterInitPWGHeader(cups_page_header2_t *h, pwg_media_t *media, const char *type, int xdpi, int ydpi, const char *sides, const char *sheet_back) _CUPS_DEPRECATED_MSG("Use cupsRasterInitHeader instead."); +extern cups_raster_t *cupsRasterOpen(int fd, cups_raster_mode_t mode) _CUPS_PUBLIC; +extern cups_raster_t *cupsRasterOpenIO(cups_raster_cb_t iocb, void *ctx, cups_raster_mode_t mode) _CUPS_PUBLIC; extern unsigned cupsRasterReadHeader(cups_raster_t *r, cups_page_header_t *h) _CUPS_DEPRECATED_MSG("Use cupsRasterReadHeader2 instead.") _CUPS_PUBLIC; +extern unsigned cupsRasterReadHeader2(cups_raster_t *r, cups_page_header2_t *h) _CUPS_PUBLIC; extern unsigned cupsRasterReadPixels(cups_raster_t *r, unsigned char *p, unsigned len) _CUPS_PUBLIC; extern unsigned cupsRasterWriteHeader(cups_raster_t *r, cups_page_header_t *h) _CUPS_DEPRECATED_MSG("Use cupsRasterWriteHeader2 instead.") _CUPS_PUBLIC; +extern unsigned cupsRasterWriteHeader2(cups_raster_t *r, cups_page_header2_t *h) _CUPS_PUBLIC; extern unsigned cupsRasterWritePixels(cups_raster_t *r, unsigned char *p, unsigned len) _CUPS_PUBLIC; -/**** New in CUPS 1.2 ****/ -extern unsigned cupsRasterReadHeader2(cups_raster_t *r, cups_page_header2_t *h) _CUPS_API_1_2; -extern unsigned cupsRasterWriteHeader2(cups_raster_t *r, cups_page_header2_t *h) _CUPS_API_1_2; - -/**** New in CUPS 1.3 ****/ -extern const char *cupsRasterErrorString(void) _CUPS_API_1_3; - -/**** New in CUPS 1.5 ****/ -extern cups_raster_t *cupsRasterOpenIO(cups_raster_iocb_t iocb, void *ctx, cups_mode_t mode) _CUPS_API_1_5; - -/**** New in CUPS 2.2/macOS 10.12 ****/ -extern int cupsRasterInitPWGHeader(cups_page_header2_t *h, pwg_media_t *media, const char *type, int xdpi, int ydpi, const char *sides, const char *sheet_back) _CUPS_API_2_2; # ifdef __cplusplus } -# endif /* __cplusplus */ - -#endif /* !_CUPS_RASTER_H_ */ +# endif // __cplusplus +#endif // !_CUPS_RASTER_H_ diff --git a/cups/testdnssd.c b/cups/testdnssd.c index e273a6c422..cf0ee81791 100644 --- a/cups/testdnssd.c +++ b/cups/testdnssd.c @@ -37,7 +37,7 @@ typedef struct testdata_s // Test data structure static void browse_cb(cups_dnssd_browse_t *browse, void *cb_data, cups_dnssd_flags_t flags, uint32_t if_index, const char *name, const char *regtype, const char *domain); static void error_cb(void *cb_data, const char *message); static void query_cb(cups_dnssd_query_t *query, void *cb_data, cups_dnssd_flags_t flags, uint32_t if_index, const char *fullname, uint16_t rrtype, const void *qdata, uint16_t qlen); -static void resolve_cb(cups_dnssd_resolve_t *res, void *cb_data, cups_dnssd_flags_t flags, uint32_t if_index, const char *fullname, const char *host, uint16_t port, size_t num_txt, cups_option_t *txt); +static void resolve_cb(cups_dnssd_resolve_t *res, void *cb_data, cups_dnssd_flags_t flags, uint32_t if_index, const char *fullname, const char *host, uint16_t port, int num_txt, cups_option_t *txt); static void service_cb(cups_dnssd_service_t *service, void *cb_data, cups_dnssd_flags_t flags); static void usage(const char *arg); @@ -325,12 +325,12 @@ resolve_cb( const char *fullname, // I - Full service name const char *host, // I - Hostname uint16_t port, // I - Port number - size_t num_txt, // I - Number of key/value pairs in TXT record + int num_txt, // I - Number of key/value pairs in TXT record cups_option_t *txt) // I - Key/value pairs { testdata_t *data = (testdata_t *)cb_data; // Test data - size_t i; // Looping var + int i; // Looping var char message[2048], // Message string *mptr; // Pointer into message string const char *prefix = " txt="; // Prefix string diff --git a/cups/testipp.c b/cups/testipp.c index f7b01fa476..49ab9b5458 100644 --- a/cups/testipp.c +++ b/cups/testipp.c @@ -1,342 +1,328 @@ -/* - * IPP test program for CUPS. - * - * Copyright © 2022-2023 by OpenPrinting. - * Copyright © 2007-2019 by Apple Inc. - * Copyright © 1997-2005 by Easy Software Products. - * - * Licensed under Apache License v2.0. See the file "LICENSE" for more - * information. - */ - -/* - * Include necessary headers... - */ +// +// IPP unit test program for libcups. +// +// Copyright © 2021-2022 by OpenPrinting. +// Copyright © 2007-2019 by Apple Inc. +// Copyright © 1997-2005 by Easy Software Products. +// +// Licensed under Apache License v2.0. See the file "LICENSE" for more +// information. +// #include "file.h" #include "string-private.h" #include "ipp-private.h" +#include "test-internal.h" #ifdef _WIN32 # include #else # include # include -#endif /* _WIN32 */ +#endif // _WIN32 -/* - * Local types... - */ +// +// Local types... +// typedef struct _ippdata_t { - size_t rpos, /* Read position */ - wused, /* Bytes used */ - wsize; /* Max size of buffer */ - ipp_uchar_t *wbuffer; /* Buffer */ + size_t rpos, // Read position + wused, // Bytes used + wsize; // Max size of buffer + ipp_uchar_t *wbuffer; // Buffer } _ippdata_t; -/* - * Local globals... - */ +// +// Local globals... +// -static ipp_uchar_t collection[] = /* Collection buffer */ +static ipp_uchar_t collection[] = // Collection buffer { - 0x01, 0x01, /* IPP version */ - 0x00, 0x02, /* Print-Job operation */ + 0x01, 0x01, // IPP version + 0x00, 0x02, // Print-Job operation 0x00, 0x00, 0x00, 0x01, - /* Request ID */ + // Request ID IPP_TAG_OPERATION, IPP_TAG_CHARSET, - 0x00, 0x12, /* Name length + name */ + 0x00, 0x12, // Name length + name 'a','t','t','r','i','b','u','t','e','s','-', 'c','h','a','r','s','e','t', - 0x00, 0x05, /* Value length + value */ + 0x00, 0x05, // Value length + value 'u','t','f','-','8', IPP_TAG_LANGUAGE, - 0x00, 0x1b, /* Name length + name */ + 0x00, 0x1b, // Name length + name 'a','t','t','r','i','b','u','t','e','s','-', 'n','a','t','u','r','a','l','-','l','a','n', 'g','u','a','g','e', - 0x00, 0x02, /* Value length + value */ + 0x00, 0x02, // Value length + value 'e','n', IPP_TAG_URI, - 0x00, 0x0b, /* Name length + name */ + 0x00, 0x0b, // Name length + name 'p','r','i','n','t','e','r','-','u','r','i', - 0x00, 0x1c, /* Value length + value */ + 0x00, 0x1c, // Value length + value 'i','p','p',':','/','/','l','o','c','a','l', 'h','o','s','t','/','p','r','i','n','t','e', 'r','s','/','f','o','o', - IPP_TAG_JOB, /* job group tag */ + IPP_TAG_JOB, // job group tag IPP_TAG_BEGIN_COLLECTION, - /* begCollection tag */ - 0x00, 0x09, /* Name length + name */ + // begCollection tag + 0x00, 0x09, // Name length + name 'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l', - 0x00, 0x00, /* No value */ - IPP_TAG_MEMBERNAME, /* memberAttrName tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x0a, /* Value length + value */ + 0x00, 0x00, // No value + IPP_TAG_MEMBERNAME, // memberAttrName tag + 0x00, 0x00, // No name + 0x00, 0x0a, // Value length + value 'm', 'e', 'd', 'i', 'a', '-', 's', 'i', 'z', 'e', IPP_TAG_BEGIN_COLLECTION, - /* begCollection tag */ - 0x00, 0x00, /* Name length + name */ - 0x00, 0x00, /* No value */ + // begCollection tag + 0x00, 0x00, // Name length + name + 0x00, 0x00, // No value IPP_TAG_MEMBERNAME, - /* memberAttrName tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x0b, /* Value length + value */ + // memberAttrName tag + 0x00, 0x00, // No name + 0x00, 0x0b, // Value length + value 'x', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', - IPP_TAG_INTEGER, /* integer tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x04, /* Value length + value */ + IPP_TAG_INTEGER, // integer tag + 0x00, 0x00, // No name + 0x00, 0x04, // Value length + value 0x00, 0x00, 0x54, 0x56, IPP_TAG_MEMBERNAME, - /* memberAttrName tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x0b, /* Value length + value */ + // memberAttrName tag + 0x00, 0x00, // No name + 0x00, 0x0b, // Value length + value 'y', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', - IPP_TAG_INTEGER, /* integer tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x04, /* Value length + value */ + IPP_TAG_INTEGER, // integer tag + 0x00, 0x00, // No name + 0x00, 0x04, // Value length + value 0x00, 0x00, 0x6d, 0x24, IPP_TAG_END_COLLECTION, - /* endCollection tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x00, /* No value */ - IPP_TAG_MEMBERNAME, /* memberAttrName tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x0b, /* Value length + value */ + // endCollection tag + 0x00, 0x00, // No name + 0x00, 0x00, // No value + IPP_TAG_MEMBERNAME, // memberAttrName tag + 0x00, 0x00, // No name + 0x00, 0x0b, // Value length + value 'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l', 'o', 'r', - IPP_TAG_KEYWORD, /* keyword tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x04, /* Value length + value */ + IPP_TAG_KEYWORD, // keyword tag + 0x00, 0x00, // No name + 0x00, 0x04, // Value length + value 'b', 'l', 'u', 'e', - IPP_TAG_MEMBERNAME, /* memberAttrName tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x0a, /* Value length + value */ + IPP_TAG_MEMBERNAME, // memberAttrName tag + 0x00, 0x00, // No name + 0x00, 0x0a, // Value length + value 'm', 'e', 'd', 'i', 'a', '-', 't', 'y', 'p', 'e', - IPP_TAG_KEYWORD, /* keyword tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x05, /* Value length + value */ + IPP_TAG_KEYWORD, // keyword tag + 0x00, 0x00, // No name + 0x00, 0x05, // Value length + value 'p', 'l', 'a', 'i', 'n', IPP_TAG_END_COLLECTION, - /* endCollection tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x00, /* No value */ + // endCollection tag + 0x00, 0x00, // No name + 0x00, 0x00, // No value IPP_TAG_BEGIN_COLLECTION, - /* begCollection tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x00, /* No value */ - IPP_TAG_MEMBERNAME, /* memberAttrName tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x0a, /* Value length + value */ + // begCollection tag + 0x00, 0x00, // No name + 0x00, 0x00, // No value + IPP_TAG_MEMBERNAME, // memberAttrName tag + 0x00, 0x00, // No name + 0x00, 0x0a, // Value length + value 'm', 'e', 'd', 'i', 'a', '-', 's', 'i', 'z', 'e', IPP_TAG_BEGIN_COLLECTION, - /* begCollection tag */ - 0x00, 0x00, /* Name length + name */ - 0x00, 0x00, /* No value */ + // begCollection tag + 0x00, 0x00, // Name length + name + 0x00, 0x00, // No value IPP_TAG_MEMBERNAME, - /* memberAttrName tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x0b, /* Value length + value */ + // memberAttrName tag + 0x00, 0x00, // No name + 0x00, 0x0b, // Value length + value 'x', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', - IPP_TAG_INTEGER, /* integer tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x04, /* Value length + value */ + IPP_TAG_INTEGER, // integer tag + 0x00, 0x00, // No name + 0x00, 0x04, // Value length + value 0x00, 0x00, 0x52, 0x08, IPP_TAG_MEMBERNAME, - /* memberAttrName tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x0b, /* Value length + value */ + // memberAttrName tag + 0x00, 0x00, // No name + 0x00, 0x0b, // Value length + value 'y', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', - IPP_TAG_INTEGER, /* integer tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x04, /* Value length + value */ + IPP_TAG_INTEGER, // integer tag + 0x00, 0x00, // No name + 0x00, 0x04, // Value length + value 0x00, 0x00, 0x74, 0x04, IPP_TAG_END_COLLECTION, - /* endCollection tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x00, /* No value */ - IPP_TAG_MEMBERNAME, /* memberAttrName tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x0b, /* Value length + value */ + // endCollection tag + 0x00, 0x00, // No name + 0x00, 0x00, // No value + IPP_TAG_MEMBERNAME, // memberAttrName tag + 0x00, 0x00, // No name + 0x00, 0x0b, // Value length + value 'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l', 'o', 'r', - IPP_TAG_KEYWORD, /* keyword tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x05, /* Value length + value */ + IPP_TAG_KEYWORD, // keyword tag + 0x00, 0x00, // No name + 0x00, 0x05, // Value length + value 'p', 'l', 'a', 'i', 'd', - IPP_TAG_MEMBERNAME, /* memberAttrName tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x0a, /* Value length + value */ + IPP_TAG_MEMBERNAME, // memberAttrName tag + 0x00, 0x00, // No name + 0x00, 0x0a, // Value length + value 'm', 'e', 'd', 'i', 'a', '-', 't', 'y', 'p', 'e', - IPP_TAG_KEYWORD, /* keyword tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x06, /* Value length + value */ + IPP_TAG_KEYWORD, // keyword tag + 0x00, 0x00, // No name + 0x00, 0x06, // Value length + value 'g', 'l', 'o', 's', 's', 'y', IPP_TAG_END_COLLECTION, - /* endCollection tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x00, /* No value */ + // endCollection tag + 0x00, 0x00, // No name + 0x00, 0x00, // No value - IPP_TAG_END /* end tag */ + IPP_TAG_END // end tag }; -static ipp_uchar_t bad_collection[] = /* Collection buffer (bad encoding) */ +static ipp_uchar_t bad_collection[] = // Collection buffer (bad encoding) { - 0x01, 0x01, /* IPP version */ - 0x00, 0x02, /* Print-Job operation */ + 0x01, 0x01, // IPP version + 0x00, 0x02, // Print-Job operation 0x00, 0x00, 0x00, 0x01, - /* Request ID */ + // Request ID IPP_TAG_OPERATION, IPP_TAG_CHARSET, - 0x00, 0x12, /* Name length + name */ + 0x00, 0x12, // Name length + name 'a','t','t','r','i','b','u','t','e','s','-', 'c','h','a','r','s','e','t', - 0x00, 0x05, /* Value length + value */ + 0x00, 0x05, // Value length + value 'u','t','f','-','8', IPP_TAG_LANGUAGE, - 0x00, 0x1b, /* Name length + name */ + 0x00, 0x1b, // Name length + name 'a','t','t','r','i','b','u','t','e','s','-', 'n','a','t','u','r','a','l','-','l','a','n', 'g','u','a','g','e', - 0x00, 0x02, /* Value length + value */ + 0x00, 0x02, // Value length + value 'e','n', IPP_TAG_URI, - 0x00, 0x0b, /* Name length + name */ + 0x00, 0x0b, // Name length + name 'p','r','i','n','t','e','r','-','u','r','i', - 0x00, 0x1c, /* Value length + value */ + 0x00, 0x1c, // Value length + value 'i','p','p',':','/','/','l','o','c','a','l', 'h','o','s','t','/','p','r','i','n','t','e', 'r','s','/','f','o','o', - IPP_TAG_JOB, /* job group tag */ + IPP_TAG_JOB, // job group tag IPP_TAG_BEGIN_COLLECTION, - /* begCollection tag */ - 0x00, 0x09, /* Name length + name */ + // begCollection tag + 0x00, 0x09, // Name length + name 'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l', - 0x00, 0x00, /* No value */ + 0x00, 0x00, // No value IPP_TAG_BEGIN_COLLECTION, - /* begCollection tag */ - 0x00, 0x0a, /* Name length + name */ + // begCollection tag + 0x00, 0x0a, // Name length + name 'm', 'e', 'd', 'i', 'a', '-', 's', 'i', 'z', 'e', - 0x00, 0x00, /* No value */ - IPP_TAG_INTEGER, /* integer tag */ - 0x00, 0x0b, /* Name length + name */ + 0x00, 0x00, // No value + IPP_TAG_INTEGER, // integer tag + 0x00, 0x0b, // Name length + name 'x', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', - 0x00, 0x04, /* Value length + value */ + 0x00, 0x04, // Value length + value 0x00, 0x00, 0x54, 0x56, - IPP_TAG_INTEGER, /* integer tag */ - 0x00, 0x0b, /* Name length + name */ + IPP_TAG_INTEGER, // integer tag + 0x00, 0x0b, // Name length + name 'y', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', - 0x00, 0x04, /* Value length + value */ + 0x00, 0x04, // Value length + value 0x00, 0x00, 0x6d, 0x24, IPP_TAG_END_COLLECTION, - /* endCollection tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x00, /* No value */ + // endCollection tag + 0x00, 0x00, // No name + 0x00, 0x00, // No value IPP_TAG_END_COLLECTION, - /* endCollection tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x00, /* No value */ + // endCollection tag + 0x00, 0x00, // No name + 0x00, 0x00, // No value - IPP_TAG_END /* end tag */ + IPP_TAG_END // end tag }; -static ipp_uchar_t mixed[] = /* Mixed value buffer */ +static ipp_uchar_t mixed[] = // Mixed value buffer { - 0x01, 0x01, /* IPP version */ - 0x00, 0x02, /* Print-Job operation */ + 0x01, 0x01, // IPP version + 0x00, 0x02, // Print-Job operation 0x00, 0x00, 0x00, 0x01, - /* Request ID */ + // Request ID IPP_TAG_OPERATION, - IPP_TAG_INTEGER, /* integer tag */ - 0x00, 0x1f, /* Name length + name */ + IPP_TAG_INTEGER, // integer tag + 0x00, 0x1f, // Name length + name 'n', 'o', 't', 'i', 'f', 'y', '-', 'l', 'e', 'a', 's', 'e', '-', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '-', 's', 'u', 'p', 'p', 'o', 'r', 't', 'e', 'd', - 0x00, 0x04, /* Value length + value */ + 0x00, 0x04, // Value length + value 0x00, 0x00, 0x00, 0x01, - IPP_TAG_RANGE, /* rangeOfInteger tag */ - 0x00, 0x00, /* No name */ - 0x00, 0x08, /* Value length + value */ + IPP_TAG_RANGE, // rangeOfInteger tag + 0x00, 0x00, // No name + 0x00, 0x08, // Value length + value 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, - IPP_TAG_END /* end tag */ + IPP_TAG_END // end tag }; -/* - * Local functions... - */ +// +// Local functions... +// -void hex_dump(const char *title, ipp_uchar_t *buffer, size_t bytes); void print_attributes(ipp_t *ipp, int indent); ssize_t read_cb(_ippdata_t *data, ipp_uchar_t *buffer, size_t bytes); ssize_t read_hex(cups_file_t *fp, ipp_uchar_t *buffer, size_t bytes); -int token_cb(_ipp_file_t *f, _ipp_vars_t *v, void *user_data, const char *token); +bool token_cb(ipp_file_t *f, void *user_data, const char *token); ssize_t write_cb(_ippdata_t *data, ipp_uchar_t *buffer, size_t bytes); -/* - * 'main()' - Main entry. - */ +// +// 'main()' - Main entry. +// -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments { - _ippdata_t data; /* IPP buffer */ - ipp_uchar_t buffer[8192]; /* Write buffer data */ - ipp_t *cols[2], /* Collections */ - *size; /* media-size collection */ - ipp_t *request; /* Request */ - ipp_attribute_t *media_col, /* media-col attribute */ - *media_size, /* media-size attribute */ - *attr; /* Other attribute */ - ipp_state_t state; /* State */ - size_t length; /* Length of data */ - cups_file_t *fp; /* File pointer */ - size_t i; /* Looping var */ - int status; /* Status of tests (0 = success, 1 = fail) */ + _ippdata_t data; // IPP buffer + ipp_uchar_t buffer[8192]; // Write buffer data + ipp_t *cols[2], // Collections + *size; // media-size collection + ipp_t *request; // Request + ipp_attribute_t *media_col, // media-col attribute + *media_size, // media-size attribute + *attr; // Other attribute + ipp_state_t state; // State + size_t length; // Length of data + cups_file_t *fp; // File pointer + size_t i; // Looping var + int status; // Status of tests (0 = success, 1 = fail) #ifdef DEBUG - const char *name; /* Option name */ -#endif /* DEBUG */ - static const char * const test_strings[] = - { /* Test strings */ - "one-string", - "two-string", - "red-string", - "blue-string" - }; + const char *name; // Option name +#endif // DEBUG status = 0; if (argc == 1) { - /* - * Test request generation code... - */ - - printf("Create Sample Request: "); + // Test request generation code... + testBegin("Create Sample Request"); request = ippNew(); request->request.op.version[0] = 0x01; @@ -378,42 +364,41 @@ main(int argc, /* I - Number of command-line arguments */ ippDelete(cols[0]); ippDelete(cols[1]); - length = ippLength(request); + length = ippGetLength(request); if (length != sizeof(collection)) { - printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n", + testEndMessage(false, "wrong ippGetLength(), %d instead of %d bytes", (int)length, (int)sizeof(collection)); status = 1; } else - puts("PASS"); - - /* - * Write test #1... - */ + testEnd(true); - printf("Write Sample to Memory: "); + // Write test #1... + testBegin("Write Sample to Memory"); data.wused = 0; data.wsize = sizeof(buffer); data.wbuffer = buffer; - while ((state = ippWriteIO(&data, (ipp_iocb_t)write_cb, 1, NULL, + while ((state = ippWriteIO(&data, (ipp_io_cb_t)write_cb, 1, NULL, request)) != IPP_STATE_DATA) if (state == IPP_STATE_ERROR) break; if (state != IPP_STATE_DATA) { - printf("FAIL - %d bytes written.\n", (int)data.wused); + testEndMessage(false, "%d bytes written", (int)data.wused); status = 1; } else if (data.wused != sizeof(collection)) { - printf("FAIL - wrote %d bytes, expected %d bytes!\n", (int)data.wused, + testEndMessage(false, "wrote %d bytes, expected %d bytes", (int)data.wused, (int)sizeof(collection)); - hex_dump("Bytes Written", data.wbuffer, data.wused); - hex_dump("Baseline", collection, sizeof(collection)); + testError("Bytes Written"); + testHexDump(data.wbuffer, data.wused); + testError("Baseline"); + testHexDump(collection, sizeof(collection)); status = 1; } else if (memcmp(data.wbuffer, collection, data.wused)) @@ -422,77 +407,78 @@ main(int argc, /* I - Number of command-line arguments */ if (data.wbuffer[i] != collection[i]) break; - printf("FAIL - output does not match baseline at 0x%04x!\n", (unsigned)i); - hex_dump("Bytes Written", data.wbuffer, data.wused); - hex_dump("Baseline", collection, sizeof(collection)); + testEndMessage(false, "output does not match baseline at 0x%04x", (unsigned)i); + testError("Bytes Written"); + testHexDump(data.wbuffer, data.wused); + testError("Baseline"); + testHexDump(collection, sizeof(collection)); status = 1; } else - puts("PASS"); + testEnd(true); ippDelete(request); - /* - * Read the data back in and confirm... - */ - - printf("Read Sample from Memory: "); + // Read the data back in and confirm... + testBegin("Read Sample from Memory"); - request = ippNew(); + request = ippNew(); data.rpos = 0; - while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL, + while ((state = ippReadIO(&data, (ipp_io_cb_t)read_cb, 1, NULL, request)) != IPP_STATE_DATA) + { if (state == IPP_STATE_ERROR) break; + } - length = ippLength(request); + length = ippGetLength(request); if (state != IPP_STATE_DATA) { - printf("FAIL - %d bytes read.\n", (int)data.rpos); + testEndMessage(false, "%d bytes read", (int)data.rpos); status = 1; } else if (data.rpos != data.wused) { - printf("FAIL - read %d bytes, expected %d bytes!\n", (int)data.rpos, + testEndMessage(false, "read %d bytes, expected %d bytes", (int)data.rpos, (int)data.wused); print_attributes(request, 8); status = 1; } else if (length != sizeof(collection)) { - printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n", + testEndMessage(false, "wrong ippLength(), %d instead of %d bytes", (int)length, (int)sizeof(collection)); print_attributes(request, 8); status = 1; } else - puts("PASS"); + testEnd(true); - fputs("ippFindAttribute(media-col): ", stdout); + testBegin("ippFindAttribute(media-col)"); if ((media_col = ippFindAttribute(request, "media-col", IPP_TAG_BEGIN_COLLECTION)) == NULL) { if ((media_col = ippFindAttribute(request, "media-col", IPP_TAG_ZERO)) == NULL) - puts("FAIL (not found)"); + testEndMessage(false, "not found"); else - printf("FAIL (wrong type - %s)\n", ippTagString(media_col->value_tag)); + testEndMessage(false, "wrong type - %s", ippTagString(media_col->value_tag)); status = 1; } else if (media_col->num_values != 2) { - printf("FAIL (wrong count - %d)\n", media_col->num_values); + testEndMessage(false, "wrong count - %d", media_col->num_values); status = 1; } else - puts("PASS"); + testEnd(true); if (media_col) { - fputs("ippFindAttribute(media-size 1): ", stdout); + testBegin("ippFindAttribute(media-size 1)"); if ((media_size = ippFindAttribute(media_col->values[0].collection, "media-size", IPP_TAG_BEGIN_COLLECTION)) == NULL) @@ -500,9 +486,9 @@ main(int argc, /* I - Number of command-line arguments */ if ((media_size = ippFindAttribute(media_col->values[0].collection, "media-col", IPP_TAG_ZERO)) == NULL) - puts("FAIL (not found)"); + testEndMessage(false, "not found"); else - printf("FAIL (wrong type - %s)\n", + testEndMessage(false, "wrong type - %s", ippTagString(media_size->value_tag)); status = 1; @@ -514,16 +500,16 @@ main(int argc, /* I - Number of command-line arguments */ { if ((attr = ippFindAttribute(media_size->values[0].collection, "x-dimension", IPP_TAG_ZERO)) == NULL) - puts("FAIL (missing x-dimension)"); + testEndMessage(false, "missing x-dimension"); else - printf("FAIL (wrong type for x-dimension - %s)\n", + testEndMessage(false, "wrong type for x-dimension - %s", ippTagString(attr->value_tag)); status = 1; } else if (attr->values[0].integer != 21590) { - printf("FAIL (wrong value for x-dimension - %d)\n", + testEndMessage(false, "wrong value for x-dimension - %d", attr->values[0].integer); status = 1; } @@ -533,24 +519,24 @@ main(int argc, /* I - Number of command-line arguments */ { if ((attr = ippFindAttribute(media_size->values[0].collection, "y-dimension", IPP_TAG_ZERO)) == NULL) - puts("FAIL (missing y-dimension)"); + testEndMessage(false, "missing y-dimension"); else - printf("FAIL (wrong type for y-dimension - %s)\n", + testEndMessage(false, "wrong type for y-dimension - %s", ippTagString(attr->value_tag)); status = 1; } else if (attr->values[0].integer != 27940) { - printf("FAIL (wrong value for y-dimension - %d)\n", + testEndMessage(false, "wrong value for y-dimension - %d", attr->values[0].integer); status = 1; } else - puts("PASS"); + testEnd(true); } - fputs("ippFindAttribute(media-size 2): ", stdout); + testBegin("ippFindAttribute(media-size 2)"); if ((media_size = ippFindAttribute(media_col->values[1].collection, "media-size", IPP_TAG_BEGIN_COLLECTION)) == NULL) @@ -558,9 +544,9 @@ main(int argc, /* I - Number of command-line arguments */ if ((media_size = ippFindAttribute(media_col->values[1].collection, "media-col", IPP_TAG_ZERO)) == NULL) - puts("FAIL (not found)"); + testEndMessage(false, "not found"); else - printf("FAIL (wrong type - %s)\n", + testEndMessage(false, "wrong type - %s", ippTagString(media_size->value_tag)); status = 1; @@ -573,16 +559,16 @@ main(int argc, /* I - Number of command-line arguments */ { if ((attr = ippFindAttribute(media_size->values[0].collection, "x-dimension", IPP_TAG_ZERO)) == NULL) - puts("FAIL (missing x-dimension)"); + testEndMessage(false, "missing x-dimension"); else - printf("FAIL (wrong type for x-dimension - %s)\n", + testEndMessage(false, "wrong type for x-dimension - %s", ippTagString(attr->value_tag)); status = 1; } else if (attr->values[0].integer != 21000) { - printf("FAIL (wrong value for x-dimension - %d)\n", + testEndMessage(false, "wrong value for x-dimension - %d", attr->values[0].integer); status = 1; } @@ -592,78 +578,72 @@ main(int argc, /* I - Number of command-line arguments */ { if ((attr = ippFindAttribute(media_size->values[0].collection, "y-dimension", IPP_TAG_ZERO)) == NULL) - puts("FAIL (missing y-dimension)"); + testEndMessage(false, "missing y-dimension"); else - printf("FAIL (wrong type for y-dimension - %s)\n", + testEndMessage(false, "wrong type for y-dimension - %s", ippTagString(attr->value_tag)); status = 1; } else if (attr->values[0].integer != 29700) { - printf("FAIL (wrong value for y-dimension - %d)\n", + testEndMessage(false, "wrong value for y-dimension - %d", attr->values[0].integer); status = 1; } else - puts("PASS"); + testEnd(true); } } - /* - * Test hierarchical find... - */ - - fputs("ippFindAttribute(media-col/media-size/x-dimension): ", stdout); + // Test hierarchical find... + testBegin("ippFindAttribute(media-col/media-size/x-dimension)"); if ((attr = ippFindAttribute(request, "media-col/media-size/x-dimension", IPP_TAG_INTEGER)) != NULL) { if (ippGetInteger(attr, 0) != 21590) { - printf("FAIL (wrong value for x-dimension - %d)\n", ippGetInteger(attr, 0)); + testEndMessage(false, "wrong value for x-dimension - %d", ippGetInteger(attr, 0)); status = 1; } else - puts("PASS"); + testEnd(true); } else { - puts("FAIL (not found)"); + testEndMessage(false, "not found"); status = 1; } - fputs("ippFindNextAttribute(media-col/media-size/x-dimension): ", stdout); + testBegin("ippFindNextAttribute(media-col/media-size/x-dimension)"); if ((attr = ippFindNextAttribute(request, "media-col/media-size/x-dimension", IPP_TAG_INTEGER)) != NULL) { if (ippGetInteger(attr, 0) != 21000) { - printf("FAIL (wrong value for x-dimension - %d)\n", ippGetInteger(attr, 0)); + testEndMessage(false, "wrong value for x-dimension - %d", ippGetInteger(attr, 0)); status = 1; } else - puts("PASS"); + testEnd(true); } else { - puts("FAIL (not found)"); + testEndMessage(false, "not found"); status = 1; } - fputs("ippFindNextAttribute(media-col/media-size/x-dimension) again: ", stdout); + testBegin("ippFindNextAttribute(media-col/media-size/x-dimension) again"); if ((attr = ippFindNextAttribute(request, "media-col/media-size/x-dimension", IPP_TAG_INTEGER)) != NULL) { - printf("FAIL (got %d, expected nothing)\n", ippGetInteger(attr, 0)); + testEndMessage(false, "got %d, expected nothing", ippGetInteger(attr, 0)); status = 1; } else - puts("PASS"); + testEnd(true); ippDelete(request); - /* - * Read the bad collection data and confirm we get an error... - */ - - fputs("Read Bad Collection from Memory: ", stdout); + // Read the bad collection data and confirm we get an error... + testBegin("Read Bad Collection from Memory"); request = ippNew(); data.rpos = 0; @@ -671,21 +651,20 @@ main(int argc, /* I - Number of command-line arguments */ data.wsize = sizeof(bad_collection); data.wbuffer = bad_collection; - while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL, request)) != IPP_STATE_DATA) + while ((state = ippReadIO(&data, (ipp_io_cb_t)read_cb, 1, NULL, request)) != IPP_STATE_DATA) if (state == IPP_STATE_ERROR) break; + ippDelete(request); + if (state != IPP_STATE_ERROR) - puts("FAIL (read successful)"); + testEndMessage(false, "read successful"); else - puts("PASS"); + testEnd(true); - /* - * Read the mixed data and confirm we converted everything to rangeOfInteger - * values... - */ - - fputs("Read Mixed integer/rangeOfInteger from Memory: ", stdout); + // Read the mixed data and confirm we converted everything to rangeOfInteger + // values... + testBegin("Read Mixed integer/rangeOfInteger from Memory"); request = ippNew(); data.rpos = 0; @@ -693,50 +672,50 @@ main(int argc, /* I - Number of command-line arguments */ data.wsize = sizeof(mixed); data.wbuffer = mixed; - while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL, + while ((state = ippReadIO(&data, (ipp_io_cb_t)read_cb, 1, NULL, request)) != IPP_STATE_DATA) if (state == IPP_STATE_ERROR) break; - length = ippLength(request); + length = ippGetLength(request); if (state != IPP_STATE_DATA) { - printf("FAIL - %d bytes read.\n", (int)data.rpos); + testEndMessage(false, "%d bytes read", (int)data.rpos); status = 1; } else if (data.rpos != sizeof(mixed)) { - printf("FAIL - read %d bytes, expected %d bytes!\n", (int)data.rpos, + testEndMessage(false, "read %d bytes, expected %d bytes", (int)data.rpos, (int)sizeof(mixed)); print_attributes(request, 8); status = 1; } else if (length != (sizeof(mixed) + 4)) { - printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n", + testEndMessage(false, "wrong ippLength(), %d instead of %d bytes", (int)length, (int)sizeof(mixed) + 4); print_attributes(request, 8); status = 1; } else - puts("PASS"); + testEnd(true); - fputs("ippFindAttribute(notify-lease-duration-supported): ", stdout); + testBegin("ippFindAttribute(notify-lease-duration-supported)"); if ((attr = ippFindAttribute(request, "notify-lease-duration-supported", IPP_TAG_ZERO)) == NULL) { - puts("FAIL (not found)"); + testEndMessage(false, "not found"); status = 1; } else if (attr->value_tag != IPP_TAG_RANGE) { - printf("FAIL (wrong type - %s)\n", ippTagString(attr->value_tag)); + testEndMessage(false, "wrong type - %s", ippTagString(attr->value_tag)); status = 1; } else if (attr->num_values != 2) { - printf("FAIL (wrong count - %d)\n", attr->num_values); + testEndMessage(false, "wrong count - %d", attr->num_values); status = 1; } else if (attr->values[0].range.lower != 1 || @@ -744,7 +723,7 @@ main(int argc, /* I - Number of command-line arguments */ attr->values[1].range.lower != 16 || attr->values[1].range.upper != 32) { - printf("FAIL (wrong values - %d,%d and %d,%d)\n", + testEndMessage(false, "wrong values - %d,%d and %d,%d", attr->values[0].range.lower, attr->values[0].range.upper, attr->values[1].range.lower, @@ -752,97 +731,54 @@ main(int argc, /* I - Number of command-line arguments */ status = 1; } else - puts("PASS"); - - fputs("ippDeleteValues: ", stdout); - attr = ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "test-strings", 4, NULL, test_strings); - if (ippGetCount(attr) != 4) - { - printf("FAIL (got %d values, expected 4 values)\n", ippGetCount(attr)); - status = 1; - } - else if (!ippDeleteValues(request, &attr, 3, 1)) - { - puts("FAIL (returned 0)"); - status = 1; - } - else if (ippGetCount(attr) != 3) - { - printf("FAIL (got %d values, expected 3 values)\n", ippGetCount(attr)); - status = 1; - } - else - { - puts("PASS"); - } + testEnd(true); ippDelete(request); #ifdef DEBUG - /* - * Test that private option array is sorted... - */ - - fputs("_ippCheckOptions: ", stdout); + // Test that private option array is sorted... + testBegin("_ippCheckOptions"); if ((name = _ippCheckOptions()) == NULL) - puts("PASS"); + { + testEnd(true); + } else { - printf("FAIL (\"%s\" out of order)\n", name); + testEndMessage(false, "\"%s\" out of order", name); status = 1; } -#endif /* DEBUG */ - - /* - * Test _ippFindOption() private API... - */ +#endif // DEBUG - fputs("_ippFindOption(\"printer-type\"): ", stdout); + // Test _ippFindOption() private API... + testBegin("_ippFindOption(\"printer-type\")"); if (_ippFindOption("printer-type")) - puts("PASS"); + testEnd(true); else { - puts("FAIL"); + testEnd(false); status = 1; } - - /* - * Summarize... - */ - - putchar('\n'); - - if (status) - puts("Core IPP tests failed."); - else - puts("Core IPP tests passed."); } else { - /* - * Read IPP files... - */ - + // Read IPP files... for (i = 1; i < (size_t)argc; i ++) { if (strlen(argv[i]) > 5 && !strcmp(argv[i] + strlen(argv[i]) - 5, ".test")) { - /* - * Read an ASCII IPP message... - */ + // Read an ASCII IPP message... + ipp_file_t *file; // IPP data file - _ipp_vars_t v; /* IPP variables */ + file = ippFileNew(NULL, NULL, NULL, NULL); + request = ippNew(); - _ippVarsInit(&v, NULL, NULL, token_cb); - request = _ippFileParse(&v, argv[i], NULL); - _ippVarsDeinit(&v); + ippFileOpen(file, argv[i], "r"); + ippFileRead(file, token_cb, true); + ippFileDelete(file); } else if (strlen(argv[i]) > 4 && !strcmp(argv[i] + strlen(argv[i]) - 4, ".hex")) { - /* - * Read a hex-encoded IPP message... - */ - + // Read a hex-encoded IPP message... if ((fp = cupsFileOpen(argv[i], "r")) == NULL) { printf("Unable to open \"%s\" - %s\n", argv[i], strerror(errno)); @@ -851,7 +787,7 @@ main(int argc, /* I - Number of command-line arguments */ } request = ippNew(); - while ((state = ippReadIO(fp, (ipp_iocb_t)read_hex, 1, NULL, request)) == IPP_STATE_ATTRIBUTE); + while ((state = ippReadIO(fp, (ipp_io_cb_t)read_hex, 1, NULL, request)) == IPP_STATE_ATTRIBUTE); if (state != IPP_STATE_DATA) { @@ -866,10 +802,7 @@ main(int argc, /* I - Number of command-line arguments */ } else { - /* - * Read a raw (binary) IPP message... - */ - + // Read a raw (binary) IPP message... if ((fp = cupsFileOpen(argv[i], "r")) == NULL) { printf("Unable to open \"%s\" - %s\n", argv[i], strerror(errno)); @@ -878,7 +811,7 @@ main(int argc, /* I - Number of command-line arguments */ } request = ippNew(); - while ((state = ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, + while ((state = ippReadIO(fp, (ipp_io_cb_t)cupsFileRead, 1, NULL, request)) == IPP_STATE_ATTRIBUTE); if (state != IPP_STATE_DATA) @@ -906,76 +839,17 @@ main(int argc, /* I - Number of command-line arguments */ } -/* - * 'hex_dump()' - Produce a hex dump of a buffer. - */ - -void -hex_dump(const char *title, /* I - Title */ - ipp_uchar_t *buffer, /* I - Buffer to dump */ - size_t bytes) /* I - Number of bytes */ -{ - size_t i, j; /* Looping vars */ - int ch; /* Current ASCII char */ - - - /* - * Show lines of 16 bytes at a time... - */ - - printf(" %s:\n", title); - - for (i = 0; i < bytes; i += 16) - { - /* - * Show the offset... - */ - - printf(" %04x ", (unsigned)i); - - /* - * Then up to 16 bytes in hex... - */ - - for (j = 0; j < 16; j ++) - if ((i + j) < bytes) - printf(" %02x", buffer[i + j]); - else - printf(" "); - - /* - * Then the ASCII representation of the bytes... - */ - - putchar(' '); - putchar(' '); - - for (j = 0; j < 16 && (i + j) < bytes; j ++) - { - ch = buffer[i + j] & 127; - - if (ch < ' ' || ch == 127) - putchar('.'); - else - putchar(ch); - } - - putchar('\n'); - } -} - - -/* - * 'print_attributes()' - Print the attributes in a request... - */ +// +// 'print_attributes()' - Print the attributes in a request... +// void -print_attributes(ipp_t *ipp, /* I - IPP request */ - int indent) /* I - Indentation */ +print_attributes(ipp_t *ipp, // I - IPP request + int indent) // I - Indentation { - ipp_tag_t group; /* Current group */ - ipp_attribute_t *attr; /* Current attribute */ - char buffer[2048]; /* Value string */ + ipp_tag_t group; // Current group + ipp_attribute_t *attr; // Current attribute + char buffer[2048]; // Value string for (group = IPP_TAG_ZERO, attr = ipp->attrs; attr; attr = attr->next) @@ -991,58 +865,52 @@ print_attributes(ipp_t *ipp, /* I - IPP request */ { group = attr->group_tag; - printf("\n%*s%s:\n\n", indent - 4, "", ippTagString(group)); + testError("\n%*s%s:\n", indent - 4, "", ippTagString(group)); } ippAttributeString(attr, buffer, sizeof(buffer)); - printf("%*s%s (%s%s): %s\n", indent, "", attr->name ? attr->name : "(null)", attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag), buffer); + testError("%*s%s (%s%s): %s\n", indent, "", attr->name ? attr->name : "(null)", attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag), buffer); } } -/* - * 'read_cb()' - Read data from a buffer. - */ +// +// 'read_cb()' - Read data from a buffer. +// -ssize_t /* O - Number of bytes read */ -read_cb(_ippdata_t *data, /* I - Data */ - ipp_uchar_t *buffer, /* O - Buffer to read */ - size_t bytes) /* I - Number of bytes to read */ +ssize_t // O - Number of bytes read +read_cb(_ippdata_t *data, // I - Data + ipp_uchar_t *buffer, // O - Buffer to read + size_t bytes) // I - Number of bytes to read { - size_t count; /* Number of bytes */ - + size_t count; // Number of bytes - /* - * Copy bytes from the data buffer to the read buffer... - */ + // Copy bytes from the data buffer to the read buffer... if ((count = data->wsize - data->rpos) > bytes) count = bytes; memcpy(buffer, data->wbuffer + data->rpos, count); data->rpos += count; - /* - * Return the number of bytes read... - */ - + // Return the number of bytes read... return ((ssize_t)count); } -/* - * 'read_hex()' - Read a hex dump of an IPP request. - */ +// +// 'read_hex()' - Read a hex dump of an IPP request. +// -ssize_t /* O - Number of bytes read */ -read_hex(cups_file_t *fp, /* I - File to read from */ - ipp_uchar_t *buffer, /* I - Buffer to read */ - size_t bytes) /* I - Number of bytes to read */ +ssize_t // O - Number of bytes read +read_hex(cups_file_t *fp, // I - File to read from + ipp_uchar_t *buffer, // I - Buffer to read + size_t bytes) // I - Number of bytes to read { - size_t total = 0; /* Total bytes read */ - static char hex[256] = ""; /* Line from file */ - static char *hexptr = NULL; /* Pointer in line */ + size_t total = 0; // Total bytes read + static char hex[256] = ""; // Line from file + static char *hexptr = NULL; // Pointer in line while (total < bytes) @@ -1073,59 +941,47 @@ read_hex(cups_file_t *fp, /* I - File to read from */ } -/* - * 'token_cb()' - Token callback for ASCII IPP data file parser. - */ +// +// 'token_cb()' - Token callback for ASCII IPP data file parser. +// -int /* O - 1 on success, 0 on failure */ -token_cb(_ipp_file_t *f, /* I - IPP file data */ - _ipp_vars_t *v, /* I - IPP variables */ - void *user_data, /* I - User data pointer */ - const char *token) /* I - Token string */ +bool // O - `true` on success, `false` on failure +token_cb(ipp_file_t *f, // I - IPP file data + void *user_data, // I - User data pointer + const char *token) // I - Token string { - (void)v; (void)user_data; - if (!token) - { - f->attrs = ippNew(); - f->group_tag = IPP_TAG_PRINTER; - } - else + // TODO: Add a custom directive to test this. + if (strcasecmp(token, "TEST")) { - fprintf(stderr, "Unknown directive \"%s\" on line %d of \"%s\".\n", token, f->linenum, f->filename); - return (0); + fprintf(stderr, "Unknown directive '%s' on line %d of '%s'.\n", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } - return (1); + return (true); } -/* - * 'write_cb()' - Write data into a buffer. - */ +// +// 'write_cb()' - Write data into a buffer. +// -ssize_t /* O - Number of bytes written */ -write_cb(_ippdata_t *data, /* I - Data */ - ipp_uchar_t *buffer, /* I - Buffer to write */ - size_t bytes) /* I - Number of bytes to write */ +ssize_t // O - Number of bytes written +write_cb(_ippdata_t *data, // I - Data + ipp_uchar_t *buffer, // I - Buffer to write + size_t bytes) // I - Number of bytes to write { - size_t count; /* Number of bytes */ + size_t count; // Number of bytes - /* - * Loop until all bytes are written... - */ - + // Loop until all bytes are written... if ((count = data->wsize - data->wused) > bytes) count = bytes; memcpy(data->wbuffer + data->wused, buffer, count); data->wused += count; - /* - * Return the number of bytes written... - */ - + // Return the number of bytes written... return ((ssize_t)count); } diff --git a/cups/testtestpage.c b/cups/testtestpage.c new file mode 100644 index 0000000000..b92e369aea --- /dev/null +++ b/cups/testtestpage.c @@ -0,0 +1,647 @@ +// +// Raster test page generator unit test for CUPS. +// +// Copyright © 2020-2023 by OpenPrinting +// Copyright © 2017-2019 by Apple Inc. +// +// Licensed under Apache License v2.0. See the file "LICENSE" for more +// information. +// + +#include "raster-testpage.h" +#include "test-internal.h" +#include +#include +#include +#include +#include + + +// +// Local functions... +// + +static void usage(void); + + +// +// 'main()' - Generate a test raster file. +// + +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments +{ + int i; // Looping var + int ret = 0; // Exit status + const char *opt; // Current option + const char *filename = NULL, + // Output filename + *media_name = "na_letter_8.5x11in", + // Media size name + *sheet_back = "normal", + // Back side transform + *sides = "one-sided", + // Duplex mode + *type = "srgb_8"; + // Output type + int xres = 300, // Horizontal resolution + yres = 300, // Vertical resolution + num_copies = 1, // Number of copies + num_pages = 2; // Number of pages + ipp_orient_t orientation = IPP_ORIENT_PORTRAIT; + // Output orientation + int fd; // File descriptor + cups_raster_t *ras; // Raster stream + cups_page_header2_t header; // Page header (front side) + cups_page_header2_t back_header; // Page header (back side) + pwg_media_t *pwg; // Media size + cups_media_t media; // Media information + static const char * const sheet_backs[4] = + { // Back side values + "normal", + "flipped", + "manual-tumble", + "rotated" + }; + + + // Parse command-line options... + if (argc > 1) + { + for (i = 1; i < argc; i ++) + { + if (!strcmp(argv[i], "--help")) + { + usage(); + return (0); + } + else if (!strncmp(argv[i], "--", 2)) + { + fprintf(stderr, "testtestpage: Unknown option '%s'.\n", argv[i]); + usage(); + return (1); + } + else if (argv[i][0] == '-') + { + for (opt = argv[i] + 1; *opt; opt ++) + { + switch (*opt) + { + case 'b' : // -b SHEET-BACK + i ++; + if (i >= argc) + { + fputs("testtestpage: Expected sheet-back after '-b'.\n", stderr); + usage(); + return (1); + } + + if (strcmp(argv[i], "normal") && strcmp(argv[i], "flip") && strcmp(argv[i], "rotate") && strcmp(argv[i], "manual-tumble")) + { + fprintf(stderr, "testtestpage: Unexpected sheet-back '-b %s'.\n", argv[i]); + usage(); + return (1); + } + + sheet_back = argv[i]; + break; + + case 'c' : // -c NUM-COPIES + i ++; + if (i >= argc || !isdigit(argv[i][0] & 255)) + { + fputs("testtestpage: Expected number of copies after '-c'.\n", stderr); + usage(); + return (1); + } + + num_copies = atoi(argv[i]); + break; + + case 'm' : // -m MEDIA-NAME + i ++; + if (i >= argc) + { + fputs("testtestpage: Expected media size name after '-m'.\n", stderr); + usage(); + return (1); + } + + media_name = argv[i]; + break; + + case 'n' : // -n NUM-PAGES + i ++; + if (i >= argc || !isdigit(argv[i][0] & 255)) + { + fputs("testtestpage: Expected number of pages after '-p'.\n", stderr); + usage(); + return (1); + } + + num_pages = atoi(argv[i]); + break; + + case 'o' : // -o ORIENTATION + i ++; + if (i >= argc) + { + fputs("testtestpage: Expected orientation after '-o'.\n", stderr); + usage(); + return (1); + } + + if (!strcmp(argv[i], "portrait")) + orientation = IPP_ORIENT_PORTRAIT; + else if (!strcmp(argv[i], "landscape")) + orientation = IPP_ORIENT_LANDSCAPE; + else if (!strcmp(argv[i], "reverse-portrait")) + orientation = IPP_ORIENT_REVERSE_PORTRAIT; + else if (!strcmp(argv[i], "reverse-landscape")) + orientation = IPP_ORIENT_REVERSE_LANDSCAPE; + else + { + fprintf(stderr, "testtestpage: Unexpected orientation '-o %s'.\n", argv[i]); + usage(); + return (1); + } + break; + + case 'r' : // -r RES or -r XRESxYRES + i ++; + if (i >= argc) + { + fputs("testtestpage: Expected resolution after '-r'.\n", stderr); + usage(); + return (1); + } + + switch (sscanf(argv[i], "%dx%d", &xres, &yres)) + { + case 0 : + fprintf(stderr, "testtestpage: Unexpected resolution '-r %s'.\n", argv[i]); + usage(); + return (1); + case 1 : + yres = xres; + break; + } + break; + + case 's' : // -s SIDES + i ++; + if (i >= argc) + { + fputs("testtestpage: Expected sides after '-s'.\n", stderr); + usage(); + return (1); + } + + if (strcmp(argv[i], "one-sided") && strcmp(argv[i], "two-sided-long-edge") && strcmp(argv[i], "two-sided-short-edge")) + { + fprintf(stderr, "testtestpage: Unexpected sides '-s %s'.\n", argv[i]); + usage(); + return (1); + } + + sides = argv[i]; + break; + + case 't' : // -t TYPE + i ++; + if (i >= argc) + { + fputs("testtestpage: Expected type after '-t'.\n", stderr); + usage(); + return (1); + } + + if (!strcmp(argv[i], "color")) + type = "srgb_8"; + else if (!strcmp(argv[i], "gray")) + type = "sgray_8"; + else if (strcmp(argv[i], "black_1") && strcmp(argv[i], "black_8") && strcmp(argv[i], "black_16") && strcmp(argv[i], "cmyk_8") && strcmp(argv[i], "cmyk_16") && strcmp(argv[i], "sgray_8") && strcmp(argv[i], "sgray_16") && strcmp(argv[i], "srgb_8") && strcmp(argv[i], "srgb_16")) + { + fprintf(stderr, "testtestpage: Unexpected sheet-back '-b %s'.\n", argv[i]); + usage(); + return (1); + } + else + type = argv[i]; + break; + + default : + fprintf(stderr, "testtestpage: Unknown option '-%c'.\n", *opt); + usage(); + return (1); + } + } + } + else if (!filename) + { + filename = argv[i]; + } + else + { + fprintf(stderr, "testtestpage: Unknown option '%s'.\n", argv[i]); + usage(); + return (1); + } + + if ((pwg = pwgMediaForPWG(media_name)) == NULL) + { + fprintf(stderr, "testtestpage: Unable to lookup media '%s'.\n", media_name); + return (1); + } + + if (filename) + { + if ((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) + { + fprintf(stderr, "testtestpage: Unable to create '%s': %s\n", filename, strerror(errno)); + return (1); + } + } + else + fd = 1; + + if ((ras = cupsRasterOpen(fd, CUPS_RASTER_WRITE_PWG)) == NULL) + { + fprintf(stderr, "testtestpage: Unable to open raster stream for '%s': %s\n", filename ? filename : "(stdout)", cupsGetErrorString()); + close(fd); + return (1); + } + + memset(&media, 0, sizeof(media)); + cupsCopyString(media.media, pwg->pwg, sizeof(media.media)); + media.width = pwg->width; + media.length = pwg->length; + + cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, orientation, sides, type, xres, yres, NULL); + cupsRasterInitHeader(&back_header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, orientation, sides, type, xres, yres, sheet_back); + cupsRasterWriteTest(ras, &header, &back_header, sheet_back, orientation, num_copies, num_pages); + cupsRasterClose(ras); + } + } + else + { + // Do unit tests... + testBegin("open(test.pwg)"); + if ((fd = open("test.pwg", O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) + { + testEndMessage(false, "%s", strerror(errno)); + return (1); + } + testEnd(true); + + testBegin("cupsRasterOpen"); + if ((ras = cupsRasterOpen(fd, CUPS_RASTER_WRITE_PWG)) == NULL) + { + testEndMessage(false, "%s", cupsRasterErrorString()); + close(fd); + return (1); + } + testEnd(true); + + pwg = pwgMediaForPWG("na_letter_8.5x11in"); + + memset(&media, 0, sizeof(media)); + cupsCopyString(media.media, pwg->pwg, sizeof(media.media)); + media.width = pwg->width; + media.length = pwg->length; + + for (orientation = IPP_ORIENT_PORTRAIT; orientation <= IPP_ORIENT_REVERSE_PORTRAIT; orientation ++) + { + testBegin("cupsRasterInitHeader(black_1)"); + if (cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, IPP_ORIENT_PORTRAIT, "one-sided", "black_1", 300, 300, "normal")) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + if (orientation == IPP_ORIENT_PORTRAIT) + { + testBegin("cupsRasterWriteTest(2,3)"); + if (cupsRasterWriteTest(ras, &header, &header, "normal", orientation, 2, 3)) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + } + else + { + testBegin("cupsRasterWriteTest(1,1)"); + if (cupsRasterWriteTest(ras, &header, &header, "normal", orientation, 1, 1)) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + } + + testBegin("cupsRasterInitHeader(black_8)"); + if (cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, IPP_ORIENT_PORTRAIT, "one-sided", "black_8", 300, 300, "normal")) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterWriteTest(1,1)"); + if (cupsRasterWriteTest(ras, &header, &header, "normal", orientation, 1, 1)) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterInitHeader(black_16)"); + if (cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, IPP_ORIENT_PORTRAIT, "one-sided", "black_16", 300, 300, "normal")) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterWriteTest(1,1)"); + if (cupsRasterWriteTest(ras, &header, &header, "normal", orientation, 1, 1)) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterInitHeader(srgb_8)"); + if (cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, IPP_ORIENT_PORTRAIT, "one-sided", "srgb_8", 300, 300, "normal")) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterWriteTest(1,1)"); + if (cupsRasterWriteTest(ras, &header, &header, "normal", orientation, 1, 1)) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterInitHeader(srgb_16)"); + if (cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, IPP_ORIENT_PORTRAIT, "one-sided", "srgb_16", 300, 300, "normal")) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterWriteTest(1,1)"); + if (cupsRasterWriteTest(ras, &header, &header, "normal", orientation, 1, 1)) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterInitHeader(sgray_1)"); + if (cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, IPP_ORIENT_PORTRAIT, "one-sided", "sgray_1", 300, 300, "normal")) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterWriteTest(1,1)"); + if (cupsRasterWriteTest(ras, &header, &header, "normal", orientation, 1, 1)) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterInitHeader(sgray_8)"); + if (cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, IPP_ORIENT_PORTRAIT, "one-sided", "sgray_8", 300, 300, "normal")) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterWriteTest(1,1)"); + if (cupsRasterWriteTest(ras, &header, &header, "normal", orientation, 1, 1)) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterInitHeader(cmyk_8)"); + if (cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, IPP_ORIENT_PORTRAIT, "one-sided", "cmyk_8", 300, 300, "normal")) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterWriteTest(1,1)"); + if (cupsRasterWriteTest(ras, &header, &header, "normal", orientation, 1, 1)) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterInitHeader(cmyk_16)"); + if (cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, IPP_ORIENT_PORTRAIT, "one-sided", "cmyk_16", 300, 300, "normal")) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterWriteTest(1,1)"); + if (cupsRasterWriteTest(ras, &header, &header, "normal", orientation, 1, 1)) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + } + + for (i = 0; i < 4; i ++) + { + for (orientation = IPP_ORIENT_PORTRAIT; orientation <= IPP_ORIENT_REVERSE_PORTRAIT; orientation ++) + { + testBegin("cupsRasterInitHeader(black_1, %d, %s)", (int)orientation, sheet_backs[i]); + if (cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, orientation, "two-sided-long-edge", "black_1", 300, 300, sheet_backs[i])) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterWriteTest(1,2)"); + if (cupsRasterWriteTest(ras, &header, &back_header, sheet_backs[i], orientation, 1, 2)) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterInitHeader(black_8, %d, %s)", (int)orientation, sheet_backs[i]); + if (cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, orientation, "two-sided-long-edge", "black_8", 300, 300, sheet_backs[i])) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterWriteTest(1,2)"); + if (cupsRasterWriteTest(ras, &header, &back_header, sheet_backs[i], orientation, 1, 2)) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterInitHeader(srgb_8, %d, %s)", (int)orientation, sheet_backs[i]); + if (cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, orientation, "two-sided-long-edge", "srgb_8", 300, 300, sheet_backs[i])) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterWriteTest(1,2)"); + if (cupsRasterWriteTest(ras, &header, &back_header, sheet_backs[i], orientation, 1, 2)) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterInitHeader(cmyk_8, %d, %s)", (int)orientation, sheet_backs[i]); + if (cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, orientation, "two-sided-long-edge", "cmyk_8", 300, 300, sheet_backs[i])) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + + testBegin("cupsRasterWriteTest(1,2)"); + if (cupsRasterWriteTest(ras, &header, &back_header, sheet_backs[i], orientation, 1, 2)) + { + testEnd(true); + } + else + { + testEndMessage(false, "%s", cupsRasterErrorString()); + ret = 1; + } + } + } + cupsRasterClose(ras); + } + + return (ret); +} + + +// +// 'usage()' - Show program usage. +// + +static void +usage(void) +{ + puts("Usage: ./testtestpage [OPTIONS] [FILENAME]"); + puts("Options:"); + puts("-b SHEET-BACK Specify the back side transform for duplex output (normal, flip, manual-tumble, or rotate)"); + puts("-c NUM-COPIES Specify the number of copies (default 1)"); + puts("-m MEDIA-SIZE-NAME Specify the PWG media size name (default 'na_letter_8.5x11in')"); + puts("-n NUM-PAGES Specify the number of pages (default 2)"); + puts("-o ORIENTATION Specify the orientation (portrait, landscape, reverse-landscape, reverse-portrait)"); + puts("-r RESOLUTION Specify the output resolution (NNN or NNNxNNN)"); + puts("-t TYPE Specify the output color space and bit depth"); +} diff --git a/cups/tls-openssl.c b/cups/tls-openssl.c index cc0da86a2b..da7a0d67df 100644 --- a/cups/tls-openssl.c +++ b/cups/tls-openssl.c @@ -198,7 +198,7 @@ cupsCreateCredentials( cups_credusage_t usage_bit; // Current usage - DEBUG_printf("cupsCreateCredentials(path=\"%s\", ca_cert=%s, purpose=0x%x, type=%d, usage=0x%x, organization=\"%s\", org_unit=\"%s\", locality=\"%s\", state_province=\"%s\", country=\"%s\", common_name=\"%s\", num_alt_names=%u, alt_names=%p, root_name=\"%s\", expiration_date=%ld)", path, ca_cert ? "true" : "false", purpose, type, usage, organization, org_unit, locality, state_province, country, common_name, (unsigned)num_alt_names, alt_names, root_name, (long)expiration_date); + DEBUG_printf("cupsCreateCredentials(path=\"%s\", ca_cert=%s, purpose=0x%x, type=%d, usage=0x%x, organization=\"%s\", org_unit=\"%s\", locality=\"%s\", state_province=\"%s\", country=\"%s\", common_name=\"%s\", num_alt_names=%u, alt_names=%p, root_name=\"%s\", expiration_date=%ld)", path, ca_cert ? "true" : "false", purpose, type, usage, organization, org_unit, locality, state_province, country, common_name, (unsigned)num_alt_names, (void *)alt_names, root_name, (long)expiration_date); // Filenames... if (!path) @@ -497,7 +497,7 @@ cupsCreateCredentialsRequest( cups_credusage_t usage_bit; // Current usage - DEBUG_printf("cupsCreateCredentialsRequest(path=\"%s\", purpose=0x%x, type=%d, usage=0x%x, organization=\"%s\", org_unit=\"%s\", locality=\"%s\", state_province=\"%s\", country=\"%s\", common_name=\"%s\", num_alt_names=%u, alt_names=%p)", path, purpose, type, usage, organization, org_unit, locality, state_province, country, common_name, (unsigned)num_alt_names, alt_names); + DEBUG_printf("cupsCreateCredentialsRequest(path=\"%s\", purpose=0x%x, type=%d, usage=0x%x, organization=\"%s\", org_unit=\"%s\", locality=\"%s\", state_province=\"%s\", country=\"%s\", common_name=\"%s\", num_alt_names=%u, alt_names=%p)", path, purpose, type, usage, organization, org_unit, locality, state_province, country, common_name, (unsigned)num_alt_names, (void *)alt_names); // Filenames... if (!path) @@ -658,7 +658,7 @@ cupsGetCredentialsInfo( // Range check input... - DEBUG_printf("cupsGetCredentialsInfo(credentials=%p, buffer=%p, bufsize=" CUPS_LLFMT ")", credentials, buffer, CUPS_LLCAST bufsize); + DEBUG_printf("cupsGetCredentialsInfo(credentials=%p, buffer=%p, bufsize=" CUPS_LLFMT ")", (void *)credentials, (void *)buffer, CUPS_LLCAST bufsize); if (buffer) *buffer = '\0'; @@ -973,7 +973,7 @@ cupsSignCredentialsRequest( saw_san = false; // Saw NID_subject_alt_name? - DEBUG_printf("cupsSignCredentialsRequest(path=\"%s\", common_name=\"%s\", request=\"%s\", root_name=\"%s\", allowed_purpose=0x%x, allowed_usage=0x%x, cb=%p, cb_data=%p, expiration_date=%ld)", path, common_name, request, root_name, allowed_purpose, allowed_usage, cb, cb_data, (long)expiration_date); + DEBUG_printf("cupsSignCredentialsRequest(path=\"%s\", common_name=\"%s\", request=\"%s\", root_name=\"%s\", allowed_purpose=0x%x, allowed_usage=0x%x, cb=%p, cb_data=%p, expiration_date=%ld)", path, common_name, request, root_name, allowed_purpose, allowed_usage, (void *)cb, cb_data, (long)expiration_date); // Filenames... if (!path) @@ -1320,14 +1320,14 @@ httpCopyPeerCredentials(http_t *http) // I - Connection to server STACK_OF(X509) *chain; // Certificate chain - DEBUG_printf("httpCopyCredentials(http=%p)", http); + DEBUG_printf("httpCopyCredentials(http=%p)", (void *)http); if (http && http->tls) { // Get the chain of certificates for the remote end... chain = SSL_get_peer_cert_chain(http->tls); - DEBUG_printf("1httpCopyCredentials: chain=%p", chain); + DEBUG_printf("1httpCopyCredentials: chain=%p", (void *)chain); if (chain) { @@ -1421,7 +1421,7 @@ _httpCreateCredentials( } } - DEBUG_printf("1_httpCreateCredentials: Returning %p.", hcreds); + DEBUG_printf("1_httpCreateCredentials: Returning %p.", (void *)hcreds); return (hcreds); } @@ -1517,7 +1517,7 @@ _httpTLSStart(http_t *http) // I - Connection to server }; - DEBUG_printf("3_httpTLSStart(http=%p)", http); + DEBUG_printf("3_httpTLSStart(http=%p)", (void *)http); if (tls_options < 0) { diff --git a/notifier/mailto.c b/notifier/mailto.c index 81ddec8c5d..e6e1352f25 100644 --- a/notifier/mailto.c +++ b/notifier/mailto.c @@ -126,18 +126,18 @@ main(int argc, /* I - Number of command-line arguments */ */ msg = ippNew(); - while ((state = ippReadFile(0, msg)) != IPP_DATA) + while ((state = ippReadFile(0, msg)) != IPP_STATE_DATA) { - if (state <= IPP_IDLE) + if (state <= IPP_STATE_IDLE) break; } fprintf(stderr, "DEBUG: state=%d\n", state); - if (state == IPP_ERROR) + if (state == IPP_STATE_ERROR) fputs("DEBUG: ippReadFile() returned IPP_ERROR!\n", stderr); - if (state <= IPP_IDLE) + if (state <= IPP_STATE_IDLE) { /* * Out of messages, free memory and then exit... diff --git a/notifier/rss.c b/notifier/rss.c index 1472356a93..7c418a7a30 100644 --- a/notifier/rss.c +++ b/notifier/rss.c @@ -288,16 +288,16 @@ main(int argc, /* I - Number of command-line arguments */ */ event = ippNew(); - while ((state = ippReadFile(0, event)) != IPP_DATA) + while ((state = ippReadFile(0, event)) != IPP_STATE_DATA) { - if (state <= IPP_IDLE) + if (state <= IPP_STATE_IDLE) break; } - if (state == IPP_ERROR) + if (state == IPP_STATE_ERROR) fputs("DEBUG: ippReadFile() returned IPP_ERROR!\n", stderr); - if (state <= IPP_IDLE) + if (state <= IPP_STATE_IDLE) break; /* diff --git a/notifier/testnotify.c b/notifier/testnotify.c index ce4594b5bb..5364a58278 100644 --- a/notifier/testnotify.c +++ b/notifier/testnotify.c @@ -44,16 +44,16 @@ main(int argc, /* I - Number of command-line arguments */ for (;;) { event = ippNew(); - while ((state = ippReadFile(0, event)) != IPP_DATA) + while ((state = ippReadFile(0, event)) != IPP_STATE_DATA) { - if (state <= IPP_IDLE) + if (state <= IPP_STATE_IDLE) break; } - if (state == IPP_ERROR) + if (state == IPP_STATE_ERROR) fputs("DEBUG: ippReadFile() returned IPP_ERROR!\n", stderr); - if (state <= IPP_IDLE) + if (state <= IPP_STATE_IDLE) { ippDelete(event); return (0); diff --git a/scheduler/auth.c b/scheduler/auth.c index 9b53869070..6ba5782275 100644 --- a/scheduler/auth.c +++ b/scheduler/auth.c @@ -105,7 +105,7 @@ cupsdAddIPMask( cupsd_authmask_t temp; /* New host/domain mask */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddIPMask(masks=%p(%p), address=%x:%x:%x:%x, netmask=%x:%x:%x:%x)", masks, *masks, address[0], address[1], address[2], address[3], netmask[0], netmask[1], netmask[2], netmask[3]); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddIPMask(masks=%p(%p), address=%x:%x:%x:%x, netmask=%x:%x:%x:%x)", (void *)masks, (void *)*masks, address[0], address[1], address[2], address[3], netmask[0], netmask[1], netmask[2], netmask[3]); temp.type = CUPSD_AUTH_IP; memcpy(temp.mask.ip.address, address, sizeof(temp.mask.ip.address)); @@ -158,7 +158,7 @@ void cupsdAddName(cupsd_location_t *loc, /* I - Location to add to */ char *name) /* I - Name to add */ { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddName(loc=%p, name=\"%s\")", loc, name); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddName(loc=%p, name=\"%s\")", (void *)loc, name); if (!loc->names) loc->names = cupsArrayNew3(NULL, NULL, NULL, 0, @@ -188,7 +188,7 @@ cupsdAddNameMask(cups_array_t **masks, /* IO - Masks array (created as needed) * *ifptr; /* Pointer to end of name */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddNameMask(masks=%p(%p), name=\"%s\")", masks, *masks, name); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddNameMask(masks=%p(%p), name=\"%s\")", (void *)masks, (void *)*masks, name); if (!_cups_strcasecmp(name, "@LOCAL")) { @@ -274,7 +274,7 @@ cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */ con->best = cupsdFindBest(con->uri, httpGetState(con->http)); con->type = CUPSD_AUTH_NONE; - cupsdLogClient(con, CUPSD_LOG_DEBUG2, "con->uri=\"%s\", con->best=%p(%s)", con->uri, con->best, con->best ? con->best->location : ""); + cupsdLogClient(con, CUPSD_LOG_DEBUG2, "con->uri=\"%s\", con->best=%p(%s)", con->uri, (void *)con->best, con->best ? con->best->location : ""); if (con->best && con->best->type != CUPSD_AUTH_NONE) { @@ -1143,7 +1143,7 @@ cupsdCheckGroup( #endif /* HAVE_MBR_UID_TO_UUID */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckGroup(username=\"%s\", user=%p, groupname=\"%s\")", username, user, groupname); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckGroup(username=\"%s\", user=%p, groupname=\"%s\")", username, (void *)user, groupname); /* * Validate input... @@ -1558,7 +1558,7 @@ cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */ }; - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: con->uri=\"%s\", con->best=%p(%s)", con->uri, con->best, con->best ? con->best->location ? con->best->location : "(null)" : ""); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: con->uri=\"%s\", con->best=%p(%s)", con->uri, (void *)con->best, con->best ? con->best->location ? con->best->location : "(null)" : ""); if (owner) cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: owner=\"%s\"", owner); @@ -1938,6 +1938,8 @@ cupsdNewLocation(const char *location) /* I - Location path */ static int // O - 1 if authorized, 0 otherwise check_admin_access(cupsd_client_t *con) // I - Client connection { + (void)con; + #if defined(HAVE_LIBAPPARMOR) && defined(HAVE_LIBSNAPDGLIB) /* * If the client accesses locally via domain socket, find out whether it diff --git a/scheduler/classes.c b/scheduler/classes.c index ace5bee232..cc3963670f 100644 --- a/scheduler/classes.c +++ b/scheduler/classes.c @@ -220,7 +220,7 @@ cupsdFindAvailablePrinter( i = 0; if (c->printers[i]->accepting && - (c->printers[i]->state == IPP_PRINTER_IDLE || + (c->printers[i]->state == IPP_PSTATE_IDLE || ((c->printers[i]->type & CUPS_PRINTER_REMOTE) && !c->printers[i]->job))) { c->last_printer = i; @@ -317,7 +317,7 @@ cupsdLoadAllClasses(void) p = cupsdAddClass(value); p->accepting = 1; - p->state = IPP_PRINTER_IDLE; + p->state = IPP_PSTATE_IDLE; if (!_cups_strcasecmp(line, "make_model, "Remote Printer on unknown"); - temp->state = IPP_PRINTER_STOPPED; + temp->state = IPP_PSTATE_STOPPED; temp->type |= CUPS_PRINTER_REMOTE; cupsdSetString(&temp->location, "Location Unknown"); @@ -436,10 +436,10 @@ cupsdLoadAllClasses(void) */ if (!_cups_strcasecmp(value, "idle")) - p->state = IPP_PRINTER_IDLE; + p->state = IPP_PSTATE_IDLE; else if (!_cups_strcasecmp(value, "stopped")) { - p->state = IPP_PRINTER_STOPPED; + p->state = IPP_PSTATE_STOPPED; for (i = 0 ; i < p->num_reasons; i ++) if (!strcmp("paused", p->reasons[i])) @@ -746,7 +746,7 @@ cupsdSaveAllClasses(void) if (pclass->location) cupsFilePutConf(fp, "Location", pclass->location); - if (pclass->state == IPP_PRINTER_STOPPED) + if (pclass->state == IPP_PSTATE_STOPPED) cupsFilePuts(fp, "State Stopped\n"); else cupsFilePuts(fp, "State Idle\n"); diff --git a/scheduler/client.c b/scheduler/client.c index 4ada086ddd..260f0d4969 100644 --- a/scheduler/client.c +++ b/scheduler/client.c @@ -72,7 +72,7 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */ #endif /* HAVE_TCPD_H */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAcceptClient(lis=%p(%d)) Clients=%d", lis, lis->fd, cupsArrayGetCount(Clients)); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAcceptClient(lis=%p(%d)) Clients=%d", (void *)lis, lis->fd, cupsArrayGetCount(Clients)); /* * Make sure we don't have a full set of clients already... @@ -555,7 +555,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ status = HTTP_STATUS_CONTINUE; - cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cupsdReadClient: error=%d, used=%d, state=%s, data_encoding=HTTP_ENCODING_%s, data_remaining=" CUPS_LLFMT ", request=%p(%s), file=%d", httpGetError(con->http), (int)httpGetReady(con->http), httpStateString(httpGetState(con->http)), httpIsChunked(con->http) ? "CHUNKED" : "LENGTH", CUPS_LLCAST httpGetRemaining(con->http), con->request, con->request ? ippStateString(ippGetState(con->request)) : "", con->file); + cupsdLogClient(con, CUPSD_LOG_DEBUG2, "cupsdReadClient: error=%d, used=%d, state=%s, data_encoding=HTTP_ENCODING_%s, data_remaining=" CUPS_LLFMT ", request=%p(%s), file=%d", httpGetError(con->http), (int)httpGetReady(con->http), httpStateString(httpGetState(con->http)), httpIsChunked(con->http) ? "CHUNKED" : "LENGTH", CUPS_LLCAST httpGetRemaining(con->http), (void *)con->request, con->request ? ippStateString(ippGetState(con->request)) : "", con->file); if (httpGetError(con->http) == EPIPE && !httpGetReady(con->http) && recv(httpGetFd(con->http), buf, 1, MSG_PEEK) < 1) { @@ -1626,7 +1626,7 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ con->request->request.op.version[1], ippOpString(con->request->request.op.operation_id), con->request->request.op.request_id); - con->bytes += (off_t)ippLength(con->request); + con->bytes += (off_t)ippGetLength(con->request); } } @@ -2223,7 +2223,7 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */ ipp_state_t ipp_state; /* IPP state value */ - cupsdLogClient(con, CUPSD_LOG_DEBUG, "con->http=%p", con->http); + cupsdLogClient(con, CUPSD_LOG_DEBUG, "con->http=%p", (void *)con->http); cupsdLogClient(con, CUPSD_LOG_DEBUG, "cupsdWriteClient " "error=%d, " @@ -2238,7 +2238,7 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */ httpStateString(httpGetState(con->http)), httpIsChunked(con->http) ? "CHUNKED" : "LENGTH", CUPS_LLCAST httpGetLength2(con->http), - con->response, + (void *)con->response, con->response ? ippStateString(ippGetState(con->request)) : "", con->pipe_pid, con->file); @@ -2578,7 +2578,7 @@ check_if_modified( if (*ptr == '\0') return (1); - cupsdLogClient(con, CUPSD_LOG_DEBUG2, "check_if_modified: filestats=%p(" CUPS_LLFMT ", %d)) If-Modified-Since=\"%s\"", filestats, CUPS_LLCAST filestats->st_size, (int)filestats->st_mtime, ptr); + cupsdLogClient(con, CUPSD_LOG_DEBUG2, "check_if_modified: filestats=%p(" CUPS_LLFMT ", %d)) If-Modified-Since=\"%s\"", (void *)filestats, CUPS_LLCAST filestats->st_size, (int)filestats->st_mtime, ptr); while (*ptr != '\0') { @@ -2953,7 +2953,7 @@ get_file(cupsd_client_t *con, /* I - Client connection */ } } - cupsdLogClient(con, CUPSD_LOG_DEBUG2, "get_file: filestats=%p, filename=%p, len=" CUPS_LLFMT ", returning \"%s\".", filestats, filename, CUPS_LLCAST len, status ? "(null)" : filename); + cupsdLogClient(con, CUPSD_LOG_DEBUG2, "get_file: filestats=%p, filename=%p, len=" CUPS_LLFMT ", returning \"%s\".", (void *)filestats, (void *)filename, CUPS_LLCAST len, status ? "(null)" : filename); if (status) return (NULL); @@ -3091,7 +3091,7 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */ if (!type || _cups_strcasecmp(type->super, "application")) { - cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 0.", filename, filestats, type ? type->super : "unknown", type ? type->type : "unknown"); + cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 0.", filename, (void *)filestats, type ? type->super : "unknown", type ? type->type : "unknown"); return (0); } @@ -3106,11 +3106,11 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */ if (options) cupsdSetStringf(&con->options, " %s", options); - cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 1.", filename, filestats, type->super, type->type); + cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 1.", filename, (void *)filestats, type->super, type->type); return (1); } - cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 0.", filename, filestats, type->super, type->type); + cupsdLogClient(con, CUPSD_LOG_DEBUG2, "is_cgi: filename=\"%s\", filestats=%p, type=%s/%s, returning 0.", filename, (void *)filestats, type->super, type->type); return (0); } @@ -3217,7 +3217,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */ * be consistent with Apache... */ - cupsdLogClient(con, CUPSD_LOG_DEBUG2, "pipe_command: infile=%d, outfile=%p, command=\"%s\", options=\"%s\", root=%d", infile, outfile, command, options ? options : "(null)", root); + cupsdLogClient(con, CUPSD_LOG_DEBUG2, "pipe_command: infile=%d, outfile=%p, command=\"%s\", options=\"%s\", root=%d", infile, (void *)outfile, command, options ? options : "(null)", root); argv[0] = command; @@ -3700,7 +3700,7 @@ write_file(cupsd_client_t *con, /* I - Client connection */ { con->file = open(filename, O_RDONLY); - cupsdLogClient(con, CUPSD_LOG_DEBUG2, "write_file: code=%d, filename=\"%s\" (%d), type=\"%s\", filestats=%p.", code, filename, con->file, type ? type : "(null)", filestats); + cupsdLogClient(con, CUPSD_LOG_DEBUG2, "write_file: code=%d, filename=\"%s\" (%d), type=\"%s\", filestats=%p.", code, filename, con->file, type ? type : "(null)", (void *)filestats); if (con->file < 0) return (0); diff --git a/scheduler/conf.c b/scheduler/conf.c index e555d777b3..80dc806112 100644 --- a/scheduler/conf.c +++ b/scheduler/conf.c @@ -1363,34 +1363,34 @@ cupsdReadConfiguration(void) cupsdAddString(&(p->job_attrs), "notify-user-data"); cupsdLogMessage(CUPSD_LOG_INFO, ""); - po = cupsdAddPolicyOp(p, NULL, IPP_CREATE_JOB); - cupsdAddPolicyOp(p, po, IPP_PRINT_JOB); - cupsdAddPolicyOp(p, po, IPP_PRINT_URI); - cupsdAddPolicyOp(p, po, IPP_VALIDATE_JOB); + po = cupsdAddPolicyOp(p, NULL, IPP_OP_CREATE_JOB); + cupsdAddPolicyOp(p, po, IPP_OP_PRINT_JOB); + cupsdAddPolicyOp(p, po, IPP_OP_PRINT_URI); + cupsdAddPolicyOp(p, po, IPP_OP_VALIDATE_JOB); cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow"); po->order_type = CUPSD_AUTH_ALLOW; cupsdLogMessage(CUPSD_LOG_INFO, ""); cupsdLogMessage(CUPSD_LOG_INFO, ""); - po = cupsdAddPolicyOp(p, NULL, IPP_SEND_DOCUMENT); - cupsdAddPolicyOp(p, po, IPP_SEND_URI); - cupsdAddPolicyOp(p, po, IPP_HOLD_JOB); - cupsdAddPolicyOp(p, po, IPP_RELEASE_JOB); - cupsdAddPolicyOp(p, po, IPP_RESTART_JOB); - cupsdAddPolicyOp(p, po, IPP_PURGE_JOBS); - cupsdAddPolicyOp(p, po, IPP_SET_JOB_ATTRIBUTES); - cupsdAddPolicyOp(p, po, IPP_CREATE_JOB_SUBSCRIPTION); - cupsdAddPolicyOp(p, po, IPP_RENEW_SUBSCRIPTION); - cupsdAddPolicyOp(p, po, IPP_CANCEL_SUBSCRIPTION); - cupsdAddPolicyOp(p, po, IPP_GET_NOTIFICATIONS); - cupsdAddPolicyOp(p, po, IPP_REPROCESS_JOB); - cupsdAddPolicyOp(p, po, IPP_CANCEL_CURRENT_JOB); - cupsdAddPolicyOp(p, po, IPP_SUSPEND_CURRENT_JOB); - cupsdAddPolicyOp(p, po, IPP_RESUME_JOB); - cupsdAddPolicyOp(p, po, IPP_CANCEL_MY_JOBS); - cupsdAddPolicyOp(p, po, IPP_CLOSE_JOB); - cupsdAddPolicyOp(p, po, CUPS_MOVE_JOB); + po = cupsdAddPolicyOp(p, NULL, IPP_OP_SEND_DOCUMENT); + cupsdAddPolicyOp(p, po, IPP_OP_SEND_URI); + cupsdAddPolicyOp(p, po, IPP_OP_HOLD_JOB); + cupsdAddPolicyOp(p, po, IPP_OP_RELEASE_JOB); + cupsdAddPolicyOp(p, po, IPP_OP_RESTART_JOB); + cupsdAddPolicyOp(p, po, IPP_OP_PURGE_JOBS); + cupsdAddPolicyOp(p, po, IPP_OP_SET_JOB_ATTRIBUTES); + cupsdAddPolicyOp(p, po, IPP_OP_CREATE_JOB_SUBSCRIPTIONS); + cupsdAddPolicyOp(p, po, IPP_OP_RENEW_SUBSCRIPTION); + cupsdAddPolicyOp(p, po, IPP_OP_CANCEL_SUBSCRIPTION); + cupsdAddPolicyOp(p, po, IPP_OP_GET_NOTIFICATIONS); + cupsdAddPolicyOp(p, po, IPP_OP_REPROCESS_JOB); + cupsdAddPolicyOp(p, po, IPP_OP_CANCEL_CURRENT_JOB); + cupsdAddPolicyOp(p, po, IPP_OP_SUSPEND_CURRENT_JOB); + cupsdAddPolicyOp(p, po, IPP_OP_RESUME_JOB); + cupsdAddPolicyOp(p, po, IPP_OP_CANCEL_MY_JOBS); + cupsdAddPolicyOp(p, po, IPP_OP_CLOSE_JOB); + cupsdAddPolicyOp(p, po, IPP_OP_CUPS_MOVE_JOB); cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow"); po->order_type = CUPSD_AUTH_ALLOW; @@ -1402,7 +1402,7 @@ cupsdReadConfiguration(void) cupsdLogMessage(CUPSD_LOG_INFO, ""); cupsdLogMessage(CUPSD_LOG_INFO, ""); - po = cupsdAddPolicyOp(p, NULL, CUPS_GET_DOCUMENT); + po = cupsdAddPolicyOp(p, NULL, IPP_OP_CUPS_GET_DOCUMENT); cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow"); po->order_type = CUPSD_AUTH_ALLOW; @@ -1417,29 +1417,29 @@ cupsdReadConfiguration(void) cupsdLogMessage(CUPSD_LOG_INFO, ""); cupsdLogMessage(CUPSD_LOG_INFO, ""); - po = cupsdAddPolicyOp(p, NULL, IPP_PAUSE_PRINTER); - cupsdAddPolicyOp(p, po, IPP_RESUME_PRINTER); - cupsdAddPolicyOp(p, po, IPP_SET_PRINTER_ATTRIBUTES); - cupsdAddPolicyOp(p, po, IPP_ENABLE_PRINTER); - cupsdAddPolicyOp(p, po, IPP_DISABLE_PRINTER); - cupsdAddPolicyOp(p, po, IPP_PAUSE_PRINTER_AFTER_CURRENT_JOB); - cupsdAddPolicyOp(p, po, IPP_HOLD_NEW_JOBS); - cupsdAddPolicyOp(p, po, IPP_RELEASE_HELD_NEW_JOBS); - cupsdAddPolicyOp(p, po, IPP_DEACTIVATE_PRINTER); - cupsdAddPolicyOp(p, po, IPP_ACTIVATE_PRINTER); - cupsdAddPolicyOp(p, po, IPP_RESTART_PRINTER); - cupsdAddPolicyOp(p, po, IPP_SHUTDOWN_PRINTER); - cupsdAddPolicyOp(p, po, IPP_STARTUP_PRINTER); - cupsdAddPolicyOp(p, po, IPP_PROMOTE_JOB); - cupsdAddPolicyOp(p, po, IPP_SCHEDULE_JOB_AFTER); - cupsdAddPolicyOp(p, po, IPP_CANCEL_JOBS); - cupsdAddPolicyOp(p, po, CUPS_ADD_PRINTER); - cupsdAddPolicyOp(p, po, CUPS_DELETE_PRINTER); - cupsdAddPolicyOp(p, po, CUPS_ADD_CLASS); - cupsdAddPolicyOp(p, po, CUPS_DELETE_CLASS); - cupsdAddPolicyOp(p, po, CUPS_ACCEPT_JOBS); - cupsdAddPolicyOp(p, po, CUPS_REJECT_JOBS); - cupsdAddPolicyOp(p, po, CUPS_SET_DEFAULT); + po = cupsdAddPolicyOp(p, NULL, IPP_OP_PAUSE_PRINTER); + cupsdAddPolicyOp(p, po, IPP_OP_RESUME_PRINTER); + cupsdAddPolicyOp(p, po, IPP_OP_SET_PRINTER_ATTRIBUTES); + cupsdAddPolicyOp(p, po, IPP_OP_ENABLE_PRINTER); + cupsdAddPolicyOp(p, po, IPP_OP_DISABLE_PRINTER); + cupsdAddPolicyOp(p, po, IPP_OP_PAUSE_PRINTER_AFTER_CURRENT_JOB); + cupsdAddPolicyOp(p, po, IPP_OP_HOLD_NEW_JOBS); + cupsdAddPolicyOp(p, po, IPP_OP_RELEASE_HELD_NEW_JOBS); + cupsdAddPolicyOp(p, po, IPP_OP_DEACTIVATE_PRINTER); + cupsdAddPolicyOp(p, po, IPP_OP_ACTIVATE_PRINTER); + cupsdAddPolicyOp(p, po, IPP_OP_RESTART_PRINTER); + cupsdAddPolicyOp(p, po, IPP_OP_SHUTDOWN_PRINTER); + cupsdAddPolicyOp(p, po, IPP_OP_STARTUP_PRINTER); + cupsdAddPolicyOp(p, po, IPP_OP_PROMOTE_JOB); + cupsdAddPolicyOp(p, po, IPP_OP_SCHEDULE_JOB_AFTER); + cupsdAddPolicyOp(p, po, IPP_OP_CANCEL_JOBS); + cupsdAddPolicyOp(p, po, IPP_OP_CUPS_ADD_MODIFY_PRINTER); + cupsdAddPolicyOp(p, po, IPP_OP_CUPS_DELETE_PRINTER); + cupsdAddPolicyOp(p, po, IPP_OP_CUPS_ADD_MODIFY_CLASS); + cupsdAddPolicyOp(p, po, IPP_OP_CUPS_DELETE_CLASS); + cupsdAddPolicyOp(p, po, IPP_OP_CUPS_ACCEPT_JOBS); + cupsdAddPolicyOp(p, po, IPP_OP_CUPS_REJECT_JOBS); + cupsdAddPolicyOp(p, po, IPP_OP_CUPS_SET_DEFAULT); cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow"); po->order_type = CUPSD_AUTH_ALLOW; @@ -1453,7 +1453,7 @@ cupsdReadConfiguration(void) cupsdLogMessage(CUPSD_LOG_INFO, ""); cupsdLogMessage(CUPSD_LOG_INFO, ""); - po = cupsdAddPolicyOp(p, NULL, IPP_CANCEL_JOB); + po = cupsdAddPolicyOp(p, NULL, IPP_OP_CANCEL_JOB); cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow"); po->order_type = CUPSD_AUTH_ALLOW; @@ -1465,7 +1465,7 @@ cupsdReadConfiguration(void) cupsdLogMessage(CUPSD_LOG_INFO, ""); cupsdLogMessage(CUPSD_LOG_INFO, ""); - po = cupsdAddPolicyOp(p, NULL, CUPS_AUTHENTICATE_JOB); + po = cupsdAddPolicyOp(p, NULL, IPP_OP_CUPS_AUTHENTICATE_JOB); cupsdLogMessage(CUPSD_LOG_INFO, "AuthType Default"); po->type = CUPSD_AUTH_DEFAULT; @@ -4144,10 +4144,10 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */ if (cupsArrayCount(pol->ops) > 1) { - if ((op = cupsdFindPolicyOp(pol, IPP_VALIDATE_JOB)) == NULL || + if ((op = cupsdFindPolicyOp(pol, IPP_OP_VALIDATE_JOB)) == NULL || op->op == IPP_ANY_OPERATION) { - if ((op = cupsdFindPolicyOp(pol, IPP_PRINT_JOB)) != NULL && + if ((op = cupsdFindPolicyOp(pol, IPP_OP_PRINT_JOB)) != NULL && op->op != IPP_ANY_OPERATION) { /* @@ -4157,16 +4157,16 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Validate-Job defined in policy %s - using Print-Job's policy.", pol->name); - cupsdAddPolicyOp(pol, op, IPP_VALIDATE_JOB); + cupsdAddPolicyOp(pol, op, IPP_OP_VALIDATE_JOB); } else cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Validate-Job defined in policy %s and no suitable template found.", pol->name); } - if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_JOBS)) == NULL || + if ((op = cupsdFindPolicyOp(pol, IPP_OP_CANCEL_JOBS)) == NULL || op->op == IPP_ANY_OPERATION) { - if ((op = cupsdFindPolicyOp(pol, IPP_PAUSE_PRINTER)) != NULL && + if ((op = cupsdFindPolicyOp(pol, IPP_OP_PAUSE_PRINTER)) != NULL && op->op != IPP_ANY_OPERATION) { /* @@ -4176,16 +4176,16 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-Jobs defined in policy %s - using Pause-Printer's policy.", pol->name); - cupsdAddPolicyOp(pol, op, IPP_CANCEL_JOBS); + cupsdAddPolicyOp(pol, op, IPP_OP_CANCEL_JOBS); } else cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-Jobs defined in policy %s and no suitable template found.", pol->name); } - if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_MY_JOBS)) == NULL || + if ((op = cupsdFindPolicyOp(pol, IPP_OP_CANCEL_MY_JOBS)) == NULL || op->op == IPP_ANY_OPERATION) { - if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL && + if ((op = cupsdFindPolicyOp(pol, IPP_OP_SEND_DOCUMENT)) != NULL && op->op != IPP_ANY_OPERATION) { /* @@ -4195,16 +4195,16 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-My-Jobs defined in policy %s - using Send-Document's policy.", pol->name); - cupsdAddPolicyOp(pol, op, IPP_CANCEL_MY_JOBS); + cupsdAddPolicyOp(pol, op, IPP_OP_CANCEL_MY_JOBS); } else cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Cancel-My-Jobs defined in policy %s and no suitable template found.", pol->name); } - if ((op = cupsdFindPolicyOp(pol, IPP_CLOSE_JOB)) == NULL || + if ((op = cupsdFindPolicyOp(pol, IPP_OP_CLOSE_JOB)) == NULL || op->op == IPP_ANY_OPERATION) { - if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL && + if ((op = cupsdFindPolicyOp(pol, IPP_OP_SEND_DOCUMENT)) != NULL && op->op != IPP_ANY_OPERATION) { /* @@ -4214,16 +4214,16 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Close-Job defined in policy %s - using Send-Document's policy.", pol->name); - cupsdAddPolicyOp(pol, op, IPP_CLOSE_JOB); + cupsdAddPolicyOp(pol, op, IPP_OP_CLOSE_JOB); } else cupsdLogMessage(CUPSD_LOG_WARN, "No limit for Close-Job defined in policy %s and no suitable template found.", pol->name); } - if ((op = cupsdFindPolicyOp(pol, CUPS_GET_DOCUMENT)) == NULL || + if ((op = cupsdFindPolicyOp(pol, IPP_OP_CUPS_GET_DOCUMENT)) == NULL || op->op == IPP_ANY_OPERATION) { - if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL && + if ((op = cupsdFindPolicyOp(pol, IPP_OP_SEND_DOCUMENT)) != NULL && op->op != IPP_ANY_OPERATION) { /* @@ -4233,7 +4233,7 @@ set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */ cupsdLogMessage(CUPSD_LOG_WARN, "No limit for CUPS-Get-Document defined in policy %s - using Send-Document's policy.", pol->name); - cupsdAddPolicyOp(pol, op, CUPS_GET_DOCUMENT); + cupsdAddPolicyOp(pol, op, IPP_OP_CUPS_GET_DOCUMENT); } else cupsdLogMessage(CUPSD_LOG_WARN, "No limit for CUPS-Get-Document defined in policy %s and no suitable template found.", pol->name); diff --git a/scheduler/cups-deviced.c b/scheduler/cups-deviced.c index 20d174dc49..be16c1b487 100644 --- a/scheduler/cups-deviced.c +++ b/scheduler/cups-deviced.c @@ -269,7 +269,7 @@ main(int argc, /* I - Number of command-line args */ if (getenv("SOFTWARE")) puts("Content-Type: application/ipp\n"); - cupsdSendIPPHeader(IPP_OK, request_id); + cupsdSendIPPHeader(IPP_STATUS_OK, request_id); cupsdSendIPPGroup(IPP_TAG_OPERATION); cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", "en-US"); diff --git a/scheduler/cups-driverd.cxx b/scheduler/cups-driverd.cxx index eb59e6464c..b5ef7fe39c 100644 --- a/scheduler/cups-driverd.cxx +++ b/scheduler/cups-driverd.cxx @@ -336,7 +336,7 @@ cat_drv(const char *name, /* I - PPD name */ { snprintf(message, sizeof(message), "Bad PPD name \"%s\".", name); - cupsdSendIPPHeader(IPP_NOT_FOUND, request_id); + cupsdSendIPPHeader(IPP_STATUS_ERROR_NOT_FOUND, request_id); cupsdSendIPPGroup(IPP_TAG_OPERATION); cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", @@ -381,7 +381,7 @@ cat_drv(const char *name, /* I - PPD name */ if (request_id) { - cupsdSendIPPHeader(IPP_OK, request_id); + cupsdSendIPPHeader(IPP_STATUS_OK, request_id); cupsdSendIPPGroup(IPP_TAG_OPERATION); cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", @@ -404,7 +404,7 @@ cat_drv(const char *name, /* I - PPD name */ { snprintf(message, sizeof(message), "PPD \"%s\" not found.", name); - cupsdSendIPPHeader(IPP_NOT_FOUND, request_id); + cupsdSendIPPHeader(IPP_STATUS_ERROR_NOT_FOUND, request_id); cupsdSendIPPGroup(IPP_TAG_OPERATION); cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", @@ -505,7 +505,7 @@ cat_ppd(const char *name, /* I - PPD name */ snprintf(message, sizeof(message), "Unable to access \"%s\" - %s", line, strerror(errno)); - cupsdSendIPPHeader(IPP_NOT_FOUND, request_id); + cupsdSendIPPHeader(IPP_STATUS_ERROR_NOT_FOUND, request_id); cupsdSendIPPGroup(IPP_TAG_OPERATION); cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", @@ -523,7 +523,7 @@ cat_ppd(const char *name, /* I - PPD name */ if (request_id) { - cupsdSendIPPHeader(IPP_OK, request_id); + cupsdSendIPPHeader(IPP_STATUS_OK, request_id); cupsdSendIPPGroup(IPP_TAG_OPERATION); cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", @@ -575,7 +575,7 @@ cat_static(const char *name, /* I - PPD name */ if (request_id) { - cupsdSendIPPHeader(IPP_OK, request_id); + cupsdSendIPPHeader(IPP_STATUS_OK, request_id); cupsdSendIPPGroup(IPP_TAG_OPERATION); cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", @@ -636,7 +636,7 @@ cat_tar(const char *name, /* I - PPD name */ { if (request_id) { - cupsdSendIPPHeader(IPP_OK, request_id); + cupsdSendIPPHeader(IPP_STATUS_OK, request_id); cupsdSendIPPGroup(IPP_TAG_OPERATION); cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", @@ -684,7 +684,7 @@ cat_tar(const char *name, /* I - PPD name */ { snprintf(buffer, sizeof(buffer), "PPD \"%s\" not found.", name); - cupsdSendIPPHeader(IPP_NOT_FOUND, request_id); + cupsdSendIPPHeader(IPP_STATUS_ERROR_NOT_FOUND, request_id); cupsdSendIPPGroup(IPP_TAG_OPERATION); cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", @@ -873,7 +873,7 @@ get_file(const char *name, /* I - Name */ { snprintf(message, sizeof(message), "Bad PPD name \"%s\".", name); - cupsdSendIPPHeader(IPP_NOT_FOUND, request_id); + cupsdSendIPPHeader(IPP_STATUS_ERROR_NOT_FOUND, request_id); cupsdSendIPPGroup(IPP_TAG_OPERATION); cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", @@ -984,7 +984,7 @@ get_file(const char *name, /* I - Name */ snprintf(message, sizeof(message), "Unable to open \"%s\" - %s", buffer, strerror(errno)); - cupsdSendIPPHeader(IPP_NOT_FOUND, request_id); + cupsdSendIPPHeader(IPP_STATUS_ERROR_NOT_FOUND, request_id); cupsdSendIPPGroup(IPP_TAG_OPERATION); cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", @@ -1464,7 +1464,7 @@ list_ppds(int request_id, /* I - Request ID */ if (request_id) { - cupsdSendIPPHeader(IPP_OK, request_id); + cupsdSendIPPHeader(IPP_STATUS_OK, request_id); cupsdSendIPPGroup(IPP_TAG_OPERATION); cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", @@ -1569,7 +1569,7 @@ list_ppds(int request_id, /* I - Request ID */ if (!sent_header && request_id) { - cupsdSendIPPHeader(IPP_NOT_FOUND, request_id); + cupsdSendIPPHeader(IPP_STATUS_ERROR_NOT_FOUND, request_id); cupsdSendIPPGroup(IPP_TAG_OPERATION); cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", "en-US"); diff --git a/scheduler/cups-lpd.c b/scheduler/cups-lpd.c index 6185cafa21..9491c2a2c6 100644 --- a/scheduler/cups-lpd.c +++ b/scheduler/cups-lpd.c @@ -804,7 +804,7 @@ recv_print_job( * Connect to the server... */ - http = httpConnect2(cupsGetServer(), ippPort(), NULL, AF_UNSPEC, cupsGetEncryption(), 1, 30000, NULL); + http = httpConnect2(cupsGetServer(), ippGetPort(), NULL, AF_UNSPEC, cupsGetEncryption(), 1, 30000, NULL); if (!http) { syslog(LOG_ERR, "Unable to connect to server: %s", strerror(errno)); @@ -1230,7 +1230,7 @@ remove_jobs(const char *dest, /* I - Destination */ * Try connecting to the local server... */ - if ((http = httpConnect2(cupsGetServer(), ippPort(), NULL, AF_UNSPEC, cupsGetEncryption(), 1, 30000, NULL)) == NULL) + if ((http = httpConnect2(cupsGetServer(), ippGetPort(), NULL, AF_UNSPEC, cupsGetEncryption(), 1, 30000, NULL)) == NULL) { syslog(LOG_ERR, "Unable to connect to server %s: %s", cupsGetServer(), strerror(errno)); @@ -1350,7 +1350,7 @@ send_state(const char *queue, /* I - Destination */ * Try connecting to the local server... */ - if ((http = httpConnect2(cupsGetServer(), ippPort(), NULL, AF_UNSPEC, cupsGetEncryption(), 1, 30000, NULL)) == NULL) + if ((http = httpConnect2(cupsGetServer(), ippGetPort(), NULL, AF_UNSPEC, cupsGetEncryption(), 1, 30000, NULL)) == NULL) { syslog(LOG_ERR, "Unable to connect to server %s: %s", cupsGetServer(), strerror(errno)); diff --git a/scheduler/cupsfilter.c b/scheduler/cupsfilter.c index 0b7ca11a6f..33e34164fb 100644 --- a/scheduler/cupsfilter.c +++ b/scheduler/cupsfilter.c @@ -1338,7 +1338,7 @@ get_job_file(const char *job) /* I - Job ID */ exit(1); } - request = ippNewRequest(CUPS_GET_DOCUMENT); + request = ippNewRequest(IPP_OP_CUPS_GET_DOCUMENT); snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", (int)jobid); @@ -1361,7 +1361,7 @@ get_job_file(const char *job) /* I - Job ID */ httpClose(http); - if (cupsGetError() != IPP_OK) + if (cupsGetError() != IPP_STATUS_OK) { _cupsLangPrintf(stderr, _("cupsfilter: Unable to get job file - %s"), cupsGetErrorString()); diff --git a/scheduler/dirsvc.c b/scheduler/dirsvc.c index 344c5df838..23ff775008 100644 --- a/scheduler/dirsvc.c +++ b/scheduler/dirsvc.c @@ -92,7 +92,7 @@ cupsdDeregisterPrinter( */ cupsdLogMessage(CUPSD_LOG_DEBUG, - "cupsdDeregisterPrinter(p=%p(%s), removeit=%d)", p, p->name, + "cupsdDeregisterPrinter(p=%p(%s), removeit=%d)", (void *)p, p->name, removeit); if (!Browsing || !p->shared || @@ -118,7 +118,7 @@ cupsdDeregisterPrinter( void cupsdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */ { - cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdRegisterPrinter(p=%p(%s))", p, + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdRegisterPrinter(p=%p(%s))", (void *)p, p->name); if (!Browsing || !BrowseLocalProtocols || @@ -705,7 +705,7 @@ dnssdDeregisterPrinter( { cupsdLogMessage(CUPSD_LOG_DEBUG2, - "dnssdDeregisterPrinter(p=%p(%s), clear_name=%d)", p, p->name, + "dnssdDeregisterPrinter(p=%p(%s), clear_name=%d)", (void *)p, p->name, clear_name); if (p->ipp_srv) @@ -1583,7 +1583,7 @@ get_auth_info_required( if ((auth = cupsdFindBest(resource, HTTP_STATE_POST)) == NULL || auth->type == CUPSD_AUTH_NONE) - auth = cupsdFindPolicyOp(p->op_policy_ptr, IPP_PRINT_JOB); + auth = cupsdFindPolicyOp(p->op_policy_ptr, IPP_OP_PRINT_JOB); if (auth) { diff --git a/scheduler/ipp.c b/scheduler/ipp.c index ccf4520963..e8b5f94414 100644 --- a/scheduler/ipp.c +++ b/scheduler/ipp.c @@ -143,7 +143,7 @@ cupsdProcessIPPRequest( int valid = 1; /* Valid request? */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdProcessIPPRequest(%p[%d]): operation_id=%04x(%s)", con, con->number, con->request->request.op.operation_id, ippOpString(con->request->request.op.operation_id)); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdProcessIPPRequest(%p[%d]): operation_id=%04x(%s)", (void *)con, con->number, con->request->request.op.operation_id, ippOpString(con->request->request.op.operation_id)); if (LogLevel >= CUPSD_LOG_DEBUG2) { @@ -243,7 +243,7 @@ cupsdProcessIPPRequest( */ attr = con->request->attrs; - if (attr && attr->name && !strcmp(attr->name, "attributes-charset") && (attr->value_tag & IPP_TAG_MASK) == IPP_TAG_CHARSET && attr->group_tag == IPP_TAG_OPERATION) + if (attr && attr->name && !strcmp(attr->name, "attributes-charset") && (attr->value_tag & IPP_TAG_CUPS_MASK) == IPP_TAG_CHARSET && attr->group_tag == IPP_TAG_OPERATION) charset = attr; else charset = NULL; @@ -251,7 +251,7 @@ cupsdProcessIPPRequest( if (attr) attr = attr->next; - if (attr && attr->name && !strcmp(attr->name, "attributes-natural-language") && (attr->value_tag & IPP_TAG_MASK) == IPP_TAG_LANGUAGE && attr->group_tag == IPP_TAG_OPERATION) + if (attr && attr->name && !strcmp(attr->name, "attributes-natural-language") && (attr->value_tag & IPP_TAG_CUPS_MASK) == IPP_TAG_LANGUAGE && attr->group_tag == IPP_TAG_OPERATION) { language = attr; @@ -273,7 +273,7 @@ cupsdProcessIPPRequest( uri = attr; else if ((attr = ippFindAttribute(con->request, "job-uri", IPP_TAG_URI)) != NULL && attr->group_tag == IPP_TAG_OPERATION) uri = attr; - else if (con->request->request.op.operation_id == CUPS_GET_PPD && (attr = ippFindAttribute(con->request, "ppd-name", IPP_TAG_NAME)) != NULL && attr->group_tag == IPP_TAG_OPERATION) + else if (con->request->request.op.operation_id == IPP_OP_CUPS_GET_PPD && (attr = ippFindAttribute(con->request, "ppd-name", IPP_TAG_NAME)) != NULL && attr->group_tag == IPP_TAG_OPERATION) uri = attr; else uri = NULL; @@ -301,11 +301,11 @@ cupsdProcessIPPRequest( } else if (!charset || !language || (!uri && - con->request->request.op.operation_id != CUPS_GET_DEFAULT && - con->request->request.op.operation_id != CUPS_GET_PRINTERS && - con->request->request.op.operation_id != CUPS_GET_CLASSES && - con->request->request.op.operation_id != CUPS_GET_DEVICES && - con->request->request.op.operation_id != CUPS_GET_PPDS)) + con->request->request.op.operation_id != IPP_OP_CUPS_GET_DEFAULT && + con->request->request.op.operation_id != IPP_OP_CUPS_GET_PRINTERS && + con->request->request.op.operation_id != IPP_OP_CUPS_GET_CLASSES && + con->request->request.op.operation_id != IPP_OP_CUPS_GET_DEVICES && + con->request->request.op.operation_id != IPP_OP_CUPS_GET_PPDS)) { /* * Return an error, since attributes-charset, @@ -345,7 +345,7 @@ cupsdProcessIPPRequest( cupsdLogMessage(CUPSD_LOG_DEBUG, "End of attributes..."); - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Missing required attributes.")); } else @@ -747,7 +747,7 @@ accept_jobs(cupsd_client_t *con, /* I - Client connection */ cupsd_printer_t *printer; /* Printer data */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "accept_jobs(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "accept_jobs(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -760,7 +760,7 @@ accept_jobs(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -805,7 +805,7 @@ accept_jobs(cupsd_client_t *con, /* I - Client connection */ * Everything was ok, so return OK status... */ - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -832,7 +832,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */ int need_restart_job; /* Need to restart job? */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_class(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_class(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -850,7 +850,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */ * No, return an error... */ - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("The printer-uri must be of the form " "\"ipp://HOSTNAME/classes/CLASSNAME\".")); return; @@ -866,7 +866,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */ * No, return an error... */ - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("The printer-uri \"%s\" contains invalid characters."), uri->values[0].string.text); return; @@ -888,7 +888,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */ * Yes, return an error... */ - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("A printer named \"%s\" already exists."), resource + 9); return; @@ -962,7 +962,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */ * Cannot re-share remote printers. */ - send_ipp_status(con, IPP_BAD_REQUEST, _("Cannot change printer-is-shared for remote queues.")); + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Cannot change printer-is-shared for remote queues.")); if (!modify) cupsdDeletePrinter(pclass, 0); @@ -982,10 +982,10 @@ add_class(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "printer-state", IPP_TAG_ENUM)) != NULL) { - if (attr->values[0].integer != IPP_PRINTER_IDLE && - attr->values[0].integer != IPP_PRINTER_STOPPED) + if (attr->values[0].integer != IPP_PSTATE_IDLE && + attr->values[0].integer != IPP_PSTATE_STOPPED) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Attempt to set %s printer-state to bad value %d."), pclass->name, attr->values[0].integer); if (!modify) @@ -997,7 +997,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_INFO, "Setting %s printer-state to %d (was %d.)", pclass->name, attr->values[0].integer, pclass->state); - if (attr->values[0].integer == IPP_PRINTER_STOPPED) + if (attr->values[0].integer == IPP_PSTATE_STOPPED) cupsdStopPrinter(pclass, 0); else { @@ -1045,7 +1045,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); if (!modify) cupsdDeletePrinter(pclass, 0); @@ -1054,7 +1054,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */ } else if (dtype & CUPS_PRINTER_CLASS) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Nested classes are not allowed.")); if (!modify) cupsdDeletePrinter(pclass, 0); @@ -1097,7 +1097,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */ * Reset the current job to a "pending" status... */ - cupsdSetJobState(pclass->job, IPP_JOB_PENDING, CUPSD_JOB_FORCE, + cupsdSetJobState(pclass->job, IPP_JSTATE_PENDING, CUPSD_JOB_FORCE, "Job restarted because the class was modified."); } @@ -1122,7 +1122,7 @@ add_class(cupsd_client_t *con, /* I - Client connection */ pclass->name, get_username(con)); } - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -1142,7 +1142,7 @@ add_file(cupsd_client_t *con, /* I - Connection to client */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_file(con=%p[%d], job=%d, filetype=%s/%s, " - "compression=%d)", con, con ? con->number : -1, job->id, + "compression=%d)", (void *)con, con ? con->number : -1, job->id, filetype->super, filetype->type, compression); /* @@ -1171,11 +1171,11 @@ add_file(cupsd_client_t *con, /* I - Connection to client */ if (!compressions || !filetypes) { - cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE, + cupsdSetJobState(job, IPP_JSTATE_ABORTED, CUPSD_JOB_PURGE, "Job aborted because the scheduler ran out of memory."); if (con) - send_ipp_status(con, IPP_INTERNAL_ERROR, + send_ipp_status(con, IPP_STATUS_ERROR_INTERNAL, _("Unable to allocate memory for file types.")); return (-1); @@ -1245,8 +1245,8 @@ add_job(cupsd_client_t *con, /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_job(%p[%d], %p(%s), %p(%s/%s))", - con, con->number, printer, printer->name, - filetype, filetype ? filetype->super : "none", + (void *)con, con->number, (void *)printer, printer->name, + (void *)filetype, filetype ? filetype->super : "none", filetype ? filetype->type : "none"); /* @@ -1257,7 +1257,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ _cups_strcasecmp(con->http->hostname, "localhost") && _cups_strcasecmp(con->http->hostname, ServerName)) { - send_ipp_status(con, IPP_NOT_AUTHORIZED, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_AUTHORIZED, _("The printer or class is not shared.")); return (NULL); } @@ -1297,7 +1297,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ if (!printer->accepting) { - send_ipp_status(con, IPP_NOT_ACCEPTING, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_ACCEPTING_JOBS, _("Destination \"%s\" is not accepting jobs."), printer->name); return (NULL); @@ -1317,7 +1317,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ if (StrictConformance) { - send_ipp_status(con, IPP_BAD_REQUEST, _("The '%s' Job Status attribute cannot be supplied in a job creation request."), readonly[i]); + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("The '%s' Job Status attribute cannot be supplied in a job creation request."), readonly[i]); return (NULL); } @@ -1337,7 +1337,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ * Missing a required attribute... */ - send_ipp_status(con, IPP_CONFLICT, + send_ipp_status(con, IPP_STATUS_ERROR_CONFLICTING, _("The \"%s\" attribute is required for print jobs."), mandatory); return (NULL); @@ -1355,7 +1355,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, filetype->type); - send_ipp_status(con, IPP_DOCUMENT_FORMAT, + send_ipp_status(con, IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED, _("Unsupported format \"%s\"."), mimetype); ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE, @@ -1369,7 +1369,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ { if (attr->values[0].integer < 1 || attr->values[0].integer > MaxCopies) { - send_ipp_status(con, IPP_ATTRIBUTES, _("Bad copies value %d."), + send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Bad copies value %d."), attr->values[0].integer); ippAddInteger(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_INTEGER, "copies", attr->values[0].integer); @@ -1383,13 +1383,13 @@ add_job(cupsd_client_t *con, /* I - Client connection */ if (attr->value_tag != IPP_TAG_KEYWORD && attr->value_tag != IPP_TAG_NAME) { - send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-sheets value type.")); + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad job-sheets value type.")); return (NULL); } if (attr->num_values > 2) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Too many job-sheets values (%d > 2)."), attr->num_values); return (NULL); @@ -1399,7 +1399,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ if (strcmp(attr->values[i].string.text, "none") && !cupsdFindBanner(attr->values[i].string.text)) { - send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-sheets value \"%s\"."), + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad job-sheets value \"%s\"."), attr->values[i].string.text); return (NULL); } @@ -1415,7 +1415,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ attr->values[0].integer != 9 && attr->values[0].integer != 16) { - send_ipp_status(con, IPP_ATTRIBUTES, _("Bad number-up value %d."), + send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Bad number-up value %d."), attr->values[0].integer); ippAddInteger(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_INTEGER, "number-up", attr->values[0].integer); @@ -1431,7 +1431,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ if (attr->values[i].range.lower < lowerpagerange || attr->values[i].range.lower > attr->values[i].range.upper) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad page-ranges values %d-%d."), attr->values[i].range.lower, attr->values[i].range.upper); @@ -1454,7 +1454,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ (media_col = ippFindAttribute(con->request, "media-col", IPP_TAG_BEGIN_COLLECTION)) != NULL) { - send_ipp_status(con, IPP_OK_SUBST, _("Unsupported margins.")); + send_ipp_status(con, IPP_STATUS_OK_IGNORED_OR_SUBSTITUTED, _("Unsupported margins.")); unsup_col = ippNew(); if ((media_margin = ippFindAttribute(media_col->values[0].collection, @@ -1496,18 +1496,18 @@ add_job(cupsd_client_t *con, /* I - Client connection */ if (MaxJobs && cupsArrayCount(Jobs) >= MaxJobs) { - send_ipp_status(con, IPP_NOT_POSSIBLE, _("Too many active jobs.")); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Too many active jobs.")); return (NULL); } if ((i = check_quotas(con, printer)) < 0) { - send_ipp_status(con, IPP_NOT_POSSIBLE, _("Quota limit reached.")); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Quota limit reached.")); return (NULL); } else if (i == 0) { - send_ipp_status(con, IPP_NOT_AUTHORIZED, _("Not allowed to print.")); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_AUTHORIZED, _("Not allowed to print.")); return (NULL); } @@ -1536,7 +1536,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ attr->value_tag != IPP_TAG_NAMELANG) || attr->num_values != 1) { - send_ipp_status(con, IPP_ATTRIBUTES, + send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Bad job-name value: Wrong type or count.")); if ((attr = ippCopyAttribute(con->response, attr, 0)) != NULL) attr->group_tag = IPP_TAG_UNSUPPORTED_GROUP; @@ -1551,7 +1551,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ } else if (!ippValidateAttribute(attr)) { - send_ipp_status(con, IPP_ATTRIBUTES, _("Bad job-name value: %s"), + send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Bad job-name value: %s"), cupsGetErrorString()); if ((attr = ippCopyAttribute(con->response, attr, 0)) != NULL) @@ -1570,7 +1570,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ if ((job = cupsdAddJob(priority, printer->name)) == NULL) { - send_ipp_status(con, IPP_INTERNAL_ERROR, + send_ipp_status(con, IPP_STATUS_ERROR_INTERNAL, _("Unable to add job for destination \"%s\"."), printer->name); return (NULL); @@ -1674,7 +1674,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id); job->state = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_ENUM, - "job-state", IPP_JOB_STOPPED); + "job-state", IPP_JSTATE_STOPPED); job->state_value = (ipp_jstate_t)job->state->values[0].integer; job->reasons = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-incoming"); @@ -1713,8 +1713,8 @@ add_job(cupsd_client_t *con, /* I - Client connection */ else cupsdSetJobHoldUntil(job, "indefinite", 0); - job->state->values[0].integer = IPP_JOB_HELD; - job->state_value = IPP_JOB_HELD; + job->state->values[0].integer = IPP_JSTATE_HELD; + job->state_value = IPP_JSTATE_HELD; ippSetString(job->attrs, &job->reasons, 0, "job-held-on-create"); } @@ -1726,21 +1726,21 @@ add_job(cupsd_client_t *con, /* I - Client connection */ cupsdSetJobHoldUntil(job, attr->values[0].string.text, 0); - job->state->values[0].integer = IPP_JOB_HELD; - job->state_value = IPP_JOB_HELD; + job->state->values[0].integer = IPP_JSTATE_HELD; + job->state_value = IPP_JSTATE_HELD; ippSetString(job->attrs, &job->reasons, 0, "job-hold-until-specified"); } - else if (job->attrs->request.op.operation_id == IPP_CREATE_JOB) + else if (job->attrs->request.op.operation_id == IPP_OP_CREATE_JOB) { job->hold_until = time(NULL) + MultipleOperationTimeout; - job->state->values[0].integer = IPP_JOB_HELD; - job->state_value = IPP_JOB_HELD; + job->state->values[0].integer = IPP_JSTATE_HELD; + job->state_value = IPP_JSTATE_HELD; } else { - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; + job->state->values[0].integer = IPP_JSTATE_PENDING; + job->state_value = IPP_JSTATE_PENDING; ippSetString(job->attrs, &job->reasons, 0, "none"); } @@ -1885,7 +1885,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ if ((kbytes = copy_banner(con, job, attr->values[0].string.text)) < 0) { - cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE, + cupsdSetJobState(job, IPP_JSTATE_ABORTED, CUPSD_JOB_PURGE, "Aborting job because the start banner could not be " "copied."); return (NULL); @@ -1911,7 +1911,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_TEXT, "job-state-message", NULL, ""); ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, job->reasons->values[0].string.text); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; /* * Add any job subscriptions... @@ -2010,31 +2010,31 @@ add_job_subscriptions( host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Bad notify-recipient-uri \"%s\"."), recipient); ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, - "notify-status-code", IPP_URI_SCHEME); + "notify-status-code", IPP_STATUS_ERROR_URI_SCHEME); return; } snprintf(notifier, sizeof(notifier), "%s/notifier/%s", ServerBin, scheme); if (access(notifier, X_OK) || stat(notifier, &info) || !S_ISREG(info.st_mode)) { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("notify-recipient-uri URI \"%s\" uses unknown " "scheme."), recipient); ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, - "notify-status-code", IPP_URI_SCHEME); + "notify-status-code", IPP_STATUS_ERROR_URI_SCHEME); return; } if (!strcmp(scheme, "rss") && !check_rss_recipient(recipient)) { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("notify-recipient-uri URI \"%s\" is already used."), recipient); ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, - "notify-status-code", IPP_ATTRIBUTES); + "notify-status-code", IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES); return; } } @@ -2045,10 +2045,10 @@ add_job_subscriptions( if (strcmp(pullmethod, "ippget")) { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Bad notify-pull-method \"%s\"."), pullmethod); ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, - "notify-status-code", IPP_ATTRIBUTES); + "notify-status-code", IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES); return; } } @@ -2057,7 +2057,7 @@ add_job_subscriptions( strcmp(attr->values[0].string.text, "us-ascii") && strcmp(attr->values[0].string.text, "utf-8")) { - send_ipp_status(con, IPP_CHARSET, + send_ipp_status(con, IPP_STATUS_ERROR_CHARSET, _("Character set \"%s\" not supported."), attr->values[0].string.text); return; @@ -2066,7 +2066,7 @@ add_job_subscriptions( (attr->value_tag != IPP_TAG_LANGUAGE || strcmp(attr->values[0].string.text, DefaultLanguage))) { - send_ipp_status(con, IPP_CHARSET, + send_ipp_status(con, IPP_STATUS_ERROR_CHARSET, _("Language \"%s\" not supported."), attr->values[0].string.text); return; @@ -2076,7 +2076,7 @@ add_job_subscriptions( { if (attr->num_values > 1 || attr->values[0].unknown.length > 63) { - send_ipp_status(con, IPP_REQUEST_VALUE, + send_ipp_status(con, IPP_STATUS_ERROR_REQUEST_VALUE, _("The notify-user-data value is too large " "(%d > 63 octets)."), attr->values[0].unknown.length); @@ -2093,7 +2093,7 @@ add_job_subscriptions( } else if (!strcmp(attr->name, "notify-lease-duration")) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("The notify-lease-duration attribute cannot be " "used with job subscriptions.")); return; @@ -2224,7 +2224,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ set_port_monitor; /* Did we set the port monitor? */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_printer(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_printer(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -2241,7 +2241,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ * No, return an error... */ - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("The printer-uri must be of the form " "\"ipp://HOSTNAME/printers/PRINTERNAME\".")); return; @@ -2257,7 +2257,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ * No, return an error... */ - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("The printer-uri \"%s\" contains invalid characters."), uri->values[0].string.text); return; @@ -2279,7 +2279,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ * Yes, return an error... */ - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("A class named \"%s\" already exists."), resource + 10); return; @@ -2374,7 +2374,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ if (uri_status < HTTP_URI_STATUS_OK) { - send_ipp_status(con, IPP_NOT_POSSIBLE, _("Bad device-uri \"%s\"."), + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Bad device-uri \"%s\"."), attr->values[0].string.text); if (!modify) cupsdDeletePrinter(printer, 0); @@ -2394,7 +2394,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ * File devices are disabled and the URL is not file:/dev/null... */ - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("File device URIs have been disabled. " "To enable, see the FileDevice directive in " "\"%s/cups-files.conf\"."), @@ -2418,7 +2418,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ * Could not find device in list! */ - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Bad device-uri scheme \"%s\"."), scheme); if (!modify) cupsdDeletePrinter(printer, 0); @@ -2465,7 +2465,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ if (!supported || i >= supported->num_values) { - send_ipp_status(con, IPP_NOT_POSSIBLE, _("Bad port-monitor \"%s\"."), + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Bad port-monitor \"%s\"."), attr->values[0].string.text); if (!modify) cupsdDeletePrinter(printer, 0); @@ -2507,7 +2507,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ printer->num_auth_info_required == 1 && !strcmp(printer->auth_info_required[0], "negotiate")) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Cannot share a remote Kerberized printer.")); if (!modify) cupsdDeletePrinter(printer, 0); @@ -2521,7 +2521,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ * Cannot re-share remote printers. */ - send_ipp_status(con, IPP_BAD_REQUEST, _("Cannot change printer-is-shared for remote queues.")); + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Cannot change printer-is-shared for remote queues.")); if (!modify) cupsdDeletePrinter(printer, 0); @@ -2543,10 +2543,10 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "printer-state", IPP_TAG_ENUM)) != NULL) { - if (attr->values[0].integer != IPP_PRINTER_IDLE && - attr->values[0].integer != IPP_PRINTER_STOPPED) + if (attr->values[0].integer != IPP_PSTATE_IDLE && + attr->values[0].integer != IPP_PSTATE_STOPPED) { - send_ipp_status(con, IPP_BAD_REQUEST, _("Bad printer-state value %d."), + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad printer-state value %d."), attr->values[0].integer); if (!modify) cupsdDeletePrinter(printer, 0); @@ -2557,7 +2557,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_INFO, "Setting %s printer-state to %d (was %d.)", printer->name, attr->values[0].integer, printer->state); - if (attr->values[0].integer == IPP_PRINTER_STOPPED) + if (attr->values[0].integer == IPP_PSTATE_STOPPED) cupsdStopPrinter(printer, 0); else { @@ -2582,7 +2582,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ if (attr->num_values > (int)(sizeof(printer->reasons) / sizeof(printer->reasons[0]))) { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Too many printer-state-reasons values (%d > %d)."), attr->num_values, (int)(sizeof(printer->reasons) / @@ -2606,11 +2606,11 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ printer->num_reasons ++; if (!strcmp(attr->values[i].string.text, "paused") && - printer->state != IPP_PRINTER_STOPPED) + printer->state != IPP_PSTATE_STOPPED) { cupsdLogMessage(CUPSD_LOG_INFO, "Setting %s printer-state to %d (was %d.)", - printer->name, IPP_PRINTER_STOPPED, printer->state); + printer->name, IPP_PSTATE_STOPPED, printer->state); cupsdStopPrinter(printer, 0); } } @@ -2685,7 +2685,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ if (copy_file(srcfile, dstfile, ConfigFilePerm)) { - send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to copy PPD file - %s"), strerror(errno)); + send_ipp_status(con, IPP_STATUS_ERROR_INTERNAL, _("Unable to copy PPD file - %s"), strerror(errno)); if (!modify) cupsdDeletePrinter(printer, 0); @@ -2708,7 +2708,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ // Create IPP Everywhere PPD... if (!printer->device_uri || (strncmp(printer->device_uri, "dnssd://", 8) && strncmp(printer->device_uri, "ipp://", 6) && strncmp(printer->device_uri, "ipps://", 7) && strncmp(printer->device_uri, "ippusb://", 9))) { - send_ipp_status(con, IPP_INTERNAL_ERROR, _("IPP Everywhere driver requires an IPP connection.")); + send_ipp_status(con, IPP_STATUS_ERROR_INTERNAL, _("IPP Everywhere driver requires an IPP connection.")); if (!modify) cupsdDeletePrinter(printer, 0); @@ -2840,7 +2840,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ * Restart the current job... */ - cupsdSetJobState(printer->job, IPP_JOB_PENDING, CUPSD_JOB_FORCE, + cupsdSetJobState(printer->job, IPP_JSTATE_PENDING, CUPSD_JOB_FORCE, "Job restarted because the printer was modified."); } @@ -2865,7 +2865,7 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ printer->name, get_username(con)); } - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -2881,7 +2881,7 @@ add_printer_state_reasons( { cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_printer_state_reasons(%p[%d], %p[%s])", - con, con->number, p, p->name); + (void *)con, con->number, (void *)p, p->name); if (p->num_reasons == 0) ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, @@ -2907,7 +2907,7 @@ add_queued_job_count( cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_queued_job_count(%p[%d], %p[%s])", - con, con->number, p, p->name); + (void *)con, con->number, (void *)p, p->name); count = cupsdGetPrinterJobCount(p->name); @@ -2997,13 +2997,13 @@ authenticate_job(cupsd_client_t *con, /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "authenticate_job(%p[%d], %s)", - con, con->number, uri->values[0].string.text); + (void *)con, con->number, uri->values[0].string.text); /* * Start with "everything is OK" status... */ - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; /* * See if we have a job URI or a printer URI... @@ -3018,7 +3018,7 @@ authenticate_job(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "job-id", IPP_TAG_INTEGER)) == NULL) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Got a printer-uri attribute but no job-id.")); return; } @@ -3041,7 +3041,7 @@ authenticate_job(cupsd_client_t *con, /* I - Client connection */ * Not a valid URI! */ - send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad job-uri \"%s\"."), uri->values[0].string.text); return; } @@ -3059,7 +3059,7 @@ authenticate_job(cupsd_client_t *con, /* I - Client connection */ * Nope - return a "not found" error... */ - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), jobid); return; } @@ -3067,13 +3067,13 @@ authenticate_job(cupsd_client_t *con, /* I - Client connection */ * See if the job has been completed... */ - if (job->state_value != IPP_JOB_HELD) + if (job->state_value != IPP_JSTATE_HELD) { /* * Return a "not-possible" error... */ - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job #%d is not held for authentication."), jobid); return; @@ -3100,7 +3100,7 @@ authenticate_job(cupsd_client_t *con, /* I - Client connection */ !strcmp(printer->auth_info_required[0], "negotiate")) send_http_error(con, HTTP_STATUS_UNAUTHORIZED, printer); else - send_ipp_status(con, IPP_NOT_AUTHORIZED, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_AUTHORIZED, _("No authentication information provided.")); return; } @@ -3175,7 +3175,7 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */ cupsd_job_t *job; /* Job */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_all_jobs(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_all_jobs(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -3184,7 +3184,7 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */ switch (con->request->request.op.operation_id) { - case IPP_PURGE_JOBS : + case IPP_OP_PURGE_JOBS : /* * Get the username (if any) for the jobs we want to cancel (only if * "my-jobs" is specified... @@ -3199,7 +3199,7 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */ username = attr->values[0].string.text; else { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Missing requesting-user-name attribute.")); return; } @@ -3216,7 +3216,7 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */ purge = CUPSD_JOB_PURGE; break; - case IPP_CANCEL_MY_JOBS : + case IPP_OP_CANCEL_MY_JOBS : if (con->username[0]) username = con->username; else if ((attr = ippFindAttribute(con->request, "requesting-user-name", @@ -3224,7 +3224,7 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */ username = attr->values[0].string.text; else { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Missing requesting-user-name attribute.")); return; } @@ -3241,7 +3241,7 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */ if (strcmp(uri->name, "printer-uri")) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("The printer-uri attribute is required.")); return; } @@ -3264,7 +3264,7 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */ if ((!strncmp(resource, "/printers/", 10) && resource[10]) || (!strncmp(resource, "/classes/", 9) && resource[9])) { - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -3286,14 +3286,14 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */ if ((job = cupsdFindJob(job_ids->values[i].integer)) == NULL) break; - if (con->request->request.op.operation_id == IPP_CANCEL_MY_JOBS && + if (con->request->request.op.operation_id == IPP_OP_CANCEL_MY_JOBS && _cups_strcasecmp(job->username, username)) break; } if (i < job_ids->num_values) { - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), job_ids->values[i].integer); return; } @@ -3302,7 +3302,7 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */ { job = cupsdFindJob(job_ids->values[i].integer); - cupsdSetJobState(job, IPP_JOB_CANCELED, purge, + cupsdSetJobState(job, IPP_JSTATE_CANCELED, purge, purge == CUPSD_JOB_PURGE ? "Job purged by user." : "Job canceled by user."); } @@ -3345,14 +3345,14 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */ _cups_strcasecmp(job->dest, printer->name)) break; - if (con->request->request.op.operation_id == IPP_CANCEL_MY_JOBS && + if (con->request->request.op.operation_id == IPP_OP_CANCEL_MY_JOBS && _cups_strcasecmp(job->username, username)) break; } if (i < job_ids->num_values) { - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), job_ids->values[i].integer); return; } @@ -3361,7 +3361,7 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */ { job = cupsdFindJob(job_ids->values[i].integer); - cupsdSetJobState(job, IPP_JOB_CANCELED, purge, + cupsdSetJobState(job, IPP_JSTATE_CANCELED, purge, purge == CUPSD_JOB_PURGE ? "Job purged by user." : "Job canceled by user."); } @@ -3385,7 +3385,7 @@ cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */ } } - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; cupsdCheckJobs(); } @@ -3412,7 +3412,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ cupsd_jobaction_t purge; /* Purge the job? */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_job(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_job(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -3428,7 +3428,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "job-id", IPP_TAG_INTEGER)) == NULL) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Got a printer-uri attribute but no job-id.")); return; } @@ -3445,7 +3445,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -3457,7 +3457,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); job; job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) - if (job->state_value <= IPP_JOB_PROCESSING && + if (job->state_value <= IPP_JSTATE_PROCESSING && !_cups_strcasecmp(job->dest, printer->name)) break; @@ -3472,7 +3472,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); job; job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) - if (job->state_value == IPP_JOB_STOPPED && + if (job->state_value == IPP_JSTATE_STOPPED && !_cups_strcasecmp(job->dest, printer->name)) break; @@ -3480,7 +3480,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ jobid = job->id; else { - send_ipp_status(con, IPP_NOT_POSSIBLE, _("No active jobs on %s."), + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("No active jobs on %s."), printer->name); return; } @@ -3503,7 +3503,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ * Not a valid URI! */ - send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad job-uri \"%s\"."), uri->values[0].string.text); return; } @@ -3531,7 +3531,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ * Nope - return a "not found" error... */ - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), jobid); return; } @@ -3551,24 +3551,24 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ * we can't cancel... */ - if (job->state_value >= IPP_JOB_CANCELED && purge != CUPSD_JOB_PURGE) + if (job->state_value >= IPP_JSTATE_CANCELED && purge != CUPSD_JOB_PURGE) { switch (job->state_value) { - case IPP_JOB_CANCELED : - send_ipp_status(con, IPP_NOT_POSSIBLE, + case IPP_JSTATE_CANCELED : + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job #%d is already canceled - can\'t cancel."), jobid); break; - case IPP_JOB_ABORTED : - send_ipp_status(con, IPP_NOT_POSSIBLE, + case IPP_JSTATE_ABORTED : + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job #%d is already aborted - can\'t cancel."), jobid); break; default : - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job #%d is already completed - can\'t cancel."), jobid); break; @@ -3581,7 +3581,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ * Cancel the job and return... */ - cupsdSetJobState(job, IPP_JOB_CANCELED, purge, + cupsdSetJobState(job, IPP_JSTATE_CANCELED, purge, purge == CUPSD_JOB_PURGE ? "Job purged by \"%s\"" : "Job canceled by \"%s\"", username); @@ -3594,7 +3594,7 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Canceled by \"%s\".", jobid, username); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -3613,7 +3613,7 @@ cancel_subscription( cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_subscription(con=%p[%d], sub_id=%d)", - con, con->number, sub_id); + (void *)con, con->number, sub_id); /* * Is the subscription ID valid? @@ -3625,7 +3625,7 @@ cancel_subscription( * Bad subscription ID... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Subscription #%d does not exist."), sub_id); return; } @@ -3648,7 +3648,7 @@ cancel_subscription( cupsdDeleteSubscription(sub, 1); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -3719,7 +3719,7 @@ check_quotas(cupsd_client_t *con, /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "check_quotas(%p[%d], %p[%s])", - con, con->number, p, p->name); + (void *)con, con->number, (void *)p, p->name); /* * Figure out who is printing... @@ -3941,7 +3941,7 @@ close_job(cupsd_client_t *con, /* I - Client connection */ username[256]; /* User name */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "close_job(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "close_job(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -3954,7 +3954,7 @@ close_job(cupsd_client_t *con, /* I - Client connection */ * job-uri is not supported by Close-Job! */ - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Close-Job doesn't support the job-uri attribute.")); return; } @@ -3966,7 +3966,7 @@ close_job(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "job-id", IPP_TAG_INTEGER)) == NULL) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Got a printer-uri attribute but no job-id.")); return; } @@ -3977,7 +3977,7 @@ close_job(cupsd_client_t *con, /* I - Client connection */ * Nope - return a "not found" error... */ - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), attr->values[0].integer); return; } @@ -4000,12 +4000,12 @@ close_job(cupsd_client_t *con, /* I - Client connection */ if (cupsdTimeoutJob(job)) return; - if (job->state_value == IPP_JOB_STOPPED) + if (job->state_value == IPP_JSTATE_STOPPED) { - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; + job->state->values[0].integer = IPP_JSTATE_PENDING; + job->state_value = IPP_JSTATE_PENDING; } - else if (job->state_value == IPP_JOB_HELD) + else if (job->state_value == IPP_JSTATE_HELD) { if ((attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_KEYWORD)) == NULL) @@ -4013,8 +4013,8 @@ close_job(cupsd_client_t *con, /* I - Client connection */ if (!attr || !strcmp(attr->values[0].string.text, "no-hold")) { - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; + job->state->values[0].integer = IPP_JSTATE_PENDING; + job->state_value = IPP_JSTATE_PENDING; } } @@ -4034,7 +4034,7 @@ close_job(cupsd_client_t *con, /* I - Client connection */ ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state", (int)job->state_value); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; /* * Start the job if necessary... @@ -4061,7 +4061,7 @@ copy_attrs(ipp_t *to, /* I - Destination request */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "copy_attrs(to=%p, from=%p, ra=%p, group=%x, quickcopy=%d)", - to, from, ra, group, quickcopy); + (void *)to, (void *)from, (void *)ra, group, quickcopy); if (!to || !from) return; @@ -4145,7 +4145,7 @@ copy_banner(cupsd_client_t *con, /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "copy_banner(con=%p[%d], job=%p[%d], name=\"%s\")", - con, con ? con->number : -1, job, job->id, + (void *)con, con ? con->number : -1, (void *)job, job->id, name ? name : "(null)"); /* @@ -4490,7 +4490,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */ /* cupsProtocol attribute */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "copy_model(con=%p, from=\"%s\", to=\"%s\")", con, from, to); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "copy_model(con=%p, from=\"%s\", to=\"%s\")", (void *)con, from, to); /* * Run cups-driverd to get the PPD file... @@ -4521,7 +4521,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */ if (!cupsdStartProcess(buffer, argv, envp, -1, temppipe[1], CGIPipes[1], -1, -1, 0, DefaultProfile, NULL, &temppid)) { - send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to run cups-driverd: %s"), strerror(errno)); + send_ipp_status(con, IPP_STATUS_ERROR_INTERNAL, _("Unable to run cups-driverd: %s"), strerror(errno)); close(tempfd); unlink(tempfile); @@ -4601,7 +4601,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */ */ cupsdLogMessage(CUPSD_LOG_ERROR, "copy_model: empty PPD file"); - send_ipp_status(con, IPP_INTERNAL_ERROR, _("cups-driverd failed to get PPD file - see error_log for details.")); + send_ipp_status(con, IPP_STATUS_ERROR_INTERNAL, _("cups-driverd failed to get PPD file - see error_log for details.")); unlink(tempfile); return (-1); } @@ -4695,7 +4695,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */ if ((dst = cupsdCreateConfFile(to, ConfigFilePerm)) == NULL) { - send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to save PPD file: %s"), strerror(errno)); + send_ipp_status(con, IPP_STATUS_ERROR_INTERNAL, _("Unable to save PPD file: %s"), strerror(errno)); cupsFreeOptions(num_defaults, defaults); cupsFileClose(src); unlink(tempfile); @@ -4751,7 +4751,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */ if (cupsdCloseCreatedConfFile(dst, to)) { - send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to commit PPD file: %s"), strerror(errno)); + send_ipp_status(con, IPP_STATUS_ERROR_INTERNAL, _("Unable to commit PPD file: %s"), strerror(errno)); return (-1); } else @@ -4800,7 +4800,7 @@ copy_job_attrs(cupsd_client_t *con, /* I - Client connection */ "job-more-info", NULL, job_uri); } - if (job->state_value > IPP_JOB_PROCESSING && + if (job->state_value > IPP_JSTATE_PROCESSING && (!exclude || !cupsArrayFind(exclude, "job-preserved")) && (!ra || cupsArrayFind(ra, "job-preserved"))) ippAddBoolean(con->response, IPP_TAG_JOB, "job-preserved", @@ -5077,7 +5077,7 @@ copy_printer_attrs( copy_attrs(con->response, printer->attrs, ra, IPP_TAG_ZERO, 0, NULL); if (printer->ppd_attrs) copy_attrs(con->response, printer->ppd_attrs, ra, IPP_TAG_ZERO, 0, NULL); - copy_attrs(con->response, CommonData, ra, IPP_TAG_ZERO, IPP_TAG_COPY, NULL); + copy_attrs(con->response, CommonData, ra, IPP_TAG_ZERO, IPP_TAG_CUPS_CONST, NULL); cupsRWUnlock(&printer->lock); } @@ -5104,7 +5104,7 @@ copy_subscription_attrs( cupsdLogMessage(CUPSD_LOG_DEBUG2, "copy_subscription_attrs(con=%p, sub=%p, ra=%p, exclude=%p)", - con, sub, ra, exclude); + (void *)con, (void *)sub, (void *)ra, (void *)exclude); /* * Copy the subscription attributes to the response using the @@ -5218,7 +5218,7 @@ create_job(cupsd_client_t *con, /* I - Client connection */ }; - cupsdLogMessage(CUPSD_LOG_DEBUG2, "create_job(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "create_job(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -5231,7 +5231,7 @@ create_job(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -5248,7 +5248,7 @@ create_job(cupsd_client_t *con, /* I - Client connection */ { if (StrictConformance) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("The '%s' operation attribute cannot be supplied in a " "Create-Job request."), forbidden_attrs[i]); return; @@ -5793,7 +5793,7 @@ create_subscriptions( * Is the destination valid? */ - cupsdLogMessage(CUPSD_LOG_DEBUG, "create_subscriptions(con=%p(%d), uri=\"%s\")", con, con->number, uri->values[0].string.text); + cupsdLogMessage(CUPSD_LOG_DEBUG, "create_subscriptions(con=%p(%d), uri=\"%s\")", (void *)con, con->number, uri->values[0].string.text); httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, sizeof(scheme), userpass, sizeof(userpass), host, @@ -5820,7 +5820,7 @@ create_subscriptions( * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -5861,7 +5861,7 @@ create_subscriptions( if (!attr) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("No subscription attributes in request.")); return; } @@ -5870,7 +5870,7 @@ create_subscriptions( * Process the subscription attributes in the request... */ - con->response->request.status.status_code = IPP_BAD_REQUEST; + con->response->request.status.status_code = IPP_STATUS_ERROR_BAD_REQUEST; while (attr) { @@ -5919,10 +5919,10 @@ create_subscriptions( host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Bad notify-recipient-uri \"%s\"."), recipient); ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, - "notify-status-code", IPP_URI_SCHEME); + "notify-status-code", IPP_STATUS_ERROR_URI_SCHEME); return; } @@ -5930,21 +5930,21 @@ create_subscriptions( scheme); if (access(notifier, X_OK) || !strcmp(scheme, ".") || !strcmp(scheme, "..")) { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("notify-recipient-uri URI \"%s\" uses unknown " "scheme."), recipient); ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, - "notify-status-code", IPP_URI_SCHEME); + "notify-status-code", IPP_STATUS_ERROR_URI_SCHEME); return; } if (!strcmp(scheme, "rss") && !check_rss_recipient(recipient)) { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("notify-recipient-uri URI \"%s\" is already used."), recipient); ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, - "notify-status-code", IPP_ATTRIBUTES); + "notify-status-code", IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES); return; } } @@ -5955,10 +5955,10 @@ create_subscriptions( if (strcmp(pullmethod, "ippget")) { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Bad notify-pull-method \"%s\"."), pullmethod); ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, - "notify-status-code", IPP_ATTRIBUTES); + "notify-status-code", IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES); return; } } @@ -5967,7 +5967,7 @@ create_subscriptions( strcmp(attr->values[0].string.text, "us-ascii") && strcmp(attr->values[0].string.text, "utf-8")) { - send_ipp_status(con, IPP_CHARSET, + send_ipp_status(con, IPP_STATUS_ERROR_CHARSET, _("Character set \"%s\" not supported."), attr->values[0].string.text); return; @@ -5976,7 +5976,7 @@ create_subscriptions( (attr->value_tag != IPP_TAG_LANGUAGE || strcmp(attr->values[0].string.text, DefaultLanguage))) { - send_ipp_status(con, IPP_CHARSET, + send_ipp_status(con, IPP_STATUS_ERROR_CHARSET, _("Language \"%s\" not supported."), attr->values[0].string.text); return; @@ -5986,7 +5986,7 @@ create_subscriptions( { if (attr->num_values > 1 || attr->values[0].unknown.length > 63) { - send_ipp_status(con, IPP_REQUEST_VALUE, + send_ipp_status(con, IPP_STATUS_ERROR_REQUEST_VALUE, _("The notify-user-data value is too large " "(%d > 63 octets)."), attr->values[0].unknown.length); @@ -6031,7 +6031,7 @@ create_subscriptions( if (httpSeparateURI(HTTP_URI_CODING_ALL, temp, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) { - send_ipp_status(con, IPP_NOT_POSSIBLE, _("Bad notify-user-data \"%s\"."), temp); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Bad notify-user-data \"%s\"."), temp); ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, "notify-status-code", IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES); return; } @@ -6054,7 +6054,7 @@ create_subscriptions( mask = CUPSD_EVENT_PRINTER_STATE_CHANGED; else { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("notify-events not specified.")); return; } @@ -6073,7 +6073,7 @@ create_subscriptions( { if ((job = cupsdFindJob(jobid)) == NULL) { - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), jobid); return; } @@ -6083,7 +6083,7 @@ create_subscriptions( if ((sub = cupsdAddSubscription(mask, printer, job, recipient, 0)) == NULL) { - send_ipp_status(con, IPP_TOO_MANY_SUBSCRIPTIONS, + send_ipp_status(con, IPP_STATUS_ERROR_TOO_MANY_SUBSCRIPTIONS, _("There are too many subscriptions.")); return; } @@ -6116,7 +6116,7 @@ create_subscriptions( ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-subscription-id", sub->id); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; if (attr) attr = attr->next; @@ -6141,7 +6141,7 @@ delete_printer(cupsd_client_t *con, /* I - Client connection */ int temporary; /* Temporary queue? */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "delete_printer(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "delete_printer(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -6154,7 +6154,7 @@ delete_printer(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -6239,7 +6239,7 @@ delete_printer(cupsd_client_t *con, /* I - Client connection */ * Return with no errors... */ - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -6254,7 +6254,7 @@ get_default(cupsd_client_t *con) /* I - Client connection */ cups_array_t *ra; /* Requested attributes array */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_default(%p[%d])", con, con->number); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_default(%p[%d])", (void *)con, con->number); /* * Check policy... @@ -6274,10 +6274,10 @@ get_default(cupsd_client_t *con) /* I - Client connection */ cupsArrayDelete(ra); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } else - send_ipp_status(con, IPP_NOT_FOUND, _("No default printer.")); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("No default printer.")); } @@ -6304,7 +6304,7 @@ get_devices(cupsd_client_t *con) /* I - Client connection */ /* String for included schemes */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_devices(%p[%d])", con, con->number); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_devices(%p[%d])", (void *)con, con->number); /* * Check policy... @@ -6369,7 +6369,7 @@ get_devices(cupsd_client_t *con) /* I - Client connection */ * went wrong... */ - send_ipp_status(con, IPP_INTERNAL_ERROR, + send_ipp_status(con, IPP_STATUS_ERROR_INTERNAL, _("cups-deviced failed to execute.")); } } @@ -6397,7 +6397,7 @@ get_document(cupsd_client_t *con, /* I - Client connection */ format[1024]; /* Format for document */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_document(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_document(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -6413,7 +6413,7 @@ get_document(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "job-id", IPP_TAG_INTEGER)) == NULL) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Got a printer-uri attribute but no job-id.")); return; } @@ -6436,7 +6436,7 @@ get_document(cupsd_client_t *con, /* I - Client connection */ * Not a valid URI! */ - send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad job-uri \"%s\"."), uri->values[0].string.text); return; } @@ -6454,7 +6454,7 @@ get_document(cupsd_client_t *con, /* I - Client connection */ * Nope - return a "not found" error... */ - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), jobid); return; } @@ -6476,7 +6476,7 @@ get_document(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "document-number", IPP_TAG_INTEGER)) == NULL) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Missing document-number attribute.")); return; } @@ -6484,7 +6484,7 @@ get_document(cupsd_client_t *con, /* I - Client connection */ if ((docnum = attr->values[0].integer) < 1 || docnum > job->num_files || attr->num_values > 1) { - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Document #%d does not exist in job #%d."), docnum, jobid); return; @@ -6497,7 +6497,7 @@ get_document(cupsd_client_t *con, /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open document %d in job %d - %s", docnum, jobid, strerror(errno)); - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Unable to open document #%d in job #%d."), docnum, jobid); return; @@ -6544,7 +6544,7 @@ get_job_attrs(cupsd_client_t *con, /* I - Client connection */ *exclude; /* Private attributes array */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_job_attrs(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_job_attrs(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -6560,7 +6560,7 @@ get_job_attrs(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "job-id", IPP_TAG_INTEGER)) == NULL) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Got a printer-uri attribute but no job-id.")); return; } @@ -6583,7 +6583,7 @@ get_job_attrs(cupsd_client_t *con, /* I - Client connection */ * Not a valid URI! */ - send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad job-uri \"%s\"."), uri->values[0].string.text); return; } @@ -6601,7 +6601,7 @@ get_job_attrs(cupsd_client_t *con, /* I - Client connection */ * Nope - return a "not found" error... */ - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), jobid); return; } @@ -6635,7 +6635,7 @@ get_job_attrs(cupsd_client_t *con, /* I - Client connection */ copy_job_attrs(con, job, ra, exclude); cupsArrayDelete(ra); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -6675,7 +6675,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */ cupsd_policy_t *policy; /* Current policy */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs(%p[%d], %s)", con, con->number, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -6684,7 +6684,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */ if (strcmp(uri->name, "printer-uri")) { - send_ipp_status(con, IPP_BAD_REQUEST, _("No printer-uri in request.")); + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("No printer-uri in request.")); return; } @@ -6720,7 +6720,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -6754,7 +6754,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "which-jobs", IPP_TAG_KEYWORD)) != NULL && job_ids) { - send_ipp_status(con, IPP_CONFLICT, + send_ipp_status(con, IPP_STATUS_ERROR_CONFLICTING, _("The %s attribute cannot be provided with job-ids."), "which-jobs"); return; @@ -6762,63 +6762,63 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */ else if (!attr || !strcmp(attr->values[0].string.text, "not-completed")) { job_comparison = -1; - job_state = IPP_JOB_STOPPED; + job_state = IPP_JSTATE_STOPPED; list = ActiveJobs; } else if (!strcmp(attr->values[0].string.text, "completed")) { job_comparison = 1; - job_state = IPP_JOB_CANCELED; + job_state = IPP_JSTATE_CANCELED; list = cupsdGetCompletedJobs(printer); delete_list = 1; } else if (!strcmp(attr->values[0].string.text, "aborted")) { job_comparison = 0; - job_state = IPP_JOB_ABORTED; + job_state = IPP_JSTATE_ABORTED; list = cupsdGetCompletedJobs(printer); delete_list = 1; } else if (!strcmp(attr->values[0].string.text, "all")) { job_comparison = 1; - job_state = IPP_JOB_PENDING; + job_state = IPP_JSTATE_PENDING; list = Jobs; } else if (!strcmp(attr->values[0].string.text, "canceled")) { job_comparison = 0; - job_state = IPP_JOB_CANCELED; + job_state = IPP_JSTATE_CANCELED; list = cupsdGetCompletedJobs(printer); delete_list = 1; } else if (!strcmp(attr->values[0].string.text, "pending")) { job_comparison = 0; - job_state = IPP_JOB_PENDING; + job_state = IPP_JSTATE_PENDING; list = ActiveJobs; } else if (!strcmp(attr->values[0].string.text, "pending-held")) { job_comparison = 0; - job_state = IPP_JOB_HELD; + job_state = IPP_JSTATE_HELD; list = ActiveJobs; } else if (!strcmp(attr->values[0].string.text, "processing")) { job_comparison = 0; - job_state = IPP_JOB_PROCESSING; + job_state = IPP_JSTATE_PROCESSING; list = PrintingJobs; } else if (!strcmp(attr->values[0].string.text, "processing-stopped")) { job_comparison = 0; - job_state = IPP_JOB_STOPPED; + job_state = IPP_JSTATE_STOPPED; list = ActiveJobs; } else { - send_ipp_status(con, IPP_ATTRIBUTES, + send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("The which-jobs value \"%s\" is not supported."), attr->values[0].string.text); ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD, @@ -6834,7 +6834,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */ { if (job_ids) { - send_ipp_status(con, IPP_CONFLICT, + send_ipp_status(con, IPP_STATUS_ERROR_CONFLICTING, _("The %s attribute cannot be provided with job-ids."), "limit"); return; @@ -6847,7 +6847,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */ { if (job_ids) { - send_ipp_status(con, IPP_CONFLICT, + send_ipp_status(con, IPP_STATUS_ERROR_CONFLICTING, _("The %s attribute cannot be provided with job-ids."), "first-index"); return; @@ -6859,7 +6859,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */ { if (job_ids) { - send_ipp_status(con, IPP_CONFLICT, + send_ipp_status(con, IPP_STATUS_ERROR_CONFLICTING, _("The %s attribute cannot be provided with job-ids."), "first-job-id"); return; @@ -6874,7 +6874,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "my-jobs", IPP_TAG_BOOLEAN)) != NULL && job_ids) { - send_ipp_status(con, IPP_CONFLICT, + send_ipp_status(con, IPP_STATUS_ERROR_CONFLICTING, _("The %s attribute cannot be provided with job-ids."), "my-jobs"); return; @@ -6938,7 +6938,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */ if (i < job_ids->num_values) { - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), job_ids->values[i].integer); cupsArrayDelete(ra); return; @@ -6986,7 +6986,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: job->id=%d, dest=\"%s\", username=\"%s\", " "state_value=%d, attrs=%p", job->id, job->dest, - job->username, job->state_value, job->attrs); + job->username, job->state_value, (void *)job->attrs); if (!job->dest || !job->username) cupsdLoadJob(job); @@ -7044,7 +7044,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */ if (delete_list) cupsArrayDelete(list); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -7065,7 +7065,7 @@ get_notifications(cupsd_client_t *con) /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_notifications(con=%p[%d])", - con, con->number); + (void *)con, con->number); /* * Get subscription attributes... @@ -7078,7 +7078,7 @@ get_notifications(cupsd_client_t *con) /* I - Client connection */ if (!ids) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Missing notify-subscription-ids attribute.")); return; } @@ -7095,7 +7095,7 @@ get_notifications(cupsd_client_t *con) /* I - Client connection */ * Bad subscription ID... */ - send_ipp_status(con, IPP_NOT_FOUND, _("Subscription #%d does not exist."), + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Subscription #%d does not exist."), ids->values[i].integer); return; } @@ -7116,12 +7116,12 @@ get_notifications(cupsd_client_t *con) /* I - Client connection */ * Check the subscription type and update the interval accordingly. */ - if (sub->job && sub->job->state_value == IPP_JOB_PROCESSING && + if (sub->job && sub->job->state_value == IPP_JSTATE_PROCESSING && interval > 10) interval = 10; - else if (sub->job && sub->job->state_value >= IPP_JOB_STOPPED) + else if (sub->job && sub->job->state_value >= IPP_JSTATE_STOPPED) interval = 0; - else if (sub->dest && sub->dest->state == IPP_PRINTER_PROCESSING && + else if (sub->dest && sub->dest->state == IPP_PSTATE_PROCESSING && interval > 30) interval = 30; } @@ -7142,7 +7142,7 @@ get_notifications(cupsd_client_t *con) /* I - Client connection */ */ con->response->request.status.status_code = - interval ? IPP_OK : IPP_OK_EVENTS_COMPLETE; + interval ? IPP_STATUS_OK : IPP_STATUS_OK_EVENTS_COMPLETE; for (i = 0; i < ids->num_values; i ++) { @@ -7198,8 +7198,8 @@ get_ppd(cupsd_client_t *con, /* I - Client connection */ cups_ptype_t dtype; /* Destination type */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppd(%p[%d], %p[%s=%s])", con, - con->number, uri, uri->name, uri->values[0].string.text); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppd(%p[%d], %p[%s=%s])", (void *)con, + con->number, (void *)uri, uri->name, uri->values[0].string.text); if (!strcmp(ippGetName(uri), "ppd-name")) { @@ -7257,7 +7257,7 @@ get_ppd(cupsd_client_t *con, /* I - Client connection */ * went wrong... */ - send_ipp_status(con, IPP_INTERNAL_ERROR, _("cups-driverd failed to execute.")); + send_ipp_status(con, IPP_STATUS_ERROR_INTERNAL, _("cups-driverd failed to execute.")); } } else if (!strcmp(ippGetName(uri), "printer-uri") && cupsdValidateDest(ippGetString(uri, 0, NULL), &dtype, &dest)) @@ -7371,7 +7371,7 @@ get_ppds(cupsd_client_t *con) /* I - Client connection */ /* String for included schemes */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppds(%p[%d])", con, con->number); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppds(%p[%d])", (void *)con, con->number); /* * Check policy... @@ -7495,7 +7495,7 @@ get_ppds(cupsd_client_t *con) /* I - Client connection */ * went wrong... */ - send_ipp_status(con, IPP_INTERNAL_ERROR, + send_ipp_status(con, IPP_STATUS_ERROR_INTERNAL, _("cups-driverd failed to execute.")); } } @@ -7515,7 +7515,7 @@ get_printer_attrs(cupsd_client_t *con, /* I - Client connection */ cups_array_t *ra; /* Requested attributes array */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printer_attrs(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printer_attrs(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -7528,7 +7528,7 @@ get_printer_attrs(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -7553,7 +7553,7 @@ get_printer_attrs(cupsd_client_t *con, /* I - Client connection */ cupsArrayDelete(ra); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -7571,7 +7571,7 @@ get_printer_supported( cupsd_printer_t *printer; /* Printer/class */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printer_supported(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printer_supported(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -7584,7 +7584,7 @@ get_printer_supported( * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -7614,7 +7614,7 @@ get_printer_supported( ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE, "printer-organizational-unit", 0); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -7641,7 +7641,7 @@ get_printers(cupsd_client_t *con, /* I - Client connection */ int local; /* Local connection? */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printers(%p[%d], %x)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printers(%p[%d], %x)", (void *)con, con->number, type); /* @@ -7660,7 +7660,7 @@ get_printers(cupsd_client_t *con, /* I - Client connection */ if (!Printers || !cupsArrayCount(Printers)) { - send_ipp_status(con, IPP_NOT_FOUND, _("No destinations added.")); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("No destinations added.")); return; } @@ -7780,7 +7780,7 @@ get_printers(cupsd_client_t *con, /* I - Client connection */ cupsArrayDelete(ra); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -7802,7 +7802,7 @@ get_subscription_attrs( cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_subscription_attrs(con=%p[%d], sub_id=%d)", - con, con->number, sub_id); + (void *)con, con->number, sub_id); /* * Expire subscriptions as needed... @@ -7820,7 +7820,7 @@ get_subscription_attrs( * Bad subscription ID... */ - send_ipp_status(con, IPP_NOT_FOUND, _("Subscription #%d does not exist."), + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Subscription #%d does not exist."), sub_id); return; } @@ -7853,7 +7853,7 @@ get_subscription_attrs( cupsArrayDelete(ra); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -7889,7 +7889,7 @@ get_subscriptions(cupsd_client_t *con, /* I - Client connection */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_subscriptions(con=%p[%d], uri=%s)", - con, con->number, uri->values[0].string.text); + (void *)con, con->number, uri->values[0].string.text); /* * Is the destination valid? @@ -7915,7 +7915,7 @@ get_subscriptions(cupsd_client_t *con, /* I - Client connection */ if (!job) { - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), job_id); return; } @@ -7926,7 +7926,7 @@ get_subscriptions(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -7937,7 +7937,7 @@ get_subscriptions(cupsd_client_t *con, /* I - Client connection */ if (!job) { - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), attr->values[0].integer); return; } @@ -8012,9 +8012,9 @@ get_subscriptions(cupsd_client_t *con, /* I - Client connection */ cupsArrayDelete(ra); if (count) - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; else - send_ipp_status(con, IPP_NOT_FOUND, _("No subscriptions found.")); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("No subscriptions found.")); } @@ -8057,7 +8057,7 @@ hold_job(cupsd_client_t *con, /* I - Client connection */ cupsd_job_t *job; /* Job information */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_job(%p[%d], %s)", con, con->number, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_job(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -8073,7 +8073,7 @@ hold_job(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "job-id", IPP_TAG_INTEGER)) == NULL) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Got a printer-uri attribute but no job-id.")); return; } @@ -8096,7 +8096,7 @@ hold_job(cupsd_client_t *con, /* I - Client connection */ * Not a valid URI! */ - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad job-uri \"%s\"."), uri->values[0].string.text); return; @@ -8115,7 +8115,7 @@ hold_job(cupsd_client_t *con, /* I - Client connection */ * Nope - return a "not found" error... */ - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), jobid); return; } @@ -8134,13 +8134,13 @@ hold_job(cupsd_client_t *con, /* I - Client connection */ * See if the job is in a state that allows holding... */ - if (job->state_value > IPP_JOB_STOPPED) + if (job->state_value > IPP_JSTATE_STOPPED) { /* * Return a "not-possible" error... */ - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job #%d is finished and cannot be altered."), job->id); return; @@ -8168,10 +8168,10 @@ hold_job(cupsd_client_t *con, /* I - Client connection */ when = "indefinite"; cupsdSetJobHoldUntil(job, when, 1); - cupsdSetJobState(job, IPP_JOB_HELD, CUPSD_JOB_DEFAULT, "Job held by \"%s\".", + cupsdSetJobState(job, IPP_JSTATE_HELD, CUPSD_JOB_DEFAULT, "Job held by \"%s\".", username); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -8188,7 +8188,7 @@ hold_new_jobs(cupsd_client_t *con, /* I - Connection */ cupsd_printer_t *printer; /* Printer data */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_new_jobs(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_new_jobs(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -8201,7 +8201,7 @@ hold_new_jobs(cupsd_client_t *con, /* I - Connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -8237,7 +8237,7 @@ hold_new_jobs(cupsd_client_t *con, /* I - Connection */ * Everything was ok, so return OK status... */ - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -8265,7 +8265,7 @@ move_job(cupsd_client_t *con, /* I - Client connection */ *dprinter; /* Destination printer */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "move_job(%p[%d], %s)", con, con->number, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "move_job(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -8279,7 +8279,7 @@ move_job(cupsd_client_t *con, /* I - Client connection */ * Need job-printer-uri... */ - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("job-printer-uri attribute missing.")); return; } @@ -8290,7 +8290,7 @@ move_job(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -8323,7 +8323,7 @@ move_job(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -8342,7 +8342,7 @@ move_job(cupsd_client_t *con, /* I - Client connection */ * Nope - return a "not found" error... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), attr->values[0].integer); return; } @@ -8369,7 +8369,7 @@ move_job(cupsd_client_t *con, /* I - Client connection */ * Not a valid URI! */ - send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad job-uri \"%s\"."), uri->values[0].string.text); return; } @@ -8386,7 +8386,7 @@ move_job(cupsd_client_t *con, /* I - Client connection */ * Nope - return a "not found" error... */ - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), jobid); return; } else @@ -8421,13 +8421,13 @@ move_job(cupsd_client_t *con, /* I - Client connection */ * See if the job has been completed... */ - if (job->state_value > IPP_JOB_STOPPED) + if (job->state_value > IPP_JSTATE_STOPPED) { /* * Return a "not-possible" error... */ - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job #%d is finished and cannot be altered."), job->id); return; @@ -8466,7 +8466,7 @@ move_job(cupsd_client_t *con, /* I - Client connection */ */ if (_cups_strcasecmp(job->dest, src) || - job->state_value > IPP_JOB_STOPPED) + job->state_value > IPP_JSTATE_STOPPED) continue; /* @@ -8494,7 +8494,7 @@ move_job(cupsd_client_t *con, /* I - Client connection */ * Return with "everything is OK" status... */ - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -8594,7 +8594,7 @@ print_job(cupsd_client_t *con, /* I - Client connection */ int compression; /* Document compression */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "print_job(%p[%d], %s)", con, con->number, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "print_job(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -8613,7 +8613,7 @@ print_job(cupsd_client_t *con, /* I - Client connection */ #endif /* HAVE_LIBZ */ ) { - send_ipp_status(con, IPP_ATTRIBUTES, + send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Unsupported compression \"%s\"."), attr->values[0].string.text); ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD, @@ -8633,7 +8633,7 @@ print_job(cupsd_client_t *con, /* I - Client connection */ if (!con->filename) { - send_ipp_status(con, IPP_BAD_REQUEST, _("No file in print request.")); + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("No file in print request.")); return; } @@ -8647,7 +8647,7 @@ print_job(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -8670,7 +8670,7 @@ print_job(cupsd_client_t *con, /* I - Client connection */ if (sscanf(format->values[0].string.text, "%15[^/]/%255[^;]", super, type) != 2) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad document-format \"%s\"."), format->values[0].string.text); return; @@ -8688,7 +8688,7 @@ print_job(cupsd_client_t *con, /* I - Client connection */ if (sscanf(default_format, "%15[^/]/%255[^;]", super, type) != 2) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad document-format \"%s\"."), default_format); return; @@ -8753,7 +8753,7 @@ print_job(cupsd_client_t *con, /* I - Client connection */ } else if (!filetype) { - send_ipp_status(con, IPP_DOCUMENT_FORMAT, + send_ipp_status(con, IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED, _("Unsupported document-format \"%s\"."), format ? format->values[0].string.text : "application/octet-stream"); @@ -8811,7 +8811,7 @@ print_job(cupsd_client_t *con, /* I - Client connection */ { cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to rename job document file \"%s\": %s", filename, strerror(errno)); - send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to rename job document file.")); + send_ipp_status(con, IPP_STATUS_ERROR_INTERNAL, _("Unable to rename job document file.")); return; } @@ -9045,7 +9045,7 @@ reject_jobs(cupsd_client_t *con, /* I - Client connection */ ipp_attribute_t *attr; /* printer-state-message text */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "reject_jobs(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "reject_jobs(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -9058,7 +9058,7 @@ reject_jobs(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -9109,7 +9109,7 @@ reject_jobs(cupsd_client_t *con, /* I - Client connection */ * Everything was ok, so return OK status... */ - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -9127,7 +9127,7 @@ release_held_new_jobs( cupsd_printer_t *printer; /* Printer data */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "release_held_new_jobs(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "release_held_new_jobs(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -9140,7 +9140,7 @@ release_held_new_jobs( * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -9178,7 +9178,7 @@ release_held_new_jobs( * Everything was ok, so return OK status... */ - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -9200,7 +9200,7 @@ release_job(cupsd_client_t *con, /* I - Client connection */ cupsd_job_t *job; /* Job information */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "release_job(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "release_job(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -9216,7 +9216,7 @@ release_job(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "job-id", IPP_TAG_INTEGER)) == NULL) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Got a printer-uri attribute but no job-id.")); return; } @@ -9239,7 +9239,7 @@ release_job(cupsd_client_t *con, /* I - Client connection */ * Not a valid URI! */ - send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad job-uri \"%s\"."), uri->values[0].string.text); return; } @@ -9257,7 +9257,7 @@ release_job(cupsd_client_t *con, /* I - Client connection */ * Nope - return a "not found" error... */ - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), jobid); return; } @@ -9265,13 +9265,13 @@ release_job(cupsd_client_t *con, /* I - Client connection */ * See if job is "held"... */ - if (job->state_value != IPP_JOB_HELD) + if (job->state_value != IPP_JSTATE_HELD) { /* * Nope - return a "not possible" error... */ - send_ipp_status(con, IPP_NOT_POSSIBLE, _("Job #%d is not held."), jobid); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job #%d is not held."), jobid); return; } @@ -9315,7 +9315,7 @@ release_job(cupsd_client_t *con, /* I - Client connection */ cupsdLogJob(job, CUPSD_LOG_INFO, "Released by \"%s\".", username); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; cupsdCheckJobs(); } @@ -9337,7 +9337,7 @@ renew_subscription( cupsdLogMessage(CUPSD_LOG_DEBUG2, "renew_subscription(con=%p[%d], sub_id=%d)", - con, con->number, sub_id); + (void *)con, con->number, sub_id); /* * Is the subscription ID valid? @@ -9349,7 +9349,7 @@ renew_subscription( * Bad subscription ID... */ - send_ipp_status(con, IPP_NOT_FOUND, _("Subscription #%d does not exist."), + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Subscription #%d does not exist."), sub_id); return; } @@ -9360,7 +9360,7 @@ renew_subscription( * Job subscriptions cannot be renewed... */ - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job subscriptions cannot be renewed.")); return; } @@ -9399,7 +9399,7 @@ renew_subscription( cupsdMarkDirty(CUPSD_DIRTY_SUBSCRIPTIONS); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, "notify-lease-duration", sub->lease); @@ -9424,7 +9424,7 @@ restart_job(cupsd_client_t *con, /* I - Client connection */ int port; /* Port portion of URI */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "restart_job(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "restart_job(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -9440,7 +9440,7 @@ restart_job(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "job-id", IPP_TAG_INTEGER)) == NULL) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Got a printer-uri attribute but no job-id.")); return; } @@ -9463,7 +9463,7 @@ restart_job(cupsd_client_t *con, /* I - Client connection */ * Not a valid URI! */ - send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad job-uri \"%s\"."), uri->values[0].string.text); return; } @@ -9481,7 +9481,7 @@ restart_job(cupsd_client_t *con, /* I - Client connection */ * Nope - return a "not found" error... */ - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), jobid); return; } @@ -9489,13 +9489,13 @@ restart_job(cupsd_client_t *con, /* I - Client connection */ * See if job is in any of the "completed" states... */ - if (job->state_value <= IPP_JOB_PROCESSING) + if (job->state_value <= IPP_JSTATE_PROCESSING) { /* * Nope - return a "not possible" error... */ - send_ipp_status(con, IPP_NOT_POSSIBLE, _("Job #%d is not complete."), + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job #%d is not complete."), jobid); return; } @@ -9512,7 +9512,7 @@ restart_job(cupsd_client_t *con, /* I - Client connection */ * Nope - return a "not possible" error... */ - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job #%d cannot be restarted - no files."), jobid); return; } @@ -9546,7 +9546,7 @@ restart_job(cupsd_client_t *con, /* I - Client connection */ "Restarted by \"%s\" with job-hold-until=%s.", username, attr->values[0].string.text); cupsdSetJobHoldUntil(job, attr->values[0].string.text, 1); - cupsdSetJobState(job, IPP_JOB_HELD, CUPSD_JOB_DEFAULT, + cupsdSetJobState(job, IPP_JSTATE_HELD, CUPSD_JOB_DEFAULT, "Job restarted by user with job-hold-until=%s", attr->values[0].string.text); } @@ -9562,7 +9562,7 @@ restart_job(cupsd_client_t *con, /* I - Client connection */ cupsdLogJob(job, CUPSD_LOG_INFO, "Restarted by \"%s\".", username); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -9775,7 +9775,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */ int start_job; /* Start the job? */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "send_document(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "send_document(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -9791,7 +9791,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "job-id", IPP_TAG_INTEGER)) == NULL) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Got a printer-uri attribute but no job-id.")); return; } @@ -9814,7 +9814,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */ * Not a valid URI! */ - send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad job-uri \"%s\"."), uri->values[0].string.text); return; } @@ -9832,7 +9832,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */ * Nope - return a "not found" error... */ - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), jobid); return; } @@ -9865,7 +9865,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */ #endif /* HAVE_LIBZ */ ) { - send_ipp_status(con, IPP_ATTRIBUTES, _("Unsupported compression \"%s\"."), + send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Unsupported compression \"%s\"."), attr->values[0].string.text); ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD, "compression", NULL, attr->values[0].string.text); @@ -9885,7 +9885,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "last-document", IPP_TAG_BOOLEAN)) == NULL) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Missing last-document attribute in request.")); return; } @@ -9900,7 +9900,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */ if (job->num_files > 0 && attr->values[0].boolean) goto last_document; - send_ipp_status(con, IPP_BAD_REQUEST, _("No file in print request.")); + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("No file in print request.")); return; } @@ -9920,7 +9920,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */ if (sscanf(format->values[0].string.text, "%15[^/]/%255[^;]", super, type) != 2) { - send_ipp_status(con, IPP_BAD_REQUEST, _("Bad document-format \"%s\"."), + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad document-format \"%s\"."), format->values[0].string.text); return; } @@ -9937,7 +9937,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */ if (sscanf(default_format, "%15[^/]/%255[^;]", super, type) != 2) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad document-format-default \"%s\"."), default_format); return; } @@ -10004,7 +10004,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */ } else if (!filetype) { - send_ipp_status(con, IPP_DOCUMENT_FORMAT, + send_ipp_status(con, IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED, _("Unsupported document-format \"%s/%s\"."), super, type); cupsdLogMessage(CUPSD_LOG_INFO, "Hint: Do you have the raw file printing rules enabled?"); @@ -10021,7 +10021,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */ snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, filetype->type); - send_ipp_status(con, IPP_DOCUMENT_FORMAT, + send_ipp_status(con, IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED, _("Unsupported document-format \"%s\"."), mimetype); ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE, @@ -10057,7 +10057,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */ { cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to rename job document file \"%s\": %s", filename, strerror(errno)); - send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to rename job document file.")); + send_ipp_status(con, IPP_STATUS_ERROR_INTERNAL, _("Unable to rename job document file.")); return; } @@ -10083,14 +10083,14 @@ send_document(cupsd_client_t *con, /* I - Client connection */ if (cupsdTimeoutJob(job)) return; - if (job->state_value == IPP_JOB_STOPPED) + if (job->state_value == IPP_JSTATE_STOPPED) { - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; + job->state->values[0].integer = IPP_JSTATE_PENDING; + job->state_value = IPP_JSTATE_PENDING; ippSetString(job->attrs, &job->reasons, 0, "none"); } - else if (job->state_value == IPP_JOB_HELD) + else if (job->state_value == IPP_JSTATE_HELD) { if ((attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_KEYWORD)) == NULL) @@ -10098,8 +10098,8 @@ send_document(cupsd_client_t *con, /* I - Client connection */ if (!attr || !strcmp(attr->values[0].string.text, "no-hold")) { - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; + job->state->values[0].integer = IPP_JSTATE_PENDING; + job->state_value = IPP_JSTATE_PENDING; ippSetString(job->attrs, &job->reasons, 0, "none"); } @@ -10120,8 +10120,8 @@ send_document(cupsd_client_t *con, /* I - Client connection */ if (!attr || !strcmp(attr->values[0].string.text, "no-hold")) { - job->state->values[0].integer = IPP_JOB_HELD; - job->state_value = IPP_JOB_HELD; + job->state->values[0].integer = IPP_JSTATE_HELD; + job->state_value = IPP_JSTATE_HELD; job->hold_until = time(NULL) + MultipleOperationTimeout; ippSetString(job->attrs, &job->reasons, 0, "job-incoming"); @@ -10145,7 +10145,7 @@ send_document(cupsd_client_t *con, /* I - Client connection */ ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state", (int)job->state_value); ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, job->reasons->values[0].string.text); - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; /* * Start the job if necessary... @@ -10193,9 +10193,9 @@ send_http_error( printer->num_auth_info_required > 0 && !strcmp(printer->auth_info_required[0], "negotiate") && con->request && - (con->request->request.op.operation_id == IPP_PRINT_JOB || - con->request->request.op.operation_id == IPP_CREATE_JOB || - con->request->request.op.operation_id == CUPS_AUTHENTICATE_JOB)) + (con->request->request.op.operation_id == IPP_OP_PRINT_JOB || + con->request->request.op.operation_id == IPP_OP_CREATE_JOB || + con->request->request.op.operation_id == IPP_OP_CUPS_AUTHENTICATE_JOB)) { /* * Creating and authenticating jobs requires Kerberos... @@ -10223,7 +10223,7 @@ send_http_error( auth = cupsdFindPolicyOp(printer->op_policy_ptr, con->request ? con->request->request.op.operation_id : - IPP_PRINT_JOB); + IPP_OP_PRINT_JOB); if (auth) { @@ -10300,7 +10300,7 @@ set_default(cupsd_client_t *con, /* I - Client connection */ *oldprinter; /* Old default printer */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_default(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_default(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -10313,7 +10313,7 @@ set_default(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -10353,7 +10353,7 @@ set_default(cupsd_client_t *con, /* I - Client connection */ * Everything was ok, so return OK status... */ - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -10382,14 +10382,14 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ int check_jobs; /* Check jobs? */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_job_attrs(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_job_attrs(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* * Start with "everything is OK" status... */ - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; /* * See if we have a job URI or a printer URI... @@ -10404,7 +10404,7 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ if ((attr = ippFindAttribute(con->request, "job-id", IPP_TAG_INTEGER)) == NULL) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Got a printer-uri attribute but no job-id.")); return; } @@ -10427,7 +10427,7 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ * Not a valid URI! */ - send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad job-uri \"%s\"."), uri->values[0].string.text); return; } @@ -10445,7 +10445,7 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ * Nope - return a "not found" error... */ - send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("Job #%d does not exist."), jobid); return; } @@ -10453,13 +10453,13 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ * See if the job has been completed... */ - if (job->state_value > IPP_JOB_STOPPED) + if (job->state_value > IPP_JSTATE_STOPPED) { /* * Return a "not-possible" error... */ - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job #%d is finished and cannot be altered."), jobid); return; } @@ -10518,7 +10518,7 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ * Read-only attrs! */ - send_ipp_status(con, IPP_ATTRIBUTES_NOT_SETTABLE, + send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_NOT_SETTABLE, _("%s cannot be changed."), attr->name); attr2 = ippCopyAttribute(con->response, attr, 0); @@ -10554,7 +10554,7 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ check_jobs = 1; } else - cupsdSetJobState(job, IPP_JOB_HELD, CUPSD_JOB_DEFAULT, "Job held by \"%s\".", username); + cupsdSetJobState(job, IPP_JSTATE_HELD, CUPSD_JOB_DEFAULT, "Job held by \"%s\".", username); event |= CUPSD_EVENT_JOB_CONFIG_CHANGED | CUPSD_EVENT_JOB_STATE; } @@ -10566,18 +10566,18 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ if (attr->value_tag != IPP_TAG_INTEGER) { - send_ipp_status(con, IPP_REQUEST_VALUE, _("Bad job-priority value.")); + send_ipp_status(con, IPP_STATUS_ERROR_REQUEST_VALUE, _("Bad job-priority value.")); attr2 = ippCopyAttribute(con->response, attr, 0); ippSetGroupTag(con->response, &attr2, IPP_TAG_UNSUPPORTED_GROUP); } - else if (job->state_value >= IPP_JOB_PROCESSING) + else if (job->state_value >= IPP_JSTATE_PROCESSING) { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job is completed and cannot be changed.")); return; } - else if (con->response->request.status.status_code == IPP_OK) + else if (con->response->request.status.status_code == IPP_STATUS_OK) { cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-priority to %d", attr->values[0].integer); @@ -10596,7 +10596,7 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ if (attr->value_tag != IPP_TAG_ENUM) { - send_ipp_status(con, IPP_REQUEST_VALUE, _("Bad job-state value.")); + send_ipp_status(con, IPP_STATUS_ERROR_REQUEST_VALUE, _("Bad job-state value.")); attr2 = ippCopyAttribute(con->response, attr, 0); ippSetGroupTag(con->response, &attr2, IPP_TAG_UNSUPPORTED_GROUP); @@ -10605,15 +10605,15 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ { switch (attr->values[0].integer) { - case IPP_JOB_PENDING : - case IPP_JOB_HELD : - if (job->state_value > IPP_JOB_HELD) + case IPP_JSTATE_PENDING : + case IPP_JSTATE_HELD : + if (job->state_value > IPP_JSTATE_HELD) { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job state cannot be changed.")); return; } - else if (con->response->request.status.status_code == IPP_OK) + else if (con->response->request.status.status_code == IPP_STATUS_OK) { cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-state to %d", attr->values[0].integer); @@ -10622,26 +10622,26 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ } break; - case IPP_JOB_PROCESSING : - case IPP_JOB_STOPPED : + case IPP_JSTATE_PROCESSING : + case IPP_JSTATE_STOPPED : if (job->state_value != (ipp_jstate_t)attr->values[0].integer) { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job state cannot be changed.")); return; } break; - case IPP_JOB_CANCELED : - case IPP_JOB_ABORTED : - case IPP_JOB_COMPLETED : - if (job->state_value > IPP_JOB_PROCESSING) + case IPP_JSTATE_CANCELED : + case IPP_JSTATE_ABORTED : + case IPP_JSTATE_COMPLETED : + if (job->state_value > IPP_JSTATE_PROCESSING) { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Job state cannot be changed.")); return; } - else if (con->response->request.status.status_code == IPP_OK) + else if (con->response->request.status.status_code == IPP_STATUS_OK) { cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-state to %d", attr->values[0].integer); @@ -10654,7 +10654,7 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ } } } - else if (con->response->request.status.status_code != IPP_OK) + else if (con->response->request.status.status_code != IPP_STATUS_OK) continue; else if ((attr2 = ippFindAttribute(job->attrs, attr->name, IPP_TAG_ZERO)) != NULL) @@ -10731,7 +10731,7 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ if (event & CUPSD_EVENT_JOB_STATE) cupsdAddEvent(CUPSD_EVENT_JOB_STATE, cupsdFindDest(job->dest), job, - job->state_value == IPP_JOB_HELD ? + job->state_value == IPP_JSTATE_HELD ? "Job held by user." : "Job restarted by user."); if (event & CUPSD_EVENT_JOB_CONFIG_CHANGED) @@ -10762,7 +10762,7 @@ set_printer_attrs(cupsd_client_t *con, /* I - Client connection */ int changed = 0; /* Was anything changed? */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_printer_attrs(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_printer_attrs(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -10775,7 +10775,7 @@ set_printer_attrs(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -10846,7 +10846,7 @@ set_printer_attrs(cupsd_client_t *con, /* I - Client connection */ printer->name, get_username(con)); } - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -10980,7 +10980,7 @@ set_printer_defaults( } else { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Unknown printer-op-policy \"%s\"."), attr->values[0].string.text); return (0); @@ -10997,7 +10997,7 @@ set_printer_defaults( strcmp(attr->values[0].string.text, "retry-job") && strcmp(attr->values[0].string.text, "stop-printer")))) { - send_ipp_status(con, IPP_NOT_POSSIBLE, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Unknown printer-error-policy \"%s\"."), attr->values[0].string.text); return (0); @@ -11108,7 +11108,7 @@ start_printer(cupsd_client_t *con, /* I - Client connection */ cupsd_printer_t *printer; /* Printer data */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_printer(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_printer(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -11121,7 +11121,7 @@ start_printer(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -11159,12 +11159,12 @@ start_printer(cupsd_client_t *con, /* I - Client connection */ if ((i = check_quotas(con, printer)) < 0) { - send_ipp_status(con, IPP_NOT_POSSIBLE, _("Quota limit reached.")); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_POSSIBLE, _("Quota limit reached.")); return; } else if (i == 0) { - send_ipp_status(con, IPP_NOT_AUTHORIZED, _("Not allowed to print.")); + send_ipp_status(con, IPP_STATUS_ERROR_NOT_AUTHORIZED, _("Not allowed to print.")); return; } @@ -11172,7 +11172,7 @@ start_printer(cupsd_client_t *con, /* I - Client connection */ * Everything was ok, so return OK status... */ - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -11190,7 +11190,7 @@ stop_printer(cupsd_client_t *con, /* I - Client connection */ ipp_attribute_t *attr; /* printer-state-message attribute */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "stop_printer(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "stop_printer(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -11203,7 +11203,7 @@ stop_printer(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -11244,7 +11244,7 @@ stop_printer(cupsd_client_t *con, /* I - Client connection */ * Everything was ok, so return OK status... */ - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -11430,7 +11430,7 @@ validate_job(cupsd_client_t *con, /* I - Client connection */ cupsd_printer_t *printer; /* Printer */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "validate_job(%p[%d], %s)", con, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "validate_job(%p[%d], %s)", (void *)con, con->number, uri->values[0].string.text); /* @@ -11447,7 +11447,7 @@ validate_job(cupsd_client_t *con, /* I - Client connection */ #endif /* HAVE_LIBZ */ ) { - send_ipp_status(con, IPP_ATTRIBUTES, + send_ipp_status(con, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, _("Unsupported 'compression' value \"%s\"."), attr->values[0].string.text); ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD, @@ -11466,7 +11466,7 @@ validate_job(cupsd_client_t *con, /* I - Client connection */ if (sscanf(format->values[0].string.text, "%15[^/]/%255[^;]", super, type) != 2) { - send_ipp_status(con, IPP_BAD_REQUEST, + send_ipp_status(con, IPP_STATUS_ERROR_BAD_REQUEST, _("Bad 'document-format' value \"%s\"."), format->values[0].string.text); return; @@ -11479,7 +11479,7 @@ validate_job(cupsd_client_t *con, /* I - Client connection */ { cupsdLogMessage(CUPSD_LOG_INFO, "Hint: Do you have the raw file printing rules enabled?"); - send_ipp_status(con, IPP_DOCUMENT_FORMAT, + send_ipp_status(con, IPP_STATUS_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED, _("Unsupported 'document-format' value \"%s\"."), format->values[0].string.text); ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE, @@ -11537,7 +11537,7 @@ validate_job(cupsd_client_t *con, /* I - Client connection */ * Bad URI... */ - send_ipp_status(con, IPP_NOT_FOUND, + send_ipp_status(con, IPP_STATUS_ERROR_NOT_FOUND, _("The printer or class does not exist.")); return; } @@ -11575,7 +11575,7 @@ validate_job(cupsd_client_t *con, /* I - Client connection */ * Everything was ok, so return OK status... */ - con->response->request.status.status_code = IPP_OK; + con->response->request.status.status_code = IPP_STATUS_OK; } @@ -11619,7 +11619,7 @@ validate_user(cupsd_job_t *job, /* I - Job */ cupsd_printer_t *printer; /* Printer for job */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "validate_user(job=%d, con=%d, owner=\"%s\", username=%p, userlen=" CUPS_LLFMT ")", job->id, con ? con->number : 0, owner ? owner : "(null)", username, CUPS_LLCAST userlen); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "validate_user(job=%d, con=%d, owner=\"%s\", username=%p, userlen=" CUPS_LLFMT ")", job->id, con ? con->number : 0, owner ? owner : "(null)", (void *)username, CUPS_LLCAST userlen); /* * Validate input... diff --git a/scheduler/job.c b/scheduler/job.c index 928f26e6b3..278bfb5012 100644 --- a/scheduler/job.c +++ b/scheduler/job.c @@ -47,7 +47,7 @@ * * We unload the job attributes when they are not needed to reduce overall * memory consumption. We don't unload jobs where job->state_value < - * IPP_JOB_STOPPED, job->printer != NULL, or job->access_time is recent. + * IPP_JSTATE_STOPPED, job->printer != NULL, or job->access_time is recent. * * STARTING OF JOBS (start_job) * @@ -202,10 +202,10 @@ cupsdCancelJobs(const char *dest, /* I - Destination to cancel */ */ if (purge) - cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_PURGE, + cupsdSetJobState(job, IPP_JSTATE_CANCELED, CUPSD_JOB_PURGE, "Job purged by user."); - else if (job->state_value < IPP_JOB_CANCELED) - cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_DEFAULT, + else if (job->state_value < IPP_JSTATE_CANCELED) + cupsdSetJobState(job, IPP_JSTATE_CANCELED, CUPSD_JOB_DEFAULT, "Job canceled by user."); } } @@ -240,7 +240,7 @@ cupsdCheckJobs(void) "cupsdCheckJobs: Job %d - dest=\"%s\", printer=%p, " "state=%d, cancel_time=%ld, hold_until=%ld, kill_time=%ld, " "pending_cost=%d, pending_timeout=%ld", job->id, job->dest, - job->printer, job->state_value, (long)job->cancel_time, + (void *)job->printer, job->state_value, (long)job->cancel_time, (long)job->hold_until, (long)job->kill_time, job->pending_cost, (long)job->pending_timeout); @@ -269,9 +269,9 @@ cupsdCheckJobs(void) cancel_after = attr ? ippGetInteger(attr, 0) : MaxJobTime; if (job->completed) - cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_FORCE, "Marking stuck job as completed after %d seconds.", cancel_after); + cupsdSetJobState(job, IPP_JSTATE_CANCELED, CUPSD_JOB_FORCE, "Marking stuck job as completed after %d seconds.", cancel_after); else - cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_DEFAULT, "Canceling stuck job after %d seconds.", cancel_after); + cupsdSetJobState(job, IPP_JSTATE_CANCELED, CUPSD_JOB_DEFAULT, "Canceling stuck job after %d seconds.", cancel_after); continue; } @@ -279,7 +279,7 @@ cupsdCheckJobs(void) * Start held jobs if they are ready... */ - if (job->state_value == IPP_JOB_HELD && + if (job->state_value == IPP_JSTATE_HELD && job->hold_until && job->hold_until < curtime) { @@ -297,7 +297,7 @@ cupsdCheckJobs(void) con; con = (cupsd_client_t *)cupsArrayNext(Clients)) if (con->request && - con->request->request.op.operation_id == IPP_SEND_DOCUMENT) + con->request->request.op.operation_id == IPP_OP_SEND_DOCUMENT) break; if (con) @@ -306,11 +306,11 @@ cupsdCheckJobs(void) if (cupsdTimeoutJob(job)) continue; - cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, "Job submission timed out."); + cupsdSetJobState(job, IPP_JSTATE_PENDING, CUPSD_JOB_DEFAULT, "Job submission timed out."); cupsdLogJob(job, CUPSD_LOG_ERROR, "Job submission timed out."); } else - cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, "Job hold expired."); + cupsdSetJobState(job, IPP_JSTATE_PENDING, CUPSD_JOB_DEFAULT, "Job hold expired."); } /* @@ -344,7 +344,7 @@ cupsdCheckJobs(void) * Start pending jobs if the destination is available... */ - if (job->state_value == IPP_JOB_PENDING && !NeedReload && + if (job->state_value == IPP_JSTATE_PENDING && !NeedReload && (!Sleeping || ACPower) && !DoingShutdown && !job->printer) { printer = cupsdFindDest(job->dest); @@ -358,7 +358,7 @@ cupsdCheckJobs(void) pclass = printer; - if (pclass->state == IPP_PRINTER_STOPPED) + if (pclass->state == IPP_PSTATE_STOPPED) printer = NULL; else if (pclass->type & CUPS_PRINTER_REMOTE) break; @@ -373,7 +373,7 @@ cupsdCheckJobs(void) * cancel the job... */ - cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE, + cupsdSetJobState(job, IPP_JSTATE_ABORTED, CUPSD_JOB_PURGE, "Job aborted because the destination printer/class " "has gone away."); } @@ -400,7 +400,7 @@ cupsdCheckJobs(void) cupsdMarkDirty(CUPSD_DIRTY_JOBS); } - if (!printer->job && printer->state == IPP_PRINTER_IDLE) + if (!printer->job && printer->state == IPP_PSTATE_IDLE) { /* * Start the job... @@ -451,7 +451,7 @@ cupsdCleanJobs(void) if (job->num_files > 0 && ((job->file_time && job->file_time < JobHistoryUpdate) || !JobHistoryUpdate)) JobHistoryUpdate = job->file_time; - if (job->state_value >= IPP_JOB_CANCELED && !job->printer) + if (job->state_value >= IPP_JSTATE_CANCELED && !job->printer) { /* * Expire old jobs (or job files)... @@ -496,7 +496,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */ ipp_attribute_t *attr; /* Current attribute */ const char *ptr, /* Pointer into value */ *abort_message; /* Abort message */ - ipp_jstate_t abort_state = IPP_JOB_STOPPED; + ipp_jstate_t abort_state = IPP_JSTATE_STOPPED; /* New job state on abort */ struct stat backinfo; /* Backend file information */ int backroot; /* Run backend as root? */ @@ -544,7 +544,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdContinueJob(job=%p(%d)): current_file=%d, num_files=%d", - job, job->id, job->current_file, job->num_files); + (void *)job, job->id, job->current_file, job->num_files); /* * Figure out what filters are required to convert from @@ -614,7 +614,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */ job->current_file); abort_message = "Aborting job because it cannot be printed."; - abort_state = IPP_JOB_ABORTED; + abort_state = IPP_JSTATE_ABORTED; ippSetString(job->attrs, &job->reasons, 0, "document-unprintable-error"); @@ -817,7 +817,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */ cupsArrayCount(filters), MAX_FILTERS); abort_message = "Aborting job because it needs too many filters to print."; - abort_state = IPP_JOB_ABORTED; + abort_state = IPP_JSTATE_ABORTED; ippSetString(job->attrs, &job->reasons, 0, "document-unprintable-error"); @@ -1355,7 +1355,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */ */ cupsdSetJobState(job, abort_state, CUPSD_JOB_DEFAULT, "%s", abort_message); - cupsdSetPrinterState(job->printer, IPP_PRINTER_IDLE, 0); + cupsdSetPrinterState(job->printer, IPP_PSTATE_IDLE, 0); update_job_attrs(job, 0); if (job->history) @@ -1480,7 +1480,7 @@ cupsdGetCompletedJobs( for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); job; job = (cupsd_job_t *)cupsArrayNext(Jobs)) - if ((!p || !_cups_strcasecmp(p->name, job->dest)) && job->state_value >= IPP_JOB_STOPPED && job->completed_time) + if ((!p || !_cups_strcasecmp(p->name, job->dest)) && job->state_value >= IPP_JSTATE_STOPPED && job->completed_time) cupsArrayAdd(list, job); return (list); @@ -1657,7 +1657,7 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ if (job->attrs) { - if (job->state_value > IPP_JOB_STOPPED) + if (job->state_value > IPP_JSTATE_STOPPED) job->access_time = time(NULL); return (1); @@ -1679,7 +1679,7 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ if ((fp = cupsdOpenConfFile(jobfile)) == NULL) goto error; - if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, job->attrs) != IPP_DATA) + if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, job->attrs) != IPP_STATE_DATA) { cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to read job control file \"%s\".", jobfile); @@ -1715,7 +1715,7 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ if ((attr = ippFindAttribute(job->attrs, "time-at-creation", IPP_TAG_INTEGER)) != NULL) job->creation_time = attr->values[0].integer; - if (job->state_value >= IPP_JOB_CANCELED && (attr = ippFindAttribute(job->attrs, "time-at-completed", IPP_TAG_INTEGER)) != NULL) + if (job->state_value >= IPP_JSTATE_CANCELED && (attr = ippFindAttribute(job->attrs, "time-at-completed", IPP_TAG_INTEGER)) != NULL) { job->completed_time = attr->values[0].integer; @@ -1784,14 +1784,14 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ switch (job->state_value) { default : - case IPP_JOB_PENDING : - if (destptr->state == IPP_PRINTER_STOPPED) + case IPP_JSTATE_PENDING : + if (destptr->state == IPP_PSTATE_STOPPED) reason = "printer-stopped"; else reason = "none"; break; - case IPP_JOB_HELD : + case IPP_JSTATE_HELD : if ((attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_ZERO)) != NULL && (attr->value_tag == IPP_TAG_NAME || @@ -1803,23 +1803,23 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ reason = "job-incoming"; break; - case IPP_JOB_PROCESSING : + case IPP_JSTATE_PROCESSING : reason = "job-printing"; break; - case IPP_JOB_STOPPED : + case IPP_JSTATE_STOPPED : reason = "job-stopped"; break; - case IPP_JOB_CANCELED : + case IPP_JSTATE_CANCELED : reason = "job-canceled-by-user"; break; - case IPP_JOB_ABORTED : + case IPP_JSTATE_ABORTED : reason = "aborted-by-system"; break; - case IPP_JOB_COMPLETED : + case IPP_JSTATE_COMPLETED : reason = "job-completed-successfully"; break; } @@ -1827,9 +1827,9 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ job->reasons = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-state-reasons", NULL, reason); } - else if (job->state_value == IPP_JOB_PENDING) + else if (job->state_value == IPP_JSTATE_PENDING) { - if (destptr->state == IPP_PRINTER_STOPPED) + if (destptr->state == IPP_PSTATE_STOPPED) ippSetString(job->attrs, &job->reasons, 0, "printer-stopped"); else ippSetString(job->attrs, &job->reasons, 0, "none"); @@ -1881,7 +1881,7 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ * Set the job hold-until time and state... */ - if (job->state_value == IPP_JOB_HELD) + if (job->state_value == IPP_JSTATE_HELD) { if ((attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_KEYWORD)) == NULL) @@ -1891,14 +1891,14 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ cupsdSetJobHoldUntil(job, attr->values[0].string.text, CUPSD_JOB_DEFAULT); else { - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; + job->state->values[0].integer = IPP_JSTATE_PENDING; + job->state_value = IPP_JSTATE_PENDING; } } - else if (job->state_value == IPP_JOB_PROCESSING) + else if (job->state_value == IPP_JSTATE_PROCESSING) { - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; + job->state->values[0].integer = IPP_JSTATE_PENDING; + job->state_value = IPP_JSTATE_PENDING; } if ((attr = ippFindAttribute(job->attrs, "job-k-octets", IPP_TAG_INTEGER)) != NULL) @@ -1984,7 +1984,7 @@ cupsdLoadJob(cupsd_job_t *job) /* I - Job */ * Load authentication information as needed... */ - if (job->state_value < IPP_JOB_STOPPED) + if (job->state_value < IPP_JSTATE_STOPPED) { snprintf(jobfile, sizeof(jobfile), "%s/a%05d", RequestRoot, job->id); @@ -2086,7 +2086,7 @@ cupsdMoveJob(cupsd_job_t *job, /* I - Job */ * Don't move completed jobs... */ - if (job->state_value > IPP_JOB_STOPPED) + if (job->state_value > IPP_JSTATE_STOPPED) return; /* @@ -2104,8 +2104,8 @@ cupsdMoveJob(cupsd_job_t *job, /* I - Job */ * Change the destination information... */ - if (job->state_value > IPP_JOB_HELD) - cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, + if (job->state_value > IPP_JSTATE_HELD) + cupsdSetJobState(job, IPP_JSTATE_PENDING, CUPSD_JOB_DEFAULT, "Stopping job prior to move."); cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, oldp, job, @@ -2135,10 +2135,10 @@ cupsdMoveJob(cupsd_job_t *job, /* I - Job */ void cupsdReleaseJob(cupsd_job_t *job) /* I - Job */ { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReleaseJob(job=%p(%d))", job, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReleaseJob(job=%p(%d))", (void *)job, job->id); - if (job->state_value == IPP_JOB_HELD) + if (job->state_value == IPP_JSTATE_HELD) { /* * Add trailing banner as needed... @@ -2147,7 +2147,7 @@ cupsdReleaseJob(cupsd_job_t *job) /* I - Job */ if (job->pending_timeout) cupsdTimeoutJob(job); - cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, + cupsdSetJobState(job, IPP_JSTATE_PENDING, CUPSD_JOB_DEFAULT, "Job released by user."); } } @@ -2160,11 +2160,11 @@ cupsdReleaseJob(cupsd_job_t *job) /* I - Job */ void cupsdRestartJob(cupsd_job_t *job) /* I - Job */ { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdRestartJob(job=%p(%d))", job, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdRestartJob(job=%p(%d))", (void *)job, job->id); - if (job->state_value == IPP_JOB_STOPPED || job->num_files) - cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, + if (job->state_value == IPP_JSTATE_STOPPED || job->num_files) + cupsdSetJobState(job, IPP_JSTATE_PENDING, CUPSD_JOB_DEFAULT, "Job restarted by user."); } @@ -2250,7 +2250,7 @@ cupsdSaveJob(cupsd_job_t *job) /* I - Job */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSaveJob(job=%p(%d)): job->attrs=%p", - job, job->id, job->attrs); + (void *)job, job->id, (void *)job->attrs); if (job->printer && job->printer->temporary) { @@ -2269,10 +2269,10 @@ cupsdSaveJob(cupsd_job_t *job) /* I - Job */ fchown(cupsFileNumber(fp), RunUser, Group); - job->attrs->state = IPP_IDLE; + job->attrs->state = IPP_STATE_IDLE; if (ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL, - job->attrs) != IPP_DATA) + job->attrs) != IPP_STATE_DATA) { cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to write job control file."); cupsFileClose(fp); @@ -2311,7 +2311,7 @@ cupsdSetJobHoldUntil(cupsd_job_t *job, /* I - Job */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetJobHoldUntil(job=%p(%d), when=\"%s\", update=%d)", - job, job->id, when, update); + (void *)job, job->id, when, update); if (update) { @@ -2490,7 +2490,7 @@ cupsdSetJobPriority( * Don't change completed jobs... */ - if (job->state_value >= IPP_JOB_PROCESSING) + if (job->state_value >= IPP_JSTATE_PROCESSING) return; /* @@ -2535,7 +2535,7 @@ cupsdSetJobState( cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetJobState(job=%p(%d), state=%d, newstate=%d, " - "action=%d, message=\"%s\")", job, job->id, job->state_value, + "action=%d, message=\"%s\")", (void *)job, job->id, job->state_value, newstate, action, message ? message : "(null)"); @@ -2559,7 +2559,7 @@ cupsdSetJobState( * Stop any processes that are working on the current job... */ - if (oldstate == IPP_JOB_PROCESSING) + if (oldstate == IPP_JSTATE_PROCESSING) stop_job(job, action); /* @@ -2573,7 +2573,7 @@ cupsdSetJobState( switch (newstate) { - case IPP_JOB_PENDING : + case IPP_JSTATE_PENDING : /* * Update job-hold-until as needed... */ @@ -2591,9 +2591,9 @@ cupsdSetJobState( default : break; - case IPP_JOB_ABORTED : - case IPP_JOB_CANCELED : - case IPP_JOB_COMPLETED : + case IPP_JSTATE_ABORTED : + case IPP_JSTATE_CANCELED : + case IPP_JSTATE_COMPLETED : set_time(job, "time-at-completed"); ippSetString(job->attrs, &job->reasons, 0, "processing-to-stop-point"); break; @@ -2612,12 +2612,12 @@ cupsdSetJobState( vsnprintf(buffer, sizeof(buffer), message, ap); va_end(ap); - if (newstate > IPP_JOB_STOPPED) + if (newstate > IPP_JSTATE_STOPPED) cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, "%s", buffer); else cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "%s", buffer); - if (newstate == IPP_JOB_STOPPED || newstate == IPP_JOB_ABORTED) + if (newstate == IPP_JSTATE_STOPPED || newstate == IPP_JSTATE_ABORTED) cupsdLogJob(job, CUPSD_LOG_ERROR, "%s", buffer); else cupsdLogJob(job, CUPSD_LOG_INFO, "%s", buffer); @@ -2629,7 +2629,7 @@ cupsdSetJobState( switch (newstate) { - case IPP_JOB_PROCESSING : + case IPP_JSTATE_PROCESSING : /* * Add the job to the "printing" list... */ @@ -2643,9 +2643,9 @@ cupsdSetJobState( set_time(job, "time-at-processing"); - case IPP_JOB_PENDING : - case IPP_JOB_HELD : - case IPP_JOB_STOPPED : + case IPP_JSTATE_PENDING : + case IPP_JSTATE_HELD : + case IPP_JSTATE_STOPPED : /* * Make sure the job is in the active list... */ @@ -2661,10 +2661,10 @@ cupsdSetJobState( cupsdMarkDirty(CUPSD_DIRTY_JOBS); break; - case IPP_JOB_ABORTED : - case IPP_JOB_CANCELED : - case IPP_JOB_COMPLETED : - if (newstate == IPP_JOB_CANCELED) + case IPP_JSTATE_ABORTED : + case IPP_JSTATE_CANCELED : + case IPP_JSTATE_COMPLETED : + if (newstate == IPP_JSTATE_CANCELED) { /* * Remove the job from the active list if there are no processes still @@ -2780,14 +2780,14 @@ cupsdStopAllJobs( { if (job->completed) { - cupsdSetJobState(job, IPP_JOB_COMPLETED, CUPSD_JOB_FORCE, NULL); + cupsdSetJobState(job, IPP_JSTATE_COMPLETED, CUPSD_JOB_FORCE, NULL); } else { if (kill_delay) job->kill_time = time(NULL) + kill_delay; - cupsdSetJobState(job, IPP_JOB_PENDING, action, NULL); + cupsdSetJobState(job, IPP_JSTATE_PENDING, action, NULL); } } } @@ -2809,7 +2809,7 @@ cupsdUnloadCompletedJobs(void) for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); job; job = (cupsd_job_t *)cupsArrayNext(Jobs)) - if (job->attrs && job->state_value >= IPP_JOB_STOPPED && !job->printer && + if (job->attrs && job->state_value >= IPP_JSTATE_STOPPED && !job->printer && job->access_time < expire) { if (job->dirty) @@ -2840,7 +2840,7 @@ cupsdUpdateJobs(void) job; job = (cupsd_job_t *)cupsArrayNext(Jobs)) { - if (job->state_value >= IPP_JOB_CANCELED && + if (job->state_value >= IPP_JSTATE_CANCELED && (attr = ippFindAttribute(job->attrs, "time-at-completed", IPP_TAG_INTEGER)) != NULL) { @@ -3008,8 +3008,8 @@ dump_job_history(cupsd_job_t *job) /* I - Job */ { snprintf(temp, sizeof(temp), "[Job %d] printer-state=%d(%s)", job->id, printer->state, - printer->state == IPP_PRINTER_IDLE ? "idle" : - printer->state == IPP_PRINTER_PROCESSING ? "processing" : + printer->state == IPP_PSTATE_IDLE ? "idle" : + printer->state == IPP_PSTATE_PROCESSING ? "processing" : "stopped"); cupsdWriteErrorLog(CUPSD_LOG_DEBUG, temp); @@ -3089,7 +3089,7 @@ finalize_job(cupsd_job_t *job, /* I - Job */ char scheme[255]; /* Device URI scheme */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "finalize_job(job=%p(%d))", job, job->id); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "finalize_job(job=%p(%d))", (void *)job, job->id); sscanf(job->printer->device_uri, "%254[^:]", scheme); /* @@ -3156,25 +3156,25 @@ finalize_job(cupsd_job_t *job, /* I - Job */ * Process the exit status... */ - if (job->printer->state == IPP_PRINTER_PROCESSING) - printer_state = IPP_PRINTER_IDLE; + if (job->printer->state == IPP_PSTATE_PROCESSING) + printer_state = IPP_PSTATE_IDLE; else printer_state = job->printer->state; switch (job_state = job->state_value) { - case IPP_JOB_PENDING : + case IPP_JSTATE_PENDING : message = "Job paused."; break; - case IPP_JOB_HELD : + case IPP_JSTATE_HELD : message = "Job held."; break; default : - case IPP_JOB_PROCESSING : - case IPP_JOB_COMPLETED : - job_state = IPP_JOB_COMPLETED; + case IPP_JSTATE_PROCESSING : + case IPP_JSTATE_COMPLETED : + job_state = IPP_JSTATE_COMPLETED; message = "Job completed."; if (!job->status) @@ -3182,19 +3182,19 @@ finalize_job(cupsd_job_t *job, /* I - Job */ "job-completed-successfully"); break; - case IPP_JOB_STOPPED : + case IPP_JSTATE_STOPPED : message = "Job stopped."; ippSetString(job->attrs, &job->reasons, 0, "job-stopped"); break; - case IPP_JOB_CANCELED : + case IPP_JSTATE_CANCELED : message = "Job canceled."; ippSetString(job->attrs, &job->reasons, 0, "job-canceled-by-user"); break; - case IPP_JOB_ABORTED : + case IPP_JSTATE_ABORTED : message = "Job aborted."; break; } @@ -3255,9 +3255,9 @@ finalize_job(cupsd_job_t *job, /* I - Job */ * another printer... */ - if (job_state == IPP_JOB_COMPLETED) + if (job_state == IPP_JSTATE_COMPLETED) { - job_state = IPP_JOB_PENDING; + job_state = IPP_JSTATE_PENDING; message = "Retrying job on another printer."; ippSetString(job->attrs, &job->reasons, 0, @@ -3271,9 +3271,9 @@ finalize_job(cupsd_job_t *job, /* I - Job */ * and we'll retry on the same printer... */ - if (job_state == IPP_JOB_COMPLETED) + if (job_state == IPP_JSTATE_COMPLETED) { - job_state = IPP_JOB_PENDING; + job_state = IPP_JSTATE_PENDING; message = "Retrying job on same printer."; ippSetString(job->attrs, &job->reasons, 0, "none"); @@ -3282,7 +3282,7 @@ finalize_job(cupsd_job_t *job, /* I - Job */ else if ((job->printer->type & CUPS_PRINTER_FAX) || !strcmp(job->printer->error_policy, "retry-job")) { - if (job_state == IPP_JOB_COMPLETED) + if (job_state == IPP_JSTATE_COMPLETED) { /* * The job was queued on a fax or the error policy is "retry-job" - @@ -3301,7 +3301,7 @@ finalize_job(cupsd_job_t *job, /* I - Job */ snprintf(buffer, sizeof(buffer), "Job aborted after %d unsuccessful attempts.", JobRetryLimit); - job_state = IPP_JOB_ABORTED; + job_state = IPP_JSTATE_ABORTED; message = buffer; ippSetString(job->attrs, &job->reasons, 0, "aborted-by-system"); @@ -3317,7 +3317,7 @@ finalize_job(cupsd_job_t *job, /* I - Job */ JobRetryInterval); job->hold_until = time(NULL) + JobRetryInterval; - job_state = IPP_JOB_HELD; + job_state = IPP_JSTATE_HELD; message = buffer; ippSetString(job->attrs, &job->reasons, 0, @@ -3326,9 +3326,9 @@ finalize_job(cupsd_job_t *job, /* I - Job */ } } else if (!strcmp(job->printer->error_policy, "abort-job") && - job_state == IPP_JOB_COMPLETED) + job_state == IPP_JSTATE_COMPLETED) { - job_state = IPP_JOB_ABORTED; + job_state = IPP_JSTATE_ABORTED; if (ErrorLog) { @@ -3340,10 +3340,10 @@ finalize_job(cupsd_job_t *job, /* I - Job */ ippSetString(job->attrs, &job->reasons, 0, "aborted-by-system"); } - else if (job->state_value == IPP_JOB_PROCESSING) + else if (job->state_value == IPP_JSTATE_PROCESSING) { - job_state = IPP_JOB_PENDING; - printer_state = IPP_PRINTER_STOPPED; + job_state = IPP_JSTATE_PENDING; + printer_state = IPP_PSTATE_STOPPED; if (ErrorLog) { @@ -3362,9 +3362,9 @@ finalize_job(cupsd_job_t *job, /* I - Job */ * Cancel the job... */ - if (job_state == IPP_JOB_COMPLETED) + if (job_state == IPP_JSTATE_COMPLETED) { - job_state = IPP_JOB_CANCELED; + job_state = IPP_JSTATE_CANCELED; message = "Job canceled at printer."; ippSetString(job->attrs, &job->reasons, 0, "canceled-at-device"); @@ -3372,7 +3372,7 @@ finalize_job(cupsd_job_t *job, /* I - Job */ break; case CUPS_BACKEND_HOLD : - if (job_state == IPP_JOB_COMPLETED) + if (job_state == IPP_JSTATE_COMPLETED) { /* * Hold the job... @@ -3423,7 +3423,7 @@ finalize_job(cupsd_job_t *job, /* I - Job */ message = "Job held indefinitely - account authorization failed."; } - job_state = IPP_JOB_HELD; + job_state = IPP_JSTATE_HELD; } break; @@ -3438,7 +3438,7 @@ finalize_job(cupsd_job_t *job, /* I - Job */ break; } - printer_state = IPP_PRINTER_STOPPED; + printer_state = IPP_PSTATE_STOPPED; if (ErrorLog) { @@ -3448,9 +3448,9 @@ finalize_job(cupsd_job_t *job, /* I - Job */ else message = "Printer stopped due to backend errors."; - if (job_state == IPP_JOB_COMPLETED) + if (job_state == IPP_JSTATE_COMPLETED) { - job_state = IPP_JOB_PENDING; + job_state = IPP_JSTATE_PENDING; ippSetString(job->attrs, &job->reasons, 0, "resources-are-not-ready"); } @@ -3461,11 +3461,11 @@ finalize_job(cupsd_job_t *job, /* I - Job */ * Hold the job for authentication... */ - if (job_state == IPP_JOB_COMPLETED) + if (job_state == IPP_JSTATE_COMPLETED) { cupsdSetJobHoldUntil(job, "auth-info-required", 1); - job_state = IPP_JOB_HELD; + job_state = IPP_JSTATE_HELD; message = "Job held for authentication."; if (strncmp(job->reasons->values[0].string.text, "account-", 8)) @@ -3481,7 +3481,7 @@ finalize_job(cupsd_job_t *job, /* I - Job */ break; case CUPS_BACKEND_RETRY : - if (job_state == IPP_JOB_COMPLETED) + if (job_state == IPP_JSTATE_COMPLETED) { /* * Hold the job if the number of retries is less than the @@ -3499,7 +3499,7 @@ finalize_job(cupsd_job_t *job, /* I - Job */ snprintf(buffer, sizeof(buffer), "Job aborted after %d unsuccessful attempts.", JobRetryLimit); - job_state = IPP_JOB_ABORTED; + job_state = IPP_JSTATE_ABORTED; message = buffer; ippSetString(job->attrs, &job->reasons, 0, "aborted-by-system"); @@ -3515,7 +3515,7 @@ finalize_job(cupsd_job_t *job, /* I - Job */ JobRetryInterval); job->hold_until = time(NULL) + JobRetryInterval; - job_state = IPP_JOB_HELD; + job_state = IPP_JSTATE_HELD; message = buffer; ippSetString(job->attrs, &job->reasons, 0, @@ -3529,9 +3529,9 @@ finalize_job(cupsd_job_t *job, /* I - Job */ * Mark the job as pending and retry on the same printer... */ - if (job_state == IPP_JOB_COMPLETED) + if (job_state == IPP_JSTATE_COMPLETED) { - job_state = IPP_JOB_PENDING; + job_state = IPP_JSTATE_PENDING; message = "Retrying job on same printer."; ippSetString(job->attrs, &job->reasons, 0, "none"); @@ -3545,9 +3545,9 @@ finalize_job(cupsd_job_t *job, /* I - Job */ * Filter had errors; stop job... */ - if (job_state == IPP_JOB_COMPLETED) + if (job_state == IPP_JSTATE_COMPLETED) { - job_state = IPP_JOB_STOPPED; + job_state = IPP_JSTATE_STOPPED; if (ErrorLog) { @@ -3572,14 +3572,14 @@ finalize_job(cupsd_job_t *job, /* I - Job */ cupsdSetJobState(job, job_state, CUPSD_JOB_DEFAULT, "%s", message); cupsdSetPrinterState(job->printer, printer_state, - printer_state == IPP_PRINTER_STOPPED); + printer_state == IPP_PSTATE_STOPPED); update_job_attrs(job, 0); if (job->history) { if (job->status && - (job->state_value == IPP_JOB_ABORTED || - job->state_value == IPP_JOB_STOPPED)) + (job->state_value == IPP_JSTATE_ABORTED || + job->state_value == IPP_JSTATE_STOPPED)) dump_job_history(job); else free_job_history(job); @@ -4379,9 +4379,9 @@ load_job_cache(const char *filename) /* I - job.cache filename */ { cupsArrayAdd(Jobs, job); - if (job->state_value <= IPP_JOB_STOPPED && cupsdLoadJob(job)) + if (job->state_value <= IPP_JSTATE_STOPPED && cupsdLoadJob(job)) cupsArrayAdd(ActiveJobs, job); - else if (job->state_value > IPP_JOB_STOPPED) + else if (job->state_value > IPP_JSTATE_STOPPED) { if (!job->completed_time || !job->creation_time || !job->name || !job->koctets) { @@ -4401,10 +4401,10 @@ load_job_cache(const char *filename) /* I - job.cache filename */ { job->state_value = (ipp_jstate_t)atoi(value); - if (job->state_value < IPP_JOB_PENDING) - job->state_value = IPP_JOB_PENDING; - else if (job->state_value > IPP_JOB_COMPLETED) - job->state_value = IPP_JOB_COMPLETED; + if (job->state_value < IPP_JSTATE_PENDING) + job->state_value = IPP_JSTATE_PENDING; + else if (job->state_value > IPP_JSTATE_COMPLETED) + job->state_value = IPP_JSTATE_COMPLETED; } else if (!_cups_strcasecmp(line, "Name")) { @@ -4671,7 +4671,7 @@ load_request_root(void) cupsArrayAdd(Jobs, job); - if (job->state_value <= IPP_JOB_STOPPED) + if (job->state_value <= IPP_JSTATE_STOPPED) cupsArrayAdd(ActiveJobs, job); else unload_job(job); @@ -4812,7 +4812,7 @@ start_job(cupsd_job_t *job, /* I - Job ID */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job(job=%p(%d), printer=%p(%s))", - job, job->id, printer, printer->name); + (void *)job, job->id, (void *)printer, printer->name); /* * Make sure we have some files around before we try to print... @@ -4821,7 +4821,7 @@ start_job(cupsd_job_t *job, /* I - Job ID */ if (job->num_files == 0) { ippSetString(job->attrs, &job->reasons, 0, "aborted-by-system"); - cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_DEFAULT, + cupsdSetJobState(job, IPP_JSTATE_ABORTED, CUPSD_JOB_DEFAULT, "Aborting job because it has no files."); return; } @@ -4841,8 +4841,8 @@ start_job(cupsd_job_t *job, /* I - Job ID */ ippSetString(job->attrs, &job->printer_message, 0, ""); ippSetString(job->attrs, &job->reasons, 0, "job-printing"); - cupsdSetJobState(job, IPP_JOB_PROCESSING, CUPSD_JOB_DEFAULT, NULL); - cupsdSetPrinterState(printer, IPP_PRINTER_PROCESSING, 0); + cupsdSetJobState(job, IPP_JSTATE_PROCESSING, CUPSD_JOB_DEFAULT, NULL); + cupsdSetPrinterState(printer, IPP_PSTATE_PROCESSING, 0); cupsdSetPrinterReasons(printer, "-cups-remote-pending," "cups-remote-pending-held," "cups-remote-processing," @@ -4914,7 +4914,7 @@ start_job(cupsd_job_t *job, /* I - Job ID */ cupsdLogJob(job, CUPSD_LOG_DEBUG, "Unable to create job status pipes - %s.", strerror(errno)); - cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, + cupsdSetJobState(job, IPP_JSTATE_STOPPED, CUPSD_JOB_DEFAULT, "Job stopped because the scheduler could not create the " "job status pipes."); @@ -4937,7 +4937,7 @@ start_job(cupsd_job_t *job, /* I - Job ID */ cupsdLogJob(job, CUPSD_LOG_DEBUG, "Unable to create back-channel pipes - %s.", strerror(errno)); - cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, + cupsdSetJobState(job, IPP_JSTATE_STOPPED, CUPSD_JOB_DEFAULT, "Job stopped because the scheduler could not create the " "back-channel pipes."); @@ -4966,7 +4966,7 @@ start_job(cupsd_job_t *job, /* I - Job ID */ cupsdLogJob(job, CUPSD_LOG_DEBUG, "Unable to create side-channel pipes - %s.", strerror(errno)); - cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, + cupsdSetJobState(job, IPP_JSTATE_STOPPED, CUPSD_JOB_DEFAULT, "Job stopped because the scheduler could not create the " "side-channel pipes."); @@ -5012,7 +5012,7 @@ stop_job(cupsd_job_t *job, /* I - Job */ int i; /* Looping var */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "stop_job(job=%p(%d), action=%d)", job, + cupsdLogMessage(CUPSD_LOG_DEBUG2, "stop_job(job=%p(%d), action=%d)", (void *)job, job->id, action); FilterLevel -= job->cost; @@ -5479,7 +5479,7 @@ update_job(cupsd_job_t *job) /* I - Job to check */ * Try printing another job... */ - if (printer->state != IPP_PRINTER_STOPPED) + if (printer->state != IPP_PSTATE_STOPPED) cupsdCheckJobs(); } } @@ -5522,7 +5522,7 @@ update_job_attrs(cupsd_job_t *job, /* I - Job to update */ * Copy or clear the printer-state-message value as needed... */ - if (job->state_value != IPP_JOB_PROCESSING && + if (job->state_value != IPP_JSTATE_PROCESSING && job->status_level == CUPSD_LOG_INFO) { ippSetString(job->attrs, &job->printer_message, 0, ""); diff --git a/scheduler/log.c b/scheduler/log.c index 8928df490f..80e182f535 100644 --- a/scheduler/log.c +++ b/scheduler/log.c @@ -1060,8 +1060,8 @@ cupsdLogRequest(cupsd_client_t *con, /* I - Request to log */ return (1); if (con->request && con->response && - (con->response->request.status.status_code < IPP_REDIRECTION_OTHER_SITE || - con->response->request.status.status_code == IPP_NOT_FOUND)) + (con->response->request.status.status_code < IPP_STATUS_REDIRECTION_OTHER_SITE || + con->response->request.status.status_code == IPP_STATUS_ERROR_NOT_FOUND)) { /* * Check successful requests... @@ -1141,9 +1141,9 @@ cupsdLogRequest(cupsd_client_t *con, /* I - Request to log */ }; - if ((op <= IPP_SCHEDULE_JOB_AFTER && standard_ops[op] > AccessLogLevel) || - (op >= CUPS_GET_DEFAULT && op <= CUPS_GET_PPD && - cups_ops[op - CUPS_GET_DEFAULT] > AccessLogLevel)) + if ((op <= IPP_OP_SCHEDULE_JOB_AFTER && standard_ops[op] > AccessLogLevel) || + (op >= IPP_OP_CUPS_GET_DEFAULT && op <= IPP_OP_CUPS_GET_PPD && + cups_ops[op - IPP_OP_CUPS_GET_DEFAULT] > AccessLogLevel)) return (1); } } diff --git a/scheduler/main.c b/scheduler/main.c index 12bade0f9e..b5f172b67d 100644 --- a/scheduler/main.c +++ b/scheduler/main.c @@ -1455,11 +1455,11 @@ process_children(void) job->status = -status; /* Backend failed */ if (job->current_file < job->num_files) - cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_FORCE, "Canceling multi-file job due to backend failure."); + cupsdSetJobState(job, IPP_JSTATE_ABORTED, CUPSD_JOB_FORCE, "Canceling multi-file job due to backend failure."); } } - if (job->state_value == IPP_JOB_PROCESSING && + if (job->state_value == IPP_JSTATE_PROCESSING && job->status_level > CUPSD_LOG_ERROR && (job->filters[i] || !WIFEXITED(status))) { @@ -1500,7 +1500,7 @@ process_children(void) * filters are done, and if so move to the next file. */ - if (job->state_value >= IPP_JOB_CANCELED) + if (job->state_value >= IPP_JSTATE_CANCELED) { /* * Remove the job from the active list if there are no processes still @@ -1705,13 +1705,13 @@ select_timeout(int fds) /* I - Number of descriptors returned */ why = "kill unresponsive jobs"; } - if (job->state_value == IPP_JOB_HELD && job->hold_until < timeout) + if (job->state_value == IPP_JSTATE_HELD && job->hold_until < timeout) { timeout = job->hold_until; why = "release held jobs"; } - if (job->state_value == IPP_JOB_PENDING && timeout > (now + 10)) + if (job->state_value == IPP_JSTATE_PENDING && timeout > (now + 10)) { timeout = now + 10; why = "start pending jobs"; diff --git a/scheduler/policy.c b/scheduler/policy.c index 20c91c8350..a344eb1638 100644 --- a/scheduler/policy.c +++ b/scheduler/policy.c @@ -70,7 +70,7 @@ cupsdAddPolicyOp(cupsd_policy_t *p, /* I - Policy */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddPolicyOp(p=%p, po=%p, op=%x(%s))", - p, po, op, ippOpString(op)); + (void *)p, (void *)po, op, ippOpString(op)); if (!p) return (NULL); @@ -114,7 +114,7 @@ cupsdCheckPolicy(cupsd_policy_t *p, /* I - Policy */ if (!p || !con) { - cupsdLogMessage(CUPSD_LOG_CRIT, "cupsdCheckPolicy: p=%p, con=%p.", p, con); + cupsdLogMessage(CUPSD_LOG_CRIT, "cupsdCheckPolicy: p=%p, con=%p.", (void *)p, (void *)con); return (HTTP_STATUS_SERVER_ERROR); } @@ -212,7 +212,7 @@ cupsdFindPolicyOp(cupsd_policy_t *p, /* I - Policy */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindPolicyOp(p=%p, op=%x(%s))", - p, op, ippOpString(op)); + (void *)p, op, ippOpString(op)); /* * Range check... @@ -270,13 +270,13 @@ cupsdGetPrivateAttrs( #ifdef DEBUG cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdGetPrivateAttrs(policy=%p(%s), con=%p(%d), " - "printer=%p(%s), owner=\"%s\")", policy, policy ? policy->name : "", con, - con->number, printer, printer ? printer->name : "", owner); + "printer=%p(%s), owner=\"%s\")", (void *)policy, policy ? policy->name : "", (void *)con, + con->number, (void *)printer, printer ? printer->name : "", owner); #endif /* DEBUG */ if (!policy) { - cupsdLogMessage(CUPSD_LOG_CRIT, "cupsdGetPrivateAttrs: policy=%p, con=%p, printer=%p, owner=\"%s\", DefaultPolicyPtr=%p: This should never happen, please report a bug.", policy, con, printer, owner, DefaultPolicyPtr); + cupsdLogMessage(CUPSD_LOG_CRIT, "cupsdGetPrivateAttrs: policy=%p, con=%p, printer=%p, owner=\"%s\", DefaultPolicyPtr=%p: This should never happen, please report a bug.", (void *)policy, (void *)con, (void *)printer, owner, (void *)DefaultPolicyPtr); policy = DefaultPolicyPtr; } @@ -291,9 +291,9 @@ cupsdGetPrivateAttrs( switch (con->request->request.op.operation_id) { - case IPP_GET_SUBSCRIPTIONS : - case IPP_GET_SUBSCRIPTION_ATTRIBUTES : - case IPP_GET_NOTIFICATIONS : + case IPP_OP_GET_SUBSCRIPTIONS : + case IPP_OP_GET_SUBSCRIPTION_ATTRIBUTES : + case IPP_OP_GET_NOTIFICATIONS : access_ptr = policy->sub_access; attrs_ptr = policy->sub_attrs; break; diff --git a/scheduler/printers.c b/scheduler/printers.c index 434f08c9a1..2c5fdbf5f4 100644 --- a/scheduler/printers.c +++ b/scheduler/printers.c @@ -93,7 +93,7 @@ cupsdAddPrinter(const char *name) /* I - Name of printer */ cupsdSetDeviceURI(p, "file:///dev/null"); p->config_time = time(NULL); - p->state = IPP_PRINTER_STOPPED; + p->state = IPP_PSTATE_STOPPED; p->state_time = time(NULL); p->accepting = 0; p->shared = DefaultShared; @@ -182,10 +182,10 @@ cupsdCreateCommonData(void) }; static const int orients[4] =/* orientation-requested-supported values */ { - IPP_PORTRAIT, - IPP_LANDSCAPE, - IPP_REVERSE_LANDSCAPE, - IPP_REVERSE_PORTRAIT + IPP_ORIENT_PORTRAIT, + IPP_ORIENT_LANDSCAPE, + IPP_ORIENT_REVERSE_LANDSCAPE, + IPP_ORIENT_REVERSE_PORTRAIT }; static const char * const holds[] = /* job-hold-until-supported values */ { @@ -620,7 +620,7 @@ cupsdDeletePrinter( cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDeletePrinter(p=%p(%s), update=%d)", - p, p->name, update); + (void *)p, p->name, update); /* * Save the current position in the Printers array... @@ -632,12 +632,12 @@ cupsdDeletePrinter( * Stop printing on this printer... */ - cupsdSetPrinterState(p, IPP_PRINTER_STOPPED, update); + cupsdSetPrinterState(p, IPP_PSTATE_STOPPED, update); - p->state = IPP_PRINTER_STOPPED; /* Force for browsed printers */ + p->state = IPP_PSTATE_STOPPED; /* Force for browsed printers */ if (p->job) - cupsdSetJobState(p->job, IPP_JOB_PENDING, CUPSD_JOB_FORCE, + cupsdSetJobState(p->job, IPP_JSTATE_PENDING, CUPSD_JOB_FORCE, update ? "Job stopped due to printer being deleted." : "Job stopped."); @@ -891,7 +891,7 @@ cupsdLoadAllPrinters(void) p = cupsdAddPrinter(value); p->accepting = 1; - p->state = IPP_PRINTER_IDLE; + p->state = IPP_PSTATE_IDLE; /* * Set the default printer as needed... @@ -944,7 +944,7 @@ cupsdLoadAllPrinters(void) } } - if (strncmp(p->device_uri, "file:", 5) && p->state != IPP_PRINTER_STOPPED) + if (strncmp(p->device_uri, "file:", 5) && p->state != IPP_PSTATE_STOPPED) { /* * See if the backend exists... @@ -961,7 +961,7 @@ cupsdLoadAllPrinters(void) * Backend does not exist, stop printer... */ - p->state = IPP_PRINTER_STOPPED; + p->state = IPP_PSTATE_STOPPED; snprintf(p->state_message, sizeof(p->state_message), "Backend %s does not exist!", line); } } @@ -1090,10 +1090,10 @@ cupsdLoadAllPrinters(void) */ if (value && !_cups_strcasecmp(value, "idle")) - p->state = IPP_PRINTER_IDLE; + p->state = IPP_PSTATE_IDLE; else if (value && !_cups_strcasecmp(value, "stopped")) { - p->state = IPP_PRINTER_STOPPED; + p->state = IPP_PSTATE_STOPPED; for (i = 0 ; i < p->num_reasons; i ++) if (!strcmp("paused", p->reasons[i])) @@ -1518,7 +1518,7 @@ cupsdSaveAllPrinters(void) if (printer->port_monitor) cupsFilePutConf(fp, "PortMonitor", printer->port_monitor); - if (printer->state == IPP_PRINTER_STOPPED) + if (printer->state == IPP_PSTATE_STOPPED) { cupsFilePuts(fp, "State Stopped\n"); @@ -2215,7 +2215,7 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ if ((auth = cupsdFindBest(resource, HTTP_STATE_POST)) == NULL || auth->type == CUPSD_AUTH_NONE) - auth = cupsdFindPolicyOp(p->op_policy_ptr, IPP_PRINT_JOB); + auth = cupsdFindPolicyOp(p->op_policy_ptr, IPP_OP_PRINT_JOB); if (auth) { @@ -2550,7 +2550,7 @@ cupsdSetPrinterReasons( cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdSetPrinterReasons(p=%p(%s),s=\"%s\"", p, p->name, s); + "cupsdSetPrinterReasons(p=%p(%s),s=\"%s\"", (void *)p, p->name, s); if (s[0] == '-' || s[0] == '+') { @@ -2622,8 +2622,8 @@ cupsdSetPrinterReasons( if (i < p->num_reasons) memmove(p->reasons + i, p->reasons + i + 1, (size_t)(p->num_reasons - i) * sizeof(char *)); - if (!strcmp(reason, "paused") && p->state == IPP_PRINTER_STOPPED) - cupsdSetPrinterState(p, IPP_PRINTER_IDLE, 1); + if (!strcmp(reason, "paused") && p->state == IPP_PSTATE_STOPPED) + cupsdSetPrinterState(p, IPP_PSTATE_IDLE, 1); if (!strcmp(reason, "cups-waiting-for-job-completed") && p->job) p->job->completed = 0; @@ -2658,8 +2658,8 @@ cupsdSetPrinterReasons( p->num_reasons ++; changed = 1; - if (!strcmp(reason, "paused") && p->state != IPP_PRINTER_STOPPED) - cupsdSetPrinterState(p, IPP_PRINTER_STOPPED, 1); + if (!strcmp(reason, "paused") && p->state != IPP_PSTATE_STOPPED) + cupsdSetPrinterState(p, IPP_PSTATE_STOPPED, 1); if (!strcmp(reason, "cups-waiting-for-job-completed") && p->job) p->job->completed = 1; @@ -2703,11 +2703,11 @@ cupsdSetPrinterState( if (old_state != s) { - cupsdAddEvent(s == IPP_PRINTER_STOPPED ? CUPSD_EVENT_PRINTER_STOPPED : + cupsdAddEvent(s == IPP_PSTATE_STOPPED ? CUPSD_EVENT_PRINTER_STOPPED : CUPSD_EVENT_PRINTER_STATE, p, NULL, "%s \"%s\" state changed to %s.", (p->type & CUPS_PRINTER_CLASS) ? "Class" : "Printer", - p->name, printer_states[p->state - IPP_PRINTER_IDLE]); + p->name, printer_states[p->state - IPP_PSTATE_IDLE]); /* * Let the browse code know this needs to be updated... @@ -2720,7 +2720,7 @@ cupsdSetPrinterState( * Set/clear the paused reason as needed... */ - if (s == IPP_PRINTER_STOPPED) + if (s == IPP_PSTATE_STOPPED) cupsdSetPrinterReasons(p, "+paused"); else cupsdSetPrinterReasons(p, "-paused"); @@ -2730,17 +2730,17 @@ cupsdSetPrinterState( for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); job; job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) - if (job->reasons && job->state_value == IPP_JOB_PENDING && + if (job->reasons && job->state_value == IPP_JSTATE_PENDING && !_cups_strcasecmp(job->dest, p->name)) ippSetString(job->attrs, &job->reasons, 0, - s == IPP_PRINTER_STOPPED ? "printer-stopped" : "none"); + s == IPP_PSTATE_STOPPED ? "printer-stopped" : "none"); } /* * Clear the message for the queue when going to processing... */ - if (s == IPP_PRINTER_PROCESSING) + if (s == IPP_PSTATE_PROCESSING) p->state_message[0] = '\0'; /* @@ -2756,7 +2756,7 @@ cupsdSetPrinterState( */ if (update && - (old_state == IPP_PRINTER_STOPPED) != (s == IPP_PRINTER_STOPPED)) + (old_state == IPP_PSTATE_STOPPED) != (s == IPP_PSTATE_STOPPED)) dirty_printer(p); } @@ -2773,14 +2773,14 @@ cupsdStopPrinter(cupsd_printer_t *p, /* I - Printer to stop */ * Set the printer state... */ - cupsdSetPrinterState(p, IPP_PRINTER_STOPPED, update); + cupsdSetPrinterState(p, IPP_PSTATE_STOPPED, update); /* * See if we have a job printing on this printer... */ - if (p->job && p->job->state_value == IPP_JOB_PROCESSING) - cupsdSetJobState(p->job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, + if (p->job && p->job->state_value == IPP_JSTATE_PROCESSING) + cupsdSetJobState(p->job, IPP_JSTATE_PENDING, CUPSD_JOB_DEFAULT, "Job stopped due to printer being paused."); } @@ -3396,7 +3396,7 @@ add_printer_filter( cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_printer_filter(p=%p(%s), filtertype=%p(%s/%s), " - "filter=\"%s\")", p, p->name, filtertype, filtertype->super, + "filter=\"%s\")", (void *)p, p->name, (void *)filtertype, filtertype->super, filtertype->type, filter); /* diff --git a/scheduler/printers.h b/scheduler/printers.h index 598e1d619b..bb765c1e0d 100644 --- a/scheduler/printers.h +++ b/scheduler/printers.h @@ -178,7 +178,7 @@ extern int cupsdSetPrinterReasons(cupsd_printer_t *p, extern void cupsdSetPrinterState(cupsd_printer_t *p, ipp_pstate_t s, int update); #define cupsdStartPrinter(p,u) cupsdSetPrinterState((p), \ - IPP_PRINTER_IDLE, (u)) + IPP_PSTATE_IDLE, (u)) extern void cupsdStopPrinter(cupsd_printer_t *p, int update); extern int cupsdUpdatePrinterPPD(cupsd_printer_t *p, int num_keywords, diff --git a/scheduler/process.c b/scheduler/process.c index 6579165162..521fb1c590 100644 --- a/scheduler/process.c +++ b/scheduler/process.c @@ -444,7 +444,7 @@ cupsdFinishProcess(int pid, /* I - Process ID */ cupsCopyString(name, "unknown", namelen); } - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFinishProcess(pid=%d, name=%p, namelen=" CUPS_LLFMT ", job_id=%p(%d)) = \"%s\"", pid, name, CUPS_LLCAST namelen, job_id, job_id ? *job_id : 0, name); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFinishProcess(pid=%d, name=%p, namelen=" CUPS_LLFMT ", job_id=%p(%d)) = \"%s\"", pid, (void *)name, CUPS_LLCAST namelen, (void *)job_id, job_id ? *job_id : 0, name); return (name); } @@ -827,8 +827,8 @@ cupsdStartProcess( "cupsdStartProcess(command=\"%s\", argv=%p, envp=%p, " "infd=%d, outfd=%d, errfd=%d, backfd=%d, sidefd=%d, root=%d, " "profile=%p, job=%p(%d), pid=%p) = %d", - command, argv, envp, infd, outfd, errfd, backfd, sidefd, - root, profile, job, job ? job->id : 0, pid, *pid); + command, (void *)argv, (void *)envp, infd, outfd, errfd, backfd, sidefd, + root, (void *)profile, (void *)job, job ? job->id : 0, (void *)pid, *pid); return (*pid); } @@ -864,17 +864,20 @@ cupsd_requote(char *dst, /* I - Destination buffer */ dstptr = dst; dstend = dst + dstsize - 2; - while (*src && dstptr < dstend) + if (src) { - ch = *src++; + while (*src && dstptr < dstend) + { + ch = *src++; - if (ch == '/' && !*src) - break; /* Don't add trailing slash */ + if (ch == '/' && !*src) + break; /* Don't add trailing slash */ - if (strchr(".?*()[]^$\\\"", ch)) - *dstptr++ = '\\'; + if (strchr(".?*()[]^$\\\"", ch)) + *dstptr++ = '\\'; - *dstptr++ = (char)ch; + *dstptr++ = (char)ch; + } } *dstptr = '\0'; diff --git a/scheduler/quotas.c b/scheduler/quotas.c index 88408ffc8d..fa1e9fc9f5 100644 --- a/scheduler/quotas.c +++ b/scheduler/quotas.c @@ -157,7 +157,7 @@ cupsdUpdateQuota( * This job is too old to count towards the quota, ignore it... */ - if (JobAutoPurge && !job->printer && job->state_value > IPP_JOB_STOPPED) + if (JobAutoPurge && !job->printer && job->state_value > IPP_JSTATE_STOPPED) cupsdDeleteJob(job, CUPSD_JOB_PURGE); continue; diff --git a/scheduler/select.c b/scheduler/select.c index 5c085944a8..9bf9d3b45e 100644 --- a/scheduler/select.c +++ b/scheduler/select.c @@ -207,7 +207,7 @@ cupsdAddSelect(int fd, // I - File descriptor // Range check input... - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddSelect(fd=%d, read_cb=%p, write_cb=%p, data=%p)", fd, read_cb, write_cb, data); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddSelect(fd=%d, read_cb=%p, write_cb=%p, data=%p)", fd, (void *)read_cb, (void *)write_cb, (void *)data); if (fd < 0) return (0); diff --git a/scheduler/subscriptions.c b/scheduler/subscriptions.c index dbd8423517..00877ccb65 100644 --- a/scheduler/subscriptions.c +++ b/scheduler/subscriptions.c @@ -62,8 +62,8 @@ cupsdAddEvent( cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddEvent(event=%s, dest=%p(%s), job=%p(%d), text=\"%s\", ...)", - cupsdEventName(event), dest, dest ? dest->name : "", - job, job ? job->id : 0, text); + cupsdEventName(event), (void *)dest, dest ? dest->name : "", + (void *)job, job ? job->id : 0, text); /* * Keep track of events with any OS-supplied notification mechanisms... @@ -171,7 +171,7 @@ cupsdAddEvent( ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM, "printer-state", (int)dest->state); if (dest->num_reasons == 0) - ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "printer-state-reasons", NULL, dest->state == IPP_PRINTER_STOPPED ? "paused" : "none"); + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "printer-state-reasons", NULL, dest->state == IPP_PSTATE_STOPPED ? "paused" : "none"); else ippAddStrings(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "printer-state-reasons", dest->num_reasons, NULL, (const char * const *)dest->reasons); @@ -192,14 +192,14 @@ cupsdAddEvent( switch (job->state_value) { - case IPP_JOB_PENDING : - if (dest && dest->state == IPP_PRINTER_STOPPED) + case IPP_JSTATE_PENDING : + if (dest && dest->state == IPP_PSTATE_STOPPED) ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "printer-stopped"); else ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "none"); break; - case IPP_JOB_HELD : + case IPP_JSTATE_HELD : if (ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_KEYWORD) != NULL || ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME) != NULL) ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-hold-until-specified"); @@ -207,23 +207,23 @@ cupsdAddEvent( ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-incoming"); break; - case IPP_JOB_PROCESSING : + case IPP_JSTATE_PROCESSING : ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-printing"); break; - case IPP_JOB_STOPPED : + case IPP_JSTATE_STOPPED : ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-stopped"); break; - case IPP_JOB_CANCELED : + case IPP_JSTATE_CANCELED : ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-canceled-by-user"); break; - case IPP_JOB_ABORTED : + case IPP_JSTATE_ABORTED : ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "aborted-by-system"); break; - case IPP_JOB_COMPLETED : + case IPP_JSTATE_COMPLETED : ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, "job-state-reasons", NULL, "job-completed-successfully"); break; } @@ -264,7 +264,7 @@ cupsdAddSubscription( cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdAddSubscription(mask=%x, dest=%p(%s), job=%p(%d), " "uri=\"%s\")", - mask, dest, dest ? dest->name : "", job, job ? job->id : 0, + mask, (void *)dest, dest ? dest->name : "", (void *)job, job ? job->id : 0, uri ? uri : "(null)"); if (!Subscriptions) @@ -1255,7 +1255,7 @@ cupsd_send_dbus(cupsd_eventmask_t event,/* I - Event to send */ else if (event & CUPSD_EVENT_JOB_CREATED) what = "JobQueuedLocal"; else if ((event & CUPSD_EVENT_JOB_STATE) && job && - job->state_value == IPP_JOB_PROCESSING) + job->state_value == IPP_JSTATE_PROCESSING) what = "JobStartedLocal"; else return; @@ -1319,7 +1319,7 @@ cupsd_send_notification( cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsd_send_notification(sub=%p(%d), event=%p(%s))", - sub, sub->id, event, cupsdEventName(event->event)); + (void *)sub, sub->id, (void *)event, cupsdEventName(event->event)); /* * Allocate the events array as needed... @@ -1381,13 +1381,13 @@ cupsd_send_notification( if (sub->pipe < 0) break; - event->attrs->state = IPP_IDLE; + event->attrs->state = IPP_STATE_IDLE; - while ((state = ippWriteFile(sub->pipe, event->attrs)) != IPP_DATA) - if (state == IPP_ERROR) + while ((state = ippWriteFile(sub->pipe, event->attrs)) != IPP_STATE_DATA) + if (state == IPP_STATE_ERROR) break; - if (state == IPP_ERROR) + if (state == IPP_STATE_ERROR) { if (errno == EPIPE) { diff --git a/scheduler/testspeed.c b/scheduler/testspeed.c index 5808f4493c..57fafd1fae 100644 --- a/scheduler/testspeed.c +++ b/scheduler/testspeed.c @@ -63,7 +63,7 @@ main(int argc, /* I - Number of command-line arguments */ requests = 100; children = 5; server = (char *)cupsServer(); - port = ippPort(); + port = ippGetPort(); encryption = HTTP_ENCRYPTION_IF_REQUESTED; verbose = 0; opstring = NULL; @@ -253,11 +253,11 @@ do_test(const char *server, /* I - Server to use */ int op; /* Current operation */ static ipp_op_t ops[5] = /* Operations to test... */ { - IPP_PRINT_JOB, - CUPS_GET_DEFAULT, - CUPS_GET_PRINTERS, - CUPS_GET_CLASSES, - IPP_GET_JOBS + IPP_OP_PRINT_JOB, + IPP_OP_CUPS_GET_DEFAULT, + IPP_OP_CUPS_GET_PRINTERS, + IPP_OP_CUPS_GET_CLASSES, + IPP_OP_GET_JOBS }; @@ -302,7 +302,7 @@ do_test(const char *server, /* I - Server to use */ switch (op) { - case IPP_GET_JOBS : + case IPP_OP_GET_JOBS : ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, "ipp://localhost/printers/"); @@ -310,7 +310,7 @@ do_test(const char *server, /* I - Server to use */ ippDelete(cupsDoRequest(http, request, "/")); break; - case IPP_PRINT_JOB : + case IPP_OP_PRINT_JOB : ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, "ipp://localhost/printers/test"); ippDelete(cupsDoFileRequest(http, request, "/printers/test", @@ -326,8 +326,8 @@ do_test(const char *server, /* I - Server to use */ switch (cupsGetError()) { - case IPP_OK : - case IPP_NOT_FOUND : + case IPP_STATUS_OK : + case IPP_STATUS_ERROR_NOT_FOUND : if (verbose) { printf("succeeded: %s (%.6f)\n", cupsGetErrorString(), reqtime); diff --git a/scheduler/testsub.c b/scheduler/testsub.c index d7cc386d3c..7f58f9c64a 100644 --- a/scheduler/testsub.c +++ b/scheduler/testsub.c @@ -101,8 +101,7 @@ main(int argc, /* I - Number of command-line arguments */ * Connect to the server... */ - if ((http = httpConnectEncrypt(cupsServer(), ippPort(), - cupsEncryption())) == NULL) + if ((http = httpConnect2(cupsGetServer(), ippGetPort(), NULL, AF_UNSPEC, cupsGetEncryption(), 1, 30000, NULL)) == NULL) { perror(cupsServer()); return (1); @@ -125,12 +124,12 @@ main(int argc, /* I - Number of command-line arguments */ if (strstr(uri, "/jobs/")) { - request = ippNewRequest(IPP_CREATE_JOB_SUBSCRIPTION); + request = ippNewRequest(IPP_OP_CREATE_JOB_SUBSCRIPTIONS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); } else { - request = ippNewRequest(IPP_CREATE_PRINTER_SUBSCRIPTION); + request = ippNewRequest(IPP_OP_CREATE_PRINTER_SUBSCRIPTIONS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); } @@ -144,7 +143,7 @@ main(int argc, /* I - Number of command-line arguments */ "notify-pull-method", NULL, "ippget"); response = cupsDoRequest(http, request, uri); - if (cupsGetError() >= IPP_BAD_REQUEST) + if (cupsGetError() >= IPP_STATUS_ERROR_BAD_REQUEST) { fprintf(stderr, "Create-%s-Subscription: %s\n", strstr(uri, "/jobs") ? "Job" : "Printer", cupsGetErrorString()); @@ -184,7 +183,7 @@ main(int argc, /* I - Number of command-line arguments */ printf("\nGet-Notifications(%d,%d):", subscription_id, sequence_number); fflush(stdout); - request = ippNewRequest(IPP_GET_NOTIFICATIONS); + request = ippNewRequest(IPP_OP_GET_NOTIFICATIONS); if (strstr(uri, "/jobs/")) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); @@ -205,7 +204,7 @@ main(int argc, /* I - Number of command-line arguments */ printf(" %s\n", ippErrorString(cupsGetError())); - if (cupsGetError() >= IPP_BAD_REQUEST) + if (cupsGetError() >= IPP_STATUS_ERROR_BAD_REQUEST) fprintf(stderr, "Get-Notifications: %s\n", cupsGetErrorString()); else if (response) { @@ -238,7 +237,7 @@ main(int argc, /* I - Number of command-line arguments */ printf("\nCancel-Subscription:"); fflush(stdout); - request = ippNewRequest(IPP_CANCEL_SUBSCRIPTION); + request = ippNewRequest(IPP_OP_CANCEL_SUBSCRIPTION); if (strstr(uri, "/jobs/")) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); @@ -256,7 +255,7 @@ main(int argc, /* I - Number of command-line arguments */ printf(" %s\n", ippErrorString(cupsGetError())); - if (cupsGetError() >= IPP_BAD_REQUEST) + if (cupsGetError() >= IPP_STATUS_ERROR_BAD_REQUEST) fprintf(stderr, "Cancel-Subscription: %s\n", cupsGetErrorString()); /* diff --git a/systemv/cancel.c b/systemv/cancel.c index 4d8cc790cf..9b8679885a 100644 --- a/systemv/cancel.c +++ b/systemv/cancel.c @@ -53,7 +53,7 @@ main(int argc, /* I - Number of command-line arguments */ * Setup to cancel individual print jobs... */ - op = IPP_CANCEL_JOB; + op = IPP_OP_CANCEL_JOB; purge = 0; dest = NULL; user = NULL; @@ -103,7 +103,7 @@ main(int argc, /* I - Number of command-line arguments */ break; case 'a' : /* Cancel all jobs */ - op = purge ? IPP_PURGE_JOBS : IPP_CANCEL_JOBS; + op = purge ? IPP_OP_PURGE_JOBS : IPP_OP_CANCEL_JOBS; break; case 'h' : /* Connect to host */ @@ -133,7 +133,7 @@ main(int argc, /* I - Number of command-line arguments */ break; case 'u' : /* Username */ - op = IPP_CANCEL_MY_JOBS; + op = IPP_OP_CANCEL_MY_JOBS; if (opt[1] != '\0') { @@ -157,8 +157,8 @@ main(int argc, /* I - Number of command-line arguments */ case 'x' : /* Purge job(s) */ purge = 1; - if (op == IPP_CANCEL_JOBS) - op = IPP_PURGE_JOBS; + if (op == IPP_OP_CANCEL_JOBS) + op = IPP_OP_PURGE_JOBS; break; default : @@ -201,7 +201,7 @@ main(int argc, /* I - Number of command-line arguments */ */ dest = NULL; - op = IPP_CANCEL_JOB; + op = IPP_OP_CANCEL_JOB; job_id = atoi(job + 1); } else if (isdigit(argv[i][0] & 255)) @@ -211,7 +211,7 @@ main(int argc, /* I - Number of command-line arguments */ */ dest = NULL; - op = IPP_CANCEL_JOB; + op = IPP_OP_CANCEL_JOB; job_id = atoi(argv[i]); } else @@ -283,8 +283,8 @@ main(int argc, /* I - Number of command-line arguments */ "requesting-user-name", NULL, user); ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1); - if (op == IPP_CANCEL_JOBS) - op = IPP_CANCEL_MY_JOBS; + if (op == IPP_OP_CANCEL_JOBS) + op = IPP_OP_CANCEL_MY_JOBS; } else ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, @@ -292,7 +292,7 @@ main(int argc, /* I - Number of command-line arguments */ if (purge) { - if (op == IPP_CANCEL_JOB) + if (op == IPP_OP_CANCEL_JOB) ippAddBoolean(request, IPP_TAG_OPERATION, "purge-job", (char)purge); else ippAddBoolean(request, IPP_TAG_OPERATION, "purge-jobs", (char)purge); @@ -302,16 +302,16 @@ main(int argc, /* I - Number of command-line arguments */ * Do the request and get back a response... */ - if (op == IPP_CANCEL_JOBS && (!user || _cups_strcasecmp(user, cupsGetUser()))) + if (op == IPP_OP_CANCEL_JOBS && (!user || _cups_strcasecmp(user, cupsGetUser()))) response = cupsDoRequest(http, request, "/admin/"); else response = cupsDoRequest(http, request, "/jobs/"); if (response == NULL || - response->request.status.status_code > IPP_OK_CONFLICT) + response->request.status.status_code > IPP_STATUS_OK_CONFLICTING) { _cupsLangPrintf(stderr, _("%s: %s failed: %s"), argv[0], - op == IPP_PURGE_JOBS ? "purge-jobs" : "cancel-job", + op == IPP_OP_PURGE_JOBS ? "purge-jobs" : "cancel-job", cupsGetErrorString()); ippDelete(response); @@ -323,7 +323,7 @@ main(int argc, /* I - Number of command-line arguments */ } } - if (num_dests == 0 && op != IPP_CANCEL_JOB) + if (num_dests == 0 && op != IPP_OP_CANCEL_JOB) { /* * Open a connection to the server... @@ -371,10 +371,10 @@ main(int argc, /* I - Number of command-line arguments */ response = cupsDoRequest(http, request, "/admin/"); if (response == NULL || - response->request.status.status_code > IPP_OK_CONFLICT) + response->request.status.status_code > IPP_STATUS_OK_CONFLICTING) { _cupsLangPrintf(stderr, _("%s: %s failed: %s"), argv[0], - op == IPP_PURGE_JOBS ? "purge-jobs" : "cancel-job", + op == IPP_OP_PURGE_JOBS ? "purge-jobs" : "cancel-job", cupsGetErrorString()); ippDelete(response); diff --git a/systemv/cupsaccept.c b/systemv/cupsaccept.c index 07acd91bd1..01ccb6d292 100644 --- a/systemv/cupsaccept.c +++ b/systemv/cupsaccept.c @@ -56,13 +56,13 @@ main(int argc, /* I - Number of command-line arguments */ cancel = 0; if (!strcmp(command, "cupsaccept")) - op = CUPS_ACCEPT_JOBS; + op = IPP_OP_CUPS_ACCEPT_JOBS; else if (!strcmp(command, "cupsreject")) - op = CUPS_REJECT_JOBS; + op = IPP_OP_CUPS_REJECT_JOBS; else if (!strcmp(command, "cupsdisable")) - op = IPP_PAUSE_PRINTER; + op = IPP_OP_PAUSE_PRINTER; else if (!strcmp(command, "cupsenable")) - op = IPP_RESUME_PRINTER; + op = IPP_OP_RESUME_PRINTER; else { _cupsLangPrintf(stderr, _("%s: Don't know what to do."), command); @@ -80,9 +80,9 @@ main(int argc, /* I - Number of command-line arguments */ if (!strcmp(argv[i], "--help")) usage(command); else if (!strcmp(argv[i], "--hold")) - op = IPP_HOLD_NEW_JOBS; + op = IPP_OP_HOLD_NEW_JOBS; else if (!strcmp(argv[i], "--release")) - op = IPP_RELEASE_HELD_NEW_JOBS; + op = IPP_OP_RELEASE_HELD_NEW_JOBS; else if (argv[i][0] == '-') { for (opt = argv[i] + 1; *opt; opt ++) @@ -186,7 +186,7 @@ main(int argc, /* I - Number of command-line arguments */ ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/admin/")); - if (cupsGetError() > IPP_OK_CONFLICT) + if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) { _cupsLangPrintf(stderr, _("%s: Operation failed: %s"), @@ -209,14 +209,14 @@ main(int argc, /* I - Number of command-line arguments */ * printer-uri */ - request = ippNewRequest(IPP_PURGE_JOBS); + request = ippNewRequest(IPP_OP_PURGE_JOBS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/admin/")); - if (cupsGetError() > IPP_OK_CONFLICT) + if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) { _cupsLangPrintf(stderr, "%s: %s", command, cupsGetErrorString()); return (1); diff --git a/systemv/lp.c b/systemv/lp.c index 71178caf78..38f50fc17e 100644 --- a/systemv/lp.c +++ b/systemv/lp.c @@ -624,7 +624,7 @@ main(int argc, /* I - Number of command-line arguments */ return (1); } - if (cupsFinishDocument(CUPS_HTTP_DEFAULT, printer) != IPP_OK) + if (cupsFinishDocument(CUPS_HTTP_DEFAULT, printer) != IPP_STATUS_OK) { _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsGetErrorString()); cupsCancelJob2(CUPS_HTTP_DEFAULT, printer, job_id, 0); @@ -658,7 +658,7 @@ restart_job(const char *command, /* I - Command name */ char uri[HTTP_MAX_URI]; /* URI for job */ - request = ippNewRequest(IPP_RESTART_JOB); + request = ippNewRequest(IPP_OP_RESTART_JOB); snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); @@ -681,7 +681,7 @@ restart_job(const char *command, /* I - Command name */ "name."), command); return (1); } - else if (cupsGetError() > IPP_OK_CONFLICT) + else if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) { _cupsLangPrintf(stderr, "%s: %s", command, cupsGetErrorString()); return (1); @@ -709,7 +709,7 @@ set_job_attrs( if (num_options == 0) return (0); - request = ippNewRequest(IPP_SET_JOB_ATTRIBUTES); + request = ippNewRequest(IPP_OP_SET_JOB_ATTRIBUTES); snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); @@ -731,7 +731,7 @@ set_job_attrs( "name."), command); return (1); } - else if (cupsGetError() > IPP_OK_CONFLICT) + else if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) { _cupsLangPrintf(stderr, "%s: %s", command, cupsGetErrorString()); return (1); diff --git a/systemv/lpinfo.c b/systemv/lpinfo.c index 7629a61aa2..535fe9f13a 100644 --- a/systemv/lpinfo.c +++ b/systemv/lpinfo.c @@ -293,7 +293,7 @@ show_devices( const char *exclude_schemes) /* I - List of schemes to exclude */ { if (cupsGetDevices(CUPS_HTTP_DEFAULT, timeout, include_schemes, - exclude_schemes, device_cb, &long_status) != IPP_OK) + exclude_schemes, device_cb, &long_status) != IPP_STATUS_OK) { _cupsLangPrintf(stderr, "lpinfo: %s", cupsGetErrorString()); return (1); @@ -331,7 +331,7 @@ show_models( * Build a CUPS_GET_PPDS request... */ - request = ippNewRequest(CUPS_GET_PPDS); + request = ippNewRequest(IPP_OP_CUPS_GET_PPDS); if (device_id) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_TEXT, "ppd-device-id", @@ -372,7 +372,7 @@ show_models( * Loop through the device list and display them... */ - if (response->request.status.status_code > IPP_OK_CONFLICT) + if (response->request.status.status_code > IPP_STATUS_OK_CONFLICTING) { _cupsLangPrintf(stderr, "lpinfo: %s", cupsGetErrorString()); ippDelete(response); diff --git a/systemv/lpmove.c b/systemv/lpmove.c index 3dbbed305c..9fc3a29024 100644 --- a/systemv/lpmove.c +++ b/systemv/lpmove.c @@ -160,7 +160,7 @@ move_job(http_t *http, /* I - HTTP connection to server */ * requesting-user-name */ - request = ippNewRequest(CUPS_MOVE_JOB); + request = ippNewRequest(IPP_OP_CUPS_MOVE_JOB); if (jobid) { @@ -190,7 +190,7 @@ move_job(http_t *http, /* I - HTTP connection to server */ ippDelete(cupsDoRequest(http, request, "/jobs")); - if (cupsGetError() > IPP_OK_CONFLICT) + if (cupsGetError() > IPP_STATUS_OK_CONFLICTING) { _cupsLangPrintf(stderr, "lpmove: %s", cupsGetErrorString()); return (1); diff --git a/systemv/lpstat.c b/systemv/lpstat.c index cfe9a05ace..f4a35e4e5a 100644 --- a/systemv/lpstat.c +++ b/systemv/lpstat.c @@ -704,7 +704,7 @@ show_accepting(const char *printers, /* I - Destinations */ * requesting-user-name */ - request = ippNewRequest(CUPS_GET_PRINTERS); + request = ippNewRequest(IPP_OP_CUPS_GET_PRINTERS); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), @@ -889,7 +889,7 @@ show_classes(const char *dests) /* I - Destinations */ * requesting-user-name */ - request = ippNewRequest(CUPS_GET_CLASSES); + request = ippNewRequest(IPP_OP_CUPS_GET_CLASSES); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(cattrs) / sizeof(cattrs[0]), @@ -928,7 +928,7 @@ show_classes(const char *dests) /* I - Destinations */ if (response) { - if (response->request.status.status_code > IPP_OK_CONFLICT) + if (response->request.status.status_code > IPP_STATUS_OK_CONFLICTING) { _cupsLangPrintf(stderr, "lpstat: %s", cupsGetErrorString()); ippDelete(response); @@ -1005,7 +1005,7 @@ show_classes(const char *dests) /* I - Destinations */ * requested-attributes */ - request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, printer_uri); @@ -1153,7 +1153,7 @@ show_devices(const char *printers, /* I - Destinations */ * requesting-user-name */ - request = ippNewRequest(CUPS_GET_PRINTERS); + request = ippNewRequest(IPP_OP_CUPS_GET_PRINTERS); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), @@ -1345,7 +1345,7 @@ show_jobs(const char *dests, /* I - Destinations */ * which-jobs */ - request = ippNewRequest(IPP_GET_JOBS); + request = ippNewRequest(IPP_OP_GET_JOBS); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, "ipp://localhost/"); @@ -1594,7 +1594,7 @@ show_printers(const char *printers, /* I - Destinations */ * requesting-user-name */ - request = ippNewRequest(CUPS_GET_PRINTERS); + request = ippNewRequest(IPP_OP_CUPS_GET_PRINTERS); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), @@ -1657,7 +1657,7 @@ show_printers(const char *printers, /* I - Destinations */ printer = NULL; ptime = 0; ptype = CUPS_PRINTER_LOCAL; - pstate = IPP_PRINTER_IDLE; + pstate = IPP_PSTATE_IDLE; message = NULL; description = NULL; location = NULL; @@ -1729,11 +1729,11 @@ show_printers(const char *printers, /* I - Destinations */ if (match_list(printers, printer)) { /* - * If the printer state is "IPP_PRINTER_PROCESSING", then grab the + * If the printer state is "IPP_PSTATE_PROCESSING", then grab the * current job for the printer. */ - if (pstate == IPP_PRINTER_PROCESSING) + if (pstate == IPP_PSTATE_PROCESSING) { /* * Build an IPP_GET_JOBS request, which requires the following @@ -1746,10 +1746,7 @@ show_printers(const char *printers, /* I - Destinations */ * requested-attributes */ - request = ippNewRequest(IPP_GET_JOBS); - - request->request.op.operation_id = IPP_GET_JOBS; - request->request.op.request_id = 1; + request = ippNewRequest(IPP_OP_GET_JOBS); ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "requested-attributes", @@ -1766,14 +1763,14 @@ show_printers(const char *printers, /* I - Destinations */ * Get the current active job on this queue... */ - ipp_jstate_t jobstate = IPP_JOB_PENDING; + ipp_jstate_t jobstate = IPP_JSTATE_PENDING; jobid = 0; for (jobattr = jobs->attrs; jobattr; jobattr = jobattr->next) { if (!jobattr->name) { - if (jobstate == IPP_JOB_PROCESSING) + if (jobstate == IPP_JSTATE_PROCESSING) break; else continue; @@ -1787,7 +1784,7 @@ show_printers(const char *printers, /* I - Destinations */ jobstate = (ipp_jstate_t)jobattr->values[0].integer; } - if (jobstate != IPP_JOB_PROCESSING) + if (jobstate != IPP_JSTATE_PROCESSING) jobid = 0; ippDelete(jobs); @@ -1802,21 +1799,21 @@ show_printers(const char *printers, /* I - Destinations */ switch (pstate) { - case IPP_PRINTER_IDLE : + case IPP_PSTATE_IDLE : if (ippContainsString(reasons, "hold-new-jobs")) _cupsLangPrintf(stdout, _("printer %s is holding new jobs. enabled since %s"), printer, printer_state_time); else _cupsLangPrintf(stdout, _("printer %s is idle. enabled since %s"), printer, printer_state_time); break; - case IPP_PRINTER_PROCESSING : + case IPP_PSTATE_PROCESSING : _cupsLangPrintf(stdout, _("printer %s now printing %s-%d. enabled since %s"), printer, printer, jobid, printer_state_time); break; - case IPP_PRINTER_STOPPED : + case IPP_PSTATE_STOPPED : _cupsLangPrintf(stdout, _("printer %s disabled since %s -"), printer, printer_state_time); break; } - if ((message && *message) || pstate == IPP_PRINTER_STOPPED) + if ((message && *message) || pstate == IPP_PSTATE_STOPPED) { if (message && *message) _cupsLangPrintf(stdout, "\t%s", message); @@ -1914,21 +1911,21 @@ show_printers(const char *printers, /* I - Destinations */ { switch (pstate) { - case IPP_PRINTER_IDLE : + case IPP_PSTATE_IDLE : _cupsLangPrintf(stdout, _("printer %s/%s is idle. " "enabled since %s"), printer, dests[i].instance, printer_state_time); break; - case IPP_PRINTER_PROCESSING : + case IPP_PSTATE_PROCESSING : _cupsLangPrintf(stdout, _("printer %s/%s now printing %s-%d. " "enabled since %s"), printer, dests[i].instance, printer, jobid, printer_state_time); break; - case IPP_PRINTER_STOPPED : + case IPP_PSTATE_STOPPED : _cupsLangPrintf(stdout, _("printer %s/%s disabled since %s -"), printer, dests[i].instance, @@ -1936,7 +1933,7 @@ show_printers(const char *printers, /* I - Destinations */ break; } - if ((message && *message) || pstate == IPP_PRINTER_STOPPED) + if ((message && *message) || pstate == IPP_PSTATE_STOPPED) { if (message && *message) _cupsLangPrintf(stdout, "\t%s", message); diff --git a/tools/ippeveprinter.c b/tools/ippeveprinter.c index 6ebd3cfbe0..a83cd65513 100644 --- a/tools/ippeveprinter.c +++ b/tools/ippeveprinter.c @@ -1,36 +1,29 @@ -/* - * IPP Everywhere printer application for CUPS. - * - * Copyright © 2021-2023 by OpenPrinting. - * Copyright © 2020 by the IEEE-ISTO Printer Working Group. - * Copyright © 2010-2021 by Apple Inc. - * - * Licensed under Apache License v2.0. See the file "LICENSE" for more - * information. - * - * Note: This program began life as the "ippserver" sample code that first - * appeared in CUPS 1.4. The name has been changed in order to distinguish it - * from the PWG's much more ambitious "ippserver" program, which supports - * different kinds of IPP services and multiple services per instance - the - * "ippeveprinter" program exposes a single print service conforming to the - * current IPP Everywhere specification, thus the new name. - */ - -/* - * Include necessary headers... - */ +// +// IPP Everywhere printer application for CUPS. +// +// Copyright © 2021-2023 by OpenPrinting. +// Copyright © 2020 by the IEEE-ISTO Printer Working Group. +// Copyright © 2010-2021 by Apple Inc. +// +// Licensed under Apache License v2.0. See the file "LICENSE" for more +// information. +// +// Note: This program began life as the "ippserver" sample code that first +// appeared in CUPS 1.4. The name has been changed in order to distinguish it +// from the PWG's much more ambitious "ippserver" program, which supports +// different kinds of IPP services and multiple services per instance - the +// "ippeveprinter" program exposes a single print service conforming to the +// current IPP Everywhere specification, thus the new name. +// #include -#include -#if !CUPS_LITE -# include -#endif /* !CUPS_LITE */ +#include #include -#include #include #ifdef _WIN32 +# include # include # include # define WEXITSTATUS(s) (s) @@ -41,85 +34,75 @@ typedef ULONG nfds_t; extern char **environ; # include +# include # include # include -#endif /* _WIN32 */ +#endif // _WIN32 #ifndef O_BINARY -# define O_BINARY 0 /* Windows "binary file" nonsense */ -#endif /* !O_BINARY */ - -#ifdef HAVE_MDNSRESPONDER -# include -#elif defined(HAVE_AVAHI) -# include -# include -# include -# include -# include -# include -#endif /* HAVE_MDNSRESPONDER */ +# define O_BINARY 0 // Windows "binary file" nonsense +#endif // !O_BINARY #ifdef HAVE_SYS_MOUNT_H # include -#endif /* HAVE_SYS_MOUNT_H */ +#endif // HAVE_SYS_MOUNT_H #ifdef HAVE_SYS_STATFS_H # include -#endif /* HAVE_SYS_STATFS_H */ +#endif // HAVE_SYS_STATFS_H #ifdef HAVE_SYS_STATVFS_H # include -#endif /* HAVE_SYS_STATVFS_H */ +#endif // HAVE_SYS_STATVFS_H #ifdef HAVE_SYS_VFS_H # include -#endif /* HAVE_SYS_VFS_H */ +#endif // HAVE_SYS_VFS_H #if HAVE_LIBPAM # ifdef HAVE_PAM_PAM_APPL_H # include # else # include -# endif /* HAVE_PAM_PAM_APPL_H */ -#endif /* HAVE_LIBPAM */ +# endif // HAVE_PAM_PAM_APPL_H +#endif // HAVE_LIBPAM #include "printer-png.h" #include "printer-lg-png.h" #include "printer-sm-png.h" -/* - * Constants... - */ +// +// Constants... +// -enum ippeve_preason_e /* printer-state-reasons bit values */ +enum ippeve_preason_e // printer-state-reasons bit values { - IPPEVE_PREASON_NONE = 0x0000, /* none */ - IPPEVE_PREASON_OTHER = 0x0001, /* other */ - IPPEVE_PREASON_COVER_OPEN = 0x0002, /* cover-open */ + IPPEVE_PREASON_NONE = 0x0000, // none + IPPEVE_PREASON_OTHER = 0x0001, // other + IPPEVE_PREASON_COVER_OPEN = 0x0002, // cover-open IPPEVE_PREASON_INPUT_TRAY_MISSING = 0x0004, - /* input-tray-missing */ + // input-tray-missing IPPEVE_PREASON_MARKER_SUPPLY_EMPTY = 0x0008, - /* marker-supply-empty */ + // marker-supply-empty IPPEVE_PREASON_MARKER_SUPPLY_LOW = 0x0010, - /* marker-supply-low */ + // marker-supply-low IPPEVE_PREASON_MARKER_WASTE_ALMOST_FULL = 0x0020, - /* marker-waste-almost-full */ + // marker-waste-almost-full IPPEVE_PREASON_MARKER_WASTE_FULL = 0x0040, - /* marker-waste-full */ - IPPEVE_PREASON_MEDIA_EMPTY = 0x0080, /* media-empty */ - IPPEVE_PREASON_MEDIA_JAM = 0x0100, /* media-jam */ - IPPEVE_PREASON_MEDIA_LOW = 0x0200, /* media-low */ - IPPEVE_PREASON_MEDIA_NEEDED = 0x0400, /* media-needed */ + // marker-waste-full + IPPEVE_PREASON_MEDIA_EMPTY = 0x0080, // media-empty + IPPEVE_PREASON_MEDIA_JAM = 0x0100, // media-jam + IPPEVE_PREASON_MEDIA_LOW = 0x0200, // media-low + IPPEVE_PREASON_MEDIA_NEEDED = 0x0400, // media-needed IPPEVE_PREASON_MOVING_TO_PAUSED = 0x0800, - /* moving-to-paused */ - IPPEVE_PREASON_PAUSED = 0x1000, /* paused */ - IPPEVE_PREASON_SPOOL_AREA_FULL = 0x2000,/* spool-area-full */ - IPPEVE_PREASON_TONER_EMPTY = 0x4000, /* toner-empty */ - IPPEVE_PREASON_TONER_LOW = 0x8000 /* toner-low */ + // moving-to-paused + IPPEVE_PREASON_PAUSED = 0x1000, // paused + IPPEVE_PREASON_SPOOL_AREA_FULL = 0x2000,// spool-area-full + IPPEVE_PREASON_TONER_EMPTY = 0x4000, // toner-empty + IPPEVE_PREASON_TONER_LOW = 0x8000 // toner-low }; -typedef unsigned int ippeve_preason_t; /* Bitfield for printer-state-reasons */ +typedef unsigned int ippeve_preason_t; // Bitfield for printer-state-reasons static const char * const ippeve_preason_strings[] = -{ /* Strings for each bit */ - /* "none" is implied for no bits set */ +{ // Strings for each bit + // "none" is implied for no bits set "other", "cover-open", "input-tray-missing", @@ -139,168 +122,141 @@ static const char * const ippeve_preason_strings[] = }; -/* - * URL scheme for web resources... - */ +// +// URL scheme for web resources... +// #define WEB_SCHEME "https" -/* - * Structures... - */ - -#ifdef HAVE_MDNSRESPONDER -typedef DNSServiceRef ippeve_srv_t; /* Service reference */ -typedef TXTRecordRef ippeve_txt_t; /* TXT record */ - -#elif defined(HAVE_AVAHI) -typedef AvahiEntryGroup *ippeve_srv_t; /* Service reference */ -typedef AvahiStringList *ippeve_txt_t; /* TXT record */ - -#else -typedef void *ippeve_srv_t; /* Service reference */ -typedef void *ippeve_txt_t; /* TXT record */ -#endif /* HAVE_MDNSRESPONDER */ +// +// Structures... +// #if HAVE_LIBPAM -typedef struct ippeve_authdata_s /* Authentication data */ +typedef struct ippeve_authdata_s // Authentication data { - char username[HTTP_MAX_VALUE], /* Username string */ - *password; /* Password string */ + char username[HTTP_MAX_VALUE], // Username string + *password; // Password string } ippeve_authdata_t; -#endif /* HAVE_LIBPAM */ +#endif // HAVE_LIBPAM -typedef struct ippeve_filter_s /**** Attribute filter ****/ +typedef struct ippeve_filter_s // Attribute filter { - cups_array_t *ra; /* Requested attributes */ - ipp_tag_t group_tag; /* Group to copy */ + cups_array_t *ra; // Requested attributes + ipp_tag_t group_tag; // Group to copy } ippeve_filter_t; typedef struct ippeve_job_s ippeve_job_t; -typedef struct ippeve_printer_s /**** Printer data ****/ +typedef struct ippeve_printer_s // Printer data { - /* TODO: One IPv4 and one IPv6 listener are really not sufficient */ - int ipv4, /* IPv4 listener */ - ipv6; /* IPv6 listener */ -#ifdef HAVE_MDNSRESPONDER - ippeve_srv_t ipp_ref, /* DNS-SD IPP service */ - ipps_ref, /* DNS-SD IPPS service */ - http_ref, /* DNS-SD HTTP service */ - printer_ref; /* DNS-SD LPD service */ -#elif defined(HAVE_AVAHI) - ippeve_srv_t dnssd_ref; /* DNS-SD services */ -#endif /* HAVE_MDNSRESPONDER */ - char *dnssd_subtypes;/* DNS-SD subtypes */ - int dnssd_collision;/* Name collision? */ - char *dnssd_name, /* printer-dns-sd-name */ - *name, /* printer-name */ - *icons[3], /* Icon filenames */ - *strings, /* Strings filename */ - *directory, /* Spool directory */ - *hostname, /* Hostname */ - *device_uri, /* Device URI (if any) */ - *output_format, /* Output format */ -#if !CUPS_LITE - *ppdfile, /* PPD file (if any) */ -#endif /* !CUPS_LITE */ - *command; /* Command to run with job file */ - int port; /* Port */ - int web_forms; /* Enable web interface forms? */ - size_t urilen; /* Length of printer URI */ - ipp_t *attrs; /* Static attributes */ - time_t start_time; /* Startup time */ - time_t config_time; /* printer-config-change-time */ - ipp_pstate_t state; /* printer-state value */ - ippeve_preason_t state_reasons; /* printer-state-reasons values */ - time_t state_time; /* printer-state-change-time */ - cups_array_t *jobs; /* Jobs */ - ippeve_job_t *active_job; /* Current active/pending job */ - int next_job_id; /* Next job-id value */ - cups_rwlock_t rwlock; /* Printer lock */ + // TODO: One IPv4 and one IPv6 listener are really not sufficient + int ipv4, // IPv4 listener + ipv6; // IPv6 listener + cups_dnssd_t *dnssd; // DNS-SD context + cups_dnssd_service_t *services; // DNS-SD services + char *dnssd_subtypes;// DNS-SD subtypes + int dnssd_collision;// Name collision? + char *dnssd_name, // printer-dns-sd-name + *name, // printer-name + *icons[3], // Icon filenames + *strings, // Strings filename + *directory, // Spool directory + *hostname, // Hostname + *device_uri, // Device URI (if any) + *output_format, // Output format + *command; // Command to run with job file + int port; // Port + bool web_forms; // Enable web interface forms? + size_t urilen; // Length of printer URI + ipp_t *attrs; // Static attributes + time_t start_time; // Startup time + time_t config_time; // printer-config-change-time + ipp_pstate_t state; // printer-state value + ippeve_preason_t state_reasons; // printer-state-reasons values + time_t state_time; // printer-state-change-time + cups_array_t *jobs; // Jobs + ippeve_job_t *active_job; // Current active/pending job + int next_job_id; // Next job-id value + cups_rwlock_t rwlock; // Printer lock } ippeve_printer_t; -struct ippeve_job_s /**** Job data ****/ +struct ippeve_job_s // Job data { - int id; /* Job ID */ - const char *name, /* job-name */ - *username, /* job-originating-user-name */ - *format; /* document-format */ - ipp_jstate_t state; /* job-state value */ - char *message; /* job-state-message value */ - int msglevel; /* job-state-message log level (0=error, 1=info) */ - time_t created, /* time-at-creation value */ - processing, /* time-at-processing value */ - completed; /* time-at-completed value */ - int impressions, /* job-impressions value */ - impcompleted; /* job-impressions-completed value */ - ipp_t *attrs; /* Static attributes */ - int cancel; /* Non-zero when job canceled */ - char *filename; /* Print file name */ - int fd; /* Print file descriptor */ - ippeve_printer_t *printer; /* Printer */ + int id; // Job ID + const char *name, // job-name + *username, // job-originating-user-name + *format; // document-format + ipp_jstate_t state; // job-state value + char *message; // job-state-message value + int msglevel; // job-state-message log level (0=error, 1=info) + time_t created, // time-at-creation value + processing, // time-at-processing value + completed; // time-at-completed value + int impressions, // job-impressions value + impcompleted; // job-impressions-completed value + ipp_t *attrs; // Static attributes + int cancel; // Non-zero when job canceled + char *filename; // Print file name + int fd; // Print file descriptor + ippeve_printer_t *printer; // Printer }; -typedef struct ippeve_client_s /**** Client data ****/ +typedef struct ippeve_client_s // Client data { - http_t *http; /* HTTP connection */ - ipp_t *request, /* IPP request */ - *response; /* IPP response */ - time_t start; /* Request start time */ - http_state_t operation; /* Request operation */ - ipp_op_t operation_id; /* IPP operation-id */ - char uri[1024], /* Request URI */ - *options, /* URI options */ + http_t *http; // HTTP connection + ipp_t *request, // IPP request + *response; // IPP response + time_t start; // Request start time + http_state_t operation; // Request operation + ipp_op_t operation_id; // IPP operation-id + char uri[1024], // Request URI + *options, // URI options host_field[HTTP_MAX_VALUE]; - /* Host: header */ - int host_port; /* Port number from Host: header */ - http_addr_t addr; /* Client address */ - char hostname[256], /* Client hostname */ + // Host: header + int host_port; // Port number from Host: header + http_addr_t addr; // Client address + char hostname[256], // Client hostname username[HTTP_MAX_VALUE]; - /* Authenticated username, if any */ - ippeve_printer_t *printer; /* Printer */ - ippeve_job_t *job; /* Current job, if any */ + // Authenticated username, if any + ippeve_printer_t *printer; // Printer + ippeve_job_t *job; // Current job, if any } ippeve_client_t; -/* - * Local functions... - */ +// +// Local functions... +// static http_status_t authenticate_request(ippeve_client_t *client); static void clean_jobs(ippeve_printer_t *printer); static int compare_jobs(ippeve_job_t *a, ippeve_job_t *b); -static void copy_attributes(ipp_t *to, ipp_t *from, cups_array_t *ra, ipp_tag_t group_tag, int quickcopy); +static void copy_attributes(ipp_t *to, ipp_t *from, cups_array_t *ra, ipp_tag_t group_tag, bool quickcopy); static void copy_job_attributes(ippeve_client_t *client, ippeve_job_t *job, cups_array_t *ra); static ippeve_client_t *create_client(ippeve_printer_t *printer, int sock); static ippeve_job_t *create_job(ippeve_client_t *client); static int create_job_file(ippeve_job_t *job, char *fname, size_t fnamesize, const char *dir, const char *ext); static int create_listener(const char *name, int port, int family); -static ipp_t *create_media_col(const char *media, const char *source, const char *type, int width, int length, int bottom, int left, int right, int top); +static ipp_t *create_media_col(const char *media, const char *source, const char *type, ipp_t *media_size, int bottom, int left, int right, int top); static ipp_t *create_media_size(int width, int length); +static ipp_t *create_media_size_range(int min_width, int max_width, int min_length, int max_length); static ippeve_printer_t *create_printer(const char *servername, int serverport, const char *name, const char *location, const char *icons, const char *strings, cups_array_t *docformats, const char *subtypes, const char *directory, const char *command, const char *device_uri, const char *output_format, ipp_t *attrs); static void debug_attributes(const char *title, ipp_t *ipp, int response); static void delete_client(ippeve_client_t *client); static void delete_job(ippeve_job_t *job); static void delete_printer(ippeve_printer_t *printer); -#ifdef HAVE_MDNSRESPONDER -static void DNSSD_API dnssd_callback(DNSServiceRef sdRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, ippeve_printer_t *printer); -#elif defined(HAVE_AVAHI) -static void dnssd_callback(AvahiEntryGroup *p, AvahiEntryGroupState state, void *context); -static void dnssd_client_cb(AvahiClient *c, AvahiClientState state, void *userdata); -#endif /* HAVE_MDNSRESPONDER */ -static void dnssd_init(void); +static void dnssd_callback(cups_dnssd_service_t *service, ippeve_printer_t *printer, cups_dnssd_flags_t flags); static int filter_cb(ippeve_filter_t *filter, ipp_t *dst, ipp_attribute_t *attr); static ippeve_job_t *find_job(ippeve_client_t *client); static void finish_document_data(ippeve_client_t *client, ippeve_job_t *job); static void finish_document_uri(ippeve_client_t *client, ippeve_job_t *job); static void flush_document_data(ippeve_client_t *client); -static int have_document_data(ippeve_client_t *client); -static void html_escape(ippeve_client_t *client, const char *s, size_t slen); -static void html_footer(ippeve_client_t *client); -static void html_header(ippeve_client_t *client, const char *title, int refresh); -static void html_printf(ippeve_client_t *client, const char *format, ...) _CUPS_FORMAT(2, 3); +static bool have_document_data(ippeve_client_t *client); +static bool html_escape(ippeve_client_t *client, const char *s, size_t slen); +static bool html_footer(ippeve_client_t *client); +static bool html_header(ippeve_client_t *client, const char *title, int refresh); +static bool html_printf(ippeve_client_t *client, const char *format, ...) _CUPS_FORMAT(2, 3); static void ipp_cancel_job(ippeve_client_t *client); static void ipp_cancel_my_jobs(ippeve_client_t *client); static void ipp_close_job(ippeve_client_t *client); @@ -316,12 +272,9 @@ static void ipp_send_uri(ippeve_client_t *client); static void ipp_validate_job(ippeve_client_t *client); static ipp_t *load_ippserver_attributes(const char *servername, int serverport, const char *filename, cups_array_t *docformats); static ipp_t *load_legacy_attributes(const char *make, const char *model, int ppm, int ppm_color, int duplex, cups_array_t *docformats); -#if !CUPS_LITE -static ipp_t *load_ppd_attributes(const char *ppdfile, cups_array_t *docformats); -#endif /* !CUPS_LITE */ #if HAVE_LIBPAM static int pam_func(int, const struct pam_message **, struct pam_response **, void *); -#endif /* HAVE_LIBPAM */ +#endif // HAVE_LIBPAM static int parse_options(ippeve_client_t *client, cups_option_t **options); static void process_attr_message(ippeve_job_t *job, char *message); static void *process_client(ippeve_client_t *client); @@ -329,8 +282,8 @@ static int process_http(ippeve_client_t *client); static int process_ipp(ippeve_client_t *client); static void *process_job(ippeve_job_t *job); static void process_state_message(ippeve_job_t *job, char *message); -static int register_printer(ippeve_printer_t *printer); -static int respond_http(ippeve_client_t *client, http_status_t code, const char *content_coding, const char *type, size_t length); +static bool register_printer(ippeve_printer_t *printer); +static bool respond_http(ippeve_client_t *client, http_status_t code, const char *content_coding, const char *type, size_t length); static void respond_ignored(ippeve_client_t *client, ipp_attribute_t *attr); static void respond_ipp(ippeve_client_t *client, ipp_status_t status, const char *message, ...) _CUPS_FORMAT(3, 4); static void respond_unsupported(ippeve_client_t *client, ipp_attribute_t *attr); @@ -343,73 +296,62 @@ static void signal_handler(int signum); #endif // !_WIN32 static char *time_string(time_t tv, char *buffer, size_t bufsize); static void usage(int status) _CUPS_NORETURN; -static int valid_doc_attributes(ippeve_client_t *client); -static int valid_job_attributes(ippeve_client_t *client); +static bool valid_doc_attributes(ippeve_client_t *client); +static bool valid_job_attributes(ippeve_client_t *client); -/* - * Globals... - */ +// +// Globals... +// -#ifdef HAVE_MDNSRESPONDER -static DNSServiceRef DNSSDMaster = NULL; -#elif defined(HAVE_AVAHI) -static AvahiThreadedPoll *DNSSDMaster = NULL; -static AvahiClient *DNSSDClient = NULL; -#endif /* HAVE_MDNSRESPONDER */ - -static int KeepFiles = 0, /* Keep spooled job files? */ - MaxVersion = 20,/* Maximum IPP version (20 = 2.0, 11 = 1.1, etc.) */ - Verbosity = 0; /* Verbosity level */ +static int KeepFiles = 0, // Keep spooled job files? + MaxVersion = 20,// Maximum IPP version (20 = 2.0, 11 = 1.1, etc.) + Verbosity = 0; // Verbosity level static const char *PAMService = NULL; - /* PAM service */ + // PAM service #ifndef _WIN32 -static int StopPrinter = 0;/* Stop the printer server? */ +static int StopPrinter = 0;// Stop the printer server? #endif // !_WIN32 -/* - * 'main()' - Main entry to the sample server. - */ +// +// 'main()' - Main entry to the sample server. +// -int /* O - Exit status */ -main(int argc, /* I - Number of command-line args */ - char *argv[]) /* I - Command-line arguments */ +int // O - Exit status +main(int argc, // I - Number of command-line args + char *argv[]) // I - Command-line arguments { - int i; /* Looping var */ - const char *opt, /* Current option character */ - *attrfile = NULL, /* ippserver attributes file */ - *command = NULL, /* Command to run with job files */ - *device_uri = NULL, /* Device URI */ - *output_format = NULL, /* Output format */ - *icon = NULL, /* Icon file */ - *keypath = NULL, /* Keychain path */ - *location = "", /* Location of printer */ - *make = "Example", /* Manufacturer */ - *model = "Printer", /* Model */ - *name = NULL, /* Printer name */ -#if !CUPS_LITE - *ppdfile = NULL, /* PPD file */ -#endif /* !CUPS_LITE */ - *strings = NULL, /* Strings file */ - *subtypes = "_print"; /* DNS-SD service subtype */ - int legacy = 0, /* Legacy mode? */ - duplex = 0, /* Duplex mode */ - ppm = 10, /* Pages per minute for mono */ - ppm_color = 0, /* Pages per minute for color */ - web_forms = 1; /* Enable website forms? */ - ipp_t *attrs = NULL; /* Printer attributes */ - char directory[1024] = ""; /* Spool directory */ - cups_array_t *docformats = NULL; /* Supported formats */ - const char *servername = NULL; /* Server host name */ - int serverport = 0; /* Server port number (0 = auto) */ - ippeve_printer_t *printer; /* Printer object */ - - - /* - * Parse command-line arguments... - */ - + int i; // Looping var + const char *opt, // Current option character + *attrfile = NULL, // ippserver attributes file + *command = NULL, // Command to run with job files + *device_uri = NULL, // Device URI + *output_format = NULL, // Output format + *icon = NULL, // Icon file + *keypath = NULL, // Keychain path + *location = "", // Location of printer + *make = "Example", // Manufacturer + *model = "Printer", // Model + *name = NULL, // Printer name + *strings = NULL, // Strings file + *subtypes = "_print"; // DNS-SD service subtype + bool legacy = false, // Legacy mode? + duplex = false, // Duplex mode + web_forms = true; // Enable web site forms? + int ppm = 10, // Pages per minute for mono + ppm_color = 0; // Pages per minute for color + ipp_t *attrs = NULL; // Printer attributes + char directory[1024] = ""; // Spool directory + cups_array_t *docformats = NULL; // Supported formats + const char *servername = NULL; // Server host name + int serverport = 0; // Server port number (0 = auto) + ippeve_printer_t *printer; // Printer object + + + _cupsSetLocale(argv); + + // Parse command-line arguments... for (i = 1; i < argc; i ++) { if (!strcmp(argv[i], "--help")) @@ -418,7 +360,7 @@ main(int argc, /* I - Number of command-line args */ } else if (!strcmp(argv[i], "--no-web-forms")) { - web_forms = 0; + web_forms = false; } else if (!strcmp(argv[i], "--pam-service")) { @@ -444,17 +386,17 @@ main(int argc, /* I - Number of command-line args */ { switch (*opt) { - case '2' : /* -2 (enable 2-sided printing) */ - duplex = 1; - legacy = 1; + case '2' : // -2 (enable 2-sided printing) + duplex = true; + legacy = true; break; - case 'A' : /* -A (enable authentication) */ + case 'A' : // -A (enable authentication) if (!PAMService) PAMService = "cups"; break; - case 'D' : /* -D device-uri */ + case 'D' : // -D device-uri i ++; if (i >= argc) usage(1); @@ -462,7 +404,7 @@ main(int argc, /* I - Number of command-line args */ device_uri = argv[i]; break; - case 'F' : /* -F output/format */ + case 'F' : // -F output/format i ++; if (i >= argc) usage(1); @@ -470,7 +412,7 @@ main(int argc, /* I - Number of command-line args */ output_format = argv[i]; break; - case 'K' : /* -K keypath */ + case 'K' : // -K keypath i ++; if (i >= argc) usage(1); @@ -478,26 +420,16 @@ main(int argc, /* I - Number of command-line args */ keypath = argv[i]; break; - case 'M' : /* -M manufacturer */ + case 'M' : // -M manufacturer i ++; if (i >= argc) usage(1); make = argv[i]; - legacy = 1; + legacy = true; break; -#if !CUPS_LITE - case 'P' : /* -P filename.ppd */ - i ++; - if (i >= argc) - usage(1); - - ppdfile = argv[i]; - break; -#endif /* !CUPS_LITE */ - - case 'S' : /* -S filename.strings */ + case 'S' : // -S filename.strings i ++; if (i >= argc) usage(1); @@ -505,7 +437,7 @@ main(int argc, /* I - Number of command-line args */ strings = argv[i]; break; - case 'V' : /* -V max-version */ + case 'V' : // -V max-version i ++; if (i >= argc) usage(1); @@ -518,7 +450,7 @@ main(int argc, /* I - Number of command-line args */ usage(1); break; - case 'a' : /* -a attributes-file */ + case 'a' : // -a attributes-file i ++; if (i >= argc) usage(1); @@ -526,7 +458,7 @@ main(int argc, /* I - Number of command-line args */ attrfile = argv[i]; break; - case 'c' : /* -c command */ + case 'c' : // -c command i ++; if (i >= argc) usage(1); @@ -534,7 +466,7 @@ main(int argc, /* I - Number of command-line args */ command = argv[i]; break; - case 'd' : /* -d spool-directory */ + case 'd' : // -d spool-directory i ++; if (i >= argc) usage(1); @@ -542,16 +474,16 @@ main(int argc, /* I - Number of command-line args */ cupsCopyString(directory, argv[i], sizeof(directory)); break; - case 'f' : /* -f type/subtype[,...] */ + case 'f' : // -f type/subtype[,...] i ++; if (i >= argc) usage(1); docformats = cupsArrayNewStrings(argv[i], ','); - legacy = 1; + legacy = true; break; - case 'i' : /* -i icon.png */ + case 'i' : // -i icon.png i ++; if (i >= argc) usage(1); @@ -559,11 +491,11 @@ main(int argc, /* I - Number of command-line args */ icon = argv[i]; break; - case 'k' : /* -k (keep files) */ + case 'k' : // -k (keep files) KeepFiles = 1; break; - case 'l' : /* -l location */ + case 'l' : // -l location i ++; if (i >= argc) usage(1); @@ -571,16 +503,16 @@ main(int argc, /* I - Number of command-line args */ location = argv[i]; break; - case 'm' : /* -m model */ + case 'm' : // -m model i ++; if (i >= argc) usage(1); model = argv[i]; - legacy = 1; + legacy = true; break; - case 'n' : /* -n hostname */ + case 'n' : // -n hostname i ++; if (i >= argc) usage(1); @@ -588,7 +520,7 @@ main(int argc, /* I - Number of command-line args */ servername = argv[i]; break; - case 'p' : /* -p port */ + case 'p' : // -p port i ++; if (i >= argc || !isdigit(argv[i][0] & 255)) usage(1); @@ -596,7 +528,7 @@ main(int argc, /* I - Number of command-line args */ serverport = atoi(argv[i]); break; - case 'r' : /* -r subtype */ + case 'r' : // -r subtype i ++; if (i >= argc) usage(1); @@ -604,7 +536,7 @@ main(int argc, /* I - Number of command-line args */ subtypes = argv[i]; break; - case 's' : /* -s speed[,color-speed] */ + case 's' : // -s speed[,color-speed] i ++; if (i >= argc) usage(1); @@ -612,14 +544,14 @@ main(int argc, /* I - Number of command-line args */ if (sscanf(argv[i], "%d,%d", &ppm, &ppm_color) < 1) usage(1); - legacy = 1; + legacy = true; break; - case 'v' : /* -v (be verbose) */ + case 'v' : // -v (be verbose) Verbosity ++; break; - default : /* Unknown */ + default : // Unknown _cupsLangPrintf(stderr, _("%s: Unknown option \"-%c\"."), argv[0], *opt); usage(1); } @@ -639,21 +571,13 @@ main(int argc, /* I - Number of command-line args */ if (!name) usage(1); -#if CUPS_LITE if (attrfile != NULL && legacy) usage(1); -#else - if (((ppdfile != NULL) + (attrfile != NULL) + legacy) > 1) - usage(1); -#endif /* CUPS_LITE */ - - /* - * Apply defaults as needed... - */ + // Apply defaults as needed... if (!directory[0]) { - const char *tmpdir; /* Temporary directory */ + const char *tmpdir; // Temporary directory #ifdef _WIN32 if ((tmpdir = getenv("TEMP")) == NULL) @@ -664,7 +588,7 @@ main(int argc, /* I - Number of command-line args */ #else if ((tmpdir = getenv("TMPDIR")) == NULL) tmpdir = "/tmp"; -#endif /* _WIN32 */ +#endif // _WIN32 snprintf(directory, sizeof(directory), "%s/ippeveprinter.%d", tmpdir, (int)getpid()); @@ -678,92 +602,54 @@ main(int argc, /* I - Number of command-line args */ _cupsLangPrintf(stderr, _("Using spool directory \"%s\"."), directory); } - /* - * Initialize DNS-SD... - */ - - dnssd_init(); - - /* - * Create the printer... - */ - - if (!docformats) - docformats = cupsArrayNewStrings(ppm_color > 0 ? "image/jpeg,image/pwg-raster,image/urf": "image/pwg-raster,image/urf", ','); - + // Create the printer... if (attrfile) attrs = load_ippserver_attributes(servername, serverport, attrfile, docformats); -#if !CUPS_LITE - else if (ppdfile) - { - attrs = load_ppd_attributes(ppdfile, docformats); - - if (!command) - command = "ippeveps"; - - if (!output_format) - output_format = "application/postscript"; - } -#endif /* !CUPS_LITE */ else attrs = load_legacy_attributes(make, model, ppm, ppm_color, duplex, docformats); + if (!docformats && !ippFindAttribute(attrs, "document-format-supported", IPP_TAG_MIMETYPE)) + docformats = cupsArrayNewStrings(ppm_color > 0 ? "image/jpeg,image/pwg-raster,image/urf": "image/pwg-raster,image/urf", ','); + if ((printer = create_printer(servername, serverport, name, location, icon, strings, docformats, subtypes, directory, command, device_uri, output_format, attrs)) == NULL) return (1); printer->web_forms = web_forms; -#if !CUPS_LITE - if (ppdfile) - printer->ppdfile = strdup(ppdfile); -#endif /* !CUPS_LITE */ - cupsSetServerCredentials(keypath, printer->hostname, 1); - /* - * Run the print service... - */ - + // Run the print service... run_printer(printer); - /* - * Destroy the printer and exit... - */ - + // Destroy the printer and exit... delete_printer(printer); return (0); } -/* - * 'authenticate_request()' - Try to authenticate the request. - */ +// +// 'authenticate_request()' - Try to authenticate the request. +// -static http_status_t /* O - HTTP_STATUS_CONTINUE to keep going, otherwise status to return */ +static http_status_t // O - HTTP_STATUS_CONTINUE to keep going, otherwise status to return authenticate_request( - ippeve_client_t *client) /* I - Client */ + ippeve_client_t *client) // I - Client { #if HAVE_LIBPAM - /* - * If PAM isn't enabled, return 'continue' now... - */ - - const char *authorization; /* Pointer into Authorization string */ - int userlen; /* Username:password length */ - pam_handle_t *pamh; /* PAM authentication handle */ - int pamerr; /* PAM error code */ - struct pam_conv pamdata; /* PAM conversation data */ - ippeve_authdata_t data; /* Authentication data */ + // If PAM isn't enabled, return 'continue' now... + const char *authorization; // Pointer into Authorization string + int userlen; // Username:password length + pam_handle_t *pamh; // PAM authentication handle + int pamerr; // PAM error code + struct pam_conv pamdata; // PAM conversation data + ippeve_authdata_t data; // Authentication data if (!PAMService) return (HTTP_STATUS_CONTINUE); - /* - * Try authenticating using PAM... - */ - + // Try authenticating using PAM... authorization = httpGetField(client->http, HTTP_FIELD_AUTHORIZATION); if (!*authorization) @@ -826,35 +712,34 @@ authenticate_request( return (HTTP_STATUS_CONTINUE); #else - /* - * No authentication support built-in, return 'continue'... - */ + // No authentication support built-in, return 'continue'... + (void)client; return (HTTP_STATUS_CONTINUE); -#endif /* HAVE_LIBPAM */ +#endif // HAVE_LIBPAM } -/* - * 'clean_jobs()' - Clean out old (completed) jobs. - */ +// +// 'clean_jobs()' - Clean out old (completed) jobs. +// static void -clean_jobs(ippeve_printer_t *printer) /* I - Printer */ +clean_jobs(ippeve_printer_t *printer) // I - Printer { - ippeve_job_t *job; /* Current job */ - time_t cleantime; /* Clean time */ + ippeve_job_t *job; // Current job + time_t cleantime; // Clean time - if (cupsArrayCount(printer->jobs) == 0) + if (cupsArrayGetCount(printer->jobs) == 0) return; cleantime = time(NULL) - 60; cupsRWLockWrite(&(printer->rwlock)); - for (job = (ippeve_job_t *)cupsArrayFirst(printer->jobs); + for (job = (ippeve_job_t *)cupsArrayGetFirst(printer->jobs); job; - job = (ippeve_job_t *)cupsArrayNext(printer->jobs)) + job = (ippeve_job_t *)cupsArrayGetNext(printer->jobs)) if (job->completed && job->completed < cleantime) { cupsArrayRemove(printer->jobs, job); @@ -866,48 +751,48 @@ clean_jobs(ippeve_printer_t *printer) /* I - Printer */ } -/* - * 'compare_jobs()' - Compare two jobs. - */ +// +// 'compare_jobs()' - Compare two jobs. +// -static int /* O - Result of comparison */ -compare_jobs(ippeve_job_t *a, /* I - First job */ - ippeve_job_t *b) /* I - Second job */ +static int // O - Result of comparison +compare_jobs(ippeve_job_t *a, // I - First job + ippeve_job_t *b) // I - Second job { return (b->id - a->id); } -/* - * 'copy_attributes()' - Copy attributes from one request to another. - */ +// +// 'copy_attributes()' - Copy attributes from one request to another. +// static void -copy_attributes(ipp_t *to, /* I - Destination request */ - ipp_t *from, /* I - Source request */ - cups_array_t *ra, /* I - Requested attributes */ - ipp_tag_t group_tag, /* I - Group to copy */ - int quickcopy) /* I - Do a quick copy? */ +copy_attributes(ipp_t *to, // I - Destination request + ipp_t *from, // I - Source request + cups_array_t *ra, // I - Requested attributes + ipp_tag_t group_tag, // I - Group to copy + bool quickcopy) // I - Do a quick copy? { - ippeve_filter_t filter; /* Filter data */ + ippeve_filter_t filter; // Filter data filter.ra = ra; filter.group_tag = group_tag; - ippCopyAttributes(to, from, quickcopy, (ipp_copycb_t)filter_cb, &filter); + ippCopyAttributes(to, from, quickcopy, (ipp_copy_cb_t)filter_cb, &filter); } -/* - * 'copy_job_attrs()' - Copy job attributes to the response. - */ +// +// 'copy_job_attrs()' - Copy job attributes to the response. +// static void copy_job_attributes( - ippeve_client_t *client, /* I - Client */ - ippeve_job_t *job, /* I - Job */ - cups_array_t *ra) /* I - requested-attributes */ + ippeve_client_t *client, // I - Client + ippeve_job_t *job, // I - Job + cups_array_t *ra) // I - requested-attributes { copy_attributes(client->response, job->attrs, ra, IPP_TAG_JOB, 0); @@ -1062,16 +947,16 @@ copy_job_attributes( } -/* - * 'create_client()' - Accept a new network connection and create a client - * object. - */ +// +// 'create_client()' - Accept a new network connection and create a client +// object. +// -static ippeve_client_t * /* O - Client */ -create_client(ippeve_printer_t *printer, /* I - Printer */ - int sock) /* I - Listen socket */ +static ippeve_client_t * // O - Client +create_client(ippeve_printer_t *printer, // I - Printer + int sock) // I - Listen socket { - ippeve_client_t *client; /* Client */ + ippeve_client_t *client; // Client if ((client = calloc(1, sizeof(ippeve_client_t))) == NULL) @@ -1082,10 +967,7 @@ create_client(ippeve_printer_t *printer, /* I - Printer */ client->printer = printer; - /* - * Accept the client and get the remote address... - */ - + // Accept the client and get the remote address... if ((client->http = httpAcceptConnection(sock, 1)) == NULL) { perror("Unable to accept client connection"); @@ -1104,36 +986,30 @@ create_client(ippeve_printer_t *printer, /* I - Printer */ } -/* - * 'create_job()' - Create a new job object from a Print-Job or Create-Job - * request. - */ +// +// 'create_job()' - Create a new job object from a Print-Job or Create-Job +// request. +// -static ippeve_job_t * /* O - Job */ -create_job(ippeve_client_t *client) /* I - Client */ +static ippeve_job_t * // O - Job +create_job(ippeve_client_t *client) // I - Client { - ippeve_job_t *job; /* Job */ - ipp_attribute_t *attr; /* Job attribute */ - char uri[1024], /* job-uri value */ - uuid[64]; /* job-uuid value */ + ippeve_job_t *job; // Job + ipp_attribute_t *attr; // Job attribute + char uri[1024], // job-uri value + uuid[64]; // job-uuid value cupsRWLockWrite(&(client->printer->rwlock)); if (client->printer->active_job && client->printer->active_job->state < IPP_JSTATE_CANCELED) { - /* - * Only accept a single job at a time... - */ - + // Only accept a single job at a time... cupsRWUnlock(&(client->printer->rwlock)); return (NULL); } - /* - * Allocate and initialize the job object... - */ - + // Allocate and initialize the job object... if ((job = calloc(1, sizeof(ippeve_job_t))) == NULL) { perror("Unable to allocate memory for job"); @@ -1146,16 +1022,10 @@ create_job(ippeve_client_t *client) /* I - Client */ job->state = IPP_JSTATE_HELD; job->fd = -1; - /* - * Copy all of the job attributes... - */ - + // Copy all of the job attributes... copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0); - /* - * Get the requesting-user-name, document format, and priority... - */ - + // Get the requesting-user-name, document format, and priority... if ((attr = ippFindAttribute(client->request, "requesting-user-name", IPP_TAG_NAME)) != NULL) job->username = ippGetString(attr, 0, NULL); else @@ -1179,10 +1049,7 @@ create_job(ippeve_client_t *client) /* I - Client */ if ((attr = ippFindAttribute(client->request, "job-name", IPP_TAG_NAME)) != NULL) job->name = ippGetString(attr, 0, NULL); - /* - * Add job description attributes and add to the jobs array... - */ - + // Add job description attributes and add to the jobs array... job->id = client->printer->next_job_id ++; if ((attr = ippFindAttribute(client->request, "printer-uri", IPP_TAG_URI)) != NULL) @@ -1202,7 +1069,7 @@ create_job(ippeve_client_t *client) /* I - Client */ } else { - char printer_uri[1024]; /* job-printer-uri value */ + char printer_uri[1024]; // job-printer-uri value httpAssembleURI(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), "ipp", NULL, client->printer->hostname, client->printer->port, "/ipp/print"); ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, printer_uri); @@ -1219,27 +1086,24 @@ create_job(ippeve_client_t *client) /* I - Client */ } -/* - * 'create_job_file()' - Create a file for the document in a job. - */ +// +// 'create_job_file()' - Create a file for the document in a job. +// -static int /* O - File descriptor or -1 on error */ +static int // O - File descriptor or -1 on error create_job_file( - ippeve_job_t *job, /* I - Job */ - char *fname, /* I - Filename buffer */ - size_t fnamesize, /* I - Size of filename buffer */ - const char *directory, /* I - Directory to store in */ - const char *ext) /* I - Extension (`NULL` for default) */ + ippeve_job_t *job, // I - Job + char *fname, // I - Filename buffer + size_t fnamesize, // I - Size of filename buffer + const char *directory, // I - Directory to store in + const char *ext) // I - Extension (`NULL` for default) { - char name[256], /* "Safe" filename */ - *nameptr; /* Pointer into filename */ - const char *job_name; /* job-name value */ - + char name[256], // "Safe" filename + *nameptr; // Pointer into filename + const char *job_name; // job-name value - /* - * Make a name from the job-name attribute... - */ + // Make a name from the job-name attribute... if ((job_name = ippGetString(ippFindAttribute(job->attrs, "job-name", IPP_TAG_NAME), 0, NULL)) == NULL) job_name = "untitled"; @@ -1260,10 +1124,7 @@ create_job_file( *nameptr = '\0'; - /* - * Figure out the extension... - */ - + // Figure out the extension... if (!ext) { if (!strcasecmp(job->format, "image/jpeg")) @@ -1284,28 +1145,25 @@ create_job_file( ext = "dat"; } - /* - * Create a filename with the job-id, job-name, and document-format (extension)... - */ - + // Create a filename with the job-id, job-name, and document-format (extension)... snprintf(fname, fnamesize, "%s/%d-%s.%s", directory, job->id, name, ext); return (open(fname, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666)); } -/* - * 'create_listener()' - Create a listener socket. - */ +// +// 'create_listener()' - Create a listener socket. +// -static int /* O - Listener socket or -1 on error */ -create_listener(const char *name, /* I - Host name (`NULL` for any address) */ - int port, /* I - Port number */ - int family) /* I - Address family */ +static int // O - Listener socket or -1 on error +create_listener(const char *name, // I - Host name (`NULL` for any address) + int port, // I - Port number + int family) // I - Address family { - int sock; /* Listener socket */ - http_addrlist_t *addrlist; /* Listen address */ - char service[255]; /* Service port */ + int sock; // Listener socket + http_addrlist_t *addrlist; // Listen address + char service[255]; // Service port snprintf(service, sizeof(service), "%d", port); @@ -1320,43 +1178,44 @@ create_listener(const char *name, /* I - Host name (`NULL` for any address) */ } -/* - * 'create_media_col()' - Create a media-col value. - */ - -static ipp_t * /* O - media-col collection */ -create_media_col(const char *media, /* I - Media name */ - const char *source, /* I - Media source, if any */ - const char *type, /* I - Media type, if any */ - int width, /* I - x-dimension in 2540ths */ - int length, /* I - y-dimension in 2540ths */ - int bottom, /* I - Bottom margin in 2540ths */ - int left, /* I - Left margin in 2540ths */ - int right, /* I - Right margin in 2540ths */ - int top) /* I - Top margin in 2540ths */ +// +// 'create_media_col()' - Create a media-col value. +// + +static ipp_t * // O - media-col collection +create_media_col(const char *media, // I - Media name + const char *source, // I - Media source, if any + const char *type, // I - Media type, if any + ipp_t *media_size,// I - media-size collection value + int bottom, // I - Bottom margin in 2540ths + int left, // I - Left margin in 2540ths + int right, // I - Right margin in 2540ths + int top) // I - Top margin in 2540ths { - ipp_t *media_col = ippNew(), /* media-col value */ - *media_size = create_media_size(width, length); - /* media-size value */ - char media_key[256]; /* media-key value */ - const char *media_key_suffix = ""; /* media-key suffix */ + ipp_t *media_col = ippNew(); // media-col value + char media_key[256]; // media-key value + const char *media_key_suffix = ""; // media-key suffix if (bottom == 0 && left == 0 && right == 0 && top == 0) media_key_suffix = "_borderless"; - if (type && source) - snprintf(media_key, sizeof(media_key), "%s_%s_%s%s", media, source, type, media_key_suffix); - else if (type) - snprintf(media_key, sizeof(media_key), "%s__%s%s", media, type, media_key_suffix); - else if (source) - snprintf(media_key, sizeof(media_key), "%s_%s%s", media, source, media_key_suffix); - else - snprintf(media_key, sizeof(media_key), "%s%s", media, media_key_suffix); + if (media) + { + if (type && source) + snprintf(media_key, sizeof(media_key), "%s_%s_%s%s", media, source, type, media_key_suffix); + else if (type) + snprintf(media_key, sizeof(media_key), "%s__%s%s", media, type, media_key_suffix); + else if (source) + snprintf(media_key, sizeof(media_key), "%s_%s%s", media, source, media_key_suffix); + else + snprintf(media_key, sizeof(media_key), "%s%s", media, media_key_suffix); - ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-key", NULL, media_key); + ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-key", NULL, media_key); + } ippAddCollection(media_col, IPP_TAG_PRINTER, "media-size", media_size); - ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-size-name", NULL, media); + if (media) + ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-size-name", NULL, media); if (bottom >= 0) ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-bottom-margin", bottom); if (left >= 0) @@ -1376,81 +1235,99 @@ create_media_col(const char *media, /* I - Media name */ } -/* - * 'create_media_size()' - Create a media-size value. - */ +// +// 'create_media_size()' - Create a media-size value. +// + +static ipp_t * // O - media-col collection +create_media_size(int width, // I - x-dimension in 2540ths + int length) // I - y-dimension in 2540ths +{ + ipp_t *media_size = ippNew(); // media-size value + + + ippAddInteger(media_size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "x-dimension", width); + ippAddInteger(media_size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "y-dimension", length); + + return (media_size); +} + + +// +// 'create_media_size_range()' - Create a ranged media-size value. +// -static ipp_t * /* O - media-col collection */ -create_media_size(int width, /* I - x-dimension in 2540ths */ - int length) /* I - y-dimension in 2540ths */ +static ipp_t * // O - media-col collection +create_media_size_range(int min_width, // I - Minimum x-dimension in 2540ths + int max_width, // I - Maximum x-dimension in 2540ths + int min_length, // I - Minimum x-dimension in 2540ths + int max_length) // I - Maximum y-dimension in 2540ths { - ipp_t *media_size = ippNew(); /* media-size value */ + ipp_t *media_size = ippNew(); // media-size value - ippAddInteger(media_size, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "x-dimension", width); - ippAddInteger(media_size, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "y-dimension", length); + ippAddRange(media_size, IPP_TAG_ZERO, "x-dimension", min_width, max_width); + ippAddRange(media_size, IPP_TAG_ZERO, "y-dimension", min_length, max_length); return (media_size); } -/* - * 'create_printer()' - Create, register, and listen for connections to a - * printer object. - */ +// +// 'create_printer()' - Create, register, and listen for connections to a +// printer object. +// -static ippeve_printer_t * /* O - Printer */ +static ippeve_printer_t * // O - Printer create_printer( - const char *servername, /* I - Server hostname (NULL for default) */ - int serverport, /* I - Server port */ - const char *name, /* I - printer-name */ - const char *location, /* I - printer-location */ - const char *icons, /* I - printer-icons */ - const char *strings, /* I - printer-strings-uri */ - cups_array_t *docformats, /* I - document-format-supported */ - const char *subtypes, /* I - DNS-SD service subtype(s) */ - const char *directory, /* I - Spool directory */ - const char *command, /* I - Command to run on job files, if any */ - const char *device_uri, /* I - Output device, if any */ - const char *output_format, /* I - Output format, if any */ - ipp_t *attrs) /* I - Capability attributes */ + const char *servername, // I - Server hostname (NULL for default) + int serverport, // I - Server port + const char *name, // I - printer-name + const char *location, // I - printer-location + const char *icons, // I - printer-icons + const char *strings, // I - printer-strings-uri + cups_array_t *docformats, // I - document-format-supported + const char *subtypes, // I - DNS-SD service subtype(s) + const char *directory, // I - Spool directory + const char *command, // I - Command to run on job files, if any + const char *device_uri, // I - Output device, if any + const char *output_format, // I - Output format, if any + ipp_t *attrs) // I - Capability attributes { - ippeve_printer_t *printer; /* Printer */ - int i; /* Looping var */ + ippeve_printer_t *printer; // Printer + int i; // Looping var #ifndef _WIN32 - char path[1024]; /* Full path to command */ -#endif /* !_WIN32 */ - unsigned char sha256[32]; /* SHA-256 digest/sum */ - char uuid_data[1024],/* Data to hash for printer-uuid */ - uuid[128], /* printer-uuid */ - *iconsptr; /* Pointer into icons string */ - int k_supported; /* Maximum file size supported */ - int num_formats; /* Number of supported document formats */ - const char *formats[100], /* Supported document formats */ - *format; /* Current format */ - int num_sup_attrs; /* Number of supported attributes */ - const char *sup_attrs[100];/* Supported attributes */ + char path[1024]; // Full path to command +#endif // !_WIN32 + unsigned char sha256[32]; // SHA-256 digest/sum + char uuid_data[1024],// Data to hash for printer-uuid + uuid[128], // printer-uuid + *iconsptr; // Pointer into icons string + int k_supported; // Maximum file size supported + size_t num_formats = 0;// Number of supported document formats + const char *formats[100], // Supported document formats + *format; // Current format + size_t num_sup_attrs; // Number of supported attributes + const char *sup_attrs[100];// Supported attributes char xxx_supported[256]; - /* Name of -supported attribute */ - _cups_globals_t *cg = _cupsGlobals(); - /* Global path values */ + // Name of -supported attribute #ifdef HAVE_STATVFS - struct statvfs spoolinfo; /* FS info for spool directory */ - double spoolsize; /* FS size */ + struct statvfs spoolinfo; // FS info for spool directory + double spoolsize; // FS size #elif defined(HAVE_STATFS) - struct statfs spoolinfo; /* FS info for spool directory */ - double spoolsize; /* FS size */ -#endif /* HAVE_STATVFS */ - static const char * const versions[] =/* ipp-versions-supported values */ + struct statfs spoolinfo; // FS info for spool directory + double spoolsize; // FS size +#endif // HAVE_STATVFS + static const char * const versions[] =// ipp-versions-supported values { "1.1", "2.0" }; - static const char * const features[] =/* ipp-features-supported values */ + static const char * const features[] =// ipp-features-supported values { "ipp-everywhere" }; - static const int ops[] = /* operations-supported values */ + static const int ops[] = // operations-supported values { IPP_OP_PRINT_JOB, IPP_OP_PRINT_URI, @@ -1466,17 +1343,15 @@ create_printer( IPP_OP_CLOSE_JOB, IPP_OP_IDENTIFY_PRINTER }; - static const char * const charsets[] =/* charset-supported values */ + static const char * const charsets[] =// charset-supported values { "us-ascii", "utf-8" }; - static const char * const compressions[] =/* compression-supported values */ + static const char * const compressions[] =// compression-supported values { -#ifdef HAVE_LIBZ "deflate", "gzip", -#endif /* HAVE_LIBZ */ "none" }; static const char * const identify_actions[] = @@ -1485,7 +1360,7 @@ create_printer( "sound" }; static const char * const job_creation[] = - { /* job-creation-attributes-supported values */ + { // job-creation-attributes-supported values "copies", "document-access", "document-charset", @@ -1550,7 +1425,7 @@ create_printer( "y-side2-image-shift" }; static const char * const media_col_supported[] = - { /* media-col-supported values */ + { // media-col-supported values "media-bottom-margin", "media-left-margin", "media-right-margin", @@ -1561,34 +1436,34 @@ create_printer( "media-type" }; static const char * const multiple_document_handling[] = - { /* multiple-document-handling-supported values */ + { // multiple-document-handling-supported values "separate-documents-uncollated-copies", "separate-documents-collated-copies" }; static const char * const reference_uri_schemes_supported[] = - { /* reference-uri-schemes-supported */ + { // reference-uri-schemes-supported "file", "ftp", "http", "https" }; static const char * const uri_authentication_supported[] = - { /* uri-authentication-supported values */ + { // uri-authentication-supported values "none", "none" }; static const char * const uri_authentication_basic[] = - { /* uri-authentication-supported values with authentication */ + { // uri-authentication-supported values with authentication "basic", "basic" }; static const char * const uri_security_supported[] = - { /* uri-security-supported values */ + { // uri-security-supported values "none", "tls" }; static const char * const which_jobs[] = - { /* which-jobs-supported values */ + { // which-jobs-supported values "completed", "not-completed", "aborted", @@ -1602,48 +1477,34 @@ create_printer( #ifndef _WIN32 - /* - * If a command was specified, make sure it exists and is executable... - */ - - if (command) + // If a command was specified, make sure it exists and is executable... + if (command && access(command, X_OK)) { - if (*command == '/' || !strncmp(command, "./", 2)) + if (cupsFileFind(command, getenv("PATH"), true, path, sizeof(path))) { - if (access(command, X_OK)) - { - _cupsLangPrintf(stderr, _("Unable to execute command \"%s\": %s"), command, strerror(errno)); - return (NULL); - } + // Found the command in the current path... + command = path; } else { - snprintf(path, sizeof(path), "%s/command/%s", cg->cups_serverbin, command); - - if (access(path, X_OK)) - { - _cupsLangPrintf(stderr, _("Unable to execute command \"%s\": %s"), path, strerror(errno)); - return (NULL); - } - - command = path; + // No command... + _cupsLangPrintf(stderr, _("Unable to execute command \"%s\": %s"), command, strerror(errno)); + return (NULL); } } -#endif /* !_WIN32 */ - - /* - * Allocate memory for the printer... - */ +#endif // !_WIN32 + // Allocate memory for the printer... if ((printer = calloc(1, sizeof(ippeve_printer_t))) == NULL) { - _cupsLangPrintError(NULL, _("Unable to allocate memory for printer")); + _cupsLangPrintf(stderr, _("Unable to allocate memory for printer: %s"), strerror(errno)); return (NULL); } printer->ipv4 = -1; printer->ipv6 = -1; printer->name = strdup(name); + printer->dnssd = cupsDNSSDNew(NULL, NULL); printer->dnssd_name = strdup(name); printer->dnssd_subtypes = subtypes ? strdup(subtypes) : NULL; printer->command = command ? strdup(command) : NULL; @@ -1658,15 +1519,12 @@ create_printer( printer->state = IPP_PSTATE_IDLE; printer->state_reasons = IPPEVE_PREASON_NONE; printer->state_time = printer->start_time; - printer->jobs = cupsArrayNew((cups_array_func_t)compare_jobs, NULL); + printer->jobs = cupsArrayNew3((cups_array_cb_t)compare_jobs, NULL, NULL, 0, NULL, NULL); printer->next_job_id = 1; if (printer->icons[0]) { - /* - * Extract up to 3 icons... - */ - + // Extract up to 3 icons... for (i = 1, iconsptr = strchr(printer->icons[0], ','); iconsptr && i < 3; i ++, iconsptr = strchr(iconsptr, ',')) { *iconsptr++ = '\0'; @@ -1674,7 +1532,7 @@ create_printer( } if (iconsptr) - *iconsptr = '\0'; /* Strip any icons after the third... */ + *iconsptr = '\0'; // Strip any icons after the third... while (i < 3) { @@ -1689,29 +1547,14 @@ create_printer( } else { - char temp[1024], /* Temporary string */ - *tempptr; /* Pointer into temporary string */ - -#ifdef HAVE_AVAHI - const char *avahi_name = avahi_client_get_host_name_fqdn(DNSSDClient); - - if (avahi_name) - cupsCopyString(temp, avahi_name, sizeof(temp)); - else -#endif /* HAVE_AVAHI */ - - if ((tempptr = strstr(httpGetHostname(NULL, temp, sizeof(temp)), ".lan")) != NULL && !tempptr[5]) - cupsCopyString(tempptr, ".local", sizeof(temp) - (size_t)(tempptr - temp)); + char temp[1024]; // Temporary string - printer->hostname = strdup(temp); + printer->hostname = strdup(cupsDNSSDCopyHostName(printer->dnssd, temp, sizeof(temp))); } cupsRWInit(&(printer->rwlock)); - /* - * Create the listener sockets... - */ - + // Create the listener sockets... if (printer->port) { if ((printer->ipv4 = create_listener(servername, printer->port, AF_INET)) < 0) @@ -1723,20 +1566,14 @@ create_printer( else { #ifdef _WIN32 - /* - * Windows is almost always used as a single user system, so use a default - * port number of 8631. - */ - + // Windows is almost always used as a single user system, so use a default + // port number of 8631. serverport = 8631; #else - /* - * Use 8000 + UID mod 1000 for the default port number... - */ - + // Use 8000 + UID mod 1000 for the default port number... serverport = 8000 + ((int)getuid() % 1000); -#endif /* _WIN32 */ +#endif // _WIN32 while (serverport < 10000) { @@ -1764,10 +1601,7 @@ create_printer( goto bad_printer; } - /* - * Prepare values for the printer attributes... - */ - + // Prepare values for the printer attributes... snprintf(uuid_data, sizeof(uuid_data), "_IPPEVEPRINTER_:%s:%d:%s", printer->hostname, printer->port, printer->name); cupsHashData("sha2-256", (unsigned char *)uuid_data, strlen(uuid_data), sha256, sizeof(sha256)); snprintf(uuid, sizeof(uuid), "urn:uuid:%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", sha256[0], sha256[1], sha256[3], sha256[4], sha256[5], sha256[6], (sha256[10] & 15) | 0x30, sha256[11], (sha256[15] & 0x3f) | 0x40, sha256[16], sha256[20], sha256[21], sha256[25], sha256[26], sha256[30], sha256[31]); @@ -1778,12 +1612,9 @@ create_printer( fprintf(stderr, "printer-uuid=\"%s\"\n", uuid); } - /* - * Get the maximum spool size based on the size of the filesystem used for - * the spool directory. If the host OS doesn't support the statfs call - * or the filesystem is larger than 2TiB, always report INT_MAX. - */ - + // Get the maximum spool size based on the size of the filesystem used for + // the spool directory. If the host OS doesn't support the statfs call + // or the filesystem is larger than 2TiB, always report INT_MAX. #ifdef HAVE_STATVFS if (statvfs(printer->directory, &spoolinfo)) k_supported = INT_MAX; @@ -1804,22 +1635,19 @@ create_printer( #else k_supported = INT_MAX; -#endif /* HAVE_STATVFS */ - - /* - * Assemble the final list of document formats... - */ +#endif // HAVE_STATVFS - if (!cupsArrayFind(docformats, (void *)"application/octet-stream")) - cupsArrayAdd(docformats, (void *)"application/octet-stream"); - - for (num_formats = 0, format = (const char *)cupsArrayFirst(docformats); format && num_formats < (int)(sizeof(formats) / sizeof(formats[0])); format = (const char *)cupsArrayNext(docformats)) - formats[num_formats ++] = format; + // Assemble the final list of document formats... + if (docformats) + { + if (!cupsArrayFind(docformats, (void *)"application/octet-stream")) + cupsArrayAdd(docformats, (void *)"application/octet-stream"); - /* - * Get the list of attributes that can be used when creating a job... - */ + for (format = (const char *)cupsArrayGetFirst(docformats); format && num_formats < (sizeof(formats) / sizeof(formats[0])); format = (const char *)cupsArrayGetNext(docformats)) + formats[num_formats ++] = format; + } + // Get the list of attributes that can be used when creating a job... num_sup_attrs = 0; sup_attrs[num_sup_attrs ++] = "document-access"; sup_attrs[num_sup_attrs ++] = "document-charset"; @@ -1839,159 +1667,152 @@ create_printer( sup_attrs[num_sup_attrs ++] = job_creation[i]; } - /* - * Fill out the rest of the printer attributes. - */ - + // Fill out the rest of the printer attributes. printer->attrs = attrs; - /* charset-configured */ + // charset-configured ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_CHARSET), "charset-configured", NULL, "utf-8"); - /* charset-supported */ + // charset-supported ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_CHARSET), "charset-supported", sizeof(charsets) / sizeof(charsets[0]), NULL, charsets); - /* compression-supported */ + // compression-supported if (!ippFindAttribute(printer->attrs, "compression-supported", IPP_TAG_ZERO)) ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "compression-supported", (int)(sizeof(compressions) / sizeof(compressions[0])), NULL, compressions); - /* document-format-default */ - ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_MIMETYPE), "document-format-default", NULL, "application/octet-stream"); + if (docformats) + { + // document-format-default + if (!ippFindAttribute(printer->attrs, "document-format-default", IPP_TAG_MIMETYPE)) + ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_MIMETYPE), "document-format-default", NULL, "application/octet-stream"); - /* document-format-supported */ - ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_MIMETYPE, "document-format-supported", num_formats, NULL, formats); + // document-format-supported + if (!ippFindAttribute(printer->attrs, "document-format-supported", IPP_TAG_MIMETYPE)) + ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_MIMETYPE, "document-format-supported", num_formats, NULL, formats); + } - /* generated-natural-language-supported */ + // generated-natural-language-supported ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_LANGUAGE), "generated-natural-language-supported", NULL, "en"); - /* identify-actions-default */ + // identify-actions-default ippAddString (printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "identify-actions-default", NULL, "sound"); - /* identify-actions-supported */ + // identify-actions-supported ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "identify-actions-supported", sizeof(identify_actions) / sizeof(identify_actions[0]), NULL, identify_actions); - /* ipp-features-supported */ + // ipp-features-supported ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-features-supported", sizeof(features) / sizeof(features[0]), NULL, features); - /* ipp-versions-supported */ + // ipp-versions-supported if (MaxVersion == 11) ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-versions-supported", NULL, "1.1"); else ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "ipp-versions-supported", (int)(sizeof(versions) / sizeof(versions[0])), NULL, versions); - /* job-creation-attributes-supported */ + // job-creation-attributes-supported ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "job-creation-attributes-supported", num_sup_attrs, NULL, sup_attrs); - /* job-ids-supported */ + // job-ids-supported ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "job-ids-supported", 1); - /* job-k-octets-supported */ + // job-k-octets-supported ippAddRange(printer->attrs, IPP_TAG_PRINTER, "job-k-octets-supported", 0, k_supported); - /* job-priority-default */ + // job-priority-default ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "job-priority-default", 50); - /* job-priority-supported */ + // job-priority-supported ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "job-priority-supported", 1); - /* job-sheets-default */ + // job-sheets-default ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "job-sheets-default", NULL, "none"); - /* job-sheets-supported */ + // job-sheets-supported ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_NAME), "job-sheets-supported", NULL, "none"); - /* media-col-supported */ + // media-col-supported ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-col-supported", (int)(sizeof(media_col_supported) / sizeof(media_col_supported[0])), NULL, media_col_supported); - /* multiple-document-handling-supported */ + // multiple-document-handling-supported ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "multiple-document-handling-supported", sizeof(multiple_document_handling) / sizeof(multiple_document_handling[0]), NULL, multiple_document_handling); - /* multiple-document-jobs-supported */ + // multiple-document-jobs-supported ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "multiple-document-jobs-supported", 0); - /* multiple-operation-time-out */ + // multiple-operation-time-out ippAddInteger(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "multiple-operation-time-out", 60); - /* multiple-operation-time-out-action */ + // multiple-operation-time-out-action ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "multiple-operation-time-out-action", NULL, "abort-job"); - /* natural-language-configured */ + // natural-language-configured ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_LANGUAGE), "natural-language-configured", NULL, "en"); - /* operations-supported */ + // operations-supported ippAddIntegers(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "operations-supported", sizeof(ops) / sizeof(ops[0]), ops); - /* pdl-override-supported */ + // pdl-override-supported ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pdl-override-supported", NULL, "attempted"); - /* preferred-attributes-supported */ + // preferred-attributes-supported ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "preferred-attributes-supported", 0); - /* printer-get-attributes-supported */ + // printer-get-attributes-supported ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "printer-get-attributes-supported", NULL, "document-format"); - /* printer-geo-location */ + // printer-geo-location ippAddOutOfBand(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_UNKNOWN, "printer-geo-location"); - /* printer-is-accepting-jobs */ + // printer-is-accepting-jobs ippAddBoolean(printer->attrs, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1); - /* printer-info */ + // printer-info ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info", NULL, name); - /* printer-location */ + // printer-location ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location", NULL, location); - /* printer-name */ + // printer-name ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name", NULL, name); - /* printer-organization */ + // printer-organization ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-organization", NULL, ""); - /* printer-organizational-unit */ + // printer-organizational-unit ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-organizational-unit", NULL, ""); - /* printer-strings-languages-supported */ + // printer-strings-languages-supported ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_LANGUAGE, "printer-strings-languages-supported", NULL, "en"); - /* printer-uuid */ + // printer-uuid ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uuid", NULL, uuid); - /* reference-uri-scheme-supported */ + // reference-uri-scheme-supported ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_URISCHEME), "reference-uri-schemes-supported", (int)(sizeof(reference_uri_schemes_supported) / sizeof(reference_uri_schemes_supported[0])), NULL, reference_uri_schemes_supported); - /* uri-authentication-supported */ + // uri-authentication-supported if (PAMService) ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-authentication-supported", 2, NULL, uri_authentication_basic); else ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-authentication-supported", 2, NULL, uri_authentication_supported); - /* uri-security-supported */ + // uri-security-supported ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "uri-security-supported", 2, NULL, uri_security_supported); - /* which-jobs-supported */ + // which-jobs-supported ippAddStrings(printer->attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "which-jobs-supported", sizeof(which_jobs) / sizeof(which_jobs[0]), NULL, which_jobs); debug_attributes("Printer", printer->attrs, 0); - /* - * Register the printer with DNS-SD... - */ - + // Register the printer with DNS-SD... if (!register_printer(printer)) goto bad_printer; - /* - * Return it! - */ - + // Return it! return (printer); - /* - * If we get here we were unable to create the printer... - */ - + // If we get here we were unable to create the printer... bad_printer: delete_printer(printer); @@ -2000,19 +1821,19 @@ create_printer( } -/* - * 'debug_attributes()' - Print attributes in a request or response. - */ +// +// 'debug_attributes()' - Print attributes in a request or response. +// static void -debug_attributes(const char *title, /* I - Title */ - ipp_t *ipp, /* I - Request/response */ - int type) /* I - 0 = object, 1 = request, 2 = response */ +debug_attributes(const char *title, // I - Title + ipp_t *ipp, // I - Request/response + int type) // I - 0 = object, 1 = request, 2 = response { - ipp_tag_t group_tag; /* Current group */ - ipp_attribute_t *attr; /* Current attribute */ - char buffer[2048]; /* String buffer for value */ - int major, minor; /* Version */ + ipp_tag_t group_tag; // Current group + ipp_attribute_t *attr; // Current attribute + char buffer[2048]; // String buffer for value + int major, minor; // Version if (Verbosity <= 1) @@ -2029,9 +1850,9 @@ debug_attributes(const char *title, /* I - Title */ ippErrorString(ippGetStatusCode(ipp)), ippGetStatusCode(ipp)); fprintf(stderr, " request-id=%d\n\n", ippGetRequestId(ipp)); - for (attr = ippFirstAttribute(ipp), group_tag = IPP_TAG_ZERO; + for (attr = ippGetFirstAttribute(ipp), group_tag = IPP_TAG_ZERO; attr; - attr = ippNextAttribute(ipp)) + attr = ippGetNextAttribute(ipp)) { if (ippGetGroupTag(attr) != group_tag) { @@ -2050,27 +1871,21 @@ debug_attributes(const char *title, /* I - Title */ } -/* - * 'delete_client()' - Close the socket and free all memory used by a client - * object. - */ +// +// 'delete_client()' - Close the socket and free all memory used by a client +// object. +// static void -delete_client(ippeve_client_t *client) /* I - Client */ +delete_client(ippeve_client_t *client) // I - Client { if (Verbosity) fprintf(stderr, "Closing connection from %s\n", client->hostname); - /* - * Flush pending writes before closing... - */ - + // Flush pending writes before closing... httpFlushWrite(client->http); - /* - * Free memory... - */ - + // Free memory... httpClose(client->http); ippDelete(client->request); @@ -2080,13 +1895,13 @@ delete_client(ippeve_client_t *client) /* I - Client */ } -/* - * 'delete_job()' - Remove from the printer and free all memory used by a job - * object. - */ +// +// 'delete_job()' - Remove from the printer and free all memory used by a job +// object. +// static void -delete_job(ippeve_job_t *job) /* I - Job */ +delete_job(ippeve_job_t *job) // I - Job { if (Verbosity) fprintf(stderr, "[Job %d] Removing job from history.\n", job->id); @@ -2108,13 +1923,14 @@ delete_job(ippeve_job_t *job) /* I - Job */ } -/* - * 'delete_printer()' - Unregister, close listen sockets, and free all memory - * used by a printer object. - */ +// +// 'delete_printer()' - Unregister, close listen sockets, and free all memory +// used by a printer object. +// static void -delete_printer(ippeve_printer_t *printer) /* I - Printer */ +delete_printer( + ippeve_printer_t *printer) // I - Printer { if (printer->ipv4 >= 0) close(printer->ipv4); @@ -2122,23 +1938,7 @@ delete_printer(ippeve_printer_t *printer) /* I - Printer */ if (printer->ipv6 >= 0) close(printer->ipv6); -#if HAVE_MDNSRESPONDER - if (printer->printer_ref) - DNSServiceRefDeallocate(printer->printer_ref); - if (printer->ipp_ref) - DNSServiceRefDeallocate(printer->ipp_ref); - if (printer->ipps_ref) - DNSServiceRefDeallocate(printer->ipps_ref); - if (printer->http_ref) - DNSServiceRefDeallocate(printer->http_ref); -#elif defined(HAVE_AVAHI) - avahi_threaded_poll_lock(DNSSDMaster); - - if (printer->dnssd_ref) - avahi_entry_group_free(printer->dnssd_ref); - - avahi_threaded_poll_unlock(DNSSDMaster); -#endif /* HAVE_MDNSRESPONDER */ + cupsDNSSDDelete(printer->dnssd); if (printer->dnssd_name) free(printer->dnssd_name); @@ -2152,10 +1952,6 @@ delete_printer(ippeve_printer_t *printer) /* I - Printer */ free(printer->command); if (printer->device_uri) free(printer->device_uri); -#if !CUPS_LITE - if (printer->ppdfile) - free(printer->ppdfile); -#endif /* !CUPS_LITE */ if (printer->directory) free(printer->directory); if (printer->hostname) @@ -2168,57 +1964,19 @@ delete_printer(ippeve_printer_t *printer) /* I - Printer */ } -#ifdef HAVE_MDNSRESPONDER -/* - * 'dnssd_callback()' - Handle DNS-SD registration events. - */ - -static void DNSSD_API -dnssd_callback( - DNSServiceRef sdRef, /* I - Service reference */ - DNSServiceFlags flags, /* I - Status flags */ - DNSServiceErrorType errorCode, /* I - Error, if any */ - const char *name, /* I - Service name */ - const char *regtype, /* I - Service type */ - const char *domain, /* I - Domain for service */ - ippeve_printer_t *printer) /* I - Printer */ -{ - (void)sdRef; - (void)flags; - (void)domain; - (void)name; - - if (errorCode == kDNSServiceErr_NameConflict) - { - fputs("DNS-SD service name collision detected.\n", stderr); - printer->dnssd_collision = 1; - } - else if (errorCode) - { - fprintf(stderr, "DNSServiceRegister for %s failed with error %d.\n", regtype, (int)errorCode); - return; - } -} - - -#elif defined(HAVE_AVAHI) -/* - * 'dnssd_callback()' - Handle DNS-SD registration events. - */ +// +// 'dnssd_callback()' - Handle DNS-SD registration events. +// static void dnssd_callback( - AvahiEntryGroup *srv, /* I - Service */ - AvahiEntryGroupState state, /* I - Registration state */ - void *context) /* I - Printer */ + cups_dnssd_service_t *service, // I - Service registration + ippeve_printer_t *printer, // I - Printer + cups_dnssd_flags_t flags) // I - Status flags { - ippeve_printer_t *printer = (ippeve_printer_t *)context; - /* Printer */ - + (void)service; - (void)srv; - - if (state == AVAHI_ENTRY_GROUP_COLLISION) + if (flags & CUPS_DNSSD_FLAGS_COLLISION) { fputs("DNS-SD service name collision detected.\n", stderr); printer->dnssd_collision = 1; @@ -2226,87 +1984,19 @@ dnssd_callback( } -/* - * 'dnssd_client_cb()' - Client callback for Avahi. - * - * Called whenever the client or server state changes... - */ - -static void -dnssd_client_cb( - AvahiClient *c, /* I - Client */ - AvahiClientState state, /* I - Current state */ - void *userdata) /* I - User data (printer) */ -{ - if (!c) - return; - - if (state == AVAHI_CLIENT_FAILURE) - { - if (avahi_client_errno(c) == AVAHI_ERR_DISCONNECTED) - { - fputs("Avahi server crashed, exiting.\n", stderr); - exit(1); - } - } - else - { - fprintf(stderr, "Ignored Avahi state %d.\n", state); - } -} -#endif /* HAVE_MDNSRESPONDER */ - - -/* - * 'dnssd_init()' - Initialize the DNS-SD service connections... - */ - -static void -dnssd_init(void) -{ -#ifdef HAVE_MDNSRESPONDER - if (DNSServiceCreateConnection(&DNSSDMaster) != kDNSServiceErr_NoError) - { - fputs("Error: Unable to initialize DNS-SD.\n", stderr); - exit(1); - } - -#elif defined(HAVE_AVAHI) - int error; /* Error code, if any */ - - if ((DNSSDMaster = avahi_threaded_poll_new()) == NULL) - { - fputs("Error: Unable to initialize DNS-SD.\n", stderr); - exit(1); - } - - if ((DNSSDClient = avahi_client_new(avahi_threaded_poll_get(DNSSDMaster), AVAHI_CLIENT_NO_FAIL, dnssd_client_cb, NULL, &error)) == NULL) - { - fputs("Error: Unable to initialize DNS-SD.\n", stderr); - exit(1); - } - - avahi_threaded_poll_start(DNSSDMaster); -#endif /* HAVE_MDNSRESPONDER */ -} - - -/* - * 'filter_cb()' - Filter printer attributes based on the requested array. - */ +// +// 'filter_cb()' - Filter printer attributes based on the requested array. +// -static int /* O - 1 to copy, 0 to ignore */ -filter_cb(ippeve_filter_t *filter, /* I - Filter parameters */ - ipp_t *dst, /* I - Destination (unused) */ - ipp_attribute_t *attr) /* I - Source attribute */ +static int // O - 1 to copy, 0 to ignore +filter_cb(ippeve_filter_t *filter, // I - Filter parameters + ipp_t *dst, // I - Destination (unused) + ipp_attribute_t *attr) // I - Source attribute { - /* - * Filter attributes as needed... - */ - -#ifndef _WIN32 /* Avoid MS compiler bug */ + // Filter attributes as needed... +#ifndef _WIN32 // Avoid MS compiler bug (void)dst; -#endif /* !_WIN32 */ +#endif // !_WIN32 ipp_tag_t group = ippGetGroupTag(attr); const char *name = ippGetName(attr); @@ -2318,24 +2008,24 @@ filter_cb(ippeve_filter_t *filter, /* I - Filter parameters */ } -/* - * 'find_job()' - Find a job specified in a request. - */ +// +// 'find_job()' - Find a job specified in a request. +// -static ippeve_job_t * /* O - Job or NULL */ -find_job(ippeve_client_t *client) /* I - Client */ +static ippeve_job_t * // O - Job or NULL +find_job(ippeve_client_t *client) // I - Client { - ipp_attribute_t *attr; /* job-id or job-uri attribute */ - ippeve_job_t key, /* Job search key */ - *job; /* Matching job, if any */ + ipp_attribute_t *attr; // job-id or job-uri attribute + ippeve_job_t key, // Job search key + *job; // Matching job, if any if ((attr = ippFindAttribute(client->request, "job-uri", IPP_TAG_URI)) != NULL) { const char *uri = ippGetString(attr, 0, NULL); - /* URI value */ + // URI value const char *uriptr = strrchr(uri, '/'); - /* Pointer to the last slash in the URI */ + // Pointer to the last slash in the URI if (uriptr && isdigit(uriptr[1] & 255)) key.id = atoi(uriptr + 1); @@ -2353,28 +2043,25 @@ find_job(ippeve_client_t *client) /* I - Client */ } -/* - * 'finish_document()' - Finish receiving a document file and start processing. - */ +// +// 'finish_document()' - Finish receiving a document file and start processing. +// static void finish_document_data( - ippeve_client_t *client, /* I - Client */ - ippeve_job_t *job) /* I - Job */ + ippeve_client_t *client, // I - Client + ippeve_job_t *job) // I - Job { - char filename[1024], /* Filename buffer */ - buffer[4096]; /* Copy buffer */ - ssize_t bytes; /* Bytes read */ - cups_array_t *ra; /* Attributes to send in response */ - cups_thread_t t; /* Thread */ + char filename[1024], // Filename buffer + buffer[4096]; // Copy buffer + ssize_t bytes; // Bytes read + cups_array_t *ra; // Attributes to send in response + cups_thread_t t; // Thread - /* - * Create a file for the request data... - * - * TODO: Update code to support piping large raster data to the print command. - */ - + // Create a file for the request data... + // + // TODO: Update code to support piping large raster data to the print command. if ((job->fd = create_job_file(job, filename, sizeof(filename), client->printer->directory, NULL)) < 0) { respond_ipp(client, IPP_STATUS_ERROR_INTERNAL, "Unable to create print file: %s", strerror(errno)); @@ -2385,11 +2072,11 @@ finish_document_data( if (Verbosity) fprintf(stderr, "Created job file \"%s\", format \"%s\".\n", filename, job->format); - while ((bytes = httpRead2(client->http, buffer, sizeof(buffer))) > 0) + while ((bytes = httpRead(client->http, buffer, sizeof(buffer))) > 0) { if (write(job->fd, buffer, (size_t)bytes) < bytes) { - int error = errno; /* Write error */ + int error = errno; // Write error close(job->fd); job->fd = -1; @@ -2404,10 +2091,7 @@ finish_document_data( if (bytes < 0) { - /* - * Got an error while reading the print data, so abort this job. - */ - + // Got an error while reading the print data, so abort this job. close(job->fd); job->fd = -1; @@ -2420,7 +2104,7 @@ finish_document_data( if (close(job->fd)) { - int error = errno; /* Write error */ + int error = errno; // Write error job->fd = -1; @@ -2435,10 +2119,7 @@ finish_document_data( job->filename = strdup(filename); job->state = IPP_JSTATE_PENDING; - /* - * Process the job... - */ - + // Process the job... t = cupsThreadCreate((cups_thread_func_t)process_job, job); if (t) @@ -2451,13 +2132,10 @@ finish_document_data( goto abort_job; } - /* - * Return the job info... - */ - + // Return the job info... respond_ipp(client, IPP_STATUS_OK, NULL); - ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); + ra = cupsArrayNew3((cups_array_cb_t)strcmp, NULL, NULL, 0, NULL, NULL); cupsArrayAdd(ra, "job-id"); cupsArrayAdd(ra, "job-state"); cupsArrayAdd(ra, "job-state-message"); @@ -2468,16 +2146,13 @@ finish_document_data( cupsArrayDelete(ra); return; - /* - * If we get here we had to abort the job... - */ - + // If we get here we had to abort the job... abort_job: job->state = IPP_JSTATE_ABORTED; job->completed = time(NULL); - ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); + ra = cupsArrayNew3((cups_array_cb_t)strcmp, NULL, NULL, 0, NULL, NULL); cupsArrayAdd(ra, "job-id"); cupsArrayAdd(ra, "job-state"); cupsArrayAdd(ra, "job-state-reasons"); @@ -2488,37 +2163,34 @@ finish_document_data( } -/* - * 'finish_uri()' - Finish fetching a document URI and start processing. - */ +// +// 'finish_uri()' - Finish fetching a document URI and start processing. +// static void finish_document_uri( - ippeve_client_t *client, /* I - Client */ - ippeve_job_t *job) /* I - Job */ + ippeve_client_t *client, // I - Client + ippeve_job_t *job) // I - Job { - ipp_attribute_t *uri; /* document-uri */ - char scheme[256], /* URI scheme */ - userpass[256], /* Username and password info */ - hostname[256], /* Hostname */ - resource[1024]; /* Resource path */ - int port; /* Port number */ - http_uri_status_t uri_status; /* URI decode status */ - http_encryption_t encryption; /* Encryption to use, if any */ - http_t *http; /* Connection for http/https URIs */ - http_status_t status; /* Access status for http/https URIs */ - int infile; /* Input file for local file URIs */ - char filename[1024], /* Filename buffer */ - buffer[4096]; /* Copy buffer */ - ssize_t bytes; /* Bytes read */ - ipp_attribute_t *attr; /* Current attribute */ - cups_array_t *ra; /* Attributes to send in response */ - - - /* - * Do we have a file to print? - */ - + ipp_attribute_t *uri; // document-uri + char scheme[256], // URI scheme + userpass[256], // Username and password info + hostname[256], // Hostname + resource[1024]; // Resource path + int port; // Port number + http_uri_status_t uri_status; // URI decode status + http_encryption_t encryption; // Encryption to use, if any + http_t *http; // Connection for http/https URIs + http_status_t status; // Access status for http/https URIs + int infile; // Input file for local file URIs + char filename[1024], // Filename buffer + buffer[4096]; // Copy buffer + ssize_t bytes; // Bytes read + ipp_attribute_t *attr; // Current attribute + cups_array_t *ra; // Attributes to send in response + + + // Do we have a file to print? if (have_document_data(client)) { flush_document_data(client); @@ -2527,10 +2199,7 @@ finish_document_uri( goto abort_job; } - /* - * Do we have a document URI? - */ - + // Do we have a document URI? if ((uri = ippFindAttribute(client->request, "document-uri", IPP_TAG_URI)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing document-uri."); @@ -2563,17 +2232,7 @@ finish_document_uri( goto abort_job; } - if (!strcmp(scheme, "file") && access(resource, R_OK)) - { - respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS, "Unable to access URI: %s", strerror(errno)); - - goto abort_job; - } - - /* - * Get the document format for the job... - */ - + // Get the document format for the job... cupsRWLockWrite(&(client->printer->rwlock)); if ((attr = ippFindAttribute(job->attrs, "document-format", IPP_TAG_MIMETYPE)) != NULL) @@ -2581,10 +2240,7 @@ finish_document_uri( else job->format = "application/octet-stream"; - /* - * Create a file for the request data... - */ - + // Create a file for the request data... if ((job->fd = create_job_file(job, filename, sizeof(filename), client->printer->directory, NULL)) < 0) { cupsRWUnlock(&(client->printer->rwlock)); @@ -2614,7 +2270,7 @@ finish_document_uri( } else if (bytes > 0 && write(job->fd, buffer, (size_t)bytes) < bytes) { - int error = errno; /* Write error */ + int error = errno; // Write error close(job->fd); job->fd = -1; @@ -2652,7 +2308,7 @@ finish_document_uri( httpClearFields(http); httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en"); - if (httpGet(http, resource)) + if (!httpWriteRequest(http, "GET", resource)) { respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS, "Unable to GET URI: %s", strerror(errno)); @@ -2669,7 +2325,7 @@ finish_document_uri( if (status != HTTP_STATUS_OK) { - respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS, "Unable to GET URI: %s", httpStatus(status)); + respond_ipp(client, IPP_STATUS_ERROR_DOCUMENT_ACCESS, "Unable to GET URI: %s", httpStatusString(status)); close(job->fd); job->fd = -1; @@ -2680,11 +2336,11 @@ finish_document_uri( goto abort_job; } - while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0) + while ((bytes = httpRead(http, buffer, sizeof(buffer))) > 0) { if (write(job->fd, buffer, (size_t)bytes) < bytes) { - int error = errno; /* Write error */ + int error = errno; // Write error close(job->fd); job->fd = -1; @@ -2704,7 +2360,7 @@ finish_document_uri( if (close(job->fd)) { - int error = errno; /* Write error */ + int error = errno; // Write error job->fd = -1; @@ -2723,19 +2379,13 @@ finish_document_uri( cupsRWUnlock(&(client->printer->rwlock)); - /* - * Process the job... - */ - + // Process the job... process_job(job); - /* - * Return the job info... - */ - + // Return the job info... respond_ipp(client, IPP_STATUS_OK, NULL); - ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); + ra = cupsArrayNew3((cups_array_cb_t)strcmp, NULL, NULL, 0, NULL, NULL); cupsArrayAdd(ra, "job-id"); cupsArrayAdd(ra, "job-state"); cupsArrayAdd(ra, "job-state-reasons"); @@ -2745,16 +2395,13 @@ finish_document_uri( cupsArrayDelete(ra); return; - /* - * If we get here we had to abort the job... - */ - + // If we get here we had to abort the job... abort_job: job->state = IPP_JSTATE_ABORTED; job->completed = time(NULL); - ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); + ra = cupsArrayNew3((cups_array_cb_t)strcmp, NULL, NULL, 0, NULL, NULL); cupsArrayAdd(ra, "job-id"); cupsArrayAdd(ra, "job-state"); cupsArrayAdd(ra, "job-state-reasons"); @@ -2765,53 +2412,53 @@ finish_document_uri( } -/* - * 'flush_document_data()' - Safely flush remaining document data. - */ +// +// 'flush_document_data()' - Safely flush remaining document data. +// static void flush_document_data( - ippeve_client_t *client) /* I - Client */ + ippeve_client_t *client) // I - Client { - char buffer[8192]; /* Read buffer */ + char buffer[8192]; // Read buffer if (httpGetState(client->http) == HTTP_STATE_POST_RECV) { - while (httpRead2(client->http, buffer, sizeof(buffer)) > 0); + while (httpRead(client->http, buffer, sizeof(buffer)) > 0); } } -/* - * 'have_document_data()' - Determine whether we have more document data. - */ +// +// 'have_document_data()' - Determine whether we have more document data. +// -static int /* O - 1 if data is present, 0 otherwise */ +static bool // O - `true` if data is present, `false` otherwise have_document_data( - ippeve_client_t *client) /* I - Client */ + ippeve_client_t *client) // I - Client { - char temp; /* Data */ + char temp; // Data if (httpGetState(client->http) != HTTP_STATE_POST_RECV) - return (0); + return (false); else return (httpPeek(client->http, &temp, 1) > 0); } -/* - * 'html_escape()' - Write a HTML-safe string. - */ +// +// 'html_escape()' - Write a HTML-safe string. +// -static void -html_escape(ippeve_client_t *client, /* I - Client */ - const char *s, /* I - String to write */ - size_t slen) /* I - Number of characters to write */ +static bool // O - `true` on success, `false` on error +html_escape(ippeve_client_t *client, // I - Client + const char *s, // I - String to write + size_t slen) // I - Number of characters to write { - const char *start, /* Start of segment */ - *end; /* End of string */ + const char *start, // Start of segment + *end; // End of string start = s; @@ -2822,12 +2469,18 @@ html_escape(ippeve_client_t *client, /* I - Client */ if (*s == '&' || *s == '<') { if (s > start) - httpWrite2(client->http, start, (size_t)(s - start)); + { + if (httpWrite(client->http, start, (size_t)(s - start)) < 0) + return (false); + } if (*s == '&') - httpWrite2(client->http, "&", 5); - else - httpWrite2(client->http, "<", 4); + { + if (httpWrite(client->http, "&", 5) < 0) + return (false); + } + else if (httpWrite(client->http, "<", 4) < 0) + return (false); start = s + 1; } @@ -2836,106 +2489,115 @@ html_escape(ippeve_client_t *client, /* I - Client */ } if (s > start) - httpWrite2(client->http, start, (size_t)(s - start)); + { + if (httpWrite(client->http, start, (size_t)(s - start)) < 0) + return (false); + } + + return (true); } -/* - * 'html_footer()' - Show the web interface footer. - * - * This function also writes the trailing 0-length chunk. - */ +// +// 'html_footer()' - Show the web interface footer. +// +// This function also writes the trailing 0-length chunk. +// -static void -html_footer(ippeve_client_t *client) /* I - Client */ +static bool // O - `true` on success, `false` on error +html_footer(ippeve_client_t *client) // I - Client { - html_printf(client, - "\n" - "\n" - "\n"); - httpWrite2(client->http, "", 0); + if (!html_printf(client, + "\n" + "\n" + "\n")) + return (false); + + return (httpWrite(client->http, "", 0) >= 0); } -/* - * 'html_header()' - Show the web interface header and title. - */ +// +// 'html_header()' - Show the web interface header and title. +// -static void -html_header(ippeve_client_t *client, /* I - Client */ - const char *title, /* I - Title */ - int refresh) /* I - Refresh timer, if any */ +static bool // O - `true` on success, `false` on error +html_header(ippeve_client_t *client, // I - Client + const char *title, // I - Title + int refresh) // I - Refresh timer, if any { - html_printf(client, - "\n" - "\n" - "\n" - "%s\n" - "\n" - "\n" - "\n", title); + bool ret = true; // Return value + + ret &= html_printf(client, + "\n" + "\n" + "\n" + "%s\n" + "\n" + "\n" + "\n", title); if (refresh > 0) - html_printf(client, "\n", refresh); - html_printf(client, - "\n" - "\n" - "\n" - "\n" - "" - "" - "" - "" - "
StatusSuppliesMedia
\n" - "
\n", !strcmp(client->uri, "/") ? " sel" : "", !strcmp(client->uri, "/supplies") ? " sel" : "", !strcmp(client->uri, "/media") ? " sel" : ""); + ret &= html_printf(client, "\n", refresh); + ret &= html_printf(client, + "\n" + "\n" + "\n" + "\n" + "" + "" + "" + "" + "
StatusSuppliesMedia
\n" + "
\n", !strcmp(client->uri, "/") ? " sel" : "", !strcmp(client->uri, "/supplies") ? " sel" : "", !strcmp(client->uri, "/media") ? " sel" : ""); + + return (ret); } -/* - * 'html_printf()' - Send formatted text to the client, quoting as needed. - */ +// +// 'html_printf()' - Send formatted text to the client, quoting as needed. +// -static void -html_printf(ippeve_client_t *client, /* I - Client */ - const char *format, /* I - Printf-style format string */ - ...) /* I - Additional arguments as needed */ +static bool // O - `true` on success, `false` on error +html_printf(ippeve_client_t *client, // I - Client + const char *format, // I - Printf-style format string + ...) // I - Additional arguments as needed { - va_list ap; /* Pointer to arguments */ - const char *start; /* Start of string */ - char size, /* Size character (h, l, L) */ - type; /* Format type character */ - int width, /* Width of field */ - prec; /* Number of characters of precision */ - char tformat[100], /* Temporary format string for sprintf() */ - *tptr, /* Pointer into temporary format */ - temp[1024]; /* Buffer for formatted numbers */ - char *s; /* Pointer to string */ - - - /* - * Loop through the format string, formatting as needed... - */ - + bool ret = false; // Return value + va_list ap; // Pointer to arguments + const char *start; // Start of string + char size, // Size character (h, l, L) + type; // Format type character + int width, // Width of field + prec; // Number of characters of precision + char tformat[100], // Temporary format string for sprintf() + *tptr, // Pointer into temporary format + temp[1024]; // Buffer for formatted numbers + char *s; // Pointer to string + + + // Loop through the format string, formatting as needed... va_start(ap, format); start = format; @@ -2944,14 +2606,19 @@ html_printf(ippeve_client_t *client, /* I - Client */ if (*format == '%') { if (format > start) - httpWrite2(client->http, start, (size_t)(format - start)); + { + if (httpWrite(client->http, start, (size_t)(format - start)) < 0) + goto error; + } tptr = tformat; *tptr++ = *format++; if (*format == '%') { - httpWrite2(client->http, "%", 1); + if (httpWrite(client->http, "%", 1) < 0) + goto error; + format ++; start = format; continue; @@ -2961,10 +2628,7 @@ html_printf(ippeve_client_t *client, /* I - Client */ if (*format == '*') { - /* - * Get width from argument... - */ - + // Get width from argument... format ++; width = va_arg(ap, int); @@ -2993,10 +2657,7 @@ html_printf(ippeve_client_t *client, /* I - Client */ if (*format == '*') { - /* - * Get precision from argument... - */ - + // Get precision from argument... format ++; prec = va_arg(ap, int); @@ -3039,7 +2700,6 @@ html_printf(ippeve_client_t *client, /* I - Client */ else size = 0; - if (!*format) { start = format; @@ -3055,7 +2715,7 @@ html_printf(ippeve_client_t *client, /* I - Client */ switch (type) { - case 'E' : /* Floating point formats */ + case 'E' : // Floating point formats case 'G' : case 'e' : case 'f' : @@ -3065,10 +2725,11 @@ html_printf(ippeve_client_t *client, /* I - Client */ snprintf(temp, sizeof(temp), tformat, va_arg(ap, double)); - httpWrite2(client->http, temp, strlen(temp)); + if (httpWrite(client->http, temp, strlen(temp)) < 0) + goto error; break; - case 'B' : /* Integer formats */ + case 'B' : // Integer formats case 'X' : case 'b' : case 'd' : @@ -3083,25 +2744,27 @@ html_printf(ippeve_client_t *client, /* I - Client */ if (size == 'L') snprintf(temp, sizeof(temp), tformat, va_arg(ap, long long)); else -# endif /* HAVE_LONG_LONG */ +# endif // HAVE_LONG_LONG if (size == 'l') snprintf(temp, sizeof(temp), tformat, va_arg(ap, long)); else snprintf(temp, sizeof(temp), tformat, va_arg(ap, int)); - httpWrite2(client->http, temp, strlen(temp)); + if (httpWrite(client->http, temp, strlen(temp)) < 0) + goto error; break; - case 'p' : /* Pointer value */ + case 'p' : // Pointer value if ((size_t)(width + 2) > sizeof(temp)) break; snprintf(temp, sizeof(temp), tformat, va_arg(ap, void *)); - httpWrite2(client->http, temp, strlen(temp)); + if (httpWrite(client->http, temp, strlen(temp)) < 0) + goto error; break; - case 'c' : /* Character or character array */ + case 'c' : // Character or character array if (width <= 1) { temp[0] = (char)va_arg(ap, int); @@ -3112,7 +2775,7 @@ html_printf(ippeve_client_t *client, /* I - Client */ html_escape(client, va_arg(ap, char *), (size_t)width); break; - case 's' : /* String */ + case 's' : // String if ((s = va_arg(ap, char *)) == NULL) s = "(null)"; @@ -3125,37 +2788,39 @@ html_printf(ippeve_client_t *client, /* I - Client */ } if (format > start) - httpWrite2(client->http, start, (size_t)(format - start)); + { + if (httpWrite(client->http, start, (size_t)(format - start)) < 0) + goto error; + } + + ret = true; + + error: va_end(ap); + + return (ret); } -/* - * 'ipp_cancel_job()' - Cancel a job. - */ +// +// 'ipp_cancel_job()' - Cancel a job. +// static void -ipp_cancel_job(ippeve_client_t *client) /* I - Client */ +ipp_cancel_job(ippeve_client_t *client) // I - Client { - ippeve_job_t *job; /* Job information */ - + ippeve_job_t *job; // Job information - /* - * Get the job... - */ + // Get the job... if ((job = find_job(client)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist."); return; } - /* - * See if the job is already completed, canceled, or aborted; if so, - * we can't cancel... - */ - + // See if the job is already completed, canceled, or aborted; if so, we can't cancel... switch (job->state) { case IPP_JSTATE_CANCELED : @@ -3174,10 +2839,7 @@ ipp_cancel_job(ippeve_client_t *client) /* I - Client */ break; default : - /* - * Cancel the job... - */ - + // Cancel the job... cupsRWLockWrite(&(client->printer->rwlock)); if (job->state == IPP_JSTATE_PROCESSING || @@ -3197,35 +2859,28 @@ ipp_cancel_job(ippeve_client_t *client) /* I - Client */ } -/* - * 'ipp_cancel_my_jobs()' - Cancel all jobs. - * - * Note: Since ippeveprinter doesn't do spooling, this really just cancels the - * current job. - */ +// +// 'ipp_cancel_my_jobs()' - Cancel all jobs. +// +// Note: Since ippeveprinter doesn't do spooling, this really just cancels the +// current job. +// static void ipp_cancel_my_jobs( - ippeve_client_t *client) /* I - Client */ + ippeve_client_t *client) // I - Client { - ippeve_job_t *job; /* Job information */ + ippeve_job_t *job; // Job information cupsRWLockWrite(&client->printer->rwlock); if ((job = client->printer->active_job) != NULL) { - /* - * See if the job is already completed, canceled, or aborted; if so, - * we can't cancel... - */ - + // See if the job is already completed, canceled, or aborted; if so, we can't cancel... if (job->state < IPP_JSTATE_CANCELED) { - /* - * Cancel the job... - */ - + // Cancel the job... if (job->state == IPP_JSTATE_PROCESSING || (job->state == IPP_JSTATE_HELD && job->fd >= 0)) { job->cancel = 1; @@ -3244,31 +2899,24 @@ ipp_cancel_my_jobs( } -/* - * 'ipp_close_job()' - Close an open job. - */ +// +// 'ipp_close_job()' - Close an open job. +// static void -ipp_close_job(ippeve_client_t *client) /* I - Client */ +ipp_close_job(ippeve_client_t *client) // I - Client { - ippeve_job_t *job; /* Job information */ + ippeve_job_t *job; // Job information - /* - * Get the job... - */ - + // Get the job... if ((job = find_job(client)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist."); return; } - /* - * See if the job is already completed, canceled, or aborted; if so, - * we can't cancel... - */ - + // See if the job is already completed, canceled, or aborted; if so, we can't cancel... switch (job->state) { case IPP_JSTATE_CANCELED : @@ -3299,21 +2947,18 @@ ipp_close_job(ippeve_client_t *client) /* I - Client */ } -/* - * 'ipp_create_job()' - Create a job object. - */ +// +// 'ipp_create_job()' - Create a job object. +// static void -ipp_create_job(ippeve_client_t *client) /* I - Client */ +ipp_create_job(ippeve_client_t *client) // I - Client { - ippeve_job_t *job; /* New job */ - cups_array_t *ra; /* Attributes to send in response */ + ippeve_job_t *job; // New job + cups_array_t *ra; // Attributes to send in response - /* - * Do we have a file to print? - */ - + // Do we have a file to print? if (have_document_data(client)) { flush_document_data(client); @@ -3322,31 +2967,21 @@ ipp_create_job(ippeve_client_t *client) /* I - Client */ return; } - /* - * Validate print job attributes... - */ - + // Validate print job attributes... if (!valid_job_attributes(client)) return; - /* - * Create the job... - */ - + // Create the job... if ((job = create_job(client)) == NULL) { - respond_ipp(client, IPP_STATUS_ERROR_BUSY, - "Currently printing another job."); + respond_ipp(client, IPP_STATUS_ERROR_BUSY, "Currently printing another job."); return; } - /* - * Return the job info... - */ - + // Return the job info... respond_ipp(client, IPP_STATUS_OK, NULL); - ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); + ra = cupsArrayNew3((cups_array_cb_t)strcmp, NULL, NULL, 0, NULL, NULL); cupsArrayAdd(ra, "job-id"); cupsArrayAdd(ra, "job-state"); cupsArrayAdd(ra, "job-state-message"); @@ -3358,16 +2993,16 @@ ipp_create_job(ippeve_client_t *client) /* I - Client */ } -/* - * 'ipp_get_job_attributes()' - Get the attributes for a job object. - */ +// +// 'ipp_get_job_attributes()' - Get the attributes for a job object. +// static void ipp_get_job_attributes( - ippeve_client_t *client) /* I - Client */ + ippeve_client_t *client) // I - Client { - ippeve_job_t *job; /* Job */ - cups_array_t *ra; /* requested-attributes */ + ippeve_job_t *job; // Job + cups_array_t *ra; // requested-attributes if ((job = find_job(client)) == NULL) @@ -3384,32 +3019,28 @@ ipp_get_job_attributes( } -/* - * 'ipp_get_jobs()' - Get a list of job objects. - */ +// +// 'ipp_get_jobs()' - Get a list of job objects. +// static void -ipp_get_jobs(ippeve_client_t *client) /* I - Client */ +ipp_get_jobs(ippeve_client_t *client) // I - Client { - ipp_attribute_t *attr; /* Current attribute */ + ipp_attribute_t *attr; // Current attribute const char *which_jobs = NULL; - /* which-jobs values */ - int job_comparison; /* Job comparison */ - ipp_jstate_t job_state; /* job-state value */ - int first_job_id, /* First job ID */ - limit, /* Maximum number of jobs to return */ - count; /* Number of jobs that match */ - const char *username; /* Username */ - ippeve_job_t *job; /* Current job pointer */ - cups_array_t *ra; /* Requested attributes array */ - + // which-jobs values + int job_comparison; // Job comparison + ipp_jstate_t job_state; // job-state value + int first_job_id, // First job ID + limit, // Maximum number of jobs to return + count; // Number of jobs that match + const char *username; // Username + ippeve_job_t *job; // Current job pointer + cups_array_t *ra; // Requested attributes array - /* - * See if the "which-jobs" attribute have been specified... - */ - if ((attr = ippFindAttribute(client->request, "which-jobs", - IPP_TAG_KEYWORD)) != NULL) + // See if the "which-jobs" attribute have been specified... + if ((attr = ippFindAttribute(client->request, "which-jobs", IPP_TAG_KEYWORD)) != NULL) { which_jobs = ippGetString(attr, 0, NULL); fprintf(stderr, "%s Get-Jobs which-jobs=%s", client->hostname, which_jobs); @@ -3469,38 +3100,33 @@ ipp_get_jobs(ippeve_client_t *client) /* I - Client */ return; } - /* - * See if they want to limit the number of jobs reported... - */ - - if ((attr = ippFindAttribute(client->request, "limit", - IPP_TAG_INTEGER)) != NULL) + // See if they want to limit the number of jobs reported... + if ((attr = ippFindAttribute(client->request, "limit", IPP_TAG_INTEGER)) != NULL) { limit = ippGetInteger(attr, 0); fprintf(stderr, "%s Get-Jobs limit=%d", client->hostname, limit); } else + { limit = 0; + } - if ((attr = ippFindAttribute(client->request, "first-job-id", - IPP_TAG_INTEGER)) != NULL) + if ((attr = ippFindAttribute(client->request, "first-job-id", IPP_TAG_INTEGER)) != NULL) { first_job_id = ippGetInteger(attr, 0); fprintf(stderr, "%s Get-Jobs first-job-id=%d", client->hostname, first_job_id); } else + { first_job_id = 1; + } - /* - * See if we only want to see jobs for a specific user... - */ - + // See if we only want to see jobs for a specific user... username = NULL; - if ((attr = ippFindAttribute(client->request, "my-jobs", - IPP_TAG_BOOLEAN)) != NULL) + if ((attr = ippFindAttribute(client->request, "my-jobs", IPP_TAG_BOOLEAN)) != NULL) { int my_jobs = ippGetBoolean(attr, 0); @@ -3508,11 +3134,9 @@ ipp_get_jobs(ippeve_client_t *client) /* I - Client */ if (my_jobs) { - if ((attr = ippFindAttribute(client->request, "requesting-user-name", - IPP_TAG_NAME)) == NULL) + if ((attr = ippFindAttribute(client->request, "requesting-user-name", IPP_TAG_NAME)) == NULL) { - respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, - "Need requesting-user-name with my-jobs."); + respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Need requesting-user-name with my-jobs."); return; } @@ -3522,30 +3146,21 @@ ipp_get_jobs(ippeve_client_t *client) /* I - Client */ } } - /* - * OK, build a list of jobs for this printer... - */ - + // OK, build a list of jobs for this printer... ra = ippCreateRequestedArray(client->request); respond_ipp(client, IPP_STATUS_OK, NULL); cupsRWLockRead(&(client->printer->rwlock)); - for (count = 0, job = (ippeve_job_t *)cupsArrayFirst(client->printer->jobs); - (limit <= 0 || count < limit) && job; - job = (ippeve_job_t *)cupsArrayNext(client->printer->jobs)) + for (count = 0, job = (ippeve_job_t *)cupsArrayGetFirst(client->printer->jobs); (limit <= 0 || count < limit) && job; job = (ippeve_job_t *)cupsArrayGetNext(client->printer->jobs)) { - /* - * Filter out jobs that don't match... - */ - + // Filter out jobs that don't match... if ((job_comparison < 0 && job->state > job_state) || (job_comparison == 0 && job->state != job_state) || (job_comparison > 0 && job->state < job_state) || job->id < first_job_id || - (username && job->username && - strcasecmp(username, job->username))) + (username && job->username && strcasecmp(username, job->username))) continue; if (count > 0) @@ -3561,22 +3176,19 @@ ipp_get_jobs(ippeve_client_t *client) /* I - Client */ } -/* - * 'ipp_get_printer_attributes()' - Get the attributes for a printer object. - */ +// +// 'ipp_get_printer_attributes()' - Get the attributes for a printer object. +// static void ipp_get_printer_attributes( - ippeve_client_t *client) /* I - Client */ + ippeve_client_t *client) // I - Client { - cups_array_t *ra; /* Requested attributes array */ - ippeve_printer_t *printer; /* Printer */ + cups_array_t *ra; // Requested attributes array + ippeve_printer_t *printer; // Printer - /* - * Send the attributes... - */ - + // Send the attributes... ra = ippCreateRequestedArray(client->request); printer = client->printer; @@ -3598,8 +3210,8 @@ ipp_get_printer_attributes( if (!ra || cupsArrayFind(ra, "printer-icons")) { - char uris[3][1024]; /* Buffers for URIs */ - const char *values[3]; /* Values for attribute */ + char uris[3][1024]; // Buffers for URIs + const char *values[3]; // Values for attribute httpAssembleURI(HTTP_URI_CODING_ALL, uris[0], sizeof(uris[0]), WEB_SCHEME, NULL, client->host_field, client->host_port, "/icon-sm.png"); httpAssembleURI(HTTP_URI_CODING_ALL, uris[1], sizeof(uris[1]), WEB_SCHEME, NULL, client->host_field, client->host_port, "/icon.png"); @@ -3614,7 +3226,7 @@ ipp_get_printer_attributes( if (!ra || cupsArrayFind(ra, "printer-more-info")) { - char uri[1024]; /* URI value */ + char uri[1024]; // URI value httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), WEB_SCHEME, NULL, client->host_field, client->host_port, "/"); ippAddString(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-more-info", NULL, uri); @@ -3644,10 +3256,10 @@ ipp_get_printer_attributes( } else { - ipp_attribute_t *attr = NULL; /* printer-state-reasons */ - ippeve_preason_t bit; /* Reason bit */ - int i; /* Looping var */ - char reason[32]; /* Reason string */ + ipp_attribute_t *attr = NULL; // printer-state-reasons + ippeve_preason_t bit; // Reason bit + int i; // Looping var + char reason[32]; // Reason string for (i = 0, bit = 1; i < (int)(sizeof(ippeve_preason_strings) / sizeof(ippeve_preason_strings[0])); i ++, bit *= 2) { @@ -3665,7 +3277,7 @@ ipp_get_printer_attributes( if (!ra || cupsArrayFind(ra, "printer-strings-uri")) { - char uri[1024]; /* URI value */ + char uri[1024]; // URI value httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), WEB_SCHEME, NULL, client->host_field, client->host_port, "/en.strings"); ippAddString(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-strings-uri", NULL, uri); @@ -3673,7 +3285,7 @@ ipp_get_printer_attributes( if (!ra || cupsArrayFind(ra, "printer-supply-info-uri")) { - char uri[1024]; /* URI value */ + char uri[1024]; // URI value httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), WEB_SCHEME, NULL, client->host_field, client->host_port, "/supplies"); ippAddString(client->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-supply-info-uri", NULL, uri); @@ -3684,9 +3296,9 @@ ipp_get_printer_attributes( if (!ra || cupsArrayFind(ra, "printer-uri-supported")) { - char uris[2][1024]; /* Buffers for URIs */ - const char *values[2]; /* Values for attribute */ - int num_values = 0; /* Number of values */ + char uris[2][1024]; // Buffers for URIs + const char *values[2]; // Values for attribute + size_t num_values = 0; // Number of values httpAssembleURI(HTTP_URI_CODING_ALL, uris[0], sizeof(uris[0]), "ipp", NULL, client->host_field, client->host_port, "/ipp/print"); values[num_values ++] = uris[0]; @@ -3706,16 +3318,16 @@ ipp_get_printer_attributes( } -/* - * 'ipp_identify_printer()' - Beep or display a message. - */ +// +// 'ipp_identify_printer()' - Beep or display a message. +// static void ipp_identify_printer( - ippeve_client_t *client) /* I - Client */ + ippeve_client_t *client) // I - Client { - ipp_attribute_t *actions, /* identify-actions */ - *message; /* message */ + ipp_attribute_t *actions, // identify-actions + *message; // message actions = ippFindAttribute(client->request, "identify-actions", IPP_TAG_KEYWORD); @@ -3724,9 +3336,9 @@ ipp_identify_printer( if (!actions || ippContainsString(actions, "sound")) { #ifdef __APPLE__ - pid_t pid; /* Process ID for "afplay" utility */ + pid_t pid; // Process ID for "afplay" utility static const char * const afplay[3] = - { /* Arguments for "afplay" utility */ + { // Arguments for "afplay" utility "/usr/bin/afplay", "/System/Library/Sounds/Ping.aiff", NULL @@ -3737,7 +3349,7 @@ ipp_identify_printer( #else putchar(0x07); fflush(stdout); -#endif /* __APPLE__ */ +#endif // __APPLE__ } if (ippContainsString(actions, "display")) @@ -3747,110 +3359,86 @@ ipp_identify_printer( } -/* - * 'ipp_print_job()' - Create a job object with an attached document. - */ +// +// 'ipp_print_job()' - Create a job object with an attached document. +// static void -ipp_print_job(ippeve_client_t *client) /* I - Client */ +ipp_print_job(ippeve_client_t *client) // I - Client { - ippeve_job_t *job; /* New job */ - + ippeve_job_t *job; // New job - /* - * Validate print job attributes... - */ + // Validate print job attributes... if (!valid_job_attributes(client)) { flush_document_data(client); return; } - /* - * Do we have a file to print? - */ - + // Do we have a file to print? if (!have_document_data(client)) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "No file in request."); return; } - /* - * Create the job... - */ - + // Create the job... if ((job = create_job(client)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_BUSY, "Currently printing another job."); return; } - /* - * Then finish getting the document data and process things... - */ - + // Then finish getting the document data and process things... finish_document_data(client, job); } -/* - * 'ipp_print_uri()' - Create a job object with a referenced document. - */ +// +// 'ipp_print_uri()' - Create a job object with a referenced document. +// static void -ipp_print_uri(ippeve_client_t *client) /* I - Client */ +ipp_print_uri(ippeve_client_t *client) // I - Client { - ippeve_job_t *job; /* New job */ - + ippeve_job_t *job; // New job - /* - * Validate print job attributes... - */ + // Validate print job attributes... if (!valid_job_attributes(client)) { flush_document_data(client); return; } - /* - * Create the job... - */ - + // Create the job... if ((job = create_job(client)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_BUSY, "Currently printing another job."); return; } - /* - * Then finish getting the document data and process things... - */ - + // Then finish getting the document data and process things... finish_document_uri(client, job); } -/* - * 'ipp_send_document()' - Add an attached document to a job object created with - * Create-Job. - */ +// +// 'ipp_send_document()' - Add an attached document to a job object created with +// Create-Job. +// static void ipp_send_document( - ippeve_client_t *client) /* I - Client */ + ippeve_client_t *client) // I - Client { - ippeve_job_t *job; /* Job information */ - ipp_attribute_t *attr; /* Current attribute */ - int have_data; /* Have document data? */ + ippeve_job_t *job; // Job information + ipp_attribute_t *attr; // Current attribute + int have_data; // Have document data? - /* - * Get the job... - */ - + // Get the job... if ((job = find_job(client)) == NULL) { flush_document_data(client); @@ -3858,11 +3446,7 @@ ipp_send_document( return; } - /* - * See if we already have a document for this job or the job has already - * in a terminating state... - */ - + // See if we already have a document for this job or the job has already in a terminating state... have_data = have_document_data(client); if ((job->filename || job->fd >= 0) && have_data) @@ -3878,10 +3462,7 @@ ipp_send_document( return; } - /* - * Make sure we have the "last-document" operation attribute... - */ - + // Make sure we have the "last-document" operation attribute... if ((attr = ippFindAttribute(client->request, "last-document", IPP_TAG_ZERO)) == NULL) { flush_document_data(client); @@ -3901,10 +3482,7 @@ ipp_send_document( return; } - /* - * Validate document attributes... - */ - + // Validate document attributes... if (have_data && !valid_doc_attributes(client)) { flush_document_data(client); @@ -3914,10 +3492,7 @@ ipp_send_document( if (!have_data && !job->filename) job->state = IPP_JSTATE_ABORTED; - /* - * Then finish getting the document data and process things... - */ - + // Then finish getting the document data and process things... cupsRWLockWrite(&(client->printer->rwlock)); copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0); @@ -3936,33 +3511,26 @@ ipp_send_document( } -/* - * 'ipp_send_uri()' - Add a referenced document to a job object created with - * Create-Job. - */ +// +// 'ipp_send_uri()' - Add a referenced document to a job object created with +// Create-Job. +// static void -ipp_send_uri(ippeve_client_t *client) /* I - Client */ +ipp_send_uri(ippeve_client_t *client) // I - Client { - ippeve_job_t *job; /* Job information */ - ipp_attribute_t *attr; /* Current attribute */ - + ippeve_job_t *job; // Job information + ipp_attribute_t *attr; // Current attribute - /* - * Get the job... - */ + // Get the job... if ((job = find_job(client)) == NULL) { respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "Job does not exist."); return; } - /* - * See if we already have a document for this job or the job has already - * in a non-terminating state... - */ - + // See if we already have a document for this job or the job has already in a non-terminating state... if (job->filename || job->fd >= 0) { respond_ipp(client, IPP_STATUS_ERROR_MULTIPLE_JOBS_NOT_SUPPORTED, "Multiple document jobs are not supported."); @@ -3991,20 +3559,14 @@ ipp_send_uri(ippeve_client_t *client) /* I - Client */ return; } - /* - * Validate document attributes... - */ - + // Validate document attributes... if (!valid_doc_attributes(client)) { flush_document_data(client); return; } - /* - * Then finish getting the document data and process things... - */ - + // Then finish getting the document data and process things... cupsRWLockWrite(&(client->printer->rwlock)); copy_attributes(job->attrs, client->request, NULL, IPP_TAG_JOB, 0); @@ -4022,32 +3584,32 @@ ipp_send_uri(ippeve_client_t *client) /* I - Client */ } -/* - * 'ipp_validate_job()' - Validate job creation attributes. - */ +// +// 'ipp_validate_job()' - Validate job creation attributes. +// static void -ipp_validate_job(ippeve_client_t *client) /* I - Client */ +ipp_validate_job(ippeve_client_t *client) // I - Client { if (valid_job_attributes(client)) respond_ipp(client, IPP_STATUS_OK, NULL); } -/* - * 'ippserver_attr_cb()' - Determine whether an attribute should be loaded. - */ +// +// 'ippserver_attr_cb()' - Determine whether an attribute should be loaded. +// -static int /* O - 1 to use, 0 to ignore */ +static bool // O - `true` to use, `false` to ignore ippserver_attr_cb( - _ipp_file_t *f, /* I - IPP file */ - void *user_data, /* I - User data pointer (unused) */ - const char *attr) /* I - Attribute name */ + ipp_file_t *f, // I - IPP file + void *user_data, // I - User data pointer (unused) + const char *attr) // I - Attribute name { - int i, /* Current element */ - result; /* Result of comparison */ + int i, // Current element + result; // Result of comparison static const char * const ignored[] = - { /* Ignored attributes */ + { // Ignored attributes "attributes-charset", "attributes-natural-language", "charset-configured", @@ -4066,6 +3628,7 @@ ippserver_attr_cb( "job-ids-supported", "job-k-octets-supported", "job-settable-attributes-supported", + "media-col-supported", "multiple-document-jobs-supported", "multiple-operation-time-out", "multiple-operation-time-out-action", @@ -4136,191 +3699,158 @@ ippserver_attr_cb( } -/* - * 'ippserver_error_cb()' - Log an error message. - */ +// +// 'ippserver_error_cb()' - Log an error message. +// -static int /* O - 1 to continue, 0 to stop */ +static bool // O - `true` to continue, `false` to stop ippserver_error_cb( - _ipp_file_t *f, /* I - IPP file data */ - void *user_data, /* I - User data pointer (unused) */ - const char *error) /* I - Error message */ + ipp_file_t *f, // I - IPP file data + void *user_data, // I - User data pointer (unused) + const char *error) // I - Error message { (void)f; (void)user_data; _cupsLangPrintf(stderr, "%s\n", error); - return (1); -} - - -/* - * 'ippserver_token_cb()' - Process ippserver-specific config file tokens. - */ - -static int /* O - 1 to continue, 0 to stop */ -ippserver_token_cb( - _ipp_file_t *f, /* I - IPP file data */ - _ipp_vars_t *vars, /* I - IPP variables */ - void *user_data, /* I - User data pointer (unused) */ - const char *token) /* I - Current token */ -{ - (void)vars; - (void)user_data; - - if (!token) - { - /* - * NULL token means do the initial setup - create an empty IPP message and - * return... - */ - - f->attrs = ippNew(); - f->group_tag = IPP_TAG_PRINTER; - } - else - { - _cupsLangPrintf(stderr, _("Unknown directive \"%s\" on line %d of \"%s\" ignored."), token, f->linenum, f->filename); - } - - return (1); + return (false); } -/* - * 'load_ippserver_attributes()' - Load IPP attributes from an ippserver file. - */ +// +// 'load_ippserver_attributes()' - Load IPP attributes from an ippserver file. +// -static ipp_t * /* O - IPP attributes or `NULL` on error */ +static ipp_t * // O - IPP attributes or `NULL` on error load_ippserver_attributes( - const char *servername, /* I - Server name or `NULL` for default */ - int serverport, /* I - Server port number */ - const char *filename, /* I - ippserver attribute filename */ - cups_array_t *docformats) /* I - document-format-supported values */ + const char *servername, // I - Server name or `NULL` for default + int serverport, // I - Server port number + const char *filename, // I - ippserver attribute filename + cups_array_t *docformats) // I - document-format-supported values { - ipp_t *attrs; /* IPP attributes */ - _ipp_vars_t vars; /* IPP variables */ - char temp[256]; /* Temporary string */ + ipp_file_t *file; // IPP data file + ipp_t *attrs; // IPP attributes + char temp[256]; // Temporary string - (void)docformats; /* for now */ + (void)docformats; // for now - /* - * Setup callbacks and variables for the printer configuration file... - * - * The following additional variables are supported: - * - * - SERVERNAME: The host name of the server. - * - SERVERPORT: The default port of the server. - */ + // Setup callbacks and variables for the printer configuration file... + // + // The following additional variables are supported: + // + // - SERVERNAME: The host name of the server. + // - SERVERPORT: The default port of the server. + attrs = ippNew(); + file = ippFileNew(NULL, (ipp_fattr_cb_t)ippserver_attr_cb, (ipp_ferror_cb_t)ippserver_error_cb, NULL); - _ippVarsInit(&vars, (_ipp_fattr_cb_t)ippserver_attr_cb, (_ipp_ferror_cb_t)ippserver_error_cb, (_ipp_ftoken_cb_t)ippserver_token_cb); + ippFileSetAttributes(file, attrs); + ippFileSetGroupTag(file, IPP_TAG_PRINTER); if (servername) { - _ippVarsSet(&vars, "SERVERNAME", servername); + ippFileSetVar(file, "SERVERNAME", servername); } else { httpGetHostname(NULL, temp, sizeof(temp)); - _ippVarsSet(&vars, "SERVERNAME", temp); + ippFileSetVar(file, "SERVERNAME", temp); } snprintf(temp, sizeof(temp), "%d", serverport); - _ippVarsSet(&vars, "SERVERPORT", temp); + ippFileSetVar(file, "SERVERPORT", temp); - /* - * Load attributes and values for the printer... - */ + // Load attributes and values for the printer... + ippFileOpen(file, filename, "r"); + ippFileRead(file, NULL, false); - attrs = _ippFileParse(&vars, filename, NULL); - - /* - * Free memory and return... - */ - - _ippVarsDeinit(&vars); + // Free memory and return... + ippFileDelete(file); return (attrs); } -/* - * 'load_legacy_attributes()' - Load IPP attributes using the old ippserver - * options. - */ +// +// 'load_legacy_attributes()' - Load IPP attributes using the old ippserver +// options. +// -static ipp_t * /* O - IPP attributes or `NULL` on error */ +static ipp_t * // O - IPP attributes or `NULL` on error load_legacy_attributes( - const char *make, /* I - Manufacturer name */ - const char *model, /* I - Model name */ - int ppm, /* I - pages-per-minute */ - int ppm_color, /* I - pages-per-minute-color */ - int duplex, /* I - Duplex support? */ - cups_array_t *docformats) /* I - document-format-supported values */ + const char *make, // I - Manufacturer name + const char *model, // I - Model name + int ppm, // I - pages-per-minute + int ppm_color, // I - pages-per-minute-color + int duplex, // I - Duplex support? + cups_array_t *docformats) // I - document-format-supported values { - int i; /* Looping var */ - ipp_t *attrs, /* IPP attributes */ - *col; /* Collection value */ - ipp_attribute_t *attr; /* Current attribute */ - char device_id[1024],/* printer-device-id */ - *ptr, /* Pointer into device ID */ - make_model[128];/* printer-make-and-model */ - const char *format, /* Current document format */ - *prefix; /* Prefix for device ID */ - int num_media; /* Number of media */ - const char * const *media; /* List of media */ - int num_ready; /* Number of loaded media */ - const char * const *ready; /* List of loaded media */ - pwg_media_t *pwg; /* PWG media size information */ + size_t i; // Looping var + ipp_t *attrs, // IPP attributes + *col; // Collection value + ipp_attribute_t *attr; // Current attribute + char device_id[1024],// printer-device-id + *ptr, // Pointer into device ID + make_model[128];// printer-make-and-model + const char *format, // Current document format + *prefix; // Prefix for device ID + size_t num_media; // Number of media + const char * const *media; // List of media + size_t num_ready; // Number of loaded media + const char * const *ready; // List of loaded media + pwg_media_t *pwg; // PWG media size information static const char * const media_supported[] = - { /* media-supported values */ - "na_letter_8.5x11in", /* Letter */ - "na_legal_8.5x14in", /* Legal */ - "iso_a4_210x297mm", /* A4 */ - "na_number-10_4.125x9.5in", /* #10 Envelope */ - "iso_dl_110x220mm" /* DL Envelope */ + { // media-supported values + "na_letter_8.5x11in", // Letter + "na_legal_8.5x14in", // Legal + "iso_a4_210x297mm", // A4 + "na_number-10_4.125x9.5in", // #10 Envelope + "iso_dl_110x220mm" // DL Envelope }; static const char * const media_supported_color[] = - { /* media-supported values */ - "na_letter_8.5x11in", /* Letter */ - "na_legal_8.5x14in", /* Legal */ - "iso_a4_210x297mm", /* A4 */ - "na_number-10_4.125x9.5in", /* #10 Envelope */ - "iso_dl_110x220mm", /* DL Envelope */ - "na_index-3x5_3x5in", /* Photo 3x5 */ - "oe_photo-l_3.5x5in", /* Photo L */ - "na_index-4x6_4x6in", /* Photo 4x6 */ - "iso_a6_105x148mm", /* A6 */ - "na_5x7_5x7in", /* Photo 5x7 aka 2L */ - "iso_a5_148x210mm", /* A5 */ + { // media-supported values + "na_letter_8.5x11in", // Letter + "na_legal_8.5x14in", // Legal + "iso_a4_210x297mm", // A4 + "na_number-10_4.125x9.5in", // #10 Envelope + "iso_dl_110x220mm", // DL Envelope + "na_index-3x5_3x5in", // Photo 3x5 + "oe_photo-l_3.5x5in", // Photo L + "na_index-4x6_4x6in", // Photo 4x6 + "iso_a6_105x148mm", // A6 + "na_5x7_5x7in", // Photo 5x7 aka 2L + "iso_a5_148x210mm", // A5 + "roll_min_4x1in", // Roll + "roll_max_8.5x39.6in" // Roll }; static const char * const media_ready[] = - { /* media-ready values */ - "na_letter_8.5x11in", /* Letter */ - "na_number-10_4.125x9.5in" /* #10 */ + { // media-ready values + "na_letter_8.5x11in", // Letter + "na_number-10_4.125x9.5in" // #10 }; static const char * const media_ready_color[] = - { /* media-ready values */ - "na_letter_8.5x11in", /* Letter */ - "na_index-4x6_4x6in" /* Photo 4x6 */ + { // media-ready values + "na_letter_8.5x11in", // Letter + "na_index-4x6_4x6in", // Photo 4x6 + "roll_current_8.5x0in" // 8.5" roll }; static const char * const media_source_supported[] = - { /* media-source-supported values */ + { // media-source-supported values "auto", "main", "manual", - "by-pass-tray" /* AKA multi-purpose tray */ + "by-pass-tray" // AKA multi-purpose tray }; static const char * const media_source_supported_color[] = - { /* media-source-supported values */ + { // media-source-supported values "auto", "main", - "photo" + "photo", + "roll" }; static const char * const media_type_supported[] = - { /* media-type-supported values */ + { // media-type-supported values "auto", "cardstock", "envelope", @@ -4331,7 +3861,7 @@ load_legacy_attributes( "transparency" }; static const char * const media_type_supported_color[] = - { /* media-type-supported values */ + { // media-type-supported values "auto", "cardstock", "envelope", @@ -4347,43 +3877,43 @@ load_legacy_attributes( "photographic-semi-gloss" }; static const int media_bottom_margin_supported[] = - { /* media-bottom-margin-supported values */ - 635 /* 1/4" */ + { // media-bottom-margin-supported values + 635 // 1/4" }; static const int media_bottom_margin_supported_color[] = - { /* media-bottom/top-margin-supported values */ - 0, /* Borderless */ - 1168 /* 0.46" (common HP inkjet bottom margin) */ + { // media-bottom/top-margin-supported values + 0, // Borderless + 1168 // 0.46" (common HP inkjet bottom margin) }; static const int media_lr_margin_supported[] = - { /* media-left/right-margin-supported values */ - 340, /* 3.4mm (historical HP PCL A4 margin) */ - 635 /* 1/4" */ + { // media-left/right-margin-supported values + 340, // 3.4mm (historical HP PCL A4 margin) + 635 // 1/4" }; static const int media_lr_margin_supported_color[] = - { /* media-left/right-margin-supported values */ - 0, /* Borderless */ - 340, /* 3.4mm (historical HP PCL A4 margin) */ - 635 /* 1/4" */ + { // media-left/right-margin-supported values + 0, // Borderless + 340, // 3.4mm (historical HP PCL A4 margin) + 635 // 1/4" }; static const int media_top_margin_supported[] = - { /* media-top-margin-supported values */ - 635 /* 1/4" */ + { // media-top-margin-supported values + 635 // 1/4" }; static const int media_top_margin_supported_color[] = - { /* media-top/top-margin-supported values */ - 0, /* Borderless */ - 102 /* 0.04" (common HP inkjet top margin */ + { // media-top/top-margin-supported values + 0, // Borderless + 102 // 0.04" (common HP inkjet top margin }; static const int orientation_requested_supported[4] = - { /* orientation-requested-supported values */ + { // orientation-requested-supported values IPP_ORIENT_PORTRAIT, IPP_ORIENT_LANDSCAPE, IPP_ORIENT_REVERSE_LANDSCAPE, IPP_ORIENT_REVERSE_PORTRAIT }; static const char * const overrides_supported[] = - { /* overrides-supported values */ + { // overrides-supported values "document-numbers", "media", "media-col", @@ -4391,43 +3921,44 @@ load_legacy_attributes( "pages" }; static const char * const print_color_mode_supported[] = - { /* print-color-mode-supported values */ + { // print-color-mode-supported values "monochrome" }; static const char * const print_color_mode_supported_color[] = - { /* print-color-mode-supported values */ + { // print-color-mode-supported values "auto", "color", "monochrome" }; static const int print_quality_supported[] = - { /* print-quality-supported values */ + { // print-quality-supported values IPP_QUALITY_DRAFT, IPP_QUALITY_NORMAL, IPP_QUALITY_HIGH }; static const char * const printer_input_tray[] = - { /* printer-input-tray values */ + { // printer-input-tray values "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=-2;level=-2;status=0;name=auto", "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=250;level=100;status=0;name=main", "type=sheetFeedManual;mediafeed=0;mediaxfeed=0;maxcapacity=1;level=-2;status=0;name=manual", "type=sheetFeedAutoNonRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=25;level=-2;status=0;name=by-pass-tray" }; static const char * const printer_input_tray_color[] = - { /* printer-input-tray values */ + { // printer-input-tray values "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=-2;level=-2;status=0;name=auto", "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=250;level=-2;status=0;name=main", - "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=25;level=-2;status=0;name=photo" + "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=25;level=-2;status=0;name=photo", + "type=continuousRoll;mediafeed=0;mediaxfeed=0;maxcapacity=100;level=-2;status=0;name=roll" }; static const char * const printer_supply[] = - { /* printer-supply values */ + { // printer-supply values "index=1;class=receptacleThatIsFilled;type=wasteToner;unit=percent;" "maxcapacity=100;level=25;colorantname=unknown;", "index=2;class=supplyThatIsConsumed;type=toner;unit=percent;" "maxcapacity=100;level=75;colorantname=black;" }; static const char * const printer_supply_color[] = - { /* printer-supply values */ + { // printer-supply values "index=1;class=receptacleThatIsFilled;type=wasteInk;unit=percent;" "maxcapacity=100;level=25;colorantname=unknown;", "index=2;class=supplyThatIsConsumed;type=ink;unit=percent;" @@ -4440,12 +3971,12 @@ load_legacy_attributes( "maxcapacity=100;level=67;colorantname=yellow;" }; static const char * const printer_supply_description[] = - { /* printer-supply-description values */ + { // printer-supply-description values "Toner Waste Tank", "Black Toner" }; static const char * const printer_supply_description_color[] = - { /* printer-supply-description values */ + { // printer-supply-description values "Ink Waste Tank", "Black Ink", "Cyan Ink", @@ -4470,13 +4001,13 @@ load_legacy_attributes( "srgb_16" }; static const char * const sides_supported[] = - { /* sides-supported values */ + { // sides-supported values "one-sided", "two-sided-long-edge", "two-sided-short-edge" }; static const char * const urf_supported[] = - { /* urf-supported values */ + { // urf-supported values "CP1", "IS1-4-5-19", "MT1-2-3-4-5-6", @@ -4485,7 +4016,7 @@ load_legacy_attributes( "W8" }; static const char * const urf_supported_color[] = - { /* urf-supported values */ + { // urf-supported values "CP1", "IS1-4-5-7-19", "MT1-2-3-4-5-6-8-9-10-11-12-13", @@ -4495,7 +4026,7 @@ load_legacy_attributes( "W8" }; static const char * const urf_supported_color_duplex[] = - { /* urf-supported values */ + { // urf-supported values "CP1", "IS1-4-5-7-19", "MT1-2-3-4-5-6-8-9-10-11-12-13", @@ -4506,7 +4037,7 @@ load_legacy_attributes( "DM3" }; static const char * const urf_supported_duplex[] = - { /* urf-supported values */ + { // urf-supported values "CP1", "IS1-4-5-19", "MT1-2-3-4-5-6", @@ -4534,176 +4065,198 @@ load_legacy_attributes( ready = media_ready; } - /* color-supported */ + // color-supported ippAddBoolean(attrs, IPP_TAG_PRINTER, "color-supported", ppm_color > 0); - /* copies-default */ + // copies-default ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "copies-default", 1); - /* copies-supported */ + // copies-supported ippAddRange(attrs, IPP_TAG_PRINTER, "copies-supported", 1, (cupsArrayFind(docformats, (void *)"application/pdf") != NULL || cupsArrayFind(docformats, (void *)"image/jpeg") != NULL) ? 999 : 1); - /* document-password-supported */ + // document-password-supported if (cupsArrayFind(docformats, (void *)"application/pdf")) ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "document-password-supported", 1023); - /* finishing-template-supported */ + // finishing-template-supported ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template-supported", NULL, "none"); - /* finishings-col-database */ + // finishings-col-database col = ippNew(); ippAddString(col, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template", NULL, "none"); ippAddCollection(attrs, IPP_TAG_PRINTER, "finishings-col-database", col); ippDelete(col); - /* finishings-col-default */ + // finishings-col-default col = ippNew(); ippAddString(col, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template", NULL, "none"); ippAddCollection(attrs, IPP_TAG_PRINTER, "finishings-col-default", col); ippDelete(col); - /* finishings-col-ready */ + // finishings-col-ready col = ippNew(); ippAddString(col, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishing-template", NULL, "none"); ippAddCollection(attrs, IPP_TAG_PRINTER, "finishings-col-ready", col); ippDelete(col); - /* finishings-col-supported */ + // finishings-col-supported ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishings-col-supported", NULL, "finishing-template"); - /* finishings-default */ + // finishings-default ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-default", IPP_FINISHINGS_NONE); - /* finishings-ready */ + // finishings-ready ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-ready", IPP_FINISHINGS_NONE); - /* finishings-supported */ + // finishings-supported ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-supported", IPP_FINISHINGS_NONE); - /* media-bottom-margin-supported */ + // media-bottom-margin-supported if (ppm_color > 0) ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-bottom-margin-supported", (int)(sizeof(media_bottom_margin_supported) / sizeof(media_bottom_margin_supported[0])), media_bottom_margin_supported); else ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-bottom-margin-supported", (int)(sizeof(media_bottom_margin_supported_color) / sizeof(media_bottom_margin_supported_color[0])), media_bottom_margin_supported_color); - /* media-col-database and media-col-default */ - attr = ippAddCollections(attrs, IPP_TAG_PRINTER, "media-col-database", num_media, NULL); - for (i = 0; i < num_media; i ++) + // media-col-database and media-col-default + for (i = 0, attr = NULL; i < num_media; i ++) { - int bottom, left, /* media-xxx-margins */ + int bottom, left, // media-xxx-margins right, top; - const char *source; /* media-source, if any */ + const char *source; // media-source, if any pwg = pwgMediaForPWG(media[i]); if (pwg->width < 21000 && pwg->length < 21000) { - source = "photo"; /* Photo size media from photo tray */ - bottom = /* Borderless margins */ + source = "photo"; // Photo size media from photo tray + bottom = // Borderless margins left = right = top = 0; } else if (pwg->width < 21000) { - source = "by-pass-tray"; /* Envelopes from multi-purpose tray */ + source = "by-pass-tray"; // Envelopes from multi-purpose tray bottom = ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0]; - left = /* Left/right margins are standard */ + left = // Left/right margins are standard right = media_lr_margin_supported[1]; top = ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]; } else if (pwg->width == 21000) { - source = NULL; /* A4 from any tray */ + source = NULL; // A4 from any tray bottom = ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0]; - left = /* Left/right margins are reduced */ + left = // Left/right margins are reduced right = media_lr_margin_supported[0]; top = ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]; } else { - source = NULL; /* Other size media from any tray */ + source = NULL; // Other size media from any tray bottom = ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0]; - left = /* Left/right margins are standard */ + left = // Left/right margins are standard right = media_lr_margin_supported[1]; top = ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]; } - col = create_media_col(media[i], source, NULL, pwg->width, pwg->length, bottom, left, right, top); - ippSetCollection(attrs, &attr, i, col); + if (!strncmp(media[i], "roll_min_", 9) && i < (num_media - 1)) + { + // Roll min/max range... + pwg_media_t *pwg2; // Max size + ipp_t *media_size; // media-size member attribute + + i ++; + pwg2 = pwgMediaForPWG(media[i]); + + media_size = ippNew(); + ippAddRange(media_size, IPP_TAG_ZERO, "x-dimension", pwg->width, pwg2->width); + ippAddRange(media_size, IPP_TAG_ZERO, "y-dimension", pwg->length, pwg2->length); + + col = create_media_col(NULL, source, NULL, media_size, bottom, left, right, top); + } + else + { + // Sheet size + col = create_media_col(media[i], source, NULL, create_media_size(pwg->width, pwg->length), bottom, left, right, top); + } + + if (attr) + ippSetCollection(attrs, &attr, ippGetCount(attr), col); + else + attr = ippAddCollection(attrs, IPP_TAG_PRINTER, "media-col-database", col); ippDelete(col); } - /* media-col-default */ + // media-col-default pwg = pwgMediaForPWG(ready[0]); if (pwg->width == 21000) - col = create_media_col(ready[0], "main", "stationery", pwg->width, pwg->length, ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0], media_lr_margin_supported[0], media_lr_margin_supported[0], ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]); + col = create_media_col(ready[0], "main", "stationery", create_media_size(pwg->width, pwg->length), ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0], media_lr_margin_supported[0], media_lr_margin_supported[0], ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]); else - col = create_media_col(ready[0], "main", "stationery", pwg->width, pwg->length, ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0], media_lr_margin_supported[1], media_lr_margin_supported[1], ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]); + col = create_media_col(ready[0], "main", "stationery", create_media_size(pwg->width, pwg->length), ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0], media_lr_margin_supported[1], media_lr_margin_supported[1], ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]); ippAddCollection(attrs, IPP_TAG_PRINTER, "media-col-default", col); ippDelete(col); - /* media-col-ready */ + // media-col-ready attr = ippAddCollections(attrs, IPP_TAG_PRINTER, "media-col-ready", num_ready, NULL); for (i = 0; i < num_ready; i ++) { - int bottom, left, /* media-xxx-margins */ + int bottom, left, // media-xxx-margins right, top; - const char *source, /* media-source */ - *type; /* media-type */ + const char *source, // media-source + *type; // media-type pwg = pwgMediaForPWG(ready[i]); if (pwg->width < 21000 && pwg->length < 21000) { - source = "photo"; /* Photo size media from photo tray */ - type = "photographic-glossy"; /* Glossy photo paper */ - bottom = /* Borderless margins */ + source = "photo"; // Photo size media from photo tray + type = "photographic-glossy"; // Glossy photo paper + bottom = // Borderless margins left = right = top = 0; } else if (pwg->width < 21000) { - source = "by-pass-tray"; /* Envelopes from multi-purpose tray */ - type = "envelope"; /* Envelope */ + source = "by-pass-tray"; // Envelopes from multi-purpose tray + type = "envelope"; // Envelope bottom = ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0]; - left = /* Left/right margins are standard */ + left = // Left/right margins are standard right = media_lr_margin_supported[1]; top = ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]; } else if (pwg->width == 21000) { - source = "main"; /* A4 from main tray */ - type = "stationery"; /* Plain paper */ + source = "main"; // A4 from main tray + type = "stationery"; // Plain paper bottom = ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0]; - left = /* Left/right margins are reduced */ + left = // Left/right margins are reduced right = media_lr_margin_supported[0]; top = ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]; } else { - source = "main"; /* A4 from main tray */ - type = "stationery"; /* Plain paper */ + source = "main"; // A4 from main tray + type = "stationery"; // Plain paper bottom = ppm_color > 0 ? media_bottom_margin_supported_color[1] : media_bottom_margin_supported[0]; - left = /* Left/right margins are standard */ + left = // Left/right margins are standard right = media_lr_margin_supported[1]; top = ppm_color > 0 ? media_top_margin_supported_color[1] : media_top_margin_supported[0]; } - col = create_media_col(ready[i], source, type, pwg->width, pwg->length, bottom, left, right, top); + col = create_media_col(ready[i], source, type, create_media_size(pwg->width, pwg->length), bottom, left, right, top); ippSetCollection(attrs, &attr, i, col); ippDelete(col); } - /* media-default */ + // media-default ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-default", NULL, media[0]); - /* media-left/right-margin-supported */ + // media-left/right-margin-supported if (ppm_color > 0) { ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-left-margin-supported", (int)(sizeof(media_lr_margin_supported_color) / sizeof(media_lr_margin_supported_color[0])), media_lr_margin_supported_color); @@ -4715,108 +4268,126 @@ load_legacy_attributes( ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-right-margin-supported", (int)(sizeof(media_lr_margin_supported) / sizeof(media_lr_margin_supported[0])), media_lr_margin_supported); } - /* media-ready */ + // media-ready ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-ready", num_ready, NULL, ready); - /* media-supported */ + // media-supported ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-supported", num_media, NULL, media); - /* media-size-supported */ - attr = ippAddCollections(attrs, IPP_TAG_PRINTER, "media-size-supported", num_media, NULL); - for (i = 0; i < num_media; i ++) + // media-size-supported + for (i = 0, attr = NULL; i < num_media; i ++) { pwg = pwgMediaForPWG(media[i]); - col = create_media_size(pwg->width, pwg->length); - ippSetCollection(attrs, &attr, i, col); + if (!strncmp(media[i], "roll_min_", 9) && i < (num_media - 1)) + { + // Roll min/max range... + pwg_media_t *pwg2; // Max size + + i ++; + pwg2 = pwgMediaForPWG(media[i]); + + col = create_media_size_range(pwg->width, pwg2->width, pwg->length, pwg2->length); + } + else + { + // Sheet size... + col = create_media_size(pwg->width, pwg->length); + } + + if (attr) + ippSetCollection(attrs, &attr, ippGetCount(attr), col); + else + attr = ippAddCollection(attrs, IPP_TAG_PRINTER, "media-size-supported", col); + ippDelete(col); } - /* media-source-supported */ + // media-source-supported if (ppm_color > 0) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-source-supported", (int)(sizeof(media_source_supported_color) / sizeof(media_source_supported_color[0])), NULL, media_source_supported_color); else ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-source-supported", (int)(sizeof(media_source_supported) / sizeof(media_source_supported[0])), NULL, media_source_supported); - /* media-top-margin-supported */ + // media-top-margin-supported if (ppm_color > 0) ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-top-margin-supported", (int)(sizeof(media_top_margin_supported) / sizeof(media_top_margin_supported[0])), media_top_margin_supported); else ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-top-margin-supported", (int)(sizeof(media_top_margin_supported_color) / sizeof(media_top_margin_supported_color[0])), media_top_margin_supported_color); - /* media-type-supported */ + // media-type-supported if (ppm_color > 0) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-type-supported", (int)(sizeof(media_type_supported_color) / sizeof(media_type_supported_color[0])), NULL, media_type_supported_color); else ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-type-supported", (int)(sizeof(media_type_supported) / sizeof(media_type_supported[0])), NULL, media_type_supported); - /* orientation-requested-default */ + // orientation-requested-default ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "orientation-requested-default", IPP_ORIENT_PORTRAIT); - /* orientation-requested-supported */ + // orientation-requested-supported if (cupsArrayFind(docformats, (void *)"application/pdf") || cupsArrayFind(docformats, (void *)"image/jpeg")) ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "orientation-requested-supported", (int)(sizeof(orientation_requested_supported) / sizeof(orientation_requested_supported[0])), orientation_requested_supported); else ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "orientation-requested-supported", IPP_ORIENT_PORTRAIT); - /* output-bin-default */ + // output-bin-default if (ppm_color > 0) ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-default", NULL, "face-up"); else ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-default", NULL, "face-down"); - /* output-bin-supported */ + // output-bin-supported if (ppm_color > 0) ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-supported", NULL, "face-up"); else ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-supported", NULL, "face-down"); - /* overrides-supported */ + // overrides-supported if (cupsArrayFind(docformats, (void *)"application/pdf")) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "overrides-supported", (int)(sizeof(overrides_supported) / sizeof(overrides_supported[0])), NULL, overrides_supported); - /* page-ranges-supported */ + // page-ranges-supported ippAddBoolean(attrs, IPP_TAG_PRINTER, "page-ranges-supported", cupsArrayFind(docformats, (void *)"application/pdf") != NULL); - /* pages-per-minute */ + // pages-per-minute ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "pages-per-minute", ppm); - /* pages-per-minute-color */ + // pages-per-minute-color if (ppm_color > 0) ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "pages-per-minute-color", ppm_color); - /* print-color-mode-default */ + // print-color-mode-default ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-default", NULL, ppm_color > 0 ? "auto" : "monochrome"); - /* print-color-mode-supported */ + // print-color-mode-supported if (ppm_color > 0) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-supported", (int)(sizeof(print_color_mode_supported_color) / sizeof(print_color_mode_supported_color[0])), NULL, print_color_mode_supported_color); else ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-supported", (int)(sizeof(print_color_mode_supported) / sizeof(print_color_mode_supported[0])), NULL, print_color_mode_supported); - /* print-content-optimize-default */ + // print-content-optimize-default ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-content-optimize-default", NULL, "auto"); - /* print-content-optimize-supported */ + // print-content-optimize-supported ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-content-optimize-supported", NULL, "auto"); - /* print-quality-default */ + // print-quality-default ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-default", IPP_QUALITY_NORMAL); - /* print-quality-supported */ + // print-quality-supported ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-supported", (int)(sizeof(print_quality_supported) / sizeof(print_quality_supported[0])), print_quality_supported); - /* print-rendering-intent-default */ + // print-rendering-intent-default ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-rendering-intent-default", NULL, "auto"); - /* print-rendering-intent-supported */ + // print-rendering-intent-supported ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-rendering-intent-supported", NULL, "auto"); - /* printer-device-id */ + // printer-device-id snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s;", make, model); ptr = device_id + strlen(device_id); prefix = "CMD:"; - for (format = (const char *)cupsArrayFirst(docformats); format; format = (const char *)cupsArrayNext(docformats)) + for (format = (const char *)cupsArrayGetFirst(docformats); format; format = (const char *)cupsArrayGetNext(docformats)) { if (!strcasecmp(format, "application/pdf")) snprintf(ptr, sizeof(device_id) - (size_t)(ptr - device_id), "%sPDF", prefix); @@ -4843,781 +4414,122 @@ load_legacy_attributes( *ptr++ = ';'; *ptr = '\0'; } - ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-device-id", NULL, device_id); - - /* printer-input-tray */ - if (ppm_color > 0) - { - attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-input-tray", printer_input_tray_color[0], (int)strlen(printer_input_tray_color[0])); - for (i = 1; i < (int)(sizeof(printer_input_tray_color) / sizeof(printer_input_tray_color[0])); i ++) - ippSetOctetString(attrs, &attr, i, printer_input_tray_color[i], (int)strlen(printer_input_tray_color[i])); - } - else - { - attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-input-tray", printer_input_tray[0], (int)strlen(printer_input_tray[0])); - for (i = 1; i < (int)(sizeof(printer_input_tray) / sizeof(printer_input_tray[0])); i ++) - ippSetOctetString(attrs, &attr, i, printer_input_tray[i], (int)strlen(printer_input_tray[i])); - } - - /* printer-make-and-model */ - snprintf(make_model, sizeof(make_model), "%s %s", make, model); - ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-make-and-model", NULL, make_model); - - /* printer-resolution-default */ - ippAddResolution(attrs, IPP_TAG_PRINTER, "printer-resolution-default", IPP_RES_PER_INCH, 600, 600); - - /* printer-resolution-supported */ - ippAddResolution(attrs, IPP_TAG_PRINTER, "printer-resolution-supported", IPP_RES_PER_INCH, 600, 600); - - /* printer-supply and printer-supply-description */ - if (ppm_color > 0) - { - attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-supply", printer_supply_color[0], (int)strlen(printer_supply_color[0])); - for (i = 1; i < (int)(sizeof(printer_supply_color) / sizeof(printer_supply_color[0])); i ++) - ippSetOctetString(attrs, &attr, i, printer_supply_color[i], (int)strlen(printer_supply_color[i])); - - ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-supply-description", (int)(sizeof(printer_supply_description_color) / sizeof(printer_supply_description_color[0])), NULL, printer_supply_description_color); - } - else - { - attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-supply", printer_supply[0], (int)strlen(printer_supply[0])); - for (i = 1; i < (int)(sizeof(printer_supply) / sizeof(printer_supply[0])); i ++) - ippSetOctetString(attrs, &attr, i, printer_supply[i], (int)strlen(printer_supply[i])); - - ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-supply-description", (int)(sizeof(printer_supply_description) / sizeof(printer_supply_description[0])), NULL, printer_supply_description); - } - - /* pwg-raster-document-xxx-supported */ - if (cupsArrayFind(docformats, (void *)"image/pwg-raster")) - { - ippAddResolutions(attrs, IPP_TAG_PRINTER, "pwg-raster-document-resolution-supported", (int)(sizeof(pwg_raster_document_resolution_supported) / sizeof(pwg_raster_document_resolution_supported[0])), IPP_RES_PER_INCH, pwg_raster_document_resolution_supported, pwg_raster_document_resolution_supported); - - if (ppm_color > 0 && duplex) - ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-sheet-back", NULL, "rotated"); - else if (duplex) - ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-sheet-back", NULL, "normal"); - - if (ppm_color > 0) - ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-type-supported", (int)(sizeof(pwg_raster_document_type_supported_color) / sizeof(pwg_raster_document_type_supported_color[0])), NULL, pwg_raster_document_type_supported_color); - else - ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-type-supported", (int)(sizeof(pwg_raster_document_type_supported) / sizeof(pwg_raster_document_type_supported[0])), NULL, pwg_raster_document_type_supported); - } - - /* sides-default */ - ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-default", NULL, "one-sided"); - - /* sides-supported */ - if (duplex) - ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-supported", (int)(sizeof(sides_supported) / sizeof(sides_supported[0])), NULL, sides_supported); - else - ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-supported", NULL, "one-sided"); - - /* urf-supported */ - if (cupsArrayFind(docformats, (void *)"image/urf")) - { - if (ppm_color > 0) - { - if (duplex) - ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported_color_duplex) / sizeof(urf_supported_color_duplex[0])), NULL, urf_supported_color_duplex); - else - ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported_color) / sizeof(urf_supported_color[0])), NULL, urf_supported_color); - } - else if (duplex) - { - ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported_duplex) / sizeof(urf_supported_duplex[0])), NULL, urf_supported_duplex); - } - else - { - ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported) / sizeof(urf_supported[0])), NULL, urf_supported); - } - } - - return (attrs); -} - - -#if !CUPS_LITE -/* - * 'load_ppd_attributes()' - Load IPP attributes from a PPD file. - */ - -static ipp_t * /* O - IPP attributes or `NULL` on error */ -load_ppd_attributes( - const char *ppdfile, /* I - PPD filename */ - cups_array_t *docformats) /* I - document-format-supported values */ -{ - int i, j; /* Looping vars */ - ipp_t *attrs; /* Attributes */ - ipp_attribute_t *attr; /* Current attribute */ - ipp_t *col; /* Current collection value */ - ppd_file_t *ppd; /* PPD data */ - ppd_attr_t *ppd_attr; /* PPD attribute */ - ppd_choice_t *ppd_choice; /* PPD choice */ - ppd_size_t *ppd_size; /* Default PPD size */ - pwg_size_t *pwg_size, /* Current PWG size */ - *default_size = NULL; /* Default PWG size */ - const char *default_source = NULL, /* Default media source */ - *default_type = NULL; /* Default media type */ - pwg_map_t *pwg_map; /* Mapping from PWG to PPD keywords */ - _ppd_cache_t *pc; /* PPD cache */ - _pwg_finishings_t *finishings; /* Current finishings value */ - const char *template; /* Current finishings-template value */ - int num_margins; /* Number of media-xxx-margin-supported values */ - int margins[10]; /* media-xxx-margin-supported values */ - int xres, /* Default horizontal resolution */ - yres; /* Default vertical resolution */ - int num_urf; /* Number of urf-supported values */ - const char *urf[10]; /* urf-supported values */ - char urf_rs[32]; /* RS value */ - static const int orientation_requested_supported[4] = - { /* orientation-requested-supported values */ - IPP_ORIENT_PORTRAIT, - IPP_ORIENT_LANDSCAPE, - IPP_ORIENT_REVERSE_LANDSCAPE, - IPP_ORIENT_REVERSE_PORTRAIT - }; - static const char * const overrides_supported[] = - { /* overrides-supported */ - "document-numbers", - "media", - "media-col", - "orientation-requested", - "pages" - }; - static const char * const print_color_mode_supported[] = - { /* print-color-mode-supported values */ - "monochrome" - }; - static const char * const print_color_mode_supported_color[] = - { /* print-color-mode-supported values */ - "auto", - "color", - "monochrome" - }; - static const int print_quality_supported[] = - { /* print-quality-supported values */ - IPP_QUALITY_DRAFT, - IPP_QUALITY_NORMAL, - IPP_QUALITY_HIGH - }; - static const char * const printer_supply[] = - { /* printer-supply values */ - "index=1;class=receptacleThatIsFilled;type=wasteToner;unit=percent;" - "maxcapacity=100;level=25;colorantname=unknown;", - "index=2;class=supplyThatIsConsumed;type=toner;unit=percent;" - "maxcapacity=100;level=75;colorantname=black;" - }; - static const char * const printer_supply_color[] = - { /* printer-supply values */ - "index=1;class=receptacleThatIsFilled;type=wasteInk;unit=percent;" - "maxcapacity=100;level=25;colorantname=unknown;", - "index=2;class=supplyThatIsConsumed;type=ink;unit=percent;" - "maxcapacity=100;level=75;colorantname=black;", - "index=3;class=supplyThatIsConsumed;type=ink;unit=percent;" - "maxcapacity=100;level=50;colorantname=cyan;", - "index=4;class=supplyThatIsConsumed;type=ink;unit=percent;" - "maxcapacity=100;level=33;colorantname=magenta;", - "index=5;class=supplyThatIsConsumed;type=ink;unit=percent;" - "maxcapacity=100;level=67;colorantname=yellow;" - }; - static const char * const printer_supply_description[] = - { /* printer-supply-description values */ - "Toner Waste Tank", - "Black Toner" - }; - static const char * const printer_supply_description_color[] = - { /* printer-supply-description values */ - "Ink Waste Tank", - "Black Ink", - "Cyan Ink", - "Magenta Ink", - "Yellow Ink" - }; - static const char * const pwg_raster_document_type_supported[] = - { - "black_1", - "sgray_8" - }; - static const char * const pwg_raster_document_type_supported_color[] = - { - "black_1", - "sgray_8", - "srgb_8", - "srgb_16" - }; - static const char * const sides_supported[] = - { /* sides-supported values */ - "one-sided", - "two-sided-long-edge", - "two-sided-short-edge" - }; - - - /* - * Open the PPD file... - */ - - if ((ppd = ppdOpenFile(ppdfile)) == NULL) - { - ppd_status_t status; /* Load error */ - - status = ppdLastError(&i); - _cupsLangPrintf(stderr, _("ippeveprinter: Unable to open \"%s\": %s on line %d."), ppdfile, ppdErrorString(status), i); - return (NULL); - } - - ppdMarkDefaults(ppd); - - pc = _ppdCacheCreateWithPPD(ppd); - - if ((ppd_size = ppdPageSize(ppd, NULL)) != NULL) - { - /* - * Look up default size... - */ - - for (i = 0, pwg_size = pc->sizes; i < pc->num_sizes; i ++, pwg_size ++) - { - if (!strcmp(pwg_size->map.ppd, ppd_size->name)) - { - default_size = pwg_size; - break; - } - } - } - - if (!default_size) - { - /* - * Default to A4 or Letter... - */ - - for (i = 0, pwg_size = pc->sizes; i < pc->num_sizes; i ++, pwg_size ++) - { - if (!strcmp(pwg_size->map.ppd, "Letter") || !strcmp(pwg_size->map.ppd, "A4")) - { - default_size = pwg_size; - break; - } - } - - if (!default_size) - default_size = pc->sizes; /* Last resort: first size */ - } - - if ((ppd_choice = ppdFindMarkedChoice(ppd, "InputSlot")) != NULL) - default_source = _ppdCacheGetSource(pc, ppd_choice->choice); - - if ((ppd_choice = ppdFindMarkedChoice(ppd, "MediaType")) != NULL) - default_source = _ppdCacheGetType(pc, ppd_choice->choice); - - if ((ppd_attr = ppdFindAttr(ppd, "DefaultResolution", NULL)) != NULL) - { - /* - * Use the PPD-defined default resolution... - */ - - if ((i = sscanf(ppd_attr->value, "%dx%d", &xres, &yres)) == 1) - yres = xres; - else if (i < 0) - xres = yres = 300; - } - else - { - /* - * Use default of 300dpi... - */ - - xres = yres = 300; - } - - snprintf(urf_rs, sizeof(urf_rs), "RS%d", yres < xres ? yres : xres); - - num_urf = 0; - urf[num_urf ++] = "V1.4"; - urf[num_urf ++] = "CP1"; - urf[num_urf ++] = urf_rs; - urf[num_urf ++] = "W8"; - if (pc->sides_2sided_long) - urf[num_urf ++] = "DM1"; - if (ppd->color_device) - urf[num_urf ++] = "SRGB24"; - - /* - * PostScript printers accept PDF via one of the CUPS PDF to PostScript - * filters, along with PostScript (of course) and JPEG... - */ - - cupsArrayAdd(docformats, "application/pdf"); - cupsArrayAdd(docformats, "application/postscript"); - cupsArrayAdd(docformats, "image/jpeg"); - - /* - * Create the attributes... - */ - - attrs = ippNew(); - - /* color-supported */ - ippAddBoolean(attrs, IPP_TAG_PRINTER, "color-supported", (char)ppd->color_device); - - /* copies-default */ - ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "copies-default", 1); - - /* copies-supported */ - ippAddRange(attrs, IPP_TAG_PRINTER, "copies-supported", 1, 999); - - /* document-password-supported */ - ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "document-password-supported", 127); - - /* finishing-template-supported */ - attr = ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishing-template-supported", cupsArrayCount(pc->templates) + 1, NULL, NULL); - ippSetString(attrs, &attr, 0, "none"); - for (i = 1, template = (const char *)cupsArrayFirst(pc->templates); template; i ++, template = (const char *)cupsArrayNext(pc->templates)) - ippSetString(attrs, &attr, i, template); - - /* finishings-col-database */ - attr = ippAddCollections(attrs, IPP_TAG_PRINTER, "finishings-col-database", cupsArrayCount(pc->templates) + 1, NULL); - - col = ippNew(); - ippAddString(col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishing-template", NULL, "none"); - ippSetCollection(attrs, &attr, 0, col); - ippDelete(col); - - for (i = 1, template = (const char *)cupsArrayFirst(pc->templates); template; i ++, template = (const char *)cupsArrayNext(pc->templates)) - { - col = ippNew(); - ippAddString(col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishing-template", NULL, template); - ippSetCollection(attrs, &attr, i, col); - ippDelete(col); - } - - /* finishings-col-default */ - col = ippNew(); - ippAddString(col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishing-template", NULL, "none"); - ippAddCollection(attrs, IPP_TAG_PRINTER, "finishings-col-default", col); - ippDelete(col); - - /* finishings-col-ready */ - attr = ippAddCollections(attrs, IPP_TAG_PRINTER, "finishings-col-ready", cupsArrayCount(pc->templates) + 1, NULL); - - col = ippNew(); - ippAddString(col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishing-template", NULL, "none"); - ippSetCollection(attrs, &attr, 0, col); - ippDelete(col); - - for (i = 1, template = (const char *)cupsArrayFirst(pc->templates); template; i ++, template = (const char *)cupsArrayNext(pc->templates)) - { - col = ippNew(); - ippAddString(col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "finishing-template", NULL, template); - ippSetCollection(attrs, &attr, i, col); - ippDelete(col); - } - - /* finishings-col-supported */ - ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "finishings-col-supported", NULL, "finishing-template"); - - /* finishings-default */ - ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-default", IPP_FINISHINGS_NONE); - - /* finishings-ready */ - attr = ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-ready", cupsArrayCount(pc->finishings) + 1, NULL); - ippSetInteger(attrs, &attr, 0, IPP_FINISHINGS_NONE); - for (i = 1, finishings = (_pwg_finishings_t *)cupsArrayFirst(pc->finishings); finishings; i ++, finishings = (_pwg_finishings_t *)cupsArrayNext(pc->finishings)) - ippSetInteger(attrs, &attr, i, (int)finishings->value); - - /* finishings-supported */ - attr = ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "finishings-supported", cupsArrayCount(pc->finishings) + 1, NULL); - ippSetInteger(attrs, &attr, 0, IPP_FINISHINGS_NONE); - for (i = 1, finishings = (_pwg_finishings_t *)cupsArrayFirst(pc->finishings); finishings; i ++, finishings = (_pwg_finishings_t *)cupsArrayNext(pc->finishings)) - ippSetInteger(attrs, &attr, i, (int)finishings->value); - - /* media-bottom-margin-supported */ - for (i = 0, num_margins = 0, pwg_size = pc->sizes; i < pc->num_sizes && num_margins < (int)(sizeof(margins) / sizeof(margins[0])); i ++, pwg_size ++) - { - for (j = 0; j < num_margins; j ++) - { - if (margins[j] == pwg_size->bottom) - break; - } - - if (j >= num_margins) - margins[num_margins ++] = pwg_size->bottom; - } - - for (i = 0; i < (num_margins - 1); i ++) - { - for (j = i + 1; j < num_margins; j ++) - { - if (margins[i] > margins[j]) - { - int mtemp = margins[i]; - - margins[i] = margins[j]; - margins[j] = mtemp; - } - } - } - - ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-bottom-margin-supported", num_margins, margins); - - /* media-col-database */ - attr = ippAddCollections(attrs, IPP_TAG_PRINTER, "media-col-database", pc->num_sizes, NULL); - for (i = 0, pwg_size = pc->sizes; i < pc->num_sizes; i ++, pwg_size ++) - { - col = create_media_col(pwg_size->map.pwg, NULL, NULL, pwg_size->width, pwg_size->length, pwg_size->bottom, pwg_size->left, pwg_size->right, pwg_size->top); - ippSetCollection(attrs, &attr, i, col); - ippDelete(col); - } - - /* media-col-default */ - col = create_media_col(default_size->map.pwg, default_source, default_type, default_size->width, default_size->length, default_size->bottom, default_size->left, default_size->right, default_size->top); - ippAddCollection(attrs, IPP_TAG_PRINTER, "media-col-default", col); - ippDelete(col); - - /* media-col-ready */ - col = create_media_col(default_size->map.pwg, default_source, default_type, default_size->width, default_size->length, default_size->bottom, default_size->left, default_size->right, default_size->top); - ippAddCollection(attrs, IPP_TAG_PRINTER, "media-col-ready", col); - ippDelete(col); - - /* media-default */ - ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-default", NULL, default_size->map.pwg); - - /* media-left-margin-supported */ - for (i = 0, num_margins = 0, pwg_size = pc->sizes; i < pc->num_sizes && num_margins < (int)(sizeof(margins) / sizeof(margins[0])); i ++, pwg_size ++) - { - for (j = 0; j < num_margins; j ++) - { - if (margins[j] == pwg_size->left) - break; - } - - if (j >= num_margins) - margins[num_margins ++] = pwg_size->left; - } - - for (i = 0; i < (num_margins - 1); i ++) - { - for (j = i + 1; j < num_margins; j ++) - { - if (margins[i] > margins[j]) - { - int mtemp = margins[i]; - - margins[i] = margins[j]; - margins[j] = mtemp; - } - } - } - - ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-left-margin-supported", num_margins, margins); - - /* media-ready */ - ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-ready", NULL, default_size->map.pwg); - - /* media-right-margin-supported */ - for (i = 0, num_margins = 0, pwg_size = pc->sizes; i < pc->num_sizes && num_margins < (int)(sizeof(margins) / sizeof(margins[0])); i ++, pwg_size ++) - { - for (j = 0; j < num_margins; j ++) - { - if (margins[j] == pwg_size->right) - break; - } - - if (j >= num_margins) - margins[num_margins ++] = pwg_size->right; - } - - for (i = 0; i < (num_margins - 1); i ++) - { - for (j = i + 1; j < num_margins; j ++) - { - if (margins[i] > margins[j]) - { - int mtemp = margins[i]; - - margins[i] = margins[j]; - margins[j] = mtemp; - } - } - } - - ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-right-margin-supported", num_margins, margins); - - /* media-supported */ - attr = ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-supported", pc->num_sizes, NULL, NULL); - for (i = 0, pwg_size = pc->sizes; i < pc->num_sizes; i ++, pwg_size ++) - ippSetString(attrs, &attr, i, pwg_size->map.pwg); - - /* media-size-supported */ - attr = ippAddCollections(attrs, IPP_TAG_PRINTER, "media-size-supported", pc->num_sizes, NULL); - for (i = 0, pwg_size = pc->sizes; i < pc->num_sizes; i ++, pwg_size ++) - { - col = create_media_size(pwg_size->width, pwg_size->length); - ippSetCollection(attrs, &attr, i, col); - ippDelete(col); - } - - /* media-source-supported */ - if (pc->num_sources > 0) - { - attr = ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-source-supported", pc->num_sources, NULL, NULL); - for (i = 0, pwg_map = pc->sources; i < pc->num_sources; i ++, pwg_map ++) - ippSetString(attrs, &attr, i, pwg_map->pwg); - } - else - { - ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-source-supported", NULL, "auto"); - } - - /* media-top-margin-supported */ - for (i = 0, num_margins = 0, pwg_size = pc->sizes; i < pc->num_sizes && num_margins < (int)(sizeof(margins) / sizeof(margins[0])); i ++, pwg_size ++) - { - for (j = 0; j < num_margins; j ++) - { - if (margins[j] == pwg_size->top) - break; - } - - if (j >= num_margins) - margins[num_margins ++] = pwg_size->top; - } - - for (i = 0; i < (num_margins - 1); i ++) - { - for (j = i + 1; j < num_margins; j ++) - { - if (margins[i] > margins[j]) - { - int mtemp = margins[i]; - - margins[i] = margins[j]; - margins[j] = mtemp; - } - } - } - - ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "media-top-margin-supported", num_margins, margins); - - /* media-type-supported */ - if (pc->num_types > 0) - { - attr = ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-type-supported", pc->num_types, NULL, NULL); - for (i = 0, pwg_map = pc->types; i < pc->num_types; i ++, pwg_map ++) - ippSetString(attrs, &attr, i, pwg_map->pwg); - } - else - { - ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "media-type-supported", NULL, "auto"); - } - - /* orientation-requested-default */ - ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "orientation-requested-default", IPP_ORIENT_PORTRAIT); - - /* orientation-requested-supported */ - ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "orientation-requested-supported", (int)(sizeof(orientation_requested_supported) / sizeof(orientation_requested_supported[0])), orientation_requested_supported); - - /* output-bin-default */ - if (pc->num_bins > 0) - ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "output-bin-default", NULL, pc->bins->pwg); - else - ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-default", NULL, "face-down"); - - /* output-bin-supported */ - if (pc->num_bins > 0) - { - attr = ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "output-bin-supported", pc->num_bins, NULL, NULL); - for (i = 0, pwg_map = pc->bins; i < pc->num_bins; i ++, pwg_map ++) - ippSetString(attrs, &attr, i, pwg_map->pwg); - } - else - { - ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "output-bin-supported", NULL, "face-down"); - } - - /* overrides-supported */ - ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "overrides-supported", (int)(sizeof(overrides_supported) / sizeof(overrides_supported[0])), NULL, overrides_supported); - - /* page-ranges-supported */ - ippAddBoolean(attrs, IPP_TAG_PRINTER, "page-ranges-supported", 1); - - /* pages-per-minute */ - ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "pages-per-minute", ppd->throughput); - - /* pages-per-minute-color */ - if (ppd->color_device) - ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "pages-per-minute-color", ppd->throughput); - - /* print-color-mode-default */ - ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-default", NULL, ppd->color_device ? "auto" : "monochrome"); - - /* print-color-mode-supported */ - if (ppd->color_device) - ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-supported", (int)(sizeof(print_color_mode_supported_color) / sizeof(print_color_mode_supported_color[0])), NULL, print_color_mode_supported_color); - else - ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-color-mode-supported", (int)(sizeof(print_color_mode_supported) / sizeof(print_color_mode_supported[0])), NULL, print_color_mode_supported); - - /* print-content-optimize-default */ - ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-content-optimize-default", NULL, "auto"); - - /* print-content-optimize-supported */ - ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-content-optimize-supported", NULL, "auto"); - - /* print-quality-default */ - ippAddInteger(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-default", IPP_QUALITY_NORMAL); - - /* print-quality-supported */ - ippAddIntegers(attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, "print-quality-supported", (int)(sizeof(print_quality_supported) / sizeof(print_quality_supported[0])), print_quality_supported); - - /* print-rendering-intent-default */ - ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-rendering-intent-default", NULL, "auto"); - - /* print-rendering-intent-supported */ - ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "print-rendering-intent-supported", NULL, "auto"); - - /* printer-device-id */ - if ((ppd_attr = ppdFindAttr(ppd, "1284DeviceId", NULL)) != NULL) - { - /* - * Use the device ID string from the PPD... - */ - - ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-device-id", NULL, ppd_attr->value); - } - else - { - /* - * Synthesize a device ID string... - */ - - char device_id[1024]; /* Device ID string */ - - snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s;CMD:PS;", ppd->manufacturer, ppd->modelname); - - ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-device-id", NULL, device_id); - } - - /* printer-input-tray */ - if (pc->num_sources > 0) - { - for (i = 0, attr = NULL; i < pc->num_sources; i ++) - { - char input_tray[1024]; /* printer-input-tray value */ - - if (!strcmp(pc->sources[i].pwg, "manual") || strstr(pc->sources[i].pwg, "-man") != NULL) - snprintf(input_tray, sizeof(input_tray), "type=sheetFeedManual;mediafeed=0;mediaxfeed=0;maxcapacity=1;level=-2;status=0;name=%s", pc->sources[i].pwg); - else - snprintf(input_tray, sizeof(input_tray), "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=250;level=125;status=0;name=%s", pc->sources[i].pwg); + ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-device-id", NULL, device_id); - if (attr) - ippSetOctetString(attrs, &attr, i, input_tray, (int)strlen(input_tray)); - else - attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-input-tray", input_tray, (int)strlen(input_tray)); - } + // printer-input-tray + if (ppm_color > 0) + { + attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-input-tray", printer_input_tray_color[0], strlen(printer_input_tray_color[0])); + for (i = 1; i < (int)(sizeof(printer_input_tray_color) / sizeof(printer_input_tray_color[0])); i ++) + ippSetOctetString(attrs, &attr, i, printer_input_tray_color[i], strlen(printer_input_tray_color[i])); } else { - static const char *printer_input_tray = "type=sheetFeedAutoRemovableTray;mediafeed=0;mediaxfeed=0;maxcapacity=-2;level=-2;status=0;name=auto"; - - ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-input-tray", printer_input_tray, (int)strlen(printer_input_tray)); + attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-input-tray", printer_input_tray[0], strlen(printer_input_tray[0])); + for (i = 1; i < (int)(sizeof(printer_input_tray) / sizeof(printer_input_tray[0])); i ++) + ippSetOctetString(attrs, &attr, i, printer_input_tray[i], strlen(printer_input_tray[i])); } - /* printer-make-and-model */ - ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-make-and-model", NULL, ppd->nickname); + // printer-make-and-model + snprintf(make_model, sizeof(make_model), "%s %s", make, model); + ippAddString(attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-make-and-model", NULL, make_model); - /* printer-resolution-default */ - ippAddResolution(attrs, IPP_TAG_PRINTER, "printer-resolution-default", IPP_RES_PER_INCH, xres, yres); + // printer-resolution-default + ippAddResolution(attrs, IPP_TAG_PRINTER, "printer-resolution-default", IPP_RES_PER_INCH, 600, 600); - /* printer-resolution-supported */ - ippAddResolution(attrs, IPP_TAG_PRINTER, "printer-resolution-supported", IPP_RES_PER_INCH, xres, yres); + // printer-resolution-supported + ippAddResolution(attrs, IPP_TAG_PRINTER, "printer-resolution-supported", IPP_RES_PER_INCH, 600, 600); - /* printer-supply and printer-supply-description */ - if (ppd->color_device) + // printer-supply and printer-supply-description + if (ppm_color > 0) { - attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-supply", printer_supply_color[0], (int)strlen(printer_supply_color[0])); + attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-supply", printer_supply_color[0], strlen(printer_supply_color[0])); for (i = 1; i < (int)(sizeof(printer_supply_color) / sizeof(printer_supply_color[0])); i ++) - ippSetOctetString(attrs, &attr, i, printer_supply_color[i], (int)strlen(printer_supply_color[i])); + ippSetOctetString(attrs, &attr, i, printer_supply_color[i], strlen(printer_supply_color[i])); ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-supply-description", (int)(sizeof(printer_supply_description_color) / sizeof(printer_supply_description_color[0])), NULL, printer_supply_description_color); } else { - attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-supply", printer_supply[0], (int)strlen(printer_supply[0])); + attr = ippAddOctetString(attrs, IPP_TAG_PRINTER, "printer-supply", printer_supply[0], strlen(printer_supply[0])); for (i = 1; i < (int)(sizeof(printer_supply) / sizeof(printer_supply[0])); i ++) - ippSetOctetString(attrs, &attr, i, printer_supply[i], (int)strlen(printer_supply[i])); + ippSetOctetString(attrs, &attr, i, printer_supply[i], strlen(printer_supply[i])); ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_TEXT), "printer-supply-description", (int)(sizeof(printer_supply_description) / sizeof(printer_supply_description[0])), NULL, printer_supply_description); } - /* pwg-raster-document-xxx-supported */ + // pwg-raster-document-xxx-supported if (cupsArrayFind(docformats, (void *)"image/pwg-raster")) { - ippAddResolution(attrs, IPP_TAG_PRINTER, "pwg-raster-document-resolution-supported", IPP_RES_PER_INCH, xres, yres); + ippAddResolutions(attrs, IPP_TAG_PRINTER, "pwg-raster-document-resolution-supported", (int)(sizeof(pwg_raster_document_resolution_supported) / sizeof(pwg_raster_document_resolution_supported[0])), IPP_RES_PER_INCH, pwg_raster_document_resolution_supported, pwg_raster_document_resolution_supported); - if (pc->sides_2sided_long) + if (ppm_color > 0 && duplex) + ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-sheet-back", NULL, "rotated"); + else if (duplex) ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-sheet-back", NULL, "normal"); - if (ppd->color_device) + if (ppm_color > 0) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-type-supported", (int)(sizeof(pwg_raster_document_type_supported_color) / sizeof(pwg_raster_document_type_supported_color[0])), NULL, pwg_raster_document_type_supported_color); else ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "pwg-raster-document-type-supported", (int)(sizeof(pwg_raster_document_type_supported) / sizeof(pwg_raster_document_type_supported[0])), NULL, pwg_raster_document_type_supported); } - /* sides-default */ + // sides-default ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-default", NULL, "one-sided"); - /* sides-supported */ - if (pc->sides_2sided_long) + // sides-supported + if (duplex) ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-supported", (int)(sizeof(sides_supported) / sizeof(sides_supported[0])), NULL, sides_supported); else ippAddString(attrs, IPP_TAG_PRINTER, IPP_CONST_TAG(IPP_TAG_KEYWORD), "sides-supported", NULL, "one-sided"); - /* urf-supported */ + // urf-supported if (cupsArrayFind(docformats, (void *)"image/urf")) - ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", num_urf, NULL, urf); - - /* - * Free the PPD file and return the attributes... - */ - - _ppdCacheDestroy(pc); - - ppdClose(ppd); + { + if (ppm_color > 0) + { + if (duplex) + ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported_color_duplex) / sizeof(urf_supported_color_duplex[0])), NULL, urf_supported_color_duplex); + else + ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported_color) / sizeof(urf_supported_color[0])), NULL, urf_supported_color); + } + else if (duplex) + { + ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported_duplex) / sizeof(urf_supported_duplex[0])), NULL, urf_supported_duplex); + } + else + { + ippAddStrings(attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "urf-supported", (int)(sizeof(urf_supported) / sizeof(urf_supported[0])), NULL, urf_supported); + } + } return (attrs); } -#endif /* !CUPS_LITE */ #if HAVE_LIBPAM -/* - * 'pam_func()' - PAM conversation function. - */ +// +// 'pam_func()' - PAM conversation function. +// -static int /* O - Success or failure */ +static int // O - Success or failure pam_func( - int num_msg, /* I - Number of messages */ - const struct pam_message **msg, /* I - Messages */ - struct pam_response **resp, /* O - Responses */ + int num_msg, // I - Number of messages + const struct pam_message **msg, // I - Messages + struct pam_response **resp, // O - Responses void *appdata_ptr) - /* I - Pointer to connection */ + // I - Pointer to connection { - int i; /* Looping var */ - struct pam_response *replies; /* Replies */ - ippeve_authdata_t *data; /* Pointer to auth data */ - + int i; // Looping var + struct pam_response *replies; // Replies + ippeve_authdata_t *data; // Pointer to auth data - /* - * Allocate memory for the responses... - */ + // Allocate memory for the responses... if ((replies = malloc(sizeof(struct pam_response) * (size_t)num_msg)) == NULL) return (PAM_CONV_ERR); - /* - * Answer all of the messages... - */ - + // Answer all of the messages... data = (ippeve_authdata_t *)appdata_ptr; for (i = 0; i < num_msg; i ++) @@ -5650,31 +4562,28 @@ pam_func( } } - /* - * Return the responses back to PAM... - */ - + // Return the responses back to PAM... *resp = replies; return (PAM_SUCCESS); } -#endif /* HAVE_LIBPAM */ +#endif // HAVE_LIBPAM -/* - * 'parse_options()' - Parse URL options into CUPS options. - * - * The client->options string is destroyed by this function. - */ +// +// 'parse_options()' - Parse URL options into CUPS options. +// +// The client->options string is destroyed by this function. +// -static int /* O - Number of options */ -parse_options(ippeve_client_t *client, /* I - Client */ - cups_option_t **options)/* O - Options */ +static int // O - Number of options +parse_options(ippeve_client_t *client, // I - Client + cups_option_t **options)// O - Options { - char *name, /* Name */ - *value, /* Value */ - *next; /* Next name=value pair */ - int num_options = 0; /* Number of options */ + char *name, // Name + *value, // Value + *next; // Next name=value pair + int num_options = 0; // Number of options *options = NULL; @@ -5695,56 +4604,41 @@ parse_options(ippeve_client_t *client, /* I - Client */ } -/* - * 'process_attr_message()' - Process an ATTR: message from a command. - */ +// +// 'process_attr_message()' - Process an ATTR: message from a command. +// static void process_attr_message( - ippeve_job_t *job, /* I - Job */ - char *message) /* I - Message */ + ippeve_job_t *job, // I - Job + char *message) // I - Message { - int i, /* Looping var */ - num_options = 0; /* Number of name=value pairs */ - cups_option_t *options = NULL, /* name=value pairs from message */ - *option; /* Current option */ - ipp_attribute_t *attr; /* Current attribute */ + int i, // Looping var + num_options = 0; // Number of name=value pairs + cups_option_t *options = NULL, // name=value pairs from message + *option; // Current option + ipp_attribute_t *attr; // Current attribute - /* - * Grab attributes from the message line... - */ - + // Grab attributes from the message line... num_options = cupsParseOptions(message + 5, num_options, &options); - /* - * Loop through the options and record them in the printer or job objects... - */ - + // Loop through the options and record them in the printer or job objects... for (i = num_options, option = options; i > 0; i --, option ++) { if (!strcmp(option->name, "job-impressions")) { - /* - * Update job-impressions attribute... - */ - + // Update job-impressions attribute... job->impressions = atoi(option->value); } else if (!strcmp(option->name, "job-impressions-completed")) { - /* - * Update job-impressions-completed attribute... - */ - + // Update job-impressions-completed attribute... job->impcompleted = atoi(option->value); } else if (!strncmp(option->name, "marker-", 7) || !strcmp(option->name, "printer-alert") || !strcmp(option->name, "printer-alert-description") || !strcmp(option->name, "printer-supply") || !strcmp(option->name, "printer-supply-description")) { - /* - * Update Printer Status attribute... - */ - + // Update Printer Status attribute... cupsRWLockWrite(&job->printer->rwlock); if ((attr = ippFindAttribute(job->printer->attrs, option->name, IPP_TAG_ZERO)) != NULL) @@ -5756,10 +4650,7 @@ process_attr_message( } else { - /* - * Something else that isn't currently supported... - */ - + // Something else that isn't currently supported... fprintf(stderr, "[Job %d] Ignoring update of attribute \"%s\" with value \"%s\".\n", job->id, option->name, option->value); } } @@ -5768,35 +4659,28 @@ process_attr_message( } -/* - * 'process_client()' - Process client requests on a thread. - */ +// +// 'process_client()' - Process client requests on a thread. +// -static void * /* O - Exit status */ -process_client(ippeve_client_t *client) /* I - Client */ +static void * // O - Exit status +process_client(ippeve_client_t *client) // I - Client { - /* - * Loop until we are out of requests or timeout (30 seconds)... - */ - - int first_time = 1; /* First time request? */ - + // Loop until we are out of requests or timeout (30 seconds)... + bool first_time = true; // First time request? while (httpWait(client->http, 30000)) { if (first_time) { - /* - * See if we need to negotiate a TLS connection... - */ - - char buf[1]; /* First byte from client */ + // See if we need to negotiate a TLS connection... + char buf[1]; // First byte from client if (recv(httpGetFd(client->http), buf, 1, MSG_PEEK) == 1 && (!buf[0] || !strchr("DGHOPT", buf[0]))) { fprintf(stderr, "%s Starting HTTPS session.\n", client->hostname); - if (httpEncryption(client->http, HTTP_ENCRYPTION_ALWAYS)) + if (!httpSetEncryption(client->http, HTTP_ENCRYPTION_ALWAYS)) { fprintf(stderr, "%s Unable to encrypt connection: %s\n", client->hostname, cupsGetErrorString()); break; @@ -5805,65 +4689,40 @@ process_client(ippeve_client_t *client) /* I - Client */ fprintf(stderr, "%s Connection now encrypted.\n", client->hostname); } - first_time = 0; + first_time = false; } if (!process_http(client)) break; } - /* - * Close the connection to the client and return... - */ - + // Close the conection to the client and return... delete_client(client); return (NULL); } -/* - * 'process_http()' - Process a HTTP request. - */ +// +// 'process_http()' - Process a HTTP request. +// -int /* O - 1 on success, 0 on failure */ -process_http(ippeve_client_t *client) /* I - Client connection */ +int // O - 1 on success, 0 on failure +process_http(ippeve_client_t *client) // I - Client connection { - char uri[1024]; /* URI */ - http_state_t http_state; /* HTTP state */ - http_status_t http_status; /* HTTP status */ - ipp_state_t ipp_state; /* State of IPP transfer */ - char scheme[32], /* Method/scheme */ - userpass[128], /* Username:password */ + char uri[1024]; // URI + http_state_t http_state; // HTTP state + http_status_t http_status; // HTTP status + ipp_state_t ipp_state; // State of IPP transfer + char scheme[32], // Method/scheme + userpass[128], // Username:password hostname[HTTP_MAX_HOST], - /* Hostname */ - *ptr; /* Pointer into value */ - int port; /* Port number */ - static const char * const http_states[] = - { /* Strings for logging HTTP method */ - "WAITING", - "OPTIONS", - "GET", - "GET_SEND", - "HEAD", - "POST", - "POST_RECV", - "POST_SEND", - "PUT", - "PUT_RECV", - "DELETE", - "TRACE", - "CONNECT", - "STATUS", - "UNKNOWN_METHOD", - "UNKNOWN_VERSION" - }; - + // Hostname + *ptr; // Pointer into value + int port; // Port number - /* - * Clear state variables... - */ + // Clear state variables... client->username[0] = '\0'; ippDelete(client->request); @@ -5873,24 +4732,17 @@ process_http(ippeve_client_t *client) /* I - Client connection */ client->response = NULL; client->operation = HTTP_STATE_WAITING; - /* - * Read a request from the connection... - */ - - while ((http_state = httpReadRequest(client->http, uri, - sizeof(uri))) == HTTP_STATE_WAITING) + // Read a request from the connection... + while ((http_state = httpReadRequest(client->http, uri, sizeof(uri))) == HTTP_STATE_WAITING) usleep(1); - /* - * Parse the request line... - */ - + // Parse the request line... if (http_state == HTTP_STATE_ERROR) { - if (httpError(client->http) == EPIPE) + if (httpGetError(client->http) == EPIPE) fprintf(stderr, "%s Client closed connection.\n", client->hostname); else - fprintf(stderr, "%s Bad request line (%s).\n", client->hostname, strerror(httpError(client->http))); + fprintf(stderr, "%s Bad request line (%s).\n", client->hostname, strerror(httpGetError(client->http))); return (0); } @@ -5907,17 +4759,10 @@ process_http(ippeve_client_t *client) /* I - Client connection */ return (0); } - fprintf(stderr, "%s %s %s\n", client->hostname, http_states[http_state], uri); + fprintf(stderr, "%s %s %s\n", client->hostname, httpStateString(http_state), uri); - /* - * Separate the URI into its components... - */ - - if (httpSeparateURI(HTTP_URI_CODING_MOST, uri, scheme, sizeof(scheme), - userpass, sizeof(userpass), - hostname, sizeof(hostname), &port, - client->uri, sizeof(client->uri)) < HTTP_URI_STATUS_OK && - (http_state != HTTP_STATE_OPTIONS || strcmp(uri, "*"))) + // Separate the URI into its components... + if (httpSeparateURI(HTTP_URI_CODING_MOST, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, client->uri, sizeof(client->uri)) < HTTP_URI_STATUS_OK && (http_state != HTTP_STATE_OPTIONS || strcmp(uri, "*"))) { fprintf(stderr, "%s Bad URI \"%s\".\n", client->hostname, uri); respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0); @@ -5927,17 +4772,11 @@ process_http(ippeve_client_t *client) /* I - Client connection */ if ((client->options = strchr(client->uri, '?')) != NULL) *(client->options)++ = '\0'; - /* - * Process the request... - */ - + // Process the request... client->start = time(NULL); client->operation = httpGetState(client->http); - /* - * Parse incoming parameters until the status changes... - */ - + // Parse incoming parameters until the status changes... while ((http_status = httpUpdate(client->http)) == HTTP_STATUS_CONTINUE); if (http_status != HTTP_STATUS_OK) @@ -5946,17 +4785,10 @@ process_http(ippeve_client_t *client) /* I - Client connection */ return (0); } - /* - * Validate the host header... - */ - - if (!httpGetField(client->http, HTTP_FIELD_HOST)[0] && - httpGetVersion(client->http) >= HTTP_VERSION_1_1) + // Validate the host header... + if (!httpGetField(client->http, HTTP_FIELD_HOST)[0] && httpGetVersion(client->http) >= HTTP_VERSION_1_1) { - /* - * HTTP/1.1 and higher require the "Host:" field... - */ - + // HTTP/1.1 and higher require the "Host:" field... fprintf(stderr, "%s Missing Host: header.\n", client->hostname); respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0); return (0); @@ -5965,19 +4797,13 @@ process_http(ippeve_client_t *client) /* I - Client connection */ cupsCopyString(client->host_field, httpGetField(client->http, HTTP_FIELD_HOST), sizeof(client->host_field)); if ((ptr = strrchr(client->host_field, ':')) != NULL) { - /* - * Grab port number from Host: header... - */ - + // Grab port number from Host: header... *ptr++ = '\0'; client->host_port = atoi(ptr); } else { - /* - * Use the default port number... - */ - + // Use the default port number... client->host_port = client->printer->port; } @@ -5992,10 +4818,7 @@ process_http(ippeve_client_t *client) /* I - Client connection */ return (0); } - /* - * Handle HTTP Upgrade... - */ - + // Handle HTTP Upgrade... if (!strcasecmp(httpGetField(client->http, HTTP_FIELD_CONNECTION), "Upgrade")) { if (strstr(httpGetField(client->http, HTTP_FIELD_UPGRADE), "TLS/") != NULL && !httpIsEncrypted(client->http)) @@ -6005,7 +4828,7 @@ process_http(ippeve_client_t *client) /* I - Client connection */ fprintf(stderr, "%s Upgrading to encrypted connection.\n", client->hostname); - if (httpEncryption(client->http, HTTP_ENCRYPTION_REQUIRED)) + if (!httpSetEncryption(client->http, HTTP_ENCRYPTION_REQUIRED)) { fprintf(stderr, "%s Unable to encrypt connection: %s\n", client->hostname, cupsGetErrorString()); return (0); @@ -6017,17 +4840,11 @@ process_http(ippeve_client_t *client) /* I - Client connection */ return (0); } - /* - * Handle new transfers... - */ - + // Handle new transfers... switch (client->operation) { case HTTP_STATE_OPTIONS : - /* - * Do OPTIONS command... - */ - + // Do OPTIONS command... return (respond_http(client, HTTP_STATUS_OK, NULL, NULL, 0)); case HTTP_STATE_HEAD : @@ -6043,27 +4860,29 @@ process_http(ippeve_client_t *client) /* I - Client connection */ case HTTP_STATE_GET : if (!strcmp(client->uri, "/en.strings")) { - /* - * Send strings file. - */ - + // Send strings file. if (client->printer->strings) { - int fd; /* Icon file */ - struct stat fileinfo; /* Icon file information */ - char buffer[4096]; /* Copy buffer */ - ssize_t bytes; /* Bytes */ + int fd; // Icon file + struct stat fileinfo; // Icon file information + char buffer[4096]; // Copy buffer + ssize_t bytes; // Bytes - if (!stat(client->printer->strings, &fileinfo) && (fd = open(client->printer->strings, O_RDONLY | O_BINARY)) >= 0) + if ((fd = open(client->printer->strings, O_RDONLY | O_BINARY)) >= 0) { - if (!respond_http(client, HTTP_STATUS_OK, NULL, "text/strings", (size_t)fileinfo.st_size)) + if (fstat(fd, &fileinfo)) + { + close(fd); + return (0); + } + else if (!respond_http(client, HTTP_STATUS_OK, NULL, "text/strings", (size_t)fileinfo.st_size)) { close(fd); return (0); } while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) - httpWrite2(client->http, buffer, (size_t)bytes); + httpWrite(client->http, buffer, (size_t)bytes); httpFlushWrite(client->http); @@ -6077,27 +4896,29 @@ process_http(ippeve_client_t *client) /* I - Client connection */ } else if (!strcmp(client->uri, "/icon.png")) { - /* - * Send medium PNG icon file. - */ - + // Send medium PNG icon file. if (client->printer->icons[1]) { - int fd; /* Icon file */ - struct stat fileinfo; /* Icon file information */ - char buffer[4096]; /* Copy buffer */ - ssize_t bytes; /* Bytes */ + int fd; // Icon file + struct stat fileinfo; // Icon file information + char buffer[4096]; // Copy buffer + ssize_t bytes; // Bytes - if (!stat(client->printer->icons[1], &fileinfo) && (fd = open(client->printer->icons[1], O_RDONLY | O_BINARY)) >= 0) + if ((fd = open(client->printer->icons[1], O_RDONLY | O_BINARY)) >= 0) { - if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size)) + if (fstat(fd, &fileinfo)) + { + close(fd); + return (0); + } + else if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size)) { close(fd); return (0); } while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) - httpWrite2(client->http, buffer, (size_t)bytes); + httpWrite(client->http, buffer, (size_t)bytes); httpFlushWrite(client->http); @@ -6113,33 +4934,35 @@ process_http(ippeve_client_t *client) /* I - Client connection */ if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", sizeof(printer_png))) return (0); - httpWrite2(client->http, (const char *)printer_png, sizeof(printer_png)); + httpWrite(client->http, (const char *)printer_png, sizeof(printer_png)); httpFlushWrite(client->http); } } else if (!strcmp(client->uri, "/icon-lg.png")) { - /* - * Send large PNG icon file. - */ - + // Send large PNG icon file. if (client->printer->icons[2]) { - int fd; /* Icon file */ - struct stat fileinfo; /* Icon file information */ - char buffer[4096]; /* Copy buffer */ - ssize_t bytes; /* Bytes */ + int fd; // Icon file + struct stat fileinfo; // Icon file information + char buffer[4096]; // Copy buffer + ssize_t bytes; // Bytes - if (!stat(client->printer->icons[2], &fileinfo) && (fd = open(client->printer->icons[2], O_RDONLY | O_BINARY)) >= 0) + if ((fd = open(client->printer->icons[2], O_RDONLY | O_BINARY)) >= 0) { - if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size)) + if (fstat(fd, &fileinfo)) + { + close(fd); + return (0); + } + else if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size)) { close(fd); return (0); } while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) - httpWrite2(client->http, buffer, (size_t)bytes); + httpWrite(client->http, buffer, (size_t)bytes); httpFlushWrite(client->http); @@ -6155,33 +4978,35 @@ process_http(ippeve_client_t *client) /* I - Client connection */ if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", sizeof(printer_lg_png))) return (0); - httpWrite2(client->http, (const char *)printer_lg_png, sizeof(printer_lg_png)); + httpWrite(client->http, (const char *)printer_lg_png, sizeof(printer_lg_png)); httpFlushWrite(client->http); } } else if (!strcmp(client->uri, "/icon-sm.png")) { - /* - * Send small PNG icon file. - */ - + // Send small PNG icon file. if (client->printer->icons[0]) { - int fd; /* Icon file */ - struct stat fileinfo; /* Icon file information */ - char buffer[4096]; /* Copy buffer */ - ssize_t bytes; /* Bytes */ + int fd; // Icon file + struct stat fileinfo; // Icon file information + char buffer[4096]; // Copy buffer + ssize_t bytes; // Bytes - if (!stat(client->printer->icons[0], &fileinfo) && (fd = open(client->printer->icons[0], O_RDONLY | O_BINARY)) >= 0) + if ((fd = open(client->printer->icons[0], O_RDONLY | O_BINARY)) >= 0) { - if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size)) + if (fstat(fd, &fileinfo)) + { + close(fd); + return (0); + } + else if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", (size_t)fileinfo.st_size)) { close(fd); return (0); } while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) - httpWrite2(client->http, buffer, (size_t)bytes); + httpWrite(client->http, buffer, (size_t)bytes); httpFlushWrite(client->http); @@ -6197,16 +5022,13 @@ process_http(ippeve_client_t *client) /* I - Client connection */ if (!respond_http(client, HTTP_STATUS_OK, NULL, "image/png", sizeof(printer_sm_png))) return (0); - httpWrite2(client->http, (const char *)printer_sm_png, sizeof(printer_sm_png)); + httpWrite(client->http, (const char *)printer_sm_png, sizeof(printer_sm_png)); httpFlushWrite(client->http); } } else { - /* - * Authenticate if needed... - */ - + // Authenticate if needed... if ((http_status = authenticate_request(client)) != HTTP_STATUS_CONTINUE) { return (respond_http(client, http_status, NULL, NULL, 0)); @@ -6214,26 +5036,17 @@ process_http(ippeve_client_t *client) /* I - Client connection */ if (!strcmp(client->uri, "/")) { - /* - * Show web status page... - */ - + // Show web status page... return (show_status(client)); } else if (!strcmp(client->uri, "/media")) { - /* - * Show web media page... - */ - + // Show web media page... return (show_media(client)); } else if (!strcmp(client->uri, "/supplies")) { - /* - * Show web supplies page... - */ - + // Show web supplies page... return (show_supplies(client)); } else @@ -6245,21 +5058,14 @@ process_http(ippeve_client_t *client) /* I - Client connection */ if (strcmp(httpGetField(client->http, HTTP_FIELD_CONTENT_TYPE), "application/ipp")) { - /* - * Not an IPP request... - */ - + // Not an IPP request... return (respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0)); } - /* - * Read the IPP request... - */ - + // Read the IPP request... client->request = ippNew(); - while ((ipp_state = ippRead(client->http, - client->request)) != IPP_STATE_DATA) + while ((ipp_state = ippRead(client->http, client->request)) != IPP_STATE_DATA) { if (ipp_state == IPP_STATE_ERROR) { @@ -6269,64 +5075,52 @@ process_http(ippeve_client_t *client) /* I - Client connection */ } } - /* - * Now that we have the IPP request, process the request... - */ - + // Now that we have the IPP request, process the request... return (process_ipp(client)); default : - break; /* Anti-compiler-warning-code */ + break; // Anti-compiler-warning-code } return (1); } -/* - * 'process_ipp()' - Process an IPP request. - */ +// +// 'process_ipp()' - Process an IPP request. +// -static int /* O - 1 on success, 0 on error */ -process_ipp(ippeve_client_t *client) /* I - Client */ +static int // O - 1 on success, 0 on error +process_ipp(ippeve_client_t *client) // I - Client { - ipp_tag_t group; /* Current group tag */ - ipp_attribute_t *attr; /* Current attribute */ - ipp_attribute_t *charset; /* Character set attribute */ - ipp_attribute_t *language; /* Language attribute */ - ipp_attribute_t *uri; /* Printer URI attribute */ - int major, minor; /* Version number */ - const char *name; /* Name of attribute */ - http_status_t status; /* Authentication status */ + ipp_tag_t group; // Current group tag + ipp_attribute_t *attr; // Current attribute + ipp_attribute_t *charset; // Character set attribute + ipp_attribute_t *language; // Language attribute + ipp_attribute_t *uri; // Printer URI attribute + int major, minor; // Version number + const char *name; // Name of attribute + http_status_t status; // Authentication status debug_attributes("Request", client->request, 1); - /* - * First build an empty response message for this request... - */ - + // First build an empty response message for this request... client->operation_id = ippGetOperation(client->request); client->response = ippNewResponse(client->request); - /* - * Then validate the request header and required attributes... - */ - + // Then validate the request header and required attributes... major = ippGetVersion(client->request, &minor); if (major < 1 || major > 2) { - /* - * Return an error, since we only support IPP 1.x and 2.x. - */ - + // Return an error, since we only support IPP 1.x and 2.x. respond_ipp(client, IPP_STATUS_ERROR_VERSION_NOT_SUPPORTED, "Bad request version number %d.%d.", major, minor); } else if ((major * 10 + minor) > MaxVersion) { if (httpGetState(client->http) != HTTP_STATE_POST_SEND) - httpFlush(client->http); /* Flush trailing (junk) data */ + httpFlush(client->http); // Flush trailing (junk) data respond_http(client, HTTP_STATUS_BAD_REQUEST, NULL, NULL, 0); return (0); @@ -6335,120 +5129,86 @@ process_ipp(ippeve_client_t *client) /* I - Client */ { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Bad request-id %d.", ippGetRequestId(client->request)); } - else if (!ippFirstAttribute(client->request)) + else if (!ippGetFirstAttribute(client->request)) { respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "No attributes in request."); } else { - /* - * Make sure that the attributes are provided in the correct order and - * don't repeat groups... - */ - - for (attr = ippFirstAttribute(client->request), - group = ippGetGroupTag(attr); - attr; - attr = ippNextAttribute(client->request)) + // Make sure that the attributes are provided in the correct order and don't repeat groups... + for (attr = ippGetFirstAttribute(client->request), group = ippGetGroupTag(attr); attr; attr = ippGetNextAttribute(client->request)) { if (ippGetGroupTag(attr) < group && ippGetGroupTag(attr) != IPP_TAG_ZERO) { - /* - * Out of order; return an error... - */ - - respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, - "Attribute groups are out of order (%x < %x).", - ippGetGroupTag(attr), group); + // Out of order; return an error... + respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Attribute groups are out of order (%x < %x).", ippGetGroupTag(attr), group); break; } else + { group = ippGetGroupTag(attr); + } } if (!attr) { - /* - * Then make sure that the first three attributes are: - * - * attributes-charset - * attributes-natural-language - * printer-uri/job-uri - */ - - attr = ippFirstAttribute(client->request); + // Then make sure that the first three attributes are: + // + // attributes-charset + // attributes-natural-language + // printer-uri/job-uri + attr = ippGetFirstAttribute(client->request); name = ippGetName(attr); - if (attr && name && !strcmp(name, "attributes-charset") && - ippGetValueTag(attr) == IPP_TAG_CHARSET) + if (attr && name && !strcmp(name, "attributes-charset") && ippGetValueTag(attr) == IPP_TAG_CHARSET) charset = attr; else charset = NULL; - attr = ippNextAttribute(client->request); + attr = ippGetNextAttribute(client->request); name = ippGetName(attr); - if (attr && name && !strcmp(name, "attributes-natural-language") && - ippGetValueTag(attr) == IPP_TAG_LANGUAGE) + if (attr && name && !strcmp(name, "attributes-natural-language") && ippGetValueTag(attr) == IPP_TAG_LANGUAGE) language = attr; else language = NULL; - if ((attr = ippFindAttribute(client->request, "printer-uri", - IPP_TAG_URI)) != NULL) + if ((attr = ippFindAttribute(client->request, "printer-uri", IPP_TAG_URI)) != NULL) uri = attr; - else if ((attr = ippFindAttribute(client->request, "job-uri", - IPP_TAG_URI)) != NULL) + else if ((attr = ippFindAttribute(client->request, "job-uri", IPP_TAG_URI)) != NULL) uri = attr; else uri = NULL; - if (charset && - strcasecmp(ippGetString(charset, 0, NULL), "us-ascii") && - strcasecmp(ippGetString(charset, 0, NULL), "utf-8")) + if (charset && strcasecmp(ippGetString(charset, 0, NULL), "us-ascii") && strcasecmp(ippGetString(charset, 0, NULL), "utf-8")) { - /* - * Bad character set... - */ - - respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, - "Unsupported character set \"%s\".", - ippGetString(charset, 0, NULL)); + // Bad character set... + respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Unsupported character set \"%s\".", ippGetString(charset, 0, NULL)); } else if (!charset || !language || !uri) { - /* - * Return an error, since attributes-charset, - * attributes-natural-language, and printer-uri/job-uri are required - * for all operations. - */ - - respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, - "Missing required attributes."); + // Return an error, since attributes-charset, + // attributes-natural-language, and printer-uri/job-uri are required + // for all operations. + respond_ipp(client, IPP_STATUS_ERROR_BAD_REQUEST, "Missing required attributes."); } else { - char scheme[32], /* URI scheme */ - userpass[32], /* Username/password in URI */ - host[256], /* Host name in URI */ - resource[256]; /* Resource path in URI */ - int port; /* Port number in URI */ + char scheme[32], // URI scheme + userpass[32], // Username/password in URI + host[256], // Host name in URI + resource[256]; // Resource path in URI + int port; // Port number in URI name = ippGetName(uri); - if (httpSeparateURI(HTTP_URI_CODING_ALL, ippGetString(uri, 0, NULL), - scheme, sizeof(scheme), - userpass, sizeof(userpass), - host, sizeof(host), &port, - resource, sizeof(resource)) < HTTP_URI_STATUS_OK) - respond_ipp(client, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, - "Bad %s value '%s'.", name, ippGetString(uri, 0, NULL)); - else if ((!strcmp(name, "job-uri") && - strncmp(resource, "/ipp/print/", 11)) || - (!strcmp(name, "printer-uri") && - strcmp(resource, "/ipp/print") && - (strcmp(resource, "/") || ippGetOperation(client->request) != IPP_OP_GET_PRINTER_ATTRIBUTES))) - respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "%s %s not found.", - name, ippGetString(uri, 0, NULL)); + if (httpSeparateURI(HTTP_URI_CODING_ALL, ippGetString(uri, 0, NULL), scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) + { + respond_ipp(client, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, "Bad %s value '%s'.", name, ippGetString(uri, 0, NULL)); + } + else if ((!strcmp(name, "job-uri") && strncmp(resource, "/ipp/print/", 11)) || (!strcmp(name, "printer-uri") && strcmp(resource, "/ipp/print") && (strcmp(resource, "/") || ippGetOperation(client->request) != IPP_OP_GET_PRINTER_ATTRIBUTES))) + { + respond_ipp(client, IPP_STATUS_ERROR_NOT_FOUND, "%s %s not found.", name, ippGetString(uri, 0, NULL)); + } else if (client->operation_id != IPP_OP_GET_PRINTER_ATTRIBUTES && (status = authenticate_request(client)) != HTTP_STATUS_CONTINUE) { flush_document_data(client); @@ -6457,27 +5217,18 @@ process_ipp(ippeve_client_t *client) /* I - Client */ } else { - /* - * Handle HTTP Expect... - */ - + // Handle HTTP Expect... if (httpGetExpect(client->http)) { if (httpGetExpect(client->http) == HTTP_STATUS_CONTINUE) { - /* - * Send 100-continue header... - */ - + // Send 100-continue header... if (!respond_http(client, HTTP_STATUS_CONTINUE, NULL, NULL, 0)) return (0); } else { - /* - * Send 417-expectation-failed header... - */ - + // Send 417-expectation-failed header... if (!respond_http(client, HTTP_STATUS_EXPECTATION_FAILED, NULL, NULL, 0)) return (0); @@ -6486,10 +5237,7 @@ process_ipp(ippeve_client_t *client) /* I - Client */ } } - /* - * Try processing the operation... - */ - + // Try processing the operation... switch (client->operation_id) { case IPP_OP_PRINT_JOB : @@ -6545,8 +5293,7 @@ process_ipp(ippeve_client_t *client) /* I - Client */ break; default : - respond_ipp(client, IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED, - "Operation not supported."); + respond_ipp(client, IPP_STATUS_ERROR_OPERATION_NOT_SUPPORTED, "Operation not supported."); break; } } @@ -6554,24 +5301,20 @@ process_ipp(ippeve_client_t *client) /* I - Client */ } } - /* - * Send the HTTP header and return... - */ - + // Send the HTTP header and return... if (httpGetState(client->http) != HTTP_STATE_POST_SEND) - httpFlush(client->http); /* Flush trailing (junk) data */ + httpFlush(client->http); // Flush trailing (junk) data - return (respond_http(client, HTTP_STATUS_OK, NULL, "application/ipp", - ippLength(client->response))); + return (respond_http(client, HTTP_STATUS_OK, NULL, "application/ipp", ippGetLength(client->response))); } -/* - * 'process_job()' - Process a print job. - */ +// +// 'process_job()' - Process a print job. +// -static void * /* O - Thread exit status */ -process_job(ippeve_job_t *job) /* I - Job */ +static void * // O - Thread exit status +process_job(ippeve_job_t *job) // I - Job { job->state = IPP_JSTATE_PROCESSING; job->printer->state = IPP_PSTATE_PROCESSING; @@ -6588,45 +5331,36 @@ process_job(ippeve_job_t *job) /* I - Job */ if (job->printer->command) { - /* - * Execute a command with the job spool file and wait for it to complete... - */ - - int pid, /* Process ID */ - status; /* Exit status */ - struct timeval start, /* Start time */ - end; /* End time */ - char *myargv[3], /* Command-line arguments */ - *myenvp[400]; /* Environment variables */ - int myenvc; /* Number of environment variables */ - ipp_attribute_t *attr; /* Job attribute */ - char val[1280], /* IPP_NAME=value */ - *valptr; /* Pointer into string */ + // Execute a command with the job spool file and wait for it to complete... + int pid, // Process ID + status; // Exit status + struct timeval start, // Start time + end; // End time + char *myargv[3], // Command-line arguments + *myenvp[400]; // Environment variables + int myenvc; // Number of environment variables + ipp_attribute_t *attr; // Job attribute + char val[1280], // IPP_NAME=value + *valptr; // Pointer into string #ifndef _WIN32 - int mystdout = -1; /* File for stdout */ - int mypipe[2]; /* Pipe for stderr */ - char line[2048], /* Line from stderr */ - *ptr, /* Pointer into line */ - *endptr; /* End of line */ - ssize_t bytes; /* Bytes read */ -#endif /* !_WIN32 */ + int mystdout = -1; // File for stdout + int mypipe[2]; // Pipe for stderr + char line[2048], // Line from stderr + *ptr, // Pointer into line + *endptr; // End of line + ssize_t bytes; // Bytes read +#endif // !_WIN32 fprintf(stderr, "[Job %d] Running command \"%s %s\".\n", job->id, job->printer->command, job->filename); gettimeofday(&start, NULL); - /* - * Setup the command-line arguments... - */ - + // Setup the command-line arguments... myargv[0] = job->printer->command; myargv[1] = job->filename; myargv[2] = NULL; - /* - * Copy the current environment, then add environment variables for every - * Job attribute and Printer -default attributes... - */ - + // Copy the current environment, then add environment variables for every + // Job attribute and Printer -default attributes... for (myenvc = 0; environ[myenvc] && myenvc < (int)(sizeof(myenvp) / sizeof(myenvp[0]) - 1); myenvc ++) myenvp[myenvc] = strdup(environ[myenvc]); @@ -6652,25 +5386,14 @@ process_job(ippeve_job_t *job) /* I - Job */ myenvp[myenvc ++] = strdup(val); } -#if !CUPS_LITE - if (job->printer->ppdfile) - { - snprintf(val, sizeof(val), "PPD=%s", job->printer->ppdfile); - myenvp[myenvc++] = strdup(val); - } -#endif /* !CUPS_LITE */ - - for (attr = ippFirstAttribute(job->printer->attrs); attr && myenvc < (int)(sizeof(myenvp) / sizeof(myenvp[0]) - 1); attr = ippNextAttribute(job->printer->attrs)) + for (attr = ippGetFirstAttribute(job->printer->attrs); attr && myenvc < (int)(sizeof(myenvp) / sizeof(myenvp[0]) - 1); attr = ippGetNextAttribute(job->printer->attrs)) { - /* - * Convert "attribute-name-default" to "IPP_ATTRIBUTE_NAME_DEFAULT=" and - * "pwg-xxx" to "IPP_PWG_XXX", then add the value(s) from the attribute. - */ - + // Convert "attribute-name-default" to "IPP_ATTRIBUTE_NAME_DEFAULT=" and + // "pwg-xxx" to "IPP_PWG_XXX", then add the value(s) from the attribute. const char *name = ippGetName(attr), - /* Attribute name */ + // Attribute name *suffix = strstr(name, "-default"); - /* Suffix on attribute name */ + // Suffix on attribute name if (strncmp(name, "pwg-", 4) && (!suffix || suffix[8])) continue; @@ -6695,15 +5418,12 @@ process_job(ippeve_job_t *job) /* I - Job */ myenvp[myenvc++] = strdup(val); } - for (attr = ippFirstAttribute(job->attrs); attr && myenvc < (int)(sizeof(myenvp) / sizeof(myenvp[0]) - 1); attr = ippNextAttribute(job->attrs)) + for (attr = ippGetFirstAttribute(job->attrs); attr && myenvc < (int)(sizeof(myenvp) / sizeof(myenvp[0]) - 1); attr = ippGetNextAttribute(job->attrs)) { - /* - * Convert "attribute-name" to "IPP_ATTRIBUTE_NAME=" and then add the - * value(s) from the attribute. - */ - + // Convert "attribute-name" to "IPP_ATTRIBUTE_NAME=" and then add the + // value(s) from the attribute. const char *name = ippGetName(attr); - /* Attribute name */ + // Attribute name if (!name) continue; @@ -6737,21 +5457,18 @@ process_job(ippeve_job_t *job) /* I - Job */ myenvp[myenvc] = NULL; - /* - * Now run the program... - */ - + // Now run the program... #ifdef _WIN32 status = _spawnvpe(_P_WAIT, job->printer->command, myargv, myenvp); #else if (job->printer->device_uri) { - char scheme[32], /* URI scheme */ - userpass[256], /* username:password (unused) */ - host[256], /* Hostname or IP address */ - resource[256]; /* Resource path */ - int port; /* Port number */ + char scheme[32], // URI scheme + userpass[256], // username:password (unused) + host[256], // Hostname or IP address + resource[256]; // Resource path + int port; // Port number if (httpSeparateURI(HTTP_URI_CODING_ALL, job->printer->device_uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) @@ -6760,7 +5477,7 @@ process_job(ippeve_job_t *job) /* I - Job */ } else if (!strcmp(scheme, "file")) { - struct stat fileinfo; /* See if this is a file or directory... */ + struct stat fileinfo; // See if this is a file or directory... if (stat(resource, &fileinfo)) { @@ -6795,8 +5512,8 @@ process_job(ippeve_job_t *job) /* I - Job */ } else if (!strcmp(scheme, "socket")) { - http_addrlist_t *addrlist; /* List of addresses */ - char service[32]; /* Service number */ + http_addrlist_t *addrlist; // List of addresses + char service[32]; // Service number snprintf(service, sizeof(service), "%d", port); @@ -6831,20 +5548,17 @@ process_job(ippeve_job_t *job) /* I - Job */ if ((pid = fork()) == 0) { - /* - * Child comes here... - */ - + // Child comes here... if (mystdout >= 0) { - close(1); + close(1); dup2(mystdout, 1); close(mystdout); } if (mypipe[1] >= 0) { - close(2); + close(2); dup2(mypipe[1], 2); close(mypipe[0]); close(mypipe[1]); @@ -6855,43 +5569,34 @@ process_job(ippeve_job_t *job) /* I - Job */ } else if (pid < 0) { - /* - * Unable to fork process... - */ - + // Unable to fork process... fprintf(stderr, "[Job %d] Unable to start job processing command: %s\n", job->id, strerror(errno)); status = -1; - close(mystdout); - close(mypipe[0]); - close(mypipe[1]); + if (mystdout >= 0) + close(mystdout); - /* - * Free memory used for environment... - */ + if (mypipe[0] >= 0) + { + close(mypipe[0]); + close(mypipe[1]); + } + // Free memory used for environment... while (myenvc > 0) free(myenvp[-- myenvc]); } else { - /* - * Free memory used for environment... - */ - + // Free memory used for environment... while (myenvc > 0) free(myenvp[-- myenvc]); - /* - * Close the output file in the parent process... - */ - - close(mystdout); - - /* - * If the pipe exists, read from it until EOF... - */ + // Close the output file in the parent process... + if (mystdout >= 0) + close(mystdout); + // If the pipe exists, read from it until EOF... if (mypipe[0] >= 0) { close(mypipe[1]); @@ -6904,42 +5609,30 @@ process_job(ippeve_job_t *job) /* I - Job */ while ((ptr = strchr(line, '\n')) != NULL) { - int level = 3; /* Message log level */ + int level = 3; // Message log level *ptr++ = '\0'; if (!strncmp(line, "ATTR:", 5)) { - /* - * Process job/printer attribute updates. - */ - + // Process job/printer attribute updates. process_attr_message(job, line); } else if (!strncmp(line, "DEBUG:", 6)) { - /* - * Debug message... - */ - + // Debug message... level = 2; } else if (!strncmp(line, "ERROR:", 6)) { - /* - * Error message... - */ - + // Error message... level = 0; job->message = strdup(line + 6); job->msglevel = 0; } else if (!strncmp(line, "INFO:", 5)) { - /* - * Informational/progress message... - */ - + // Informational/progress message... level = 1; if (job->msglevel) { @@ -6949,10 +5642,7 @@ process_job(ippeve_job_t *job) /* I - Job */ } else if (!strncmp(line, "STATE:", 6)) { - /* - * Process printer-state-reasons keywords. - */ - + // Process printer-state-reasons keywords. process_state_message(job, line); } @@ -6970,48 +5660,41 @@ process_job(ippeve_job_t *job) /* I - Job */ close(mypipe[0]); } - /* - * Wait for child to complete... - */ - + // Wait for child to complete... # ifdef HAVE_WAITPID while (waitpid(pid, &status, 0) < 0); # else while (wait(&status) < 0); -# endif /* HAVE_WAITPID */ +# endif // HAVE_WAITPID } -#endif /* _WIN32 */ +#endif // _WIN32 if (status) { #ifndef _WIN32 if (WIFEXITED(status)) -#endif /* !_WIN32 */ +#endif // !_WIN32 fprintf(stderr, "[Job %d] Command \"%s\" exited with status %d.\n", job->id, job->printer->command, WEXITSTATUS(status)); #ifndef _WIN32 else fprintf(stderr, "[Job %d] Command \"%s\" terminated with signal %d.\n", job->id, job->printer->command, WTERMSIG(status)); -#endif /* !_WIN32 */ +#endif // !_WIN32 job->state = IPP_JSTATE_ABORTED; } else + { fprintf(stderr, "[Job %d] Command \"%s\" completed successfully.\n", job->id, job->printer->command); + } - /* - * Report the total processing time... - */ - + // Report the total processing time... gettimeofday(&end, NULL); fprintf(stderr, "[Job %d] Processing time was %.3f seconds.\n", job->id, end.tv_sec - start.tv_sec + 0.000001 * (end.tv_usec - start.tv_usec)); } else { - /* - * Sleep for a random amount of time to simulate job processing. - */ - - sleep((unsigned)(5 + (CUPS_RAND() % 11))); + // Sleep for a random amount of time to simulate job processing. + sleep((unsigned)(5 + (cupsGetRand() % 11))); } if (job->cancel) @@ -7029,44 +5712,40 @@ process_job(ippeve_job_t *job) /* I - Job */ } -/* - * 'process_state_message()' - Process a STATE: message from a command. - */ +// +// 'process_state_message()' - Process a STATE: message from a command. +// static void process_state_message( - ippeve_job_t *job, /* I - Job */ - char *message) /* I - Message */ + ippeve_job_t *job, // I - Job + char *message) // I - Message { - int i; /* Looping var */ - ippeve_preason_t state_reasons, /* printer-state-reasons values */ - bit; /* Current reason bit */ - char *ptr, /* Pointer into message */ - *next; /* Next keyword in message */ - int remove; /* Non-zero if we are removing keywords */ + int i; // Looping var + ippeve_preason_t state_reasons, // printer-state-reasons values + bit; // Current reason bit + char *ptr, // Pointer into message + *next; // Next keyword in message + int remove; // Non-zero if we are removing keywords - /* - * Skip leading "STATE:" and any whitespace... - */ - + // Skip leading "STATE:" and any whitespace... for (message += 6; *message; message ++) + { if (*message != ' ' && *message != '\t') break; + } - /* - * Support the following forms of message: - * - * "keyword[,keyword,...]" to set the printer-state-reasons value(s). - * - * "-keyword[,keyword,...]" to remove keywords. - * - * "+keyword[,keyword,...]" to add keywords. - * - * Keywords may or may not have a suffix (-report, -warning, -error) per - * RFC 8011. - */ - + // Support the following forms of message: + // + // "keyword[,keyword,...]" to set the printer-state-reasons value(s). + // + // "-keyword[,keyword,...]" to remove keywords. + // + // "+keyword[,keyword,...]" to add keywords. + // + // Keywords may or may not have a suffix (-report, -warning, -error) per + // RFC 8011. if (*message == '-') { remove = 1; @@ -7118,34 +5797,36 @@ process_state_message( } -/* - * 'register_printer()' - Register a printer object via DNS-SD. - */ +// +// 'register_printer()' - Register a printer object via DNS-SD. +// -static int /* O - 1 on success, 0 on error */ +static bool // O - `true` on success, `false` on error register_printer( - ippeve_printer_t *printer) /* I - Printer */ + ippeve_printer_t *printer) // I - Printer { -#ifdef HAVE_DNSSD - ippeve_txt_t ipp_txt; /* DNS-SD IPP TXT record */ - int i, /* Looping var */ - count; /* Number of values */ + int num_txt; // Number of DNS-SD IPP TXT key/value pairs + cups_option_t *txt; // DNS-SD IPP TXT key/value pairs + uint32_t if_index; // Interface index + int i, // Looping var + count; // Number of values ipp_attribute_t *color_supported, *document_format_supported, *printer_location, *printer_make_and_model, *printer_uuid, *sides_supported, - *urf_supported; /* Printer attributes */ - const char *value; /* Value string */ - char adminurl[247], /* adminurl value */ - formats[252], /* List of supported formats */ - urf[252], /* List of supported URF values */ - *ptr; /* Pointer into string */ + *urf_supported; // Printer attributes + const char *value; // Value string + char regtype[256], // Registration types + adminurl[247], // adminurl value + formats[252], // List of supported formats + urf[252], // List of supported URF values + *ptr; // Pointer into string if (printer->dnssd_subtypes && !strcmp(printer->dnssd_subtypes, "off")) - return (1); + return (true); color_supported = ippFindAttribute(printer->attrs, "color-supported", IPP_TAG_BOOLEAN); document_format_supported = ippFindAttribute(printer->attrs, "document-format-supported", IPP_TAG_MIMETYPE); @@ -7189,15 +5870,12 @@ register_printer( break; } - /* - * Rename the service as needed... - */ - + // Rename the service as needed... if (printer->dnssd_collision) { - char new_dnssd_name[256]; /* New DNS-SD name */ + char new_dnssd_name[256]; // New DNS-SD name const char *uuid = ippGetString(printer_uuid, 0, NULL); - /* "printer-uuid" value */ + // "printer-uuid" value cupsRWLockWrite(&printer->rwlock); @@ -7212,252 +5890,101 @@ register_printer( printer->dnssd_collision = 0; } -#endif /* HAVE_DNSSD */ - -#ifdef HAVE_MDNSRESPONDER - DNSServiceErrorType error; /* Error from DNS-SD */ - char regtype[256]; /* DNS-SD service type */ - uint32_t ifindex; /* Interface index */ - - /* - * Build the TXT record for IPP... - */ - - TXTRecordCreate(&ipp_txt, 1024, NULL); - TXTRecordSetValue(&ipp_txt, "rp", 9, "ipp/print"); + // Build the TXT record for IPP... + num_txt = cupsAddOption("rp", "ipp/print", 0, &txt); if ((value = ippGetString(printer_make_and_model, 0, NULL)) != NULL) - TXTRecordSetValue(&ipp_txt, "ty", (uint8_t)strlen(value), value); - TXTRecordSetValue(&ipp_txt, "adminurl", (uint8_t)strlen(adminurl), adminurl); + num_txt = cupsAddOption("ty", value, num_txt, &txt); + num_txt = cupsAddOption("adminurl", adminurl, num_txt, &txt); if ((value = ippGetString(printer_location, 0, NULL)) != NULL) - TXTRecordSetValue(&ipp_txt, "note", (uint8_t)strlen(value), value); - TXTRecordSetValue(&ipp_txt, "pdl", (uint8_t)strlen(formats), formats); - TXTRecordSetValue(&ipp_txt, "Color", 1, ippGetBoolean(color_supported, 0) ? "T" : "F"); - TXTRecordSetValue(&ipp_txt, "Duplex", 1, ippGetCount(sides_supported) > 1 ? "T" : "F"); + num_txt = cupsAddOption("note", value, num_txt, &txt); + num_txt = cupsAddOption("pdl", formats, num_txt, &txt); + num_txt = cupsAddOption("Color", ippGetBoolean(color_supported, 0) ? "T" : "F", num_txt, &txt); + num_txt = cupsAddOption("Duplex", ippGetCount(sides_supported) > 1 ? "T" : "F", num_txt, &txt); if ((value = ippGetString(printer_uuid, 0, NULL)) != NULL) - TXTRecordSetValue(&ipp_txt, "UUID", (uint8_t)strlen(value) - 9, value + 9); - TXTRecordSetValue(&ipp_txt, "TLS", 3, "1.3"); + num_txt = cupsAddOption("UUID", value + 9, num_txt, &txt); + num_txt = cupsAddOption("TLS", "1.3", num_txt, &txt); if (urf[0]) - TXTRecordSetValue(&ipp_txt, "URF", (uint8_t)strlen(urf), urf); - TXTRecordSetValue(&ipp_txt, "txtvers", 1, "1"); - TXTRecordSetValue(&ipp_txt, "qtotal", 1, "1"); - - /* - * Register the _printer._tcp (LPD) service type with a port number of 0 to - * defend our service name but not actually support LPD... - */ - - ifindex = !strcmp(printer->hostname, "localhost") ? kDNSServiceInterfaceIndexLocalOnly : kDNSServiceInterfaceIndexAny; - - if (printer->printer_ref) - DNSServiceRefDeallocate(printer->printer_ref); - - printer->printer_ref = DNSSDMaster; - - if ((error = DNSServiceRegister(&(printer->printer_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, "_printer._tcp", NULL /* domain */, NULL /* host */, 0 /* port */, 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) - { - _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, "_printer._tcp", error); - return (0); - } + num_txt = cupsAddOption("URF", urf, num_txt, &txt); + num_txt = cupsAddOption("txtvers", "1", num_txt, &txt); + num_txt = cupsAddOption("qtotal", "1", num_txt, &txt); - /* - * Then register the _ipp._tcp (IPP) service type with the real port number to - * advertise our IPP printer... - */ + // Register the _printer._tcp (LPD) service type with a port number of 0 to + // defend our service name but not actually support LPD... + if_index = !strcmp(printer->hostname, "localhost") ? CUPS_DNSSD_IF_INDEX_LOCAL : CUPS_DNSSD_IF_INDEX_ANY; - if (printer->ipp_ref) - DNSServiceRefDeallocate(printer->ipp_ref); + cupsDNSSDServiceDelete(printer->services); + if ((printer->services = cupsDNSSDServiceNew(printer->dnssd, if_index, printer->dnssd_name, (cups_dnssd_service_cb_t)dnssd_callback, printer)) == NULL) + goto error; - printer->ipp_ref = DNSSDMaster; + if (!cupsDNSSDServiceAdd(printer->services, "_printer._tcp", /*domain*/NULL, printer->hostname, /*port*/0, /*num_txt*/0, /*txt*/NULL)) + goto error; + // Then register the _ipp._tcp (IPP) service type with the real port number to + // advertise our IPP printer... if (printer->dnssd_subtypes && *(printer->dnssd_subtypes)) snprintf(regtype, sizeof(regtype), "_ipp._tcp,%s", printer->dnssd_subtypes); else cupsCopyString(regtype, "_ipp._tcp", sizeof(regtype)); - if ((error = DNSServiceRegister(&(printer->ipp_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) - { - _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, regtype, error); - return (0); - } - - /* - * Then register the _ipps._tcp (IPP) service type with the real port number to - * advertise our IPPS printer... - */ - - if (printer->ipps_ref) - DNSServiceRefDeallocate(printer->ipps_ref); - - printer->ipps_ref = DNSSDMaster; + if (!cupsDNSSDServiceAdd(printer->services, regtype, /*domain*/NULL, printer->hostname, (uint16_t)printer->port, num_txt, txt)) + goto error; + // Then register the _ipps._tcp (IPP) service type with the real port number + // to advertise our IPPS printer... if (printer->dnssd_subtypes && *(printer->dnssd_subtypes)) snprintf(regtype, sizeof(regtype), "_ipps._tcp,%s", printer->dnssd_subtypes); else cupsCopyString(regtype, "_ipps._tcp", sizeof(regtype)); - if ((error = DNSServiceRegister(&(printer->ipps_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, regtype, NULL /* domain */, NULL /* host */, htons(printer->port), TXTRecordGetLength(&ipp_txt), TXTRecordGetBytesPtr(&ipp_txt), (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) - { - _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, regtype, error); - return (0); - } - - /* - * Similarly, register the _http._tcp,_printer (HTTP) service type with the - * real port number to advertise our IPP printer... - */ - - if (printer->http_ref) - DNSServiceRefDeallocate(printer->http_ref); - - printer->http_ref = DNSSDMaster; - - if ((error = DNSServiceRegister(&(printer->http_ref), kDNSServiceFlagsShareConnection | kDNSServiceFlagsNoAutoRename, ifindex, printer->dnssd_name, "_http._tcp,_printer", NULL /* domain */, NULL /* host */, htons(printer->port), 0 /* txtLen */, NULL /* txtRecord */, (DNSServiceRegisterReply)dnssd_callback, printer)) != kDNSServiceErr_NoError) - { - _cupsLangPrintf(stderr, _("Unable to register \"%s.%s\": %d"), printer->dnssd_name, "_http._tcp,_printer", error); - return (0); - } - - TXTRecordDeallocate(&ipp_txt); - -#elif defined(HAVE_AVAHI) - char temp[256]; /* Subtype service string */ - - /* - * Create the TXT record... - */ - - ipp_txt = NULL; - ipp_txt = avahi_string_list_add_printf(ipp_txt, "rp=ipp/print"); - if ((value = ippGetString(printer_make_and_model, 0, NULL)) != NULL) - ipp_txt = avahi_string_list_add_printf(ipp_txt, "ty=%s", value); - ipp_txt = avahi_string_list_add_printf(ipp_txt, "adminurl=%s", adminurl); - if ((value = ippGetString(printer_location, 0, NULL)) != NULL) - ipp_txt = avahi_string_list_add_printf(ipp_txt, "note=%s", value); - ipp_txt = avahi_string_list_add_printf(ipp_txt, "pdl=%s", formats); - ipp_txt = avahi_string_list_add_printf(ipp_txt, "Color=%s", ippGetBoolean(color_supported, 0) ? "T" : "F"); - ipp_txt = avahi_string_list_add_printf(ipp_txt, "Duplex=%s", ippGetCount(sides_supported) > 1 ? "T" : "F"); - if ((value = ippGetString(printer_uuid, 0, NULL)) != NULL) - ipp_txt = avahi_string_list_add_printf(ipp_txt, "UUID=%s", value + 9); - ipp_txt = avahi_string_list_add_printf(ipp_txt, "TLS=1.2"); - if (urf[0]) - ipp_txt = avahi_string_list_add_printf(ipp_txt, "URF=%s", urf); - ipp_txt = avahi_string_list_add_printf(ipp_txt, "txtvers=1"); - ipp_txt = avahi_string_list_add_printf(ipp_txt, "qtotal=1"); - - /* - * Register _printer._tcp (LPD) with port 0 to reserve the service name... - */ - - avahi_threaded_poll_lock(DNSSDMaster); - - if (printer->dnssd_ref) - avahi_entry_group_free(printer->dnssd_ref); - - printer->dnssd_ref = avahi_entry_group_new(DNSSDClient, dnssd_callback, printer); - - avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_printer._tcp", NULL, NULL, 0, NULL); - - /* - * Then register the _ipp._tcp (IPP)... - */ - - avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, NULL, printer->port, ipp_txt); - if (printer->dnssd_subtypes && *(printer->dnssd_subtypes)) - { - char *temptypes = strdup(printer->dnssd_subtypes), *start, *end; - - for (start = temptypes; *start; start = end) - { - if ((end = strchr(start, ',')) != NULL) - *end++ = '\0'; - else - end = start + strlen(start); - - snprintf(temp, sizeof(temp), "%s._sub._ipp._tcp", start); - avahi_entry_group_add_service_subtype(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipp._tcp", NULL, temp); - } - - free(temptypes); - } - - /* - * _ipps._tcp (IPPS) for secure printing... - */ - - avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, NULL, printer->port, ipp_txt); - if (printer->dnssd_subtypes && *(printer->dnssd_subtypes)) - { - char *temptypes = strdup(printer->dnssd_subtypes), *start, *end; - - for (start = temptypes; *start; start = end) - { - if ((end = strchr(start, ',')) != NULL) - *end++ = '\0'; - else - end = start + strlen(start); + if (!cupsDNSSDServiceAdd(printer->services, regtype, /*domain*/NULL, printer->hostname, (uint16_t)printer->port, num_txt, txt)) + goto error; - snprintf(temp, sizeof(temp), "%s._sub._ipps._tcp", start); - avahi_entry_group_add_service_subtype(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_ipps._tcp", NULL, temp); - } - - free(temptypes); - } - - /* - * Finally _http.tcp (HTTP) for the web interface... - */ + // Similarly, register the _http._tcp,_printer (HTTP) service type with the + // real port number to advertise our IPP printer's web interface... + if (!cupsDNSSDServiceAdd(printer->services, "_http._tcp,_printer", /*domain*/NULL, printer->hostname, (uint16_t)printer->port, num_txt, txt)) + goto error; - avahi_entry_group_add_service_strlst(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, NULL, printer->port, NULL); - avahi_entry_group_add_service_subtype(printer->dnssd_ref, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, printer->dnssd_name, "_http._tcp", NULL, "_printer._sub._http._tcp"); + cupsFreeOptions(num_txt, txt); - /* - * Commit it... - */ + // Commit it... + return (cupsDNSSDServicePublish(printer->services)); - avahi_entry_group_commit(printer->dnssd_ref); - avahi_threaded_poll_unlock(DNSSDMaster); - - avahi_string_list_free(ipp_txt); -#endif /* HAVE_MDNSRESPONDER */ + // If we get here there was a problem... + error: - return (1); + cupsFreeOptions(num_txt, txt); + return (false); } -/* - * 'respond_http()' - Send a HTTP response. - */ +// +// 'respond_http()' - Send a HTTP response. +// -int /* O - 1 on success, 0 on failure */ +bool // O - `true` on success, `false` on failure respond_http( - ippeve_client_t *client, /* I - Client */ - http_status_t code, /* I - HTTP status of response */ - const char *content_encoding, /* I - Content-Encoding of response */ - const char *type, /* I - MIME media type of response */ - size_t length) /* I - Length of response */ + ippeve_client_t *client, // I - Client + http_status_t code, // I - HTTP status of response + const char *content_encoding, // I - Content-Encoding of response + const char *type, // I - MIME media type of response + size_t length) // I - Length of response { - char message[1024]; /* Text message */ + char message[1024]; // Text message - fprintf(stderr, "%s %s\n", client->hostname, httpStatus(code)); + fprintf(stderr, "%s %s\n", client->hostname, httpStatusString(code)); if (code == HTTP_STATUS_CONTINUE) { - /* - * 100-continue doesn't send any headers... - */ - - return (httpWriteResponse(client->http, HTTP_STATUS_CONTINUE) == 0); + // 100-continue doesn't send any headers... + return (httpWriteResponse(client->http, HTTP_STATUS_CONTINUE)); } - /* - * Format an error message... - */ - + // Format an error message... if (!type && !length && code != HTTP_STATUS_OK && code != HTTP_STATUS_SWITCHING_PROTOCOLS) { - snprintf(message, sizeof(message), "%d - %s\n", code, httpStatus(code)); + snprintf(message, sizeof(message), "%d - %s\n", code, httpStatusString(code)); type = "text/plain"; length = strlen(message); @@ -7465,19 +5992,15 @@ respond_http( else message[0] = '\0'; - /* - * Send the HTTP response header... - */ - + // Send the HTTP response header... httpClearFields(client->http); - if (code == HTTP_STATUS_METHOD_NOT_ALLOWED || - client->operation == HTTP_STATE_OPTIONS) + if (code == HTTP_STATUS_METHOD_NOT_ALLOWED || client->operation == HTTP_STATE_OPTIONS) httpSetField(client->http, HTTP_FIELD_ALLOW, "GET, HEAD, OPTIONS, POST"); if (code == HTTP_STATUS_UNAUTHORIZED) { - char value[256]; /* WWW-Authenticate value */ + char value[256]; // WWW-Authenticate value snprintf(value, sizeof(value), "Basic realm=\"%s\"", PAMService); httpSetField(client->http, HTTP_FIELD_WWW_AUTHENTICATE, value); @@ -7486,8 +6009,7 @@ respond_http( if (type) { if (!strcmp(type, "text/html")) - httpSetField(client->http, HTTP_FIELD_CONTENT_TYPE, - "text/html; charset=utf-8"); + httpSetField(client->http, HTTP_FIELD_CONTENT_TYPE, "text/html; charset=utf-8"); else httpSetField(client->http, HTTP_FIELD_CONTENT_TYPE, type); @@ -7497,53 +6019,44 @@ respond_http( httpSetLength(client->http, length); - if (httpWriteResponse(client->http, code) < 0) - return (0); - - /* - * Send the response data... - */ + if (!httpWriteResponse(client->http, code)) + return (false); + // Send the response data... if (message[0]) { - /* - * Send a plain text message. - */ - + // Send a plain text message. if (httpPrintf(client->http, "%s", message) < 0) - return (0); + return (false); - if (httpWrite2(client->http, "", 0) < 0) - return (0); + if (httpWrite(client->http, "", 0) < 0) + return (false); } else if (client->response) { - /* - * Send an IPP response... - */ - + // Send an IPP response... debug_attributes("Response", client->response, 2); ippSetState(client->response, IPP_STATE_IDLE); if (ippWrite(client->http, client->response) != IPP_STATE_DATA) - return (0); + return (false); } - return (1); + return (true); } -/* - * 'respond_ignored()' - Respond with an ignored attribute. - */ +// +// 'respond_ignored()' - Respond with an ignored attribute. +// static void respond_ignored( - ippeve_client_t *client, /* I - Client */ - ipp_attribute_t *attr) /* I - Attribute */ + ippeve_client_t *client, // I - Client + ipp_attribute_t *attr) // I - Attribute { - ipp_attribute_t *temp; /* Copy of attribute */ + ipp_attribute_t *temp; // Copy of attribute if (!ippGetStatusCode(client->response)) @@ -7554,25 +6067,25 @@ respond_ignored( } -/* - * 'respond_ipp()' - Send an IPP response. - */ +// +// 'respond_ipp()' - Send an IPP response. +// static void -respond_ipp(ippeve_client_t *client, /* I - Client */ - ipp_status_t status, /* I - status-code */ - const char *message, /* I - printf-style status-message */ - ...) /* I - Additional args as needed */ +respond_ipp(ippeve_client_t *client, // I - Client + ipp_status_t status, // I - status-code + const char *message, // I - printf-style status-message + ...) // I - Additional args as needed { - const char *formatted = NULL; /* Formatted message */ + const char *formatted = NULL; // Formatted message ippSetStatusCode(client->response, status); if (message) { - va_list ap; /* Pointer to additional args */ - ipp_attribute_t *attr; /* New status-message attribute */ + va_list ap; // Pointer to additional args + ipp_attribute_t *attr; // New status-message attribute va_start(ap, message); if ((attr = ippFindAttribute(client->response, "status-message", IPP_TAG_TEXT)) != NULL) @@ -7591,16 +6104,16 @@ respond_ipp(ippeve_client_t *client, /* I - Client */ } -/* - * 'respond_unsupported()' - Respond with an unsupported attribute. - */ +// +// 'respond_unsupported()' - Respond with an unsupported attribute. +// static void respond_unsupported( - ippeve_client_t *client, /* I - Client */ - ipp_attribute_t *attr) /* I - Attribute */ + ippeve_client_t *client, // I - Client + ipp_attribute_t *attr) // I - Atribute { - ipp_attribute_t *temp; /* Copy of attribute */ + ipp_attribute_t *temp; // Copy of attribute respond_ipp(client, IPP_STATUS_ERROR_ATTRIBUTES_OR_VALUES, "Unsupported %s %s%s value.", ippGetName(attr), ippGetCount(attr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attr))); @@ -7610,31 +6123,25 @@ respond_unsupported( } -/* - * 'run_printer()' - Run the printer service. - */ +// +// 'run_printer()' - Run the printer service. +// static void -run_printer(ippeve_printer_t *printer) /* I - Printer */ +run_printer(ippeve_printer_t *printer) // I - Printer { - int num_fds; /* Number of file descriptors */ - struct pollfd polldata[3]; /* poll() data */ - ippeve_client_t *client; /* New client */ + int num_fds; // Number of file descriptors + struct pollfd polldata[3]; // poll() data + ippeve_client_t *client; // New client #ifndef _WIN32 - /* - * Set signal handlers for SIGINT and SIGTERM... - */ - + // Set signal handlers for SIGINT and SIGTERM... signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); #endif // !_WIN32 - /* - * Setup poll() data for the DNS-SD service socket and IPv4/6 listeners... - */ - + // Setup poll() data for the DNS-SD service socket and IPv4/6 listeners... polldata[0].fd = printer->ipv4; polldata[0].events = POLLIN; @@ -7643,15 +6150,7 @@ run_printer(ippeve_printer_t *printer) /* I - Printer */ num_fds = 2; -#ifdef HAVE_MDNSRESPONDER - polldata[num_fds ].fd = DNSServiceRefSockFD(DNSSDMaster); - polldata[num_fds ++].events = POLLIN; -#endif /* HAVE_MDNSRESPONDER */ - - /* - * Loop until we are killed or have a hard error... - */ - + // Loop until we are killed or have a hard error... for (;;) { if (poll(polldata, (nfds_t)num_fds, 1000) < 0 && errno != EINTR) @@ -7701,64 +6200,50 @@ run_printer(ippeve_printer_t *printer) /* I - Printer */ } } - /* - * Process DNS-SD messages... - */ - -#ifdef HAVE_MDNSRESPONDER - if (polldata[2].revents & POLLIN) - DNSServiceProcessResult(DNSSDMaster); -#endif /* HAVE_MDNSRESPONDER */ - -#ifdef HAVE_DNSSD if (printer->dnssd_collision) register_printer(printer); -#endif /* HAVE_DNSSD */ - - /* - * Clean out old jobs... - */ + // Clean out old jobs... clean_jobs(printer); } } -/* - * 'show_media()' - Show media load state. - */ +// +// 'show_media()' - Show media load state. +// -static int /* O - 1 on success, 0 on failure */ -show_media(ippeve_client_t *client) /* I - Client connection */ +static int // O - 1 on success, 0 on failure +show_media(ippeve_client_t *client) // I - Client connection { ippeve_printer_t *printer = client->printer; - /* Printer */ - int i, j, /* Looping vars */ - num_ready, /* Number of ready media */ - num_sizes, /* Number of media sizes */ - num_sources, /* Number of media sources */ - num_types; /* Number of media types */ - ipp_attribute_t *media_col_ready,/* media-col-ready attribute */ - *media_ready, /* media-ready attribute */ - *media_sizes, /* media-supported attribute */ - *media_sources, /* media-source-supported attribute */ - *media_types, /* media-type-supported attribute */ - *input_tray; /* printer-input-tray attribute */ - ipp_t *media_col; /* media-col value */ - const char *media_size, /* media value */ - *media_source, /* media-source value */ - *media_type, /* media-type value */ - *ready_size, /* media-col-ready media-size[-name] value */ - *ready_source, /* media-col-ready media-source value */ - *ready_tray, /* printer-input-tray value */ - *ready_type; /* media-col-ready media-type value */ - char tray_str[1024], /* printer-input-tray string value */ - *tray_ptr; /* Pointer into value */ - int tray_len; /* Length of printer-input-tray value */ - int ready_sheets; /* printer-input-tray sheets value */ - int num_options = 0;/* Number of form options */ - cups_option_t *options = NULL;/* Form options */ - static const int sheets[] = /* Number of sheets */ + // Printer + int i, j, // Looping vars + num_ready, // Number of ready media + num_sizes, // Number of media sizes + num_sources, // Number of media sources + num_types; // Number of media types + ipp_attribute_t *media_col_ready,// media-col-ready attribute + *media_ready, // media-ready attribute + *media_sizes, // media-supported attribute + *media_sources, // media-source-supported attribute + *media_types, // media-type-supported attribute + *input_tray; // printer-input-tray attribute + ipp_t *media_col; // media-col value + const char *media_size, // media value + *media_source, // media-source value + *media_type, // media-type value + *ready_size, // media-col-ready media-size[-name] value + *ready_source, // media-col-ready media-source value + *ready_tray, // printer-input-tray value + *ready_type; // media-col-ready media-type value + char tray_str[1024], // printer-input-tray string value + *tray_ptr; // Pointer into value + int tray_len; // Length of printer-input-tray value + int ready_sheets; // printer-input-tray sheets value + int num_options = 0;// Number of form options + cups_option_t *options = NULL;// Form options + static const int sheets[] = // Number of sheets { 250, 125, @@ -7812,11 +6297,10 @@ show_media(ippeve_client_t *client) /* I - Client connection */ return (1); } + num_ready = ippGetCount(media_col_ready); + num_sizes = ippGetCount(media_sizes); num_sources = ippGetCount(media_sources); - - /* - * Make sure the number of trays is consistent. - */ + num_types = ippGetCount(media_types); if (num_sources != ippGetCount(input_tray)) { @@ -7825,30 +6309,20 @@ show_media(ippeve_client_t *client) /* I - Client connection */ return (1); } - num_ready = ippGetCount(media_col_ready); - num_sizes = ippGetCount(media_sizes); - num_types = ippGetCount(media_types); - - /* - * Process form data if present... - */ - + // Process form data if present... if (printer->web_forms) num_options = parse_options(client, &options); if (num_options > 0) { - /* - * WARNING: A real printer/server implementation MUST NOT implement - * media updates via a GET request - GET requests are supposed to be - * idempotent (without side-effects) and we obviously are not - * authenticating access here. This form is provided solely to - * enable testing and development! - */ - - char name[255]; /* Form name */ - const char *val; /* Form value */ - pwg_media_t *media; /* Media info */ + // WARNING: A real printer/server implementation MUST NOT implement + // media updates via a GET request - GET requests are supposed to be + // idempotent (without side-effects) and we obviously are not + // authenticating access here. This form is provided solely to + // enable testing and development! + char name[255]; // Form name + const char *val; // Form value + pwg_media_t *media; // Media info cupsRWLockWrite(&printer->rwlock); @@ -7870,10 +6344,10 @@ show_media(ippeve_client_t *client) /* I - Client connection */ if (!strcmp(media_source, "auto") || !strcmp(media_source, "manual") || strstr(media_source, "-man") != NULL) continue; - snprintf(name, sizeof(name), "size%d", i); + snprintf(name, sizeof(name), "size%u", (unsigned)i); if ((media_size = cupsGetOption(name, num_options, options)) != NULL && (media = pwgMediaForPWG(media_size)) != NULL) { - snprintf(name, sizeof(name), "type%d", i); + snprintf(name, sizeof(name), "type%u", (unsigned)i); if ((media_type = cupsGetOption(name, num_options, options)) != NULL && !*media_type) media_type = NULL; @@ -7882,7 +6356,7 @@ show_media(ippeve_client_t *client) /* I - Client connection */ else media_ready = ippAddString(printer->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-ready", NULL, media_size); - media_col = create_media_col(media_size, media_source, media_type, media->width, media->length, -1, -1, -1, -1); + media_col = create_media_col(media_size, media_source, media_type, create_media_size(media->width, media->length), -1, -1, -1, -1); if (media_col_ready) ippSetCollection(printer->attrs, &media_col_ready, ippGetCount(media_col_ready), media_col); @@ -7893,15 +6367,18 @@ show_media(ippeve_client_t *client) /* I - Client connection */ else media = NULL; - snprintf(name, sizeof(name), "level%d", i); + snprintf(name, sizeof(name), "level%u", (unsigned)i); if ((val = cupsGetOption(name, num_options, options)) != NULL) ready_sheets = atoi(val); else ready_sheets = 0; - snprintf(tray_str, sizeof(tray_str), "type=sheetFeedAuto%sRemovableTray;mediafeed=%d;mediaxfeed=%d;maxcapacity=%d;level=%d;status=0;name=%s;", !strcmp(media_source, "by-pass-tray") ? "Non" : "", media ? media->length : 0, media ? media->width : 0, strcmp(media_source, "by-pass-tray") ? 250 : 25, ready_sheets, media_source); + if (!strcmp(media_source, "roll")) + snprintf(tray_str, sizeof(tray_str), "type=continuousRoll;mediafeed=%d;mediaxfeed=%d;maxcapacity=%d;level=%d;status=0;name=%s;", media ? media->length : 0, media ? media->width : 0, 100, ready_sheets, media_source); + else + snprintf(tray_str, sizeof(tray_str), "type=sheetFeedAuto%sRemovableTray;mediafeed=%d;mediaxfeed=%d;maxcapacity=%d;level=%d;status=0;name=%s;", !strcmp(media_source, "by-pass-tray") ? "Non" : "", media ? media->length : 0, media ? media->width : 0, strcmp(media_source, "by-pass-tray") ? 250 : 25, ready_sheets, media_source); - ippSetOctetString(printer->attrs, &input_tray, i, tray_str, (int)strlen(tray_str)); + ippSetOctetString(printer->attrs, &input_tray, i, tray_str, strlen(tray_str)); if (ready_sheets == 0) { @@ -7940,41 +6417,41 @@ show_media(ippeve_client_t *client) /* I - Client connection */ ready_source = ippGetString(ippFindAttribute(media_col, "media-source", IPP_TAG_ZERO), 0, NULL); ready_type = ippGetString(ippFindAttribute(media_col, "media-type", IPP_TAG_ZERO), 0, NULL); + if (!ready_size) + ready_size = ippGetString(media_ready, j, NULL); + if (ready_source && !strcmp(ready_source, media_source)) break; - ready_source = NULL; - ready_size = NULL; - ready_type = NULL; + ready_size = NULL; + ready_type = NULL; } html_printf(client, "%s:", media_source); - /* - * Media size... - */ - + // Media size... if (printer->web_forms) { - html_printf(client, "", (unsigned)i); + if (ready_size) + html_printf(client, "", ready_size); for (j = 0; j < num_sizes; j ++) { media_size = ippGetString(media_sizes, j, NULL); - html_printf(client, "%s", (ready_size && !strcmp(ready_size, media_size)) ? " selected" : "", media_size); + html_printf(client, "", media_size); } html_printf(client, ""); } else html_printf(client, "%s", ready_size); - /* - * Media type... - */ - + // Media type... if (printer->web_forms) { - html_printf(client, " ", (unsigned)i); + if (ready_type) + html_printf(client, "", ready_type); for (j = 0; j < num_types; j ++) { media_type = ippGetString(media_types, j, NULL); @@ -7986,10 +6463,7 @@ show_media(ippeve_client_t *client) /* I - Client connection */ else if (ready_type) html_printf(client, ", %s", ready_type); - /* - * Level/sheets loaded... - */ - + // Level/sheets loaded... if ((ready_tray = ippGetOctetString(input_tray, i, &tray_len)) != NULL) { if (tray_len > (int)(sizeof(tray_str) - 1)) @@ -8007,7 +6481,7 @@ show_media(ippeve_client_t *client) /* I - Client connection */ if (printer->web_forms) { - html_printf(client, " ", (unsigned)i); for (j = 0; j < (int)(sizeof(sheets) / sizeof(sheets[0])); j ++) { if (!strcmp(media_source, "by-pass-tray") && sheets[j] > 25) @@ -8055,19 +6529,19 @@ show_media(ippeve_client_t *client) /* I - Client connection */ } -/* - * 'show_status()' - Show printer/system state. - */ +// +// 'show_status()' - Show printer/system state. +// -static int /* O - 1 on success, 0 on failure */ -show_status(ippeve_client_t *client) /* I - Client connection */ +static int // O - 1 on success, 0 on failure +show_status(ippeve_client_t *client) // I - Client connection { ippeve_printer_t *printer = client->printer; - /* Printer */ - ippeve_job_t *job; /* Current job */ - int i; /* Looping var */ - ippeve_preason_t reason; /* Current reason */ - static const char * const reasons[] = /* Reason strings */ + // Printer + ippeve_job_t *job; // Current job + size_t i; // Looping var + ippeve_preason_t reason; // Current reason + static const char * const reasons[] = // Reason strings { "Other", "Cover Open", @@ -8087,10 +6561,10 @@ show_status(ippeve_client_t *client) /* I - Client connection */ "Toner Low" }; static const char * const state_colors[] = - { /* State colors */ - "#0C0", /* Idle */ - "#EE0", /* Processing */ - "#C00" /* Stopped */ + { // State colors + "#0C0", // Idle + "#EE0", // Processing + "#C00" // Stopped }; @@ -8099,21 +6573,21 @@ show_status(ippeve_client_t *client) /* I - Client connection */ html_header(client, printer->name, printer->state == IPP_PSTATE_PROCESSING ? 5 : 15); html_printf(client, "

%s Jobs

\n", state_colors[printer->state - IPP_PSTATE_IDLE], printer->name); - html_printf(client, "

%s, %d job(s).", printer->state == IPP_PSTATE_IDLE ? "Idle" : printer->state == IPP_PSTATE_PROCESSING ? "Printing" : "Stopped", cupsArrayCount(printer->jobs)); - for (i = 0, reason = 1; i < (int)(sizeof(reasons) / sizeof(reasons[0])); i ++, reason <<= 1) + html_printf(client, "

%s, %u job(s).", printer->state == IPP_PSTATE_IDLE ? "Idle" : printer->state == IPP_PSTATE_PROCESSING ? "Printing" : "Stopped", (unsigned)cupsArrayGetCount(printer->jobs)); + for (i = 0, reason = 1; i < (sizeof(reasons) / sizeof(reasons[0])); i ++, reason <<= 1) if (printer->state_reasons & reason) html_printf(client, "\n
    %s", reasons[i]); html_printf(client, "

\n"); - if (cupsArrayCount(printer->jobs) > 0) + if (cupsArrayGetCount(printer->jobs) > 0) { cupsRWLockRead(&(printer->rwlock)); html_printf(client, "\n"); - for (job = (ippeve_job_t *)cupsArrayFirst(printer->jobs); job; job = (ippeve_job_t *)cupsArrayNext(printer->jobs)) + for (job = (ippeve_job_t *)cupsArrayGetFirst(printer->jobs); job; job = (ippeve_job_t *)cupsArrayGetNext(printer->jobs)) { - char when[256], /* When job queued/started/finished */ - hhmmss[64]; /* Time HH:MM:SS */ + char when[256], // When job queued/started/finished + hhmmss[64]; // Time HH:MM:SS switch (job->state) { @@ -8149,29 +6623,29 @@ show_status(ippeve_client_t *client) /* I - Client connection */ } -/* - * 'show_supplies()' - Show printer supplies. - */ +// +// 'show_supplies()' - Show printer supplies. +// -static int /* O - 1 on success, 0 on failure */ +static int // O - 1 on success, 0 on failure show_supplies( - ippeve_client_t *client) /* I - Client connection */ + ippeve_client_t *client) // I - Client connection { ippeve_printer_t *printer = client->printer; - /* Printer */ - int i, /* Looping var */ - num_supply; /* Number of supplies */ - ipp_attribute_t *supply, /* printer-supply attribute */ - *supply_desc; /* printer-supply-description attribute */ - int num_options = 0; /* Number of form options */ - cups_option_t *options = NULL; /* Form options */ - int supply_len, /* Length of supply value */ - level; /* Supply level */ - const char *supply_value; /* Supply value */ - char supply_text[1024], /* Supply string */ - *supply_ptr; /* Pointer into supply string */ + // Printer + int i, // Looping var + num_supply; // Number of supplies + ipp_attribute_t *supply, // printer-supply attribute + *supply_desc; // printer-supply-description attribute + int num_options = 0; // Number of form options + cups_option_t *options = NULL; // Form options + int supply_len; // Length of supply value + int level; // Supply level + const char *supply_value; // Supply value + char supply_text[1024], // Supply string + *supply_ptr; // Pointer into supply string static const char * const printer_supply[] = - { /* printer-supply values */ + { // printer-supply values "index=1;class=receptacleThatIsFilled;type=wasteToner;unit=percent;" "maxcapacity=100;level=%d;colorantname=unknown;", "index=2;class=supplyThatIsConsumed;type=toner;unit=percent;" @@ -8184,14 +6658,14 @@ show_supplies( "maxcapacity=100;level=%d;colorantname=yellow;" }; static const char * const backgrounds[] = - { /* Background colors for the supply-level bars */ + { // Background colors for the supply-level bars "#777 linear-gradient(#333,#777)", "#000 linear-gradient(#666,#000)", "#0FF linear-gradient(#6FF,#0FF)", "#F0F linear-gradient(#F6F,#F0F)", "#CC0 linear-gradient(#EE6,#EE0)" }; - static const char * const colors[] = /* Text colors for the supply-level bars */ + static const char * const colors[] = // Text colors for the supply-level bars { "#fff", "#fff", @@ -8234,16 +6708,13 @@ show_supplies( if (num_options > 0) { - /* - * WARNING: A real printer/server implementation MUST NOT implement - * supply updates via a GET request - GET requests are supposed to be - * idempotent (without side-effects) and we obviously are not - * authenticating access here. This form is provided solely to - * enable testing and development! - */ - - char name[64]; /* Form field */ - const char *val; /* Form value */ + // WARNING: A real printer/server implementation MUST NOT implement + // supply updates via a GET request - GET requests are supposed to be + // idempotent (without side-effects) and we obviously are not + // authenticating access here. This form is provided solely to + // enable testing and development! + char name[64]; // Form field + const char *val; // Form value cupsRWLockWrite(&printer->rwlock); @@ -8254,16 +6725,16 @@ show_supplies( for (i = 0; i < num_supply; i ++) { - snprintf(name, sizeof(name), "supply%d", i); + snprintf(name, sizeof(name), "supply%u", (unsigned)i); if ((val = cupsGetOption(name, num_options, options)) != NULL) { - level = atoi(val); /* New level */ + level = atoi(val); // New level snprintf(supply_text, sizeof(supply_text), printer_supply[i], level); if (supply) - ippSetOctetString(printer->attrs, &supply, ippGetCount(supply), supply_text, (int)strlen(supply_text)); + ippSetOctetString(printer->attrs, &supply, ippGetCount(supply), supply_text, strlen(supply_text)); else - supply = ippAddOctetString(printer->attrs, IPP_TAG_PRINTER, "printer-supply", supply_text, (int)strlen(supply_text)); + supply = ippAddOctetString(printer->attrs, IPP_TAG_PRINTER, "printer-supply", supply_text, strlen(supply_text)); if (i == 0) { @@ -8304,7 +6775,7 @@ show_supplies( level = 50; if (printer->web_forms) - html_printf(client, "", ippGetString(supply_desc, i, NULL), i, level); + html_printf(client, "", ippGetString(supply_desc, i, NULL), (unsigned)i, level); else html_printf(client, "", ippGetString(supply_desc, i, NULL)); @@ -8342,12 +6813,12 @@ show_supplies( #ifndef _WIN32 -/* - * 'signal_handler()' - Handle termination signals. - */ +// +// 'signal_handler()' - Handle termination signals. +// static void -signal_handler(int signum) /* I - Signal number (not used) */ +signal_handler(int signum) // I - Signal number (not used) { (void)signum; @@ -8356,16 +6827,16 @@ signal_handler(int signum) /* I - Signal number (not used) */ #endif // !_WIN32 -/* - * 'time_string()' - Return the local time in hours, minutes, and seconds. - */ +// +// 'time_string()' - Return the local time in hours, minutes, and seconds. +// static char * -time_string(time_t tv, /* I - Time value */ - char *buffer, /* I - Buffer */ - size_t bufsize) /* I - Size of buffer */ +time_string(time_t tv, // I - Time value + char *buffer, // I - Buffer + size_t bufsize) // I - Size of buffer { - struct tm date; /* Local time and date */ + struct tm date; // Local time and date localtime_r(&tv, &date); @@ -8375,12 +6846,12 @@ time_string(time_t tv, /* I - Time value */ } -/* - * 'usage()' - Show program usage. - */ +// +// 'usage()' - Show program usage. +// static void -usage(int status) /* O - Exit status */ +usage(int status) // O - Exit status { _cupsLangPuts(stdout, _("Usage: ippeveprinter [options] \"name\"")); _cupsLangPuts(stdout, _("Options:")); @@ -8394,9 +6865,6 @@ usage(int status) /* O - Exit status */ _cupsLangPuts(stdout, _("-F output-type/subtype Set the output format for the printer")); _cupsLangPuts(stdout, _("-K keypath Set location of server X.509 certificates and keys.")); _cupsLangPuts(stdout, _("-M manufacturer Set manufacturer name (default=Test)")); -#if !CUPS_LITE - _cupsLangPuts(stdout, _("-P filename.ppd Load printer attributes from PPD file")); -#endif /* !CUPS_LITE */ _cupsLangPuts(stdout, _("-S filename.strings Set strings file")); _cupsLangPuts(stdout, _("-V version Set default IPP version")); _cupsLangPuts(stdout, _("-a filename.conf Load printer attributes from conf file")); @@ -8417,41 +6885,35 @@ usage(int status) /* O - Exit status */ } -/* - * 'valid_doc_attributes()' - Determine whether the document attributes are - * valid. - * - * When one or more document attributes are invalid, this function adds a - * suitable response and attributes to the unsupported group. - */ +// +// 'valid_doc_attributes()' - Determine whether the document attributes are +// valid. +// +// When one or more document attributes are invalid, this function adds a +// suitable response and attributes to the unsupported group. +// -static int /* O - 1 if valid, 0 if not */ +static bool // O - `true` if valid, `false` if not valid_doc_attributes( - ippeve_client_t *client) /* I - Client */ + ippeve_client_t *client) // I - Client { - int valid = 1; /* Valid attributes? */ + bool valid = true; // Valid attributes? ipp_op_t op = ippGetOperation(client->request); - /* IPP operation */ + // IPP operation const char *op_name = ippOpString(op); - /* IPP operation name */ - ipp_attribute_t *attr, /* Current attribute */ - *supported; /* xxx-supported attribute */ + // IPP operation name + ipp_attribute_t *attr, // Current attribute + *supported; // xxx-supported attribute const char *compression = NULL, - /* compression value */ - *format = NULL; /* document-format value */ - + // compression value + *format = NULL; // document-format value - /* - * Check operation attributes... - */ + // Check operation attributes... if ((attr = ippFindAttribute(client->request, "compression", IPP_TAG_ZERO)) != NULL) { - /* - * If compression is specified, only accept a supported value in a Print-Job - * or Send-Document request... - */ - + // If compression is specified, only accept a supported value in a Print-Job + // or Send-Document request... compression = ippGetString(attr, 0, NULL); supported = ippFindAttribute(client->printer->attrs, "compression-supported", IPP_TAG_KEYWORD); @@ -8463,7 +6925,7 @@ valid_doc_attributes( !ippContainsString(supported, compression)) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else { @@ -8480,17 +6942,14 @@ valid_doc_attributes( } } - /* - * Is it a format we support? - */ - + // Is it a format we support? if ((attr = ippFindAttribute(client->request, "document-format", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_MIMETYPE || ippGetGroupTag(attr) != IPP_TAG_OPERATION) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else { @@ -8505,18 +6964,15 @@ valid_doc_attributes( { format = ippGetString(ippFindAttribute(client->printer->attrs, "document-format-default", IPP_TAG_MIMETYPE), 0, NULL); if (!format) - format = "application/octet-stream"; /* Should never happen */ + format = "application/octet-stream"; // Should never happen attr = ippAddString(client->request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", NULL, format); } if (format && !strcmp(format, "application/octet-stream") && (ippGetOperation(client->request) == IPP_OP_PRINT_JOB || ippGetOperation(client->request) == IPP_OP_SEND_DOCUMENT)) { - /* - * Auto-type the file using the first 8 bytes of the file... - */ - - unsigned char header[8]; /* First 8 bytes of file */ + // Auto-type the file using the first 8 bytes of the file... + unsigned char header[8]; // First 8 bytes of file memset(header, 0, sizeof(header)); httpPeek(client->http, (char *)header, sizeof(header)); @@ -8548,13 +7004,10 @@ valid_doc_attributes( if (op != IPP_OP_CREATE_JOB && (supported = ippFindAttribute(client->printer->attrs, "document-format-supported", IPP_TAG_MIMETYPE)) != NULL && !ippContainsString(supported, format)) { respond_unsupported(client, attr); - valid = 0; + valid = false; } - /* - * document-name - */ - + // document-name if ((attr = ippFindAttribute(client->request, "document-name", IPP_TAG_NAME)) != NULL) ippAddString(client->request, IPP_TAG_JOB, IPP_TAG_NAME, "document-name-supplied", NULL, ippGetString(attr, 0, NULL)); @@ -8562,41 +7015,35 @@ valid_doc_attributes( } -/* - * 'valid_job_attributes()' - Determine whether the job attributes are valid. - * - * When one or more job attributes are invalid, this function adds a suitable - * response and attributes to the unsupported group. - */ +// +// 'valid_job_attributes()' - Determine whether the job attributes are valid. +// +// When one or more job attributes are invalid, this function adds a suitable +// response and attributes to the unsupported group. +// -static int /* O - 1 if valid, 0 if not */ +static bool // O - `true` if valid, `false` if not valid_job_attributes( - ippeve_client_t *client) /* I - Client */ + ippeve_client_t *client) // I - Client { - int i, /* Looping var */ - count, /* Number of values */ - fidelity, /* "ipp-attribute-fidelity" value */ - valid = 1; /* Valid attributes? */ - ipp_attribute_t *attr, /* Current attribute */ - *supported; /* xxx-supported attribute */ + int i, // Looping var + count; // Number of values + bool fidelity, // "ipp-attribute-fidelity" value + valid = true; // Valid attributes? + ipp_attribute_t *attr, // Current attribute + *supported; // xxx-supported attribute - /* - * Check operation attributes... - */ - + // Check operation attributes... valid = valid_doc_attributes(client); - /* - * Check the various job template attributes... - */ - + // Check the various job template attributes... if ((attr = ippFindAttribute(client->request, "ipp-attribute-fidelity", IPP_TAG_ZERO)) != NULL) { if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_BOOLEAN) { respond_unsupported(client, attr); - valid = 0; + valid = false; } } @@ -8610,7 +7057,7 @@ valid_job_attributes( if (fidelity) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else { @@ -8629,7 +7076,7 @@ valid_job_attributes( strcmp(ippGetString(attr, 0, NULL), "no-hold")) { respond_unsupported(client, attr); - valid = 0; + valid = false; } } @@ -8638,7 +7085,7 @@ valid_job_attributes( if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_INTEGER || ippGetInteger(attr, 0) < 0) { respond_unsupported(client, attr); - valid = 0; + valid = false; } } @@ -8649,7 +7096,7 @@ valid_job_attributes( ippGetValueTag(attr) != IPP_TAG_NAMELANG)) { respond_unsupported(client, attr); - valid = 0; + valid = false; } ippSetGroupTag(client->request, &attr, IPP_TAG_JOB); @@ -8665,7 +7112,7 @@ valid_job_attributes( ippGetInteger(attr, 0) < 1 || ippGetInteger(attr, 0) > 100) { respond_unsupported(client, attr); - valid = 0; + valid = false; } } @@ -8678,7 +7125,7 @@ valid_job_attributes( strcmp(ippGetString(attr, 0, NULL), "none")) { respond_unsupported(client, attr); - valid = 0; + valid = false; } } @@ -8690,7 +7137,7 @@ valid_job_attributes( ippGetValueTag(attr) != IPP_TAG_KEYWORD)) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else { @@ -8701,7 +7148,7 @@ valid_job_attributes( if (fidelity) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else { @@ -8714,19 +7161,19 @@ valid_job_attributes( if ((attr = ippFindAttribute(client->request, "media-col", IPP_TAG_ZERO)) != NULL) { - ipp_t *col, /* media-col collection */ - *size; /* media-size collection */ - ipp_attribute_t *member, /* Member attribute */ - *x_dim, /* x-dimension */ - *y_dim; /* y-dimension */ - int x_value, /* y-dimension value */ - y_value; /* x-dimension value */ + ipp_t *col, // media-col collection + *size; // media-size collection + ipp_attribute_t *member, // Member attribute + *x_dim, // x-dimension + *y_dim; // y-dimension + int x_value, // y-dimension value + y_value; // x-dimension value if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_BEGIN_COLLECTION) { respond_unsupported(client, attr); - valid = 0; + valid = false; } col = ippGetCollection(attr, 0); @@ -8739,7 +7186,7 @@ valid_job_attributes( ippGetValueTag(member) != IPP_TAG_KEYWORD)) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else { @@ -8750,7 +7197,7 @@ valid_job_attributes( if (fidelity) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else { @@ -8765,7 +7212,7 @@ valid_job_attributes( if (ippGetCount(member) != 1) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else { @@ -8775,7 +7222,7 @@ valid_job_attributes( (y_dim = ippFindAttribute(size, "y-dimension", IPP_TAG_INTEGER)) == NULL || ippGetCount(y_dim) != 1) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else { @@ -8822,7 +7269,7 @@ valid_job_attributes( if (fidelity) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else { @@ -8844,7 +7291,7 @@ valid_job_attributes( "separate-documents-collated-copies"))) { respond_unsupported(client, attr); - valid = 0; + valid = false; } } @@ -8855,7 +7302,7 @@ valid_job_attributes( ippGetInteger(attr, 0) > IPP_ORIENT_REVERSE_PORTRAIT) { respond_unsupported(client, attr); - valid = 0; + valid = false; } } @@ -8864,7 +7311,7 @@ valid_job_attributes( if (ippGetValueTag(attr) != IPP_TAG_RANGE) { respond_unsupported(client, attr); - valid = 0; + valid = false; } } @@ -8875,7 +7322,7 @@ valid_job_attributes( ippGetInteger(attr, 0) > IPP_QUALITY_HIGH) { respond_unsupported(client, attr); - valid = 0; + valid = false; } } @@ -8887,15 +7334,15 @@ valid_job_attributes( !supported) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else { - int xdpi, /* Horizontal resolution for job template attribute */ - ydpi, /* Vertical resolution for job template attribute */ - sydpi; /* Vertical resolution for supported value */ - ipp_res_t units, /* Units for job template attribute */ - sunits; /* Units for supported value */ + int xdpi, // Horizontal resolution for job template attribute + ydpi, // Vertical resolution for job template attribute + sydpi; // Vertical resolution for supported value + ipp_res_t units, // Units for job template attribute + sunits; // Units for supported value xdpi = ippGetResolution(attr, 0, &ydpi, &units); count = ippGetCount(supported); @@ -8911,7 +7358,7 @@ valid_job_attributes( if (fidelity) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else { @@ -8925,12 +7372,12 @@ valid_job_attributes( if ((attr = ippFindAttribute(client->request, "sides", IPP_TAG_ZERO)) != NULL) { const char *sides = ippGetString(attr, 0, NULL); - /* "sides" value... */ + // "sides" value... if (ippGetCount(attr) != 1 || ippGetValueTag(attr) != IPP_TAG_KEYWORD) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else if ((supported = ippFindAttribute(client->printer->attrs, "sides-supported", IPP_TAG_KEYWORD)) != NULL) { @@ -8939,7 +7386,7 @@ valid_job_attributes( if (fidelity) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else { @@ -8953,7 +7400,7 @@ valid_job_attributes( if (fidelity) { respond_unsupported(client, attr); - valid = 0; + valid = false; } else { diff --git a/tools/ippfind.c b/tools/ippfind.c index 5b021e220b..4b2392411c 100644 --- a/tools/ippfind.c +++ b/tools/ippfind.c @@ -100,7 +100,7 @@ typedef struct ippfind_srv_s // Service information *host, // Hostname *resource, // Resource path *uri; // URI - size_t num_txt; // Number of TXT record keys + int num_txt; // Number of TXT record keys cups_option_t *txt; // TXT record keys int port; // Port number bool is_local, // Is a local service? @@ -128,12 +128,12 @@ static int ipp_version = 20; // IPP version for LIST static void browse_callback(cups_dnssd_browse_t *browse, void *context, cups_dnssd_flags_t flags, uint32_t if_index, const char *serviceName, const char *regtype, const char *replyDomain); static int compare_services(ippfind_srv_t *a, ippfind_srv_t *b); static int eval_expr(ippfind_srv_t *service, ippfind_expr_t *expressions); -static int exec_program(ippfind_srv_t *service, size_t num_args, char **args); +static int exec_program(ippfind_srv_t *service, int num_args, char **args); static ippfind_srv_t *get_service(ippfind_srvs_t *services, const char *serviceName, const char *regtype, const char *replyDomain) _CUPS_NONNULL(1,2,3,4); static double get_time(void); static int list_service(ippfind_srv_t *service); static ippfind_expr_t *new_expr(ippfind_op_t op, bool invert, const char *value, const char *regex, char **args); -static void resolve_callback(cups_dnssd_resolve_t *resolve, void *context, cups_dnssd_flags_t flags, uint32_t if_index, const char *fullName, const char *hostTarget, uint16_t port, size_t num_txt, cups_option_t *txt); +static void resolve_callback(cups_dnssd_resolve_t *resolve, void *context, cups_dnssd_flags_t flags, uint32_t if_index, const char *fullName, const char *hostTarget, uint16_t port, int num_txt, cups_option_t *txt); static void set_service_uri(ippfind_srv_t *service); static void show_usage(void) _CUPS_NORETURN; static void show_version(void) _CUPS_NORETURN; @@ -1071,7 +1071,7 @@ main(int argc, // I - Number of command-line args while (get_time() < endtime) { // Process any services that we have found... - size_t j, // Looping var + int j, // Looping var count, // Number of services active = 0, // Number of active resolves resolved = 0, // Number of resolved services @@ -1299,7 +1299,7 @@ eval_expr(ippfind_srv_t *service, // I - Service static int // O - 1 if program terminated successfully, 0 otherwise exec_program(ippfind_srv_t *service, // I - Service - size_t num_args, // I - Number of command-line args + int num_args, // I - Number of command-line args char **args) // I - Command-line arguments { char **myargv, // Command-line arguments @@ -1313,7 +1313,7 @@ exec_program(ippfind_srv_t *service, // I - Service scheme[128], // IPPFIND_SERVICE_SCHEME uri[1024], // IPPFIND_SERVICE_URI txt[100][256]; // IPPFIND_TXT_foo - size_t i, // Looping var + int i, // Looping var myenvc; // Number of environment variables int status; // Exit status of program #ifndef _WIN32 @@ -1541,7 +1541,7 @@ get_service(ippfind_srvs_t *services, // I - Service array const char *regtype, // I - Type of service const char *replyDomain)// I - Service domain { - size_t i, // Looping var + int i, // Looping var count; // Number of services ippfind_srv_t key, // Search key *service; // Service @@ -1641,7 +1641,7 @@ list_service(ippfind_srv_t *service) // I - Service ipp_t *request, // IPP request *response; // IPP response ipp_attribute_t *attr; // IPP attribute - size_t i, // Looping var + int i, // Looping var count; // Number of values int version; // IPP version bool paccepting; // printer-is-accepting-jobs value @@ -1885,17 +1885,17 @@ resolve_callback( const char *fullName, // I - Full service name const char *hostTarget, // I - Hostname uint16_t port, // I - Port number - size_t num_txt, // I - Number of TXT key/value pairs + int num_txt, // I - Number of TXT key/value pairs cups_option_t *txt) // I - TXT key/value pairs { ippfind_srv_t *service = (ippfind_srv_t *)context; // Service - size_t i; // Looping var + int i; // Looping var char *value; // Pointer into value if (getenv("IPPFIND_DEBUG")) - fprintf(stderr, "R flags=0x%04X, if_index=%u, fullName=\"%s\", hostTarget=\"%s\", port=%u, num_txt=%u, txt=%p\n", flags, if_index, fullName, hostTarget, port, (unsigned)num_txt, txt); + fprintf(stderr, "R flags=0x%04X, if_index=%u, fullName=\"%s\", hostTarget=\"%s\", port=%u, num_txt=%d, txt=%p\n", flags, if_index, fullName, hostTarget, port, num_txt, (void *)txt); (void)resolve; (void)if_index; diff --git a/tools/ipptool.c b/tools/ipptool.c index 4a10e14335..1d975207b2 100644 --- a/tools/ipptool.c +++ b/tools/ipptool.c @@ -1,285 +1,310 @@ -/* - * ipptool command for CUPS. - * - * Copyright © 2021-2023 by OpenPrinting. - * Copyright © 2020 by The Printer Working Group. - * Copyright © 2007-2021 by Apple Inc. - * Copyright © 1997-2007 by Easy Software Products. - * - * Licensed under Apache License v2.0. See the file "LICENSE" for more - * information. - */ - -/* - * Include necessary headers... - */ +// +// ipptool command for CUPS. +// +// Copyright © 2021-2023 by OpenPrinting. +// Copyright © 2020 by The Printer Working Group. +// Copyright © 2007-2021 by Apple Inc. +// Copyright © 1997-2007 by Easy Software Products. +// +// Licensed under Apache License v2.0. See the file "LICENSE" for more +// information. +// + +// +// Include necessary headers... +// #include +#include #include #include #ifdef _WIN32 # include # ifndef R_OK # define R_OK 0 -# endif /* !R_OK */ +# endif // !R_OK #else # include # include -#endif /* _WIN32 */ +#endif // _WIN32 #ifndef O_BINARY # define O_BINARY 0 -#endif /* !O_BINARY */ +#endif // !O_BINARY -/* - * Limits... - */ +// +// Limits... +// -#define MAX_EXPECT 200 // Maximum number of EXPECT directives +#define MAX_EXPECT 1000 // Maximum number of EXPECT directives #define MAX_DISPLAY 200 // Maximum number of DISPLAY directives #define MAX_MONITOR 10 // Maximum number of MONITOR-PRINTER-STATE EXPECT directives -/* - * Types... - */ +// +// Types... +// -typedef enum ipptool_transfer_e /**** How to send request data ****/ +typedef enum ipptool_content_e // Content Validation { - IPPTOOL_TRANSFER_AUTO, /* Chunk for files, length for static */ - IPPTOOL_TRANSFER_CHUNKED, /* Chunk always */ - IPPTOOL_TRANSFER_LENGTH /* Length always */ -} ipptool_transfer_t; + IPPTOOL_CONTENT_NONE, // No content validation + IPPTOOL_CONTENT_AVAILABLE, // Accessible resource + IPPTOOL_CONTENT_VALID, // Valid resource + IPPTOOL_CONTENT_VALID_ICON // Valid icon resource +} ipptool_content_t; -typedef enum ipptool_output_e /**** Output mode ****/ +typedef enum ipptool_output_e // Output mode { - IPPTOOL_OUTPUT_QUIET, /* No output */ - IPPTOOL_OUTPUT_TEST, /* Traditional CUPS test output */ - IPPTOOL_OUTPUT_PLIST, /* XML plist test output */ - IPPTOOL_OUTPUT_IPPSERVER, /* ippserver attribute file output */ - IPPTOOL_OUTPUT_LIST, /* Tabular list output */ - IPPTOOL_OUTPUT_CSV, /* Comma-separated values output */ - IPPTOOL_OUTPUT_JSON /* JSON output */ + IPPTOOL_OUTPUT_QUIET, // No output + IPPTOOL_OUTPUT_TEST, // Traditional CUPS test output + IPPTOOL_OUTPUT_PLIST, // XML plist test output + IPPTOOL_OUTPUT_IPPSERVER, // ippserver attribute file output + IPPTOOL_OUTPUT_LIST, // Tabular list output + IPPTOOL_OUTPUT_CSV, // Comma-separated values output + IPPTOOL_OUTPUT_JSON // JSON output } ipptool_output_t; -typedef enum ipptool_with_e /**** WITH flags ****/ +typedef enum ipptool_transfer_e // How to send request data +{ + IPPTOOL_TRANSFER_AUTO, // Chunk for files, length for static + IPPTOOL_TRANSFER_CHUNKED, // Chunk always + IPPTOOL_TRANSFER_LENGTH // Length always +} ipptool_transfer_t; + +typedef enum ipptool_with_e // WITH flags { - IPPTOOL_WITH_LITERAL = 0, /* Match string is a literal value */ - IPPTOOL_WITH_ALL = 1, /* Must match all values */ - IPPTOOL_WITH_REGEX = 2, /* Match string is a regular expression */ - IPPTOOL_WITH_HOSTNAME = 4, /* Match string is a URI hostname */ - IPPTOOL_WITH_RESOURCE = 8, /* Match string is a URI resource */ - IPPTOOL_WITH_SCHEME = 16 /* Match string is a URI scheme */ + IPPTOOL_WITH_LITERAL = 0, // Match string is a literal value + IPPTOOL_WITH_ALL = 1, // Must match all values + IPPTOOL_WITH_REGEX = 2, // Match string is a regular expression + IPPTOOL_WITH_HOSTNAME = 4, // Match string is a URI hostname + IPPTOOL_WITH_RESOURCE = 8, // Match string is a URI resource + IPPTOOL_WITH_SCHEME = 16 // Match string is a URI scheme } ipptool_with_t; -typedef struct ipptool_expect_s /**** Expected attribute info ****/ +typedef struct ipptool_expect_s // Expected attribute info { - int optional, /* Optional attribute? */ - not_expect, /* Don't expect attribute? */ - expect_all; /* Expect all attributes to match/not match */ - char *name, /* Attribute name */ - *of_type, /* Type name */ - *same_count_as, /* Parallel attribute name */ - *if_defined, /* Only required if variable defined */ - *if_not_defined, /* Only required if variable is not defined */ - *with_value, /* Attribute must include this value */ - *with_value_from, /* Attribute must have one of the values in this attribute */ - *define_match, /* Variable to define on match */ - *define_no_match, /* Variable to define on no-match */ - *define_value, /* Variable to define with value */ - *display_match; /* Message to display on a match */ - int repeat_limit, /* Maximum number of times to repeat */ - repeat_match, /* Repeat test on match */ - repeat_no_match, /* Repeat test on no match */ - with_distinct, /* WITH-DISTINCT-VALUES? */ - with_flags, /* WITH flags */ - count; /* Expected count if > 0 */ - ipp_tag_t in_group; /* IN-GROUP value */ + bool optional, // Optional attribute? + not_expect, // Don't expect attribute? + expect_all; // Expect all attributes to match/not match + char *name, // Attribute name + *of_type, // Type name + *same_count_as, // Parallel attribute name + *if_defined, // Only required if variable defined + *if_not_defined, // Only required if variable is not defined + *with_value, // Attribute must include this value + *with_value_from, // Attribute must have one of the values in this attribute + *define_match, // Variable to define on match + *define_no_match, // Variable to define on no-match + *define_value, // Variable to define with value + *display_match; // Message to display on a match + ipptool_content_t with_content; // WITH-*-CONTENT value + cups_array_t *with_mime_types; // WITH-*-MIME-TYPES value(s) + char *save_filespec; // SAVE-*-CONTENT filespec + int repeat_limit; // Maximum number of times to repeat + bool repeat_match, // Repeat test on match + repeat_no_match, // Repeat test on no match + with_distinct; // WITH-DISTINCT-VALUES? + int with_flags; // WITH flags + int count; // Expected count if > 0 + ipp_tag_t in_group; // IN-GROUP value } ipptool_expect_t; -typedef struct ipptool_status_s /**** Status info ****/ +typedef struct ipptool_generate_s //// GENERATE-FILE parameters +{ + char media[128], // Media size name + type[128]; // Raster type/color mode + int xdpi, // Horizontal resolution + ydpi; // Vertical resolution + ipp_orient_t orientation; // Orientation + char sides[128]; // Duplex mode + int num_copies, // Number of copies + num_pages; // Number of pages + char format[128]; // Document format + char sheet_back[128]; // "pwg-raster-document-sheet-back" value +} ipptool_generate_t; + +typedef struct ipptool_status_s // Status info { - ipp_status_t status; /* Expected status code */ - char *if_defined, /* Only if variable is defined */ - *if_not_defined, /* Only if variable is not defined */ - *define_match, /* Variable to define on match */ - *define_no_match, /* Variable to define on no-match */ - *define_value; /* Variable to define with value */ - int repeat_limit, /* Maximum number of times to repeat */ - repeat_match, /* Repeat the test when it does not match */ - repeat_no_match; /* Repeat the test when it matches */ + ipp_status_t status; // Expected status code + char *if_defined, // Only if variable is defined + *if_not_defined, // Only if variable is not defined + *define_match, // Variable to define on match + *define_no_match, // Variable to define on no-match + *define_value; // Variable to define with value + int repeat_limit; // Maximum number of times to repeat + bool repeat_match, // Repeat the test when it does not match + repeat_no_match; // Repeat the test when it matches } ipptool_status_t; -typedef struct ipptool_test_s /**** Test Data ****/ +typedef struct ipptool_test_s // Test Data { - /* Global Options */ - _ipp_vars_t *vars; /* Variables */ - http_encryption_t encryption; /* Encryption for connection */ - int family; /* Address family */ - ipptool_output_t output; /* Output mode */ - int repeat_on_busy; /* Repeat tests on server-error-busy */ - int stop_after_include_error; - /* Stop after include errors? */ - double timeout; /* Timeout for connection */ - int validate_headers, /* Validate HTTP headers in response? */ - verbosity; /* Show all attributes? */ - - /* Test Defaults */ - int def_ignore_errors; /* Default IGNORE-ERRORS value */ - ipptool_transfer_t def_transfer; /* Default TRANSFER value */ - int def_version; /* Default IPP version */ - - /* Global State */ - http_t *http; /* HTTP connection to printer/server */ - cups_file_t *outfile; /* Output file */ - int show_header, /* Show the test header? */ - xml_header; /* 1 if XML plist header was written */ - int pass, /* Have we passed all tests? */ - test_count, /* Number of tests (total) */ - pass_count, /* Number of tests that passed */ - fail_count, /* Number of tests that failed */ - skip_count; /* Number of tests that were skipped */ - - /* Per-Test State */ - cups_array_t *errors; /* Errors array */ - int prev_pass, /* Result of previous test */ - skip_previous; /* Skip on previous test failure? */ - char compression[16]; /* COMPRESSION value */ - useconds_t delay; /* Initial delay */ - int num_displayed; /* Number of displayed attributes */ - char *displayed[MAX_DISPLAY];/* Displayed attributes */ - int num_expects; /* Number of expected attributes */ - ipptool_expect_t expects[MAX_EXPECT], /* Expected attributes */ - *expect, /* Current expected attribute */ - *last_expect; /* Last EXPECT (for predicates) */ - char file[1024], /* Data filename */ - file_id[1024]; /* File identifier */ - int ignore_errors; /* Ignore test failures? */ - char name[1024]; /* Test name */ - char pause[1024]; /* PAUSE value */ - useconds_t repeat_interval; /* Repeat interval (delay) */ - int request_id; /* Current request ID */ - char resource[512]; /* Resource for request */ - int pass_test, /* Pass this test? */ - skip_test, /* Skip this test? */ - num_statuses; /* Number of valid status codes */ - ipptool_status_t statuses[100], /* Valid status codes */ - *last_status; /* Last STATUS (for predicates) */ - char test_id[1024]; /* Test identifier */ - ipptool_transfer_t transfer; /* To chunk or not to chunk */ - int version; /* IPP version number to use */ - cups_thread_t monitor_thread; /* Monitoring thread ID */ - int monitor_done; /* Set to 1 to stop monitor thread */ - char *monitor_uri; /* MONITOR-PRINTER-STATE URI */ - useconds_t monitor_delay, /* MONITOR-PRINTER-STATE DELAY value, if any */ - monitor_interval; /* MONITOR-PRINTER-STATE DELAY interval */ - int num_monitor_expects; /* Number MONITOR-PRINTER-STATE EXPECTs */ + // Global Options + ipp_file_t *parent; // Parent IPP data file values + int password_tries; // Number of password attempts + http_encryption_t encryption; // Encryption for connection + int family; // Address family + ipptool_output_t output; // Output mode + bool repeat_on_busy; // Repeat tests on server-error-busy + bool stop_after_include_error; + // Stop after include errors? + double timeout; // Timeout for connection + bool validate_headers; // Validate HTTP headers in response? + int verbosity; // Show all attributes? + + // Test Defaults + bool def_ignore_errors; // Default IGNORE-ERRORS value + ipptool_transfer_t def_transfer; // Default TRANSFER value + int def_version; // Default IPP version + + // Global State + http_t *http; // HTTP connection to printer/server + cups_file_t *outfile; // Output file + bool show_header, // Show the test header? + xml_header, // `true` if XML plist header was written + pass; // Have we passed all tests? + int test_count, // Number of tests (total) + pass_count, // Number of tests that passed + fail_count, // Number of tests that failed + skip_count; // Number of tests that were skipped + + // Per-Test State + ipp_op_t op; // Operation code + cups_array_t *errors; // Errors array + bool prev_pass, // Result of previous test + skip_previous; // Skip on previous test failure? + char compression[16]; // COMPRESSION value + useconds_t delay; // Initial delay + int num_displayed; // Number of displayed attributes + char *displayed[MAX_DISPLAY];// Displayed attributes + int num_expects; // Number of expected attributes + ipptool_expect_t expects[MAX_EXPECT], // Expected attributes + *expect, // Current expected attribute + *last_expect; // Last EXPECT (for predicates) + char file[1024], // Data filename + file_id[1024]; // File identifier + bool ignore_errors; // Ignore test failures? + char name[1024]; // Test name + char pause[1024]; // PAUSE value + useconds_t repeat_interval; // Repeat interval (delay) + int request_id; // Current request ID + char resource[512]; // Resource for request + bool pass_test, // Pass this test? + skip_test; // Skip this test? + int num_statuses; // Number of valid status codes + ipptool_status_t statuses[100], // Valid status codes + *last_status; // Last STATUS (for predicates) + char test_id[1024]; // Test identifier + ipptool_transfer_t transfer; // To chunk or not to chunk + int version; // IPP version number to use + cups_thread_t monitor_thread; // Monitoring thread ID + bool monitor_done; // Set to `true` to stop monitor thread + char *monitor_uri; // MONITOR-PRINTER-STATE URI + useconds_t monitor_delay, // MONITOR-PRINTER-STATE DELAY value, if any + monitor_interval; // MONITOR-PRINTER-STATE DELAY interval + int num_monitor_expects; // Number MONITOR-PRINTER-STATE EXPECTs ipptool_expect_t monitor_expects[MAX_MONITOR]; - /* MONITOR-PRINTER-STATE EXPECTs */ + // MONITOR-PRINTER-STATE EXPECTs + ipptool_generate_t *generate_params; // GENERATE-FILE parameters + char buffer[1024*1024]; // Output buffer } ipptool_test_t; -/* - * Globals... - */ +// +// Globals... +// -static int Cancel = 0; /* Cancel test? */ +static bool Cancel = false; // Cancel test? -/* - * Local functions... - */ +// +// Local functions... +// static void add_stringf(cups_array_t *a, const char *s, ...) _CUPS_FORMAT(2, 3); -static int compare_uris(const char *a, const char *b); +static ipptool_test_t *alloc_data(void); +static void clear_data(ipptool_test_t *data); +static int compare_uris(const char *a, const char *b); +static http_t *connect_printer(ipptool_test_t *data); static void copy_hex_string(char *buffer, unsigned char *data, int datalen, size_t bufsize); +static int create_file(const char *filespec, const char *resource, int idx, char *filename, size_t filenamesize); static void *do_monitor_printer_state(ipptool_test_t *data); -static int do_test(_ipp_file_t *f, ipptool_test_t *data); -static int do_tests(const char *testfile, ipptool_test_t *data); -static int error_cb(_ipp_file_t *f, ipptool_test_t *data, const char *error); -static int expect_matches(ipptool_expect_t *expect, ipp_attribute_t *attr); +static bool do_test(ipp_file_t *file, ipptool_test_t *data); +static bool do_tests(const char *testfile, ipptool_test_t *data); +static bool error_cb(ipp_file_t *f, ipptool_test_t *data, const char *error); +static bool expect_matches(ipptool_expect_t *expect, ipp_attribute_t *attr); +static void free_data(ipptool_test_t *data); +static http_status_t generate_file(http_t *http, ipptool_generate_t *params); static char *get_filename(const char *testfile, char *dst, const char *src, size_t dstsize); static const char *get_string(ipp_attribute_t *attr, int element, int flags, char *buffer, size_t bufsize); -static void init_data(ipptool_test_t *data); static char *iso_date(const ipp_uchar_t *date); -static int parse_monitor_printer_state(_ipp_file_t *f, ipptool_test_t *data); +static bool parse_generate_file(ipp_file_t *f, ipptool_test_t *data); +static bool parse_monitor_printer_state(ipp_file_t *f, ipptool_test_t *data); +static const char *password_cb(const char *prompt, http_t *http, const char *method, const char *resource, void *user_data); static void pause_message(const char *message); static void print_attr(cups_file_t *outfile, ipptool_output_t output, ipp_attribute_t *attr, ipp_tag_t *group); -static ipp_attribute_t *print_csv(ipptool_test_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths); +static ipp_attribute_t *print_csv(ipptool_test_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, int *widths); static void print_fatal_error(ipptool_test_t *data, const char *s, ...) _CUPS_FORMAT(2, 3); static void print_ippserver_attr(ipptool_test_t *data, ipp_attribute_t *attr, int indent); static void print_ippserver_string(ipptool_test_t *data, const char *s, size_t len); static void print_json_attr(ipptool_test_t *data, ipp_attribute_t *attr, int indent); static void print_json_string(ipptool_test_t *data, const char *s, size_t len); -static ipp_attribute_t *print_line(ipptool_test_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, size_t *widths); +static ipp_attribute_t *print_line(ipptool_test_t *data, ipp_t *ipp, ipp_attribute_t *attr, int num_displayed, char **displayed, int *widths); static void print_xml_header(ipptool_test_t *data); static void print_xml_string(cups_file_t *outfile, const char *element, const char *s); static void print_xml_trailer(ipptool_test_t *data, int success, const char *message); #ifndef _WIN32 static void sigterm_handler(int sig); -#endif /* _WIN32 */ +#endif // _WIN32 static int timeout_cb(http_t *http, void *user_data); -static int token_cb(_ipp_file_t *f, _ipp_vars_t *vars, ipptool_test_t *data, const char *token); +static bool token_cb(ipp_file_t *f, ipptool_test_t *data, const char *token); static void usage(void) _CUPS_NORETURN; -static int with_distinct_values(cups_array_t *errors, ipp_attribute_t *attr); +static bool valid_image(const char *filename, int *width, int *height, int *depth); +static bool with_content(cups_array_t *errors, ipp_attribute_t *attr, ipptool_content_t content, cups_array_t *mime_types, const char *filespec); +static bool with_distinct_values(cups_array_t *errors, ipp_attribute_t *attr); static const char *with_flags_string(int flags); -static int with_value(ipptool_test_t *data, cups_array_t *errors, char *value, int flags, ipp_attribute_t *attr, char *matchbuf, size_t matchlen); -static int with_value_from(cups_array_t *errors, ipp_attribute_t *fromattr, ipp_attribute_t *attr, char *matchbuf, size_t matchlen); +static bool with_value(ipptool_test_t *data, cups_array_t *errors, char *value, int flags, ipp_attribute_t *attr, char *matchbuf, size_t matchlen); +static bool with_value_from(cups_array_t *errors, ipp_attribute_t *fromattr, ipp_attribute_t *attr, char *matchbuf, size_t matchlen); -/* - * 'main()' - Parse options and do tests. - */ +// +// 'main()' - Parse options and do tests. +// -int /* O - Exit status */ -main(int argc, /* I - Number of command-line args */ - char *argv[]) /* I - Command-line arguments */ +int // O - Exit status +main(int argc, // I - Number of command-line args + char *argv[]) // I - Command-line arguments { - int i; /* Looping var */ - int status; /* Status of tests... */ - char *opt, /* Current option */ - name[1024], /* Name/value buffer */ - *value, /* Pointer to value */ - filename[1024], /* Real filename */ - testname[1024]; /* Real test filename */ - const char *ext, /* Extension on filename */ - *testfile; /* Test file to use */ - int interval, /* Test interval in microseconds */ - repeat; /* Repeat count */ - _ipp_vars_t vars; /* Variables */ - ipptool_test_t data; /* Test data */ + int i; // Looping var + int status; // Status of tests... + char *opt, // Current option + name[1024], // Name/value buffer + *value, // Pointer to value + filename[1024], // Real filename + testname[1024]; // Real test filename + const char *base, // Base filename + *ext, // Extension on filename + *testfile; // Test file to use + int interval, // Test interval in microseconds + repeat; // Repeat count + ipptool_test_t *data; // Test data _cups_globals_t *cg = _cupsGlobals(); - /* Global data */ + // Global data #ifndef _WIN32 - /* - * Catch SIGINT and SIGTERM... - */ - + // Catch SIGINT and SIGTERM... signal(SIGINT, sigterm_handler); signal(SIGTERM, sigterm_handler); -#endif /* !_WIN32 */ - - /* - * Initialize the locale and variables... - */ +#endif // !_WIN32 + // Initialize the locale and variables... _cupsSetLocale(argv); - init_data(&data); - - _ippVarsInit(&vars, NULL, (_ipp_ferror_cb_t)error_cb, (_ipp_ftoken_cb_t)token_cb); - data.vars = &vars; - - _ippVarsSet(data.vars, "date-start", iso_date(ippTimeToDate(time(NULL)))); - - /* - * We need at least: - * - * ipptool URI testfile - */ + data = alloc_data(); + // We need at least: + // + // ipptool URI testfile interval = 0; repeat = 0; status = 0; @@ -289,6 +314,7 @@ main(int argc, /* I - Number of command-line args */ { if (!strcmp(argv[i], "--help")) { + free_data(data); usage(); } else if (!strcmp(argv[i], "--ippserver")) @@ -298,27 +324,31 @@ main(int argc, /* I - Number of command-line args */ if (i >= argc) { _cupsLangPuts(stderr, _("ipptool: Missing filename for \"--ippserver\".")); + free_data(data); usage(); } - if (data.outfile != cupsFileStdout()) + if (data->outfile != cupsFileStdout()) usage(); - if ((data.outfile = cupsFileOpen(argv[i], "w")) == NULL) + if ((data->outfile = cupsFileOpen(argv[i], "w")) == NULL) { _cupsLangPrintf(stderr, _("%s: Unable to open \"%s\": %s"), "ipptool", argv[i], strerror(errno)); - exit(1); + free_data(data); + return (1); } - data.output = IPPTOOL_OUTPUT_IPPSERVER; + data->output = IPPTOOL_OUTPUT_IPPSERVER; } else if (!strcmp(argv[i], "--stop-after-include-error")) { - data.stop_after_include_error = 1; + data->stop_after_include_error = 1; } else if (!strcmp(argv[i], "--version")) { puts(CUPS_SVERSION); + + free_data(data); return (0); } else if (argv[i][0] == '-') @@ -327,33 +357,33 @@ main(int argc, /* I - Number of command-line args */ { switch (*opt) { - case '4' : /* Connect using IPv4 only */ - data.family = AF_INET; + case '4' : // Connect using IPv4 only + data->family = AF_INET; break; #ifdef AF_INET6 - case '6' : /* Connect using IPv6 only */ - data.family = AF_INET6; + case '6' : // Connect using IPv6 only + data->family = AF_INET6; break; -#endif /* AF_INET6 */ +#endif // AF_INET6 - case 'C' : /* Enable HTTP chunking */ - data.def_transfer = IPPTOOL_TRANSFER_CHUNKED; + case 'C' : // Enable HTTP chunking + data->def_transfer = IPPTOOL_TRANSFER_CHUNKED; break; - case 'E' : /* Encrypt with TLS */ - data.encryption = HTTP_ENCRYPTION_REQUIRED; + case 'E' : // Encrypt with TLS + data->encryption = HTTP_ENCRYPTION_REQUIRED; break; - case 'I' : /* Ignore errors */ - data.def_ignore_errors = 1; + case 'I' : // Ignore errors + data->def_ignore_errors = 1; break; - case 'L' : /* Disable HTTP chunking */ - data.def_transfer = IPPTOOL_TRANSFER_LENGTH; + case 'L' : // Disable HTTP chunking + data->def_transfer = IPPTOOL_TRANSFER_LENGTH; break; - case 'P' : /* Output to plist file */ + case 'P' : // Output to plist file i ++; if (i >= argc) @@ -362,16 +392,16 @@ main(int argc, /* I - Number of command-line args */ usage(); } - if (data.outfile != cupsFileStdout()) + if (data->outfile != cupsFileStdout()) usage(); - if ((data.outfile = cupsFileOpen(argv[i], "w")) == NULL) + if ((data->outfile = cupsFileOpen(argv[i], "w")) == NULL) { _cupsLangPrintf(stderr, _("%s: Unable to open \"%s\": %s"), "ipptool", argv[i], strerror(errno)); exit(1); } - data.output = IPPTOOL_OUTPUT_PLIST; + data->output = IPPTOOL_OUTPUT_PLIST; if (interval || repeat) { @@ -380,15 +410,15 @@ main(int argc, /* I - Number of command-line args */ } break; - case 'R' : /* Repeat on server-error-busy */ - data.repeat_on_busy = 1; + case 'R' : // Repeat on server-error-busy + data->repeat_on_busy = 1; break; - case 'S' : /* Encrypt with SSL */ - data.encryption = HTTP_ENCRYPTION_ALWAYS; + case 'S' : // Encrypt with SSL + data->encryption = HTTP_ENCRYPTION_ALWAYS; break; - case 'T' : /* Set timeout */ + case 'T' : // Set timeout i ++; if (i >= argc) @@ -397,10 +427,10 @@ main(int argc, /* I - Number of command-line args */ usage(); } - data.timeout = _cupsStrScand(argv[i], NULL, localeconv()); + data->timeout = _cupsStrScand(argv[i], NULL, localeconv()); break; - case 'V' : /* Set IPP version */ + case 'V' : // Set IPP version i ++; if (i >= argc) @@ -411,23 +441,23 @@ main(int argc, /* I - Number of command-line args */ if (!strcmp(argv[i], "1.0")) { - data.def_version = 10; + data->def_version = 10; } else if (!strcmp(argv[i], "1.1")) { - data.def_version = 11; + data->def_version = 11; } else if (!strcmp(argv[i], "2.0")) { - data.def_version = 20; + data->def_version = 20; } else if (!strcmp(argv[i], "2.1")) { - data.def_version = 21; + data->def_version = 21; } else if (!strcmp(argv[i], "2.2")) { - data.def_version = 22; + data->def_version = 22; } else { @@ -436,8 +466,8 @@ main(int argc, /* I - Number of command-line args */ } break; - case 'X' : /* Produce XML output */ - data.output = IPPTOOL_OUTPUT_PLIST; + case 'X' : // Produce XML output + data->output = IPPTOOL_OUTPUT_PLIST; if (interval || repeat) { @@ -446,11 +476,11 @@ main(int argc, /* I - Number of command-line args */ } break; - case 'c' : /* CSV output */ - data.output = IPPTOOL_OUTPUT_CSV; + case 'c' : // CSV output + data->output = IPPTOOL_OUTPUT_CSV; break; - case 'd' : /* Define a variable */ + case 'd' : // Define a variable i ++; if (i >= argc) @@ -465,10 +495,10 @@ main(int argc, /* I - Number of command-line args */ else value = name + strlen(name); - _ippVarsSet(data.vars, name, value); + ippFileSetVar(data->parent, name, value); break; - case 'f' : /* Set the default test filename */ + case 'f' : // Set the default test filename i ++; if (i >= argc) @@ -479,15 +509,12 @@ main(int argc, /* I - Number of command-line args */ if (access(argv[i], 0)) { - /* - * Try filename.gz... - */ - + // Try filename.gz... snprintf(filename, sizeof(filename), "%s.gz", argv[i]); if (access(filename, 0) && filename[0] != '/' #ifdef _WIN32 && (!isalpha(filename[0] & 255) || filename[1] != ':') -#endif /* _WIN32 */ +#endif // _WIN32 ) { snprintf(filename, sizeof(filename), "%s/ipptool/%s", cg->cups_datadir, argv[i]); @@ -502,68 +529,57 @@ main(int argc, /* I - Number of command-line args */ else cupsCopyString(filename, argv[i], sizeof(filename)); - _ippVarsSet(data.vars, "filename", filename); + ippFileSetVar(data->parent, "filename", filename); + + if ((base = strrchr(filename, '/')) != NULL) + ippFileSetVar(data->parent, "basename", base + 1); + else + ippFileSetVar(data->parent, "basename", filename); if ((ext = strrchr(filename, '.')) != NULL) { - /* - * Guess the MIME media type based on the extension... - */ - + // Guess the MIME media type based on the extension... if (!_cups_strcasecmp(ext, ".gif")) - _ippVarsSet(data.vars, "filetype", "image/gif"); - else if (!_cups_strcasecmp(ext, ".htm") || - !_cups_strcasecmp(ext, ".htm.gz") || - !_cups_strcasecmp(ext, ".html") || - !_cups_strcasecmp(ext, ".html.gz")) - _ippVarsSet(data.vars, "filetype", "text/html"); - else if (!_cups_strcasecmp(ext, ".jpg") || - !_cups_strcasecmp(ext, ".jpeg")) - _ippVarsSet(data.vars, "filetype", "image/jpeg"); - else if (!_cups_strcasecmp(ext, ".pcl") || - !_cups_strcasecmp(ext, ".pcl.gz")) - _ippVarsSet(data.vars, "filetype", "application/vnd.hp-PCL"); + ippFileSetVar(data->parent, "filetype", "image/gif"); + else if (!_cups_strcasecmp(ext, ".htm") || !_cups_strcasecmp(ext, ".htm.gz") || !_cups_strcasecmp(ext, ".html") || !_cups_strcasecmp(ext, ".html.gz")) + ippFileSetVar(data->parent, "filetype", "text/html"); + else if (!_cups_strcasecmp(ext, ".jpg") || !_cups_strcasecmp(ext, ".jpeg")) + ippFileSetVar(data->parent, "filetype", "image/jpeg"); + else if (!_cups_strcasecmp(ext, ".pcl") || !_cups_strcasecmp(ext, ".pcl.gz")) + ippFileSetVar(data->parent, "filetype", "application/vnd.hp-PCL"); else if (!_cups_strcasecmp(ext, ".pdf")) - _ippVarsSet(data.vars, "filetype", "application/pdf"); + ippFileSetVar(data->parent, "filetype", "application/pdf"); else if (!_cups_strcasecmp(ext, ".png")) - _ippVarsSet(data.vars, "filetype", "image/png"); - else if (!_cups_strcasecmp(ext, ".ps") || - !_cups_strcasecmp(ext, ".ps.gz")) - _ippVarsSet(data.vars, "filetype", "application/postscript"); - else if (!_cups_strcasecmp(ext, ".pwg") || - !_cups_strcasecmp(ext, ".pwg.gz") || - !_cups_strcasecmp(ext, ".ras") || - !_cups_strcasecmp(ext, ".ras.gz")) - _ippVarsSet(data.vars, "filetype", "image/pwg-raster"); - else if (!_cups_strcasecmp(ext, ".tif") || - !_cups_strcasecmp(ext, ".tiff")) - _ippVarsSet(data.vars, "filetype", "image/tiff"); - else if (!_cups_strcasecmp(ext, ".txt") || - !_cups_strcasecmp(ext, ".txt.gz")) - _ippVarsSet(data.vars, "filetype", "text/plain"); - else if (!_cups_strcasecmp(ext, ".urf") || - !_cups_strcasecmp(ext, ".urf.gz")) - _ippVarsSet(data.vars, "filetype", "image/urf"); + ippFileSetVar(data->parent, "filetype", "image/png"); + else if (!_cups_strcasecmp(ext, ".ps") || !_cups_strcasecmp(ext, ".ps.gz")) + ippFileSetVar(data->parent, "filetype", "application/postscript"); + else if (!_cups_strcasecmp(ext, ".pwg") || !_cups_strcasecmp(ext, ".pwg.gz") || !_cups_strcasecmp(ext, ".ras") || !_cups_strcasecmp(ext, ".ras.gz")) + ippFileSetVar(data->parent, "filetype", "image/pwg-raster"); + else if (!_cups_strcasecmp(ext, ".pxl") || !_cups_strcasecmp(ext, ".pxl.gz")) + ippFileSetVar(data->parent, "filetype", "application/vnd.hp-PCLXL"); + else if (!_cups_strcasecmp(ext, ".tif") || !_cups_strcasecmp(ext, ".tiff")) + ippFileSetVar(data->parent, "filetype", "image/tiff"); + else if (!_cups_strcasecmp(ext, ".txt") || !_cups_strcasecmp(ext, ".txt.gz")) + ippFileSetVar(data->parent, "filetype", "text/plain"); + else if (!_cups_strcasecmp(ext, ".urf") || !_cups_strcasecmp(ext, ".urf.gz")) + ippFileSetVar(data->parent, "filetype", "image/urf"); else if (!_cups_strcasecmp(ext, ".xps")) - _ippVarsSet(data.vars, "filetype", "application/openxps"); + ippFileSetVar(data->parent, "filetype", "application/openxps"); else - _ippVarsSet(data.vars, "filetype", "application/octet-stream"); + ippFileSetVar(data->parent, "filetype", "application/octet-stream"); } else { - /* - * Use the "auto-type" MIME media type... - */ - - _ippVarsSet(data.vars, "filetype", "application/octet-stream"); + // Use the "auto-type" MIME media type... + ippFileSetVar(data->parent, "filetype", "application/octet-stream"); } break; - case 'h' : /* Validate response headers */ - data.validate_headers = 1; + case 'h' : // Validate response headers + data->validate_headers = 1; break; - case 'i' : /* Test every N seconds */ + case 'i' : // Test every N seconds i ++; if (i >= argc) @@ -581,22 +597,22 @@ main(int argc, /* I - Number of command-line args */ } } - if ((data.output == IPPTOOL_OUTPUT_PLIST || data.output == IPPTOOL_OUTPUT_IPPSERVER) && interval) + if ((data->output == IPPTOOL_OUTPUT_PLIST || data->output == IPPTOOL_OUTPUT_IPPSERVER) && interval) { _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\".")); usage(); } break; - case 'j' : /* JSON output */ - data.output = IPPTOOL_OUTPUT_JSON; + case 'j' : // JSON output + data->output = IPPTOOL_OUTPUT_JSON; break; - case 'l' : /* List as a table */ - data.output = IPPTOOL_OUTPUT_LIST; + case 'l' : // List as a table + data->output = IPPTOOL_OUTPUT_LIST; break; - case 'n' : /* Repeat count */ + case 'n' : // Repeat count i ++; if (i >= argc) @@ -607,72 +623,70 @@ main(int argc, /* I - Number of command-line args */ else repeat = atoi(argv[i]); - if ((data.output == IPPTOOL_OUTPUT_PLIST || data.output == IPPTOOL_OUTPUT_IPPSERVER) && repeat) + if ((data->output == IPPTOOL_OUTPUT_PLIST || data->output == IPPTOOL_OUTPUT_IPPSERVER) && repeat) { _cupsLangPuts(stderr, _("ipptool: \"-i\" and \"-n\" are incompatible with \"--ippserver\", \"-P\", and \"-X\".")); usage(); } break; - case 'q' : /* Be quiet */ - data.output = IPPTOOL_OUTPUT_QUIET; + case 'q' : // Be quiet + data->output = IPPTOOL_OUTPUT_QUIET; break; - case 't' : /* CUPS test output */ - data.output = IPPTOOL_OUTPUT_TEST; + case 't' : // CUPS test output + data->output = IPPTOOL_OUTPUT_TEST; break; - case 'v' : /* Be verbose */ - data.verbosity ++; + case 'v' : // Be verbose + data->verbosity ++; break; default : _cupsLangPrintf(stderr, _("%s: Unknown option \"-%c\"."), "ipptool", *opt); + free_data(data); usage(); } } } else if (!strncmp(argv[i], "ipp://", 6) || !strncmp(argv[i], "http://", 7) || !strncmp(argv[i], "ipps://", 7) || !strncmp(argv[i], "https://", 8)) { - /* - * Set URI... - */ - - if (data.vars->uri) + // Set URI... + if (ippFileGetVar(data->parent, "uri")) { _cupsLangPuts(stderr, _("ipptool: May only specify a single URI.")); + free_data(data); usage(); } if (!strncmp(argv[i], "ipps://", 7) || !strncmp(argv[i], "https://", 8)) - data.encryption = HTTP_ENCRYPTION_ALWAYS; + data->encryption = HTTP_ENCRYPTION_ALWAYS; - if (!_ippVarsSet(data.vars, "uri", argv[i])) + if (!ippFileSetVar(data->parent, "uri", argv[i])) { _cupsLangPrintf(stderr, _("ipptool: Bad URI \"%s\"."), argv[i]); + free_data(data); return (1); } - if (data.vars->username[0] && data.vars->password) - cupsSetPasswordCB2(_ippVarsPasswordCB, data.vars); + if (ippFileGetVar(data->parent, "uriuser") && ippFileGetVar(data->parent, "uripassword")) + cupsSetPasswordCB2(password_cb, data->parent); } else { - /* - * Run test... - */ - - if (!data.vars->uri) + // Run test... + if (!ippFileGetVar(data->parent, "uri")) { _cupsLangPuts(stderr, _("ipptool: URI required before test file.")); _cupsLangPuts(stderr, argv[i]); + free_data(data); usage(); } if (access(argv[i], 0) && argv[i][0] != '/' #ifdef _WIN32 && (!isalpha(argv[i][0] & 255) || argv[i][1] != ':') -#endif /* _WIN32 */ +#endif // _WIN32 ) { snprintf(testname, sizeof(testname), "%s/ipptool/%s", cg->cups_datadir, argv[i]); @@ -689,26 +703,28 @@ main(int argc, /* I - Number of command-line args */ _cupsLangPrintf(stderr, _("%s: Unable to open \"%s\": %s"), "ipptool", testfile, strerror(errno)); status = 1; } - else if (!do_tests(testfile, &data)) + else if (!do_tests(testfile, data)) status = 1; } } - if (!data.vars->uri || !testfile) + if (!ippFileGetVar(data->parent, "uri") || !testfile) + { + free_data(data); usage(); + } - /* - * Loop if the interval is set... - */ - - if (data.output == IPPTOOL_OUTPUT_PLIST) - print_xml_trailer(&data, !status, NULL); + // Loop if the interval is set... + if (data->output == IPPTOOL_OUTPUT_PLIST) + { + print_xml_trailer(data, !status, NULL); + } else if (interval > 0 && repeat > 0) { while (repeat > 1) { usleep((useconds_t)interval); - do_tests(testfile, &data); + do_tests(testfile, data); repeat --; } } @@ -717,111 +733,189 @@ main(int argc, /* I - Number of command-line args */ for (;;) { usleep((useconds_t)interval); - do_tests(testfile, &data); + do_tests(testfile, data); } } - if ((data.output == IPPTOOL_OUTPUT_TEST || (data.output == IPPTOOL_OUTPUT_PLIST && data.outfile)) && data.test_count > 1) + if ((data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile)) && data->test_count > 1) { - /* - * Show a summary report if there were multiple tests... - */ - - cupsFilePrintf(cupsFileStdout(), "\nSummary: %d tests, %d passed, %d failed, %d skipped\nScore: %d%%\n", data.test_count, data.pass_count, data.fail_count, data.skip_count, 100 * (data.pass_count + data.skip_count) / data.test_count); + // Show a summary report if there were multiple tests... + cupsFilePrintf(cupsFileStdout(), "\nSummary: %d tests, %d passed, %d failed, %d skipped\nScore: %d%%\n", data->test_count, data->pass_count, data->fail_count, data->skip_count, 100 * (data->pass_count + data->skip_count) / data->test_count); } - cupsFileClose(data.outfile); - - /* - * Exit... - */ + cupsFileClose(data->outfile); + free_data(data); + // Exit... return (status); } -/* - * 'add_stringf()' - Add a formatted string to an array. - */ +// +// 'add_stringf()' - Add a formatted string to an array. +// static void -add_stringf(cups_array_t *a, /* I - Array */ - const char *s, /* I - Printf-style format string */ - ...) /* I - Additional args as needed */ +add_stringf(cups_array_t *a, // I - Array + const char *s, // I - Printf-style format string + ...) // I - Additional args as needed { - char buffer[10240]; /* Format buffer */ - va_list ap; /* Argument pointer */ - + char buffer[10240]; // Format buffer + va_list ap; // Argument pointer - /* - * Don't bother is the array is NULL... - */ + // Don't bother is the array is NULL... if (!a) return; - /* - * Format the message... - */ - + // Format the message... va_start(ap, s); vsnprintf(buffer, sizeof(buffer), s, ap); va_end(ap); - /* - * Add it to the array... - */ - + // Add it to the array... cupsArrayAdd(a, buffer); } -/* - * 'compare_uris()' - Compare two URIs... - */ +// +// 'alloc_data()' - Initialize and allocate test data. +// + +static ipptool_test_t * // O - Test data +alloc_data(void) +{ + ipptool_test_t *data; // Test data + + + if ((data = calloc(1, sizeof(ipptool_test_t))) == NULL) + { + _cupsLangPrintf(stderr, _("ipptool: Unable to allocate memory: %s"), strerror(errno)); + exit(1); + } + + data->parent = ippFileNew(/*parent*/NULL, /*attr_cb*/NULL, (ipp_ferror_cb_t)error_cb, data); + data->output = IPPTOOL_OUTPUT_LIST; + data->outfile = cupsFileStdout(); + data->family = AF_UNSPEC; + data->def_transfer = IPPTOOL_TRANSFER_AUTO; + data->def_version = 20; + data->errors = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_cb_t)strdup, (cups_afree_cb_t)free); + data->pass = true; + data->prev_pass = true; + data->request_id = (cupsGetRand() % 1000) * 137; + data->show_header = true; + + ippFileSetVar(data->parent, "date-start", iso_date(ippTimeToDate(time(NULL)))); + + return (data); +} + + +// +// 'clear_data()' - Clear per-test data... +// + +static void +clear_data(ipptool_test_t *data) // I - Test data +{ + int i; // Looping var + ipptool_expect_t *expect; // Current EXPECT + + + cupsArrayClear(data->errors); + + for (i = 0; i < data->num_displayed; i ++) + free(data->displayed[i]); + data->num_displayed = 0; + + for (i = data->num_expects, expect = data->expects; i > 0; i --, expect ++) + { + free(expect->name); + free(expect->of_type); + free(expect->same_count_as); + free(expect->if_defined); + free(expect->if_not_defined); + free(expect->with_value); + free(expect->define_match); + free(expect->define_no_match); + free(expect->define_value); + free(expect->display_match); + cupsArrayDelete(expect->with_mime_types); + free(expect->save_filespec); + } + data->num_expects = 0; + + for (i = 0; i < data->num_statuses; i ++) + { + free(data->statuses[i].if_defined); + free(data->statuses[i].if_not_defined); + free(data->statuses[i].define_match); + free(data->statuses[i].define_no_match); + free(data->statuses[i].define_value); + } + data->num_statuses = 0; + + free(data->monitor_uri); + data->monitor_uri = NULL; + + for (i = data->num_monitor_expects, expect = data->monitor_expects; i > 0; i --, expect ++) + { + free(expect->name); + free(expect->of_type); + free(expect->same_count_as); + free(expect->if_defined); + free(expect->if_not_defined); + free(expect->with_value); + free(expect->define_match); + free(expect->define_no_match); + free(expect->define_value); + free(expect->display_match); + } + data->num_monitor_expects = 0; + + free(data->generate_params); + data->generate_params = NULL; +} + + +// +// 'compare_uris()' - Compare two URIs... +// -static int /* O - Result of comparison */ -compare_uris(const char *a, /* I - First URI */ - const char *b) /* I - Second URI */ +static int // O - Result of comparison +compare_uris(const char *a, // I - First URI + const char *b) // I - Second URI { - char ascheme[32], /* Components of first URI */ + char ascheme[32], // Components of first URI auserpass[256], ahost[256], aresource[256]; int aport; - char bscheme[32], /* Components of second URI */ + char bscheme[32], // Components of second URI buserpass[256], bhost[256], bresource[256]; int bport; - char *ptr; /* Pointer into string */ - int result; /* Result of comparison */ - + char *ptr; // Pointer into string + int result; // Result of comparison - /* - * Separate the URIs into their components... - */ + // Separate the URIs into their components... if (httpSeparateURI(HTTP_URI_CODING_ALL, a, ascheme, sizeof(ascheme), auserpass, sizeof(auserpass), ahost, sizeof(ahost), &aport, aresource, sizeof(aresource)) < HTTP_URI_STATUS_OK) return (-1); if (httpSeparateURI(HTTP_URI_CODING_ALL, b, bscheme, sizeof(bscheme), buserpass, sizeof(buserpass), bhost, sizeof(bhost), &bport, bresource, sizeof(bresource)) < HTTP_URI_STATUS_OK) return (-1); - /* - * Strip trailing dots from the host components, if present... - */ - + // Strip trailing dots from the host components, if present... if ((ptr = ahost + strlen(ahost) - 1) > ahost && *ptr == '.') *ptr = '\0'; if ((ptr = bhost + strlen(bhost) - 1) > bhost && *ptr == '.') *ptr = '\0'; - /* - * Compare each component... - */ - + // Compare each component... if ((result = _cups_strcasecmp(ascheme, bscheme)) != 0) return (result); @@ -841,41 +935,79 @@ compare_uris(const char *a, /* I - First URI */ } -/* - * 'copy_hex_string()' - Copy an octetString to a C string and encode as hex if - * needed. - */ +// +// 'connect_printer()' - Connect to the printer. +// + +static http_t * // O - HTTP connection or `NULL` on error +connect_printer(ipptool_test_t *data) // I - Test data +{ + const char *scheme = ippFileGetVar(data->parent, "scheme"), + *hostname = ippFileGetVar(data->parent, "hostname"), + *port = ippFileGetVar(data->parent, "port"); + // URI fields + http_encryption_t encryption; // Encryption mode + http_t *http; // HTTP connection + + + if (!scheme || !hostname || !port) + { + // This should never happen, but just in case... + print_fatal_error(data, "Missing printer/system URI."); + return (NULL); + } + + if (!_cups_strcasecmp(scheme, "https") || !_cups_strcasecmp(scheme, "ipps") || atoi(port) == 443) + encryption = HTTP_ENCRYPTION_ALWAYS; + else + encryption = data->encryption; + + if ((http = httpConnect2(hostname, atoi(port), NULL, data->family, encryption, 1, 30000, NULL)) == NULL) + { + print_fatal_error(data, "Unable to connect to '%s' on port %s: %s", hostname, port, cupsGetErrorString()); + return (NULL); + } + + httpSetDefaultField(data->http, HTTP_FIELD_ACCEPT_ENCODING, "deflate, gzip, identity"); + + if (data->timeout > 0.0) + httpSetTimeout(http, data->timeout, timeout_cb, NULL); + + return (http); +} + + +// +// 'copy_hex_string()' - Copy an octetString to a C string and encode as hex if +// needed. +// static void -copy_hex_string(char *buffer, /* I - String buffer */ - unsigned char *data, /* I - octetString data */ - int datalen, /* I - octetString length */ - size_t bufsize) /* I - Size of string buffer */ +copy_hex_string(char *buffer, // I - String buffer + unsigned char *data, // I - octetString data + int datalen, // I - octetString length + size_t bufsize) // I - Size of string buffer { - char *bufptr, /* Pointer into string buffer */ + char *bufptr, // Pointer into string buffer *bufend = buffer + bufsize - 2; - /* End of string buffer */ - unsigned char *dataptr, /* Pointer into octetString data */ + // End of string buffer + unsigned char *dataptr, // Pointer into octetString data *dataend = data + datalen; - /* End of octetString data */ + // End of octetString data static const char *hexdigits = "0123456789ABCDEF"; - /* Hex digits */ + // Hex digits - /* - * First see if there are any non-ASCII bytes in the octetString... - */ - + // First see if there are any non-ASCII bytes in the octetString... for (dataptr = data; dataptr < dataend; dataptr ++) + { if (*dataptr < 0x20 || *dataptr >= 0x7f) break; + } if (dataptr < dataend) { - /* - * Yes, encode as hex... - */ - + // Yes, encode as hex... *buffer = '<'; for (bufptr = buffer + 1, dataptr = data; bufptr < bufend && dataptr < dataend; dataptr ++) @@ -891,10 +1023,7 @@ copy_hex_string(char *buffer, /* I - String buffer */ } else { - /* - * No, copy as a string... - */ - + // No, copy as a string... if ((size_t)datalen > bufsize) datalen = (int)bufsize - 1; @@ -904,9 +1033,89 @@ copy_hex_string(char *buffer, /* I - String buffer */ } -/* - * 'do_monitor_printer_state()' - Do the MONITOR-PRINTER-STATE tests in the background. - */ +// +// 'create_file()' - Create a file for content checks. +// + +static int // O - File descriptor or -1 on error +create_file(const char *filespec, // I - Filespec string or NULL + const char *resource, // I - Resource name + int idx, // I - Value index + char *filename, // I - Filename buffer + size_t filenamesize) // I - Filename buffer size +{ + char *ptr, // Pointer into filename + *end, // End of filename buffer + base_resource[256], // Base name for resource + *base_ext; // Extension for resource + + + // If there is no filespec, just create a temporary file... + if (!filespec) + return (cupsCreateTempFd(NULL, NULL, filename, filenamesize)); + + // Convert resource path to base name... + if ((ptr = strrchr(resource, '/')) != NULL) + cupsCopyString(base_resource, ptr + 1, sizeof(base_resource)); + else + cupsCopyString(base_resource, resource, sizeof(base_resource)); + + if ((base_ext = strrchr(base_resource, '.')) != NULL) + *base_ext++ = '\0'; + else + base_ext = base_resource + strlen(base_resource); + + // Format the filename... + for (ptr = filename, end = filename + filenamesize - 1; *filespec && ptr < end;) + { + if (!strncmp(filespec, "%basename%", 10)) + { + cupsCopyString(ptr, base_resource, (size_t)(end - ptr + 1)); + ptr += strlen(ptr); + filespec += 10; + } + else if (!strncmp(filespec, "%ext%", 5)) + { + cupsCopyString(ptr, base_ext, (size_t)(end - ptr + 1)); + ptr += strlen(ptr); + filespec += 5; + } + else if (!strncmp(filespec, "%index%", 7)) + { + snprintf(ptr, (size_t)(end - ptr + 1), "%u", (unsigned)idx); + ptr += strlen(ptr); + filespec += 7; + } + else if (*filespec == '%') + { + filespec ++; + + if (*filespec == '%') + *ptr++ = '%'; + + while (*filespec != '%') + filespec ++; + + if (*filespec) + filespec ++; + } + else + { + // Copy literal character... + *ptr++ = *filespec++; + } + } + + *ptr = '\0'; + + // Try creating the file... + return (open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0666)); +} + + +// +// 'do_monitor_printer_state()' - Do the MONITOR-PRINTER-STATE tests in the background. +// static void * // O - Thread exit status do_monitor_printer_state( @@ -930,6 +1139,9 @@ do_monitor_printer_state( const char *pattrs[100]; // Printer attributes we care about + if (getenv("IPPTOOL_DEBUG")) + fprintf(stderr, "ipptool: Monitoring printer '%s' in the background.\n", data->monitor_uri); + // Connect to the printer... if (httpSeparateURI(HTTP_URI_CODING_ALL, data->monitor_uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) { @@ -948,11 +1160,7 @@ do_monitor_printer_state( return (0); } -#ifdef HAVE_LIBZ httpSetDefaultField(http, HTTP_FIELD_ACCEPT_ENCODING, "deflate, gzip, identity"); -#else - httpSetDefaultField(http, HTTP_FIELD_ACCEPT_ENCODING, "identity"); -#endif /* HAVE_LIBZ */ if (data->timeout > 0.0) httpSetTimeout(http, data->timeout, timeout_cb, NULL); @@ -990,20 +1198,20 @@ do_monitor_printer_state( // Poll the printer state... ippSetRequestId(request, ippGetRequestId(request) + 1); - if ((status = cupsSendRequest(http, request, resource, ippLength(request))) != HTTP_STATUS_ERROR) + if ((status = cupsSendRequest(http, request, resource, ippGetLength(request))) != HTTP_STATUS_ERROR) { response = cupsGetResponse(http, resource); status = httpGetStatus(http); } - if (!data->monitor_done && !Cancel && status == HTTP_STATUS_ERROR && httpError(data->http) != EINVAL && + if (!data->monitor_done && !Cancel && status == HTTP_STATUS_ERROR && httpGetError(data->http) != EINVAL && #ifdef _WIN32 - httpError(data->http) != WSAETIMEDOUT) + httpGetError(data->http) != WSAETIMEDOUT) #else - httpError(data->http) != ETIMEDOUT) + httpGetError(data->http) != ETIMEDOUT) #endif // _WIN32 { - if (httpReconnect2(http, 30000, NULL)) + if (!httpReconnect2(http, 30000, NULL)) break; } else if (status == HTTP_STATUS_ERROR || status == HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED) @@ -1022,10 +1230,10 @@ do_monitor_printer_state( for (i = data->num_monitor_expects, expect = data->monitor_expects; i > 0; i --, expect ++) { - if (expect->if_defined && !_ippVarsGet(data->vars, expect->if_defined)) + if (expect->if_defined && !ippFileGetVar(data->parent, expect->if_defined)) continue; - if (expect->if_not_defined && _ippVarsGet(data->vars, expect->if_not_defined)) + if (expect->if_not_defined && ippFileGetVar(data->parent, expect->if_not_defined)) continue; found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO); @@ -1038,7 +1246,7 @@ do_monitor_printer_state( { if (expect->define_no_match) { - _ippVarsSet(data->vars, expect->define_no_match, "1"); + ippFileSetVar(data->parent, expect->define_no_match, "1"); data->monitor_done = 1; } break; @@ -1051,7 +1259,7 @@ do_monitor_printer_state( { if (expect->define_no_match) { - _ippVarsSet(data->vars, expect->define_no_match, "1"); + ippFileSetVar(data->parent, expect->define_no_match, "1"); data->monitor_done = 1; } break; @@ -1061,7 +1269,7 @@ do_monitor_printer_state( { if (expect->define_no_match) { - _ippVarsSet(data->vars, expect->define_no_match, "1"); + ippFileSetVar(data->parent, expect->define_no_match, "1"); data->monitor_done = 1; } break; @@ -1072,7 +1280,7 @@ do_monitor_printer_state( if (found && expect->define_match) { - _ippVarsSet(data->vars, expect->define_match, "1"); + ippFileSetVar(data->parent, expect->define_match, "1"); data->monitor_done = 1; } @@ -1116,7 +1324,7 @@ do_monitor_printer_state( } } - _ippVarsSet(data->vars, expect->define_value, buffer); + ippFileSetVar(data->parent, expect->define_value, buffer); data->monitor_done = 1; } } @@ -1143,43 +1351,42 @@ do_monitor_printer_state( } -/* - * 'do_test()' - Do a single test from the test file. - */ +// +// 'do_test()' - Do a single test from the test file. +// -static int /* O - 1 on success, 0 on failure */ -do_test(_ipp_file_t *f, /* I - IPP data file */ - ipptool_test_t *data) /* I - Test data */ +static bool // O - `true` on success, `false` on failure +do_test(ipp_file_t *f, // I - IPP data file + ipptool_test_t *data) // I - Test data { - int i, /* Looping var */ - status_ok, /* Did we get a matching status? */ - repeat_count = 0, /* Repeat count */ - repeat_test; /* Repeat the test? */ - ipptool_expect_t *expect; /* Current expected attribute */ - ipp_t *request, /* IPP request */ - *response; /* IPP response */ - size_t length; /* Length of IPP request */ - http_status_t status; /* HTTP status */ - cups_array_t *a; /* Duplicate attribute array */ - ipp_tag_t group; /* Current group */ - ipp_attribute_t *attrptr, /* Attribute pointer */ - *found; /* Found attribute */ - char temp[1024]; /* Temporary string */ - cups_file_t *reqfile; /* File to send */ - ssize_t bytes; /* Bytes read/written */ - char buffer[1024 * 1024]; /* Copy buffer */ - size_t widths[200]; /* Width of columns */ - const char *error; /* Current error */ + int i; // Looping var + bool status_ok; // Did we get a matching status? + int repeat_count = 0; // Repeat count + bool repeat_test; // Repeat the test? + ipptool_expect_t *expect; // Current expected attribute + ipp_t *request, // IPP request + *response; // IPP response + size_t length; // Length of IPP request + http_status_t status; // HTTP status + cups_array_t *a; // Duplicate attribute array + ipp_tag_t group; // Current group + ipp_attribute_t *attrptr, // Attribute pointer + *found; // Found attribute + char temp[1024]; // Temporary string + cups_file_t *reqfile; // File to send + ssize_t bytes; // Bytes read/written + int widths[200]; // Width of columns + const char *error; // Current error if (Cancel) - return (0); + return (false); - /* - * Show any PAUSE message, as needed... - */ + if (getenv("IPPTOOL_DEBUG")) + fprintf(stderr, "ipptool: Doing test '%s', num_expects=%u, num_statuses=%u.\n", data->name, (unsigned)data->num_expects, (unsigned)data->num_statuses); + // Show any PAUSE message, as needed... if (data->pause[0]) { if (!data->skip_test && !data->pass_test) @@ -1188,29 +1395,21 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ data->pause[0] = '\0'; } - /* - * Start the background thread as needed... - */ - + // Start the background thread as needed... if (data->monitor_uri) { - data->monitor_done = 0; + data->monitor_done = false; data->monitor_thread = cupsThreadCreate((cups_thread_func_t)do_monitor_printer_state, data); } - /* - * Take over control of the attributes in the request... - */ - - request = f->attrs; - f->attrs = NULL; - - /* - * Submit the IPP request... - */ + // Take over control of the attributes in the request... + request = ippFileGetAttributes(f); + ippFileSetAttributes(f, NULL); + // Submit the IPP request... data->test_count ++; + ippSetOperation(request, data->op); ippSetVersion(request, data->version / 10, data->version % 10); ippSetRequestId(request, data->request_id); @@ -1237,10 +1436,10 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ cupsFilePrintf(data->outfile, "%d\n", data->request_id); cupsFilePuts(data->outfile, "RequestAttributes\n"); cupsFilePuts(data->outfile, "\n"); - if (ippFirstAttribute(request)) + if (ippGetFirstAttribute(request)) { cupsFilePuts(data->outfile, "\n"); - for (attrptr = ippFirstAttribute(request), group = ippGetGroupTag(attrptr); attrptr; attrptr = ippNextAttribute(request)) + for (attrptr = ippGetFirstAttribute(request), group = ippGetGroupTag(attrptr); attrptr; attrptr = ippGetNextAttribute(request)) print_attr(data->outfile, data->output, attrptr, &group); cupsFilePuts(data->outfile, "\n"); } @@ -1253,7 +1452,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ { cupsFilePrintf(cupsFileStdout(), " %s:\n", ippOpString(ippGetOperation(request))); - for (attrptr = ippFirstAttribute(request); attrptr; attrptr = ippNextAttribute(request)) + for (attrptr = ippGetFirstAttribute(request); attrptr; attrptr = ippGetNextAttribute(request)) print_attr(cupsFileStdout(), IPPTOOL_OUTPUT_TEST, attrptr, NULL); } @@ -1298,53 +1497,44 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ goto skip_error; } - data->vars->password_tries = 0; + data->password_tries = 0; do { if (data->delay > 0) usleep(data->delay); + if (getenv("IPPTOOL_DEBUG")) + fprintf(stderr, "ipptool: Sending %s request to '%s'.\n", ippOpString(ippGetOperation(request)), data->resource); + data->delay = data->repeat_interval; repeat_count ++; status = HTTP_STATUS_OK; - if (data->transfer == IPPTOOL_TRANSFER_CHUNKED || (data->transfer == IPPTOOL_TRANSFER_AUTO && data->file[0])) + if (data->transfer == IPPTOOL_TRANSFER_CHUNKED || (data->transfer == IPPTOOL_TRANSFER_AUTO && (data->file[0] || data->generate_params))) { - /* - * Send request using chunking - a 0 length means "chunk". - */ - + // Send request using chunking - a 0 length means "chunk". length = 0; } else { - /* - * Send request using content length... - */ - - length = ippLength(request); + // Send request using content length... + length = ippGetLength(request); if (data->file[0] && (reqfile = cupsFileOpen(data->file, "r")) != NULL) { - /* - * Read the file to get the uncompressed file size... - */ - - while ((bytes = cupsFileRead(reqfile, buffer, sizeof(buffer))) > 0) + // Read the file to get the uncompressed file size... + while ((bytes = cupsFileRead(reqfile, data->buffer, sizeof(data->buffer))) > 0) length += (size_t)bytes; cupsFileClose(reqfile); } } - /* - * Send the request... - */ - - data->prev_pass = 1; - repeat_test = 0; + // Send the request... + data->prev_pass = true; + repeat_test = false; response = NULL; if (status != HTTP_STATUS_ERROR) @@ -1355,18 +1545,17 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ status = cupsSendRequest(data->http, request, data->resource, length); -#ifdef HAVE_LIBZ if (data->compression[0]) httpSetField(data->http, HTTP_FIELD_CONTENT_ENCODING, data->compression); -#endif /* HAVE_LIBZ */ - if (!Cancel && status == HTTP_STATUS_CONTINUE && ippGetState(request) == IPP_DATA && data->file[0]) + if (!Cancel && status == HTTP_STATUS_CONTINUE && ippGetState(request) == IPP_STATE_DATA && data->file[0]) { + // Send attached file... if ((reqfile = cupsFileOpen(data->file, "r")) != NULL) { - while (!Cancel && (bytes = cupsFileRead(reqfile, buffer, sizeof(buffer))) > 0) + while (!Cancel && (bytes = cupsFileRead(reqfile, data->buffer, sizeof(data->buffer))) > 0) { - if ((status = cupsWriteRequestData(data->http, buffer, (size_t)bytes)) != HTTP_STATUS_CONTINUE) + if ((status = cupsWriteRequestData(data->http, data->buffer, (size_t)bytes)) != HTTP_STATUS_CONTINUE) break; } @@ -1374,36 +1563,38 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ } else { - snprintf(buffer, sizeof(buffer), "%s: %s", data->file, strerror(errno)); - _cupsSetError(IPP_INTERNAL_ERROR, buffer, 0); + snprintf(data->buffer, sizeof(data->buffer), "%s: %s", data->file, strerror(errno)); + _cupsSetError(IPP_STATUS_ERROR_INTERNAL, data->buffer, 0); status = HTTP_STATUS_ERROR; } } + else if (!Cancel && status == HTTP_STATUS_CONTINUE && ippGetState(request) == IPP_STATE_DATA && data->generate_params) + { + // Generate attached file... + status = generate_file(data->http, data->generate_params); + } - /* - * Get the server's response... - */ - + // Get the server's response... if (!Cancel && status != HTTP_STATUS_ERROR) { response = cupsGetResponse(data->http, data->resource); status = httpGetStatus(data->http); } - if (!Cancel && status == HTTP_STATUS_ERROR && httpError(data->http) != EINVAL && + if (!Cancel && status == HTTP_STATUS_ERROR && httpGetError(data->http) != EINVAL && #ifdef _WIN32 - httpError(data->http) != WSAETIMEDOUT) + httpGetError(data->http) != WSAETIMEDOUT) #else - httpError(data->http) != ETIMEDOUT) -#endif /* _WIN32 */ + httpGetError(data->http) != ETIMEDOUT) +#endif // _WIN32 { - if (httpReconnect2(data->http, 30000, NULL)) - data->prev_pass = 0; + if (!httpReconnect2(data->http, 30000, NULL)) + data->prev_pass = false; } else if (status == HTTP_STATUS_ERROR || status == HTTP_STATUS_CUPS_AUTHORIZATION_CANCELED) { - data->prev_pass = 0; + data->prev_pass = false; break; } else if (status != HTTP_STATUS_OK) @@ -1418,33 +1609,30 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ } } - if (!Cancel && status == HTTP_STATUS_ERROR && httpError(data->http) != EINVAL && + if (!Cancel && status == HTTP_STATUS_ERROR && httpGetError(data->http) != EINVAL && #ifdef _WIN32 - httpError(data->http) != WSAETIMEDOUT) + httpGetError(data->http) != WSAETIMEDOUT) #else - httpError(data->http) != ETIMEDOUT) -#endif /* _WIN32 */ + httpGetError(data->http) != ETIMEDOUT) +#endif // _WIN32 { - if (httpReconnect2(data->http, 30000, NULL)) - data->prev_pass = 0; + if (!httpReconnect2(data->http, 30000, NULL)) + data->prev_pass = false; } else if (status == HTTP_STATUS_ERROR) { if (!Cancel) httpReconnect2(data->http, 30000, NULL); - data->prev_pass = 0; + data->prev_pass = false; } else if (status != HTTP_STATUS_OK) { httpFlush(data->http); - data->prev_pass = 0; + data->prev_pass = false; } - /* - * Check results of request... - */ - + // Check results of request... cupsArrayClear(data->errors); if (httpGetVersion(data->http) != HTTP_VERSION_1_1) @@ -1456,7 +1644,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (data->validate_headers) { - const char *header; /* HTTP header value */ + const char *header; // HTTP header value if ((header = httpGetField(data->http, HTTP_FIELD_CONTENT_TYPE)) == NULL || _cups_strcasecmp(header, "application/ipp")) add_stringf(data->errors, "Bad HTTP Content-Type in response (%s)", header && *header ? header : ""); @@ -1467,44 +1655,34 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (!response) { - /* - * No response, log error... - */ - + // No response, log error... add_stringf(data->errors, "IPP request failed with status %s (%s)", ippErrorString(cupsGetError()), cupsGetErrorString()); } else { - /* - * Collect common attribute values... - */ - + // Collect common attribute values... if ((attrptr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) != NULL) { snprintf(temp, sizeof(temp), "%d", ippGetInteger(attrptr, 0)); - _ippVarsSet(data->vars, "job-id", temp); + ippFileSetVar(data->parent, "job-id", temp); } if ((attrptr = ippFindAttribute(response, "job-uri", IPP_TAG_URI)) != NULL) - _ippVarsSet(data->vars, "job-uri", ippGetString(attrptr, 0, NULL)); + ippFileSetVar(data->parent, "job-uri", ippGetString(attrptr, 0, NULL)); if ((attrptr = ippFindAttribute(response, "notify-subscription-id", IPP_TAG_INTEGER)) != NULL) { snprintf(temp, sizeof(temp), "%d", ippGetInteger(attrptr, 0)); - _ippVarsSet(data->vars, "notify-subscription-id", temp); + ippFileSetVar(data->parent, "notify-subscription-id", temp); } - /* - * Check response, validating groups and attributes and logging errors - * as needed... - */ - - if (ippGetState(response) != IPP_DATA) + // Check response, validating groups and attributes and logging errors as needed... + if (ippGetState(response) != IPP_STATE_DATA) add_stringf(data->errors, "Missing end-of-attributes-tag in response (RFC 2910 section 3.5.1)"); if (data->version) { - int major, minor; /* IPP version */ + int major, minor; // IPP version major = ippGetVersion(response, &minor); @@ -1515,7 +1693,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (ippGetRequestId(response) != data->request_id) add_stringf(data->errors, "Bad request ID %d in response - expected %d (RFC 8011 section 4.1.1)", ippGetRequestId(response), data->request_id); - attrptr = ippFirstAttribute(response); + attrptr = ippGetFirstAttribute(response); if (!attrptr) { add_stringf(data->errors, "Missing first attribute \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 8011 section 4.1.4)."); @@ -1525,7 +1703,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (!ippGetName(attrptr) || ippGetValueTag(attrptr) != IPP_TAG_CHARSET || ippGetGroupTag(attrptr) != IPP_TAG_OPERATION || ippGetCount(attrptr) != 1 ||strcmp(ippGetName(attrptr), "attributes-charset")) add_stringf(data->errors, "Bad first attribute \"%s (%s%s)\" in group %s, expected \"attributes-charset (charset)\" in group operation-attributes-tag (RFC 8011 section 4.1.4).", ippGetName(attrptr) ? ippGetName(attrptr) : "(null)", ippGetCount(attrptr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attrptr)), ippTagString(ippGetGroupTag(attrptr))); - attrptr = ippNextAttribute(response); + attrptr = ippGetNextAttribute(response); if (!attrptr) add_stringf(data->errors, "Missing second attribute \"attributes-natural-language (naturalLanguage)\" in group operation-attributes-tag (RFC 8011 section 4.1.4)."); else if (!ippGetName(attrptr) || ippGetValueTag(attrptr) != IPP_TAG_LANGUAGE || ippGetGroupTag(attrptr) != IPP_TAG_OPERATION || ippGetCount(attrptr) != 1 || strcmp(ippGetName(attrptr), "attributes-natural-language")) @@ -1535,43 +1713,43 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if ((attrptr = ippFindAttribute(response, "status-message", IPP_TAG_ZERO)) != NULL) { const char *status_message = ippGetString(attrptr, 0, NULL); - /* String value */ + // String value if (ippGetValueTag(attrptr) != IPP_TAG_TEXT) add_stringf(data->errors, "status-message (text(255)) has wrong value tag %s (RFC 8011 section 4.1.6.2).", ippTagString(ippGetValueTag(attrptr))); if (ippGetGroupTag(attrptr) != IPP_TAG_OPERATION) add_stringf(data->errors, "status-message (text(255)) has wrong group tag %s (RFC 8011 section 4.1.6.2).", ippTagString(ippGetGroupTag(attrptr))); if (ippGetCount(attrptr) != 1) - add_stringf(data->errors, "status-message (text(255)) has %d values (RFC 8011 section 4.1.6.2).", ippGetCount(attrptr)); + add_stringf(data->errors, "status-message (text(255)) has %u values (RFC 8011 section 4.1.6.2).", (unsigned)ippGetCount(attrptr)); if (status_message && strlen(status_message) > 255) - add_stringf(data->errors, "status-message (text(255)) has bad length %d (RFC 8011 section 4.1.6.2).", (int)strlen(status_message)); + add_stringf(data->errors, "status-message (text(255)) has bad length %u (RFC 8011 section 4.1.6.2).", (unsigned)strlen(status_message)); } if ((attrptr = ippFindAttribute(response, "detailed-status-message", IPP_TAG_ZERO)) != NULL) { const char *detailed_status_message = ippGetString(attrptr, 0, NULL); - /* String value */ + // String value if (ippGetValueTag(attrptr) != IPP_TAG_TEXT) add_stringf(data->errors, "detailed-status-message (text(MAX)) has wrong value tag %s (RFC 8011 section 4.1.6.3).", ippTagString(ippGetValueTag(attrptr))); if (ippGetGroupTag(attrptr) != IPP_TAG_OPERATION) add_stringf(data->errors, "detailed-status-message (text(MAX)) has wrong group tag %s (RFC 8011 section 4.1.6.3).", ippTagString(ippGetGroupTag(attrptr))); if (ippGetCount(attrptr) != 1) - add_stringf(data->errors, "detailed-status-message (text(MAX)) has %d values (RFC 8011 section 4.1.6.3).", ippGetCount(attrptr)); + add_stringf(data->errors, "detailed-status-message (text(MAX)) has %u values (RFC 8011 section 4.1.6.3).", (unsigned)ippGetCount(attrptr)); if (detailed_status_message && strlen(detailed_status_message) > 1023) - add_stringf(data->errors, "detailed-status-message (text(MAX)) has bad length %d (RFC 8011 section 4.1.6.3).", (int)strlen(detailed_status_message)); + add_stringf(data->errors, "detailed-status-message (text(MAX)) has bad length %u (RFC 8011 section 4.1.6.3).", (unsigned)strlen(detailed_status_message)); } - a = cupsArrayNew((cups_array_func_t)strcmp, NULL); + a = cupsArrayNew3((cups_array_cb_t)strcmp, NULL, NULL, 0, NULL, NULL); - for (attrptr = ippFirstAttribute(response), group = ippGetGroupTag(attrptr); + for (attrptr = ippGetFirstAttribute(response), group = ippGetGroupTag(attrptr); attrptr; - attrptr = ippNextAttribute(response)) + attrptr = ippGetNextAttribute(response)) { if (ippGetGroupTag(attrptr) != group) { - int out_of_order = 0; /* Are attribute groups out-of-order? */ + bool out_of_order = false; // Are attribute groups out-of-order? cupsArrayClear(a); switch (ippGetGroupTag(attrptr)) @@ -1580,28 +1758,28 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ break; case IPP_TAG_OPERATION : - out_of_order = 1; + out_of_order = true; break; case IPP_TAG_UNSUPPORTED_GROUP : if (group != IPP_TAG_OPERATION) - out_of_order = 1; + out_of_order = true; break; case IPP_TAG_JOB : case IPP_TAG_PRINTER : if (group != IPP_TAG_OPERATION && group != IPP_TAG_UNSUPPORTED_GROUP) - out_of_order = 1; + out_of_order = true; break; case IPP_TAG_SUBSCRIPTION : if (group > ippGetGroupTag(attrptr) && group != IPP_TAG_DOCUMENT) - out_of_order = 1; + out_of_order = true; break; default : if (group > ippGetGroupTag(attrptr)) - out_of_order = 1; + out_of_order = true; break; } @@ -1626,48 +1804,42 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ cupsArrayDelete(a); - /* - * Now check the test-defined expected status-code and attribute - * values... - */ - + // Now check the test-defined expected status-code and attribute values... if (ippGetStatusCode(response) == IPP_STATUS_ERROR_BUSY && data->repeat_on_busy) { // Repeat on a server-error-busy status code... - status_ok = 1; - repeat_test = 1; + status_ok = true; + repeat_test = true; } else { - for (i = 0, status_ok = 0; i < data->num_statuses; i ++) + for (i = 0, status_ok = false; i < data->num_statuses; i ++) { - if (data->statuses[i].if_defined && - !_ippVarsGet(data->vars, data->statuses[i].if_defined)) + if (data->statuses[i].if_defined && !ippFileGetVar(f, data->statuses[i].if_defined)) continue; - if (data->statuses[i].if_not_defined && - _ippVarsGet(data->vars, data->statuses[i].if_not_defined)) + if (data->statuses[i].if_not_defined && ippFileGetVar(f, data->statuses[i].if_not_defined)) continue; if (ippGetStatusCode(response) == data->statuses[i].status) { - status_ok = 1; + status_ok = true; if (data->statuses[i].repeat_match && repeat_count < data->statuses[i].repeat_limit) - repeat_test = 1; + repeat_test = true; if (data->statuses[i].define_match) - _ippVarsSet(data->vars, data->statuses[i].define_match, "1"); + ippFileSetVar(data->parent, data->statuses[i].define_match, "1"); } else { if (data->statuses[i].repeat_no_match && repeat_count < data->statuses[i].repeat_limit) - repeat_test = 1; + repeat_test = true; if (data->statuses[i].define_no_match) { - _ippVarsSet(data->vars, data->statuses[i].define_no_match, "1"); - status_ok = 1; + ippFileSetVar(data->parent, data->statuses[i].define_no_match, "1"); + status_ok = true; } } } @@ -1677,12 +1849,10 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ { for (i = 0; i < data->num_statuses; i ++) { - if (data->statuses[i].if_defined && - !_ippVarsGet(data->vars, data->statuses[i].if_defined)) + if (data->statuses[i].if_defined && !ippFileGetVar(f, data->statuses[i].if_defined)) continue; - if (data->statuses[i].if_not_defined && - _ippVarsGet(data->vars, data->statuses[i].if_not_defined)) + if (data->statuses[i].if_not_defined && ippFileGetVar(f, data->statuses[i].if_not_defined)) continue; if (!data->statuses[i].repeat_match || repeat_count >= data->statuses[i].repeat_limit) @@ -1695,13 +1865,15 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ for (i = data->num_expects, expect = data->expects; i > 0; i --, expect ++) { - ipp_attribute_t *group_found; /* Found parent attribute for group tests */ + cups_array_t *exp_errors; // Temporary list of errors + bool exp_member, // Expect for member attribute? + exp_pass; // Did this expect pass? + ipp_attribute_t *group_found; // Found parent attribute for group tests - if (expect->if_defined && !_ippVarsGet(data->vars, expect->if_defined)) + if (expect->if_defined && !ippFileGetVar(f, expect->if_defined)) continue; - if (expect->if_not_defined && - _ippVarsGet(data->vars, expect->if_not_defined)) + if (expect->if_not_defined && ippFileGetVar(f, expect->if_not_defined)) continue; if ((found = ippFindAttribute(response, expect->name, IPP_TAG_ZERO)) != NULL && expect->in_group && expect->in_group != ippGetGroupTag(found)) @@ -1711,14 +1883,20 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ break; } + exp_errors = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_cb_t)strdup, (cups_afree_cb_t)free); + exp_member = strchr(expect->name, '/') != NULL; + exp_pass = false; + do { group_found = found; + ippSave(response); + if (expect->in_group && strchr(expect->name, '/')) { - char group_name[256],/* Parent attribute name */ - *group_ptr; /* Pointer into parent attribute name */ + char group_name[256],// Parent attribute name + *group_ptr; // Pointer into parent attribute name cupsCopyString(group_name, expect->name, sizeof(group_name)); if ((group_ptr = strchr(group_name, '/')) != NULL) @@ -1734,89 +1912,121 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ (expect->with_distinct && !with_distinct_values(NULL, found))) { if (expect->define_no_match) - _ippVarsSet(data->vars, expect->define_no_match, "1"); + { + ippFileSetVar(data->parent, expect->define_no_match, "1"); + exp_pass = true; + } else if (!expect->define_match && !expect->define_value) { if (found && expect->not_expect && !expect->with_value && !expect->with_value_from) - add_stringf(data->errors, "NOT EXPECTED: %s", expect->name); + { + add_stringf(exp_errors, "NOT EXPECTED: %s", expect->name); + } else if (!found && !(expect->not_expect || expect->optional)) - add_stringf(data->errors, "EXPECTED: %s", expect->name); + { + add_stringf(exp_errors, "EXPECTED: %s", expect->name); + } else if (found) { if (!expect_matches(expect, found)) - add_stringf(data->errors, "EXPECTED: %s OF-TYPE %s (got %s)", + add_stringf(exp_errors, "EXPECTED: %s OF-TYPE %s (got %s)", expect->name, expect->of_type, ippTagString(ippGetValueTag(found))); if (expect->in_group && ippGetGroupTag(group_found) != expect->in_group) - add_stringf(data->errors, "EXPECTED: %s IN-GROUP %s (got %s).", + add_stringf(exp_errors, "EXPECTED: %s IN-GROUP %s (got %s).", expect->name, ippTagString(expect->in_group), ippTagString(ippGetGroupTag(group_found))); if (expect->with_distinct) - with_distinct_values(data->errors, found); + with_distinct_values(exp_errors, found); } } if (expect->repeat_no_match && repeat_count < expect->repeat_limit) - repeat_test = 1; + repeat_test = true; + + ippRestore(response); break; } if (found) - ippAttributeString(found, buffer, sizeof(buffer)); + ippAttributeString(found, data->buffer, sizeof(data->buffer)); + + if (found && (expect->with_content || expect->with_mime_types || expect->save_filespec) && !with_content(exp_errors, found, expect->with_content, expect->with_mime_types, expect->save_filespec)) + { + if (expect->define_no_match) + { + ippFileSetVar(data->parent, expect->define_no_match, "1"); + exp_pass = true; + } + } - if (found && expect->with_value_from && !with_value_from(NULL, ippFindAttribute(response, expect->with_value_from, IPP_TAG_ZERO), found, buffer, sizeof(buffer))) + if (found && expect->with_value_from && !with_value_from(NULL, ippFindAttribute(response, expect->with_value_from, IPP_TAG_ZERO), found, data->buffer, sizeof(data->buffer))) { if (expect->define_no_match) - _ippVarsSet(data->vars, expect->define_no_match, "1"); + { + ippFileSetVar(data->parent, expect->define_no_match, "1"); + exp_pass = true; + } else if (!expect->define_match && !expect->define_value && ((!expect->repeat_match && !expect->repeat_no_match) || repeat_count >= expect->repeat_limit)) { - add_stringf(data->errors, "EXPECTED: %s WITH-VALUES-FROM %s", expect->name, expect->with_value_from); + add_stringf(exp_errors, "EXPECTED: %s WITH-VALUES-FROM %s", expect->name, expect->with_value_from); - with_value_from(data->errors, ippFindAttribute(response, expect->with_value_from, IPP_TAG_ZERO), found, buffer, sizeof(buffer)); + with_value_from(exp_errors, ippFindAttribute(response, expect->with_value_from, IPP_TAG_ZERO), found, data->buffer, sizeof(data->buffer)); } if (expect->repeat_no_match && repeat_count < expect->repeat_limit) - repeat_test = 1; + repeat_test = true; + ippRestore(response); break; } - else if (found && !with_value(data, NULL, expect->with_value, expect->with_flags, found, buffer, sizeof(buffer))) + else if (found && !with_value(data, NULL, expect->with_value, expect->with_flags, found, data->buffer, sizeof(data->buffer))) { if (expect->define_no_match) - _ippVarsSet(data->vars, expect->define_no_match, "1"); + { + ippFileSetVar(data->parent, expect->define_no_match, "1"); + exp_pass = true; + } else if (!expect->define_match && !expect->define_value && !expect->repeat_match && (!expect->repeat_no_match || repeat_count >= expect->repeat_limit)) { if (expect->with_flags & IPPTOOL_WITH_REGEX) - add_stringf(data->errors, "EXPECTED: %s %s /%s/", expect->name, with_flags_string(expect->with_flags), expect->with_value); + add_stringf(exp_errors, "EXPECTED: %s %s /%s/", expect->name, with_flags_string(expect->with_flags), expect->with_value); else - add_stringf(data->errors, "EXPECTED: %s %s \"%s\"", expect->name, with_flags_string(expect->with_flags), expect->with_value); + add_stringf(exp_errors, "EXPECTED: %s %s \"%s\"", expect->name, with_flags_string(expect->with_flags), expect->with_value); - with_value(data, data->errors, expect->with_value, expect->with_flags, found, buffer, sizeof(buffer)); + with_value(data, exp_errors, expect->with_value, expect->with_flags, found, data->buffer, sizeof(data->buffer)); } - if (expect->repeat_no_match && - repeat_count < expect->repeat_limit) - repeat_test = 1; + if (expect->repeat_no_match && repeat_count < expect->repeat_limit) + repeat_test = true; + ippRestore(response); break; } + else if (expect->with_value) + { + exp_pass = true; + } if (found && expect->count > 0 && ippGetCount(found) != expect->count) { if (expect->define_no_match) - _ippVarsSet(data->vars, expect->define_no_match, "1"); + { + ippFileSetVar(data->parent, expect->define_no_match, "1"); + exp_pass = true; + } else if (!expect->define_match && !expect->define_value) { - add_stringf(data->errors, "EXPECTED: %s COUNT %d (got %d)", expect->name, expect->count, ippGetCount(found)); + add_stringf(exp_errors, "EXPECTED: %s COUNT %u (got %u)", expect->name, (unsigned)expect->count, (unsigned)ippGetCount(found)); } - if (expect->repeat_no_match && - repeat_count < expect->repeat_limit) - repeat_test = 1; + if (expect->repeat_no_match && repeat_count < expect->repeat_limit) + repeat_test = true; + ippRestore(response); break; } @@ -1828,19 +2038,22 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (!attrptr || ippGetCount(attrptr) != ippGetCount(found)) { if (expect->define_no_match) - _ippVarsSet(data->vars, expect->define_no_match, "1"); + { + ippFileSetVar(data->parent, expect->define_no_match, "1"); + exp_pass = true; + } else if (!expect->define_match && !expect->define_value) { if (!attrptr) - add_stringf(data->errors, "EXPECTED: %s (%d values) SAME-COUNT-AS %s (not returned)", expect->name, ippGetCount(found), expect->same_count_as); + add_stringf(exp_errors, "EXPECTED: %s (%u values) SAME-COUNT-AS %s (not returned)", expect->name, (unsigned)ippGetCount(found), expect->same_count_as); else if (ippGetCount(attrptr) != ippGetCount(found)) - add_stringf(data->errors, "EXPECTED: %s (%d values) SAME-COUNT-AS %s (%d values)", expect->name, ippGetCount(found), expect->same_count_as, ippGetCount(attrptr)); + add_stringf(exp_errors, "EXPECTED: %s (%u values) SAME-COUNT-AS %s (%u values)", expect->name, (unsigned)ippGetCount(found), expect->same_count_as, (unsigned)ippGetCount(attrptr)); } - if (expect->repeat_no_match && - repeat_count < expect->repeat_limit) - repeat_test = 1; + if (expect->repeat_no_match && repeat_count < expect->repeat_limit) + repeat_test = true; + ippRestore(response); break; } } @@ -1849,41 +2062,45 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ cupsFilePrintf(cupsFileStdout(), "\n%s\n\n", expect->display_match); if (found && expect->define_match) - _ippVarsSet(data->vars, expect->define_match, "1"); + { + ippFileSetVar(data->parent, expect->define_match, "1"); + exp_pass = true; + } if (found && expect->define_value) { + exp_pass = true; if (!expect->with_value) { int last = ippGetCount(found) - 1; - /* Last element in attribute */ + // Last element in attribute switch (ippGetValueTag(found)) { case IPP_TAG_ENUM : case IPP_TAG_INTEGER : - snprintf(buffer, sizeof(buffer), "%d", ippGetInteger(found, last)); + snprintf(data->buffer, sizeof(data->buffer), "%d", ippGetInteger(found, last)); break; case IPP_TAG_BOOLEAN : if (ippGetBoolean(found, last)) - cupsCopyString(buffer, "true", sizeof(buffer)); + cupsCopyString(data->buffer, "true", sizeof(data->buffer)); else - cupsCopyString(buffer, "false", sizeof(buffer)); + cupsCopyString(data->buffer, "false", sizeof(data->buffer)); break; case IPP_TAG_RESOLUTION : { - int xres, /* Horizontal resolution */ - yres; /* Vertical resolution */ - ipp_res_t units; /* Resolution units */ + int xres, // Horizontal resolution + yres; // Vertical resolution + ipp_res_t units; // Resolution units xres = ippGetResolution(found, last, &yres, &units); if (xres == yres) - snprintf(buffer, sizeof(buffer), "%d%s", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); + snprintf(data->buffer, sizeof(data->buffer), "%d%s", xres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); else - snprintf(buffer, sizeof(buffer), "%dx%d%s", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); + snprintf(data->buffer, sizeof(data->buffer), "%dx%d%s", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); } break; @@ -1897,30 +2114,40 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ case IPP_TAG_TEXTLANG : case IPP_TAG_URI : case IPP_TAG_URISCHEME : - cupsCopyString(buffer, ippGetString(found, last, NULL), sizeof(buffer)); + cupsCopyString(data->buffer, ippGetString(found, last, NULL), sizeof(data->buffer)); break; default : - ippAttributeString(found, buffer, sizeof(buffer)); + ippAttributeString(found, data->buffer, sizeof(data->buffer)); break; } } - _ippVarsSet(data->vars, expect->define_value, buffer); + ippFileSetVar(data->parent, expect->define_value, data->buffer); } - if (found && expect->repeat_match && - repeat_count < expect->repeat_limit) + if (found && expect->repeat_match && repeat_count < expect->repeat_limit) repeat_test = 1; + + ippRestore(response); + } + while ((expect->expect_all || !exp_member) && (found = ippFindNextAttribute(response, expect->name, IPP_TAG_ZERO)) != NULL); + + // Handle results of the EXPECT checks... + if (!exp_pass) + { + // Copy errors... + char *e; // Current error + + for (e = (char *)cupsArrayGetFirst(exp_errors); e; e = (char *)cupsArrayGetNext(exp_errors)) + cupsArrayAdd(data->errors, e); } - while (expect->expect_all && (found = ippFindNextAttribute(response, expect->name, IPP_TAG_ZERO)) != NULL); + + cupsArrayDelete(exp_errors); } } - /* - * If we are going to repeat this test, display intermediate results... - */ - + // If we are going to repeat this test, display intermediate results... if (repeat_test) { if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) @@ -1929,7 +2156,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ \ if (data->num_displayed > 0) { - for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) + for (attrptr = ippGetFirstAttribute(response); attrptr; attrptr = ippGetNextAttribute(response)) { const char *attrname = ippGetName(attrptr); if (attrname) @@ -1962,8 +2189,8 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ request = NULL; - if (cupsArrayCount(data->errors) > 0) - data->prev_pass = data->pass = 0; + if (cupsArrayGetCount(data->errors) > 0) + data->prev_pass = data->pass = false; if (data->prev_pass) data->pass_count ++; @@ -1979,16 +2206,16 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ cupsFilePuts(data->outfile, "ResponseAttributes\n"); cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "\n"); - for (attrptr = ippFirstAttribute(response), group = ippGetGroupTag(attrptr); + for (attrptr = ippGetFirstAttribute(response), group = ippGetGroupTag(attrptr); attrptr; - attrptr = ippNextAttribute(response)) + attrptr = ippGetNextAttribute(response)) print_attr(data->outfile, data->output, attrptr, &group); cupsFilePuts(data->outfile, "\n"); cupsFilePuts(data->outfile, "\n"); } else if (data->output == IPPTOOL_OUTPUT_IPPSERVER && response) { - for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) + for (attrptr = ippGetFirstAttribute(response); attrptr; attrptr = ippGetNextAttribute(response)) { if (!ippGetName(attrptr) || ippGetGroupTag(attrptr) != IPP_TAG_PRINTER) continue; @@ -1998,11 +2225,11 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ } else if (data->output == IPPTOOL_OUTPUT_JSON && response) { - ipp_tag_t cur_tag = IPP_TAG_ZERO, /* Current group tag */ - group_tag; /* Attribute's group tag */ + ipp_tag_t cur_tag = IPP_TAG_ZERO, // Current group tag + group_tag; // Attribute's group tag cupsFilePuts(data->outfile, "[\n"); - attrptr = ippFirstAttribute(response); + attrptr = ippGetFirstAttribute(response); while (attrptr) { group_tag = ippGetGroupTag(attrptr); @@ -2019,12 +2246,12 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ } print_json_attr(data, attrptr, 8); - attrptr = ippNextAttribute(response); + attrptr = ippGetNextAttribute(response); cupsFilePuts(data->outfile, ippGetName(attrptr) && ippGetGroupTag(attrptr) == cur_tag ? ",\n" : "\n"); } else { - attrptr = ippNextAttribute(response); + attrptr = ippGetNextAttribute(response); } } @@ -2039,12 +2266,12 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (!data->prev_pass || (data->verbosity && response)) { - cupsFilePrintf(cupsFileStdout(), " RECEIVED: %lu bytes in response\n", (unsigned long)ippLength(response)); + cupsFilePrintf(cupsFileStdout(), " RECEIVED: %lu bytes in response\n", (unsigned long)ippGetLength(response)); cupsFilePrintf(cupsFileStdout(), " status-code = %s (%s)\n", ippErrorString(cupsGetError()), cupsGetErrorString()); if (data->verbosity && response) { - for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) + for (attrptr = ippGetFirstAttribute(response); attrptr; attrptr = ippGetNextAttribute(response)) print_attr(cupsFileStdout(), IPPTOOL_OUTPUT_TEST, attrptr, NULL); } } @@ -2054,17 +2281,17 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (data->prev_pass && data->output >= IPPTOOL_OUTPUT_LIST && !data->verbosity && data->num_displayed > 0) { - size_t width; /* Length of value */ + int width; // Length of value for (i = 0; i < data->num_displayed; i ++) { - widths[i] = strlen(data->displayed[i]); + widths[i] = (int)strlen(data->displayed[i]); for (attrptr = ippFindAttribute(response, data->displayed[i], IPP_TAG_ZERO); attrptr; attrptr = ippFindNextAttribute(response, data->displayed[i], IPP_TAG_ZERO)) { - width = ippAttributeString(attrptr, NULL, 0); + width = (int)ippAttributeString(attrptr, NULL, 0); if (width > widths[i]) widths[i] = width; } @@ -2075,12 +2302,12 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ else print_line(data, NULL, NULL, data->num_displayed, data->displayed, widths); - attrptr = ippFirstAttribute(response); + attrptr = ippGetFirstAttribute(response); while (attrptr) { while (attrptr && ippGetGroupTag(attrptr) <= IPP_TAG_OPERATION) - attrptr = ippNextAttribute(response); + attrptr = ippGetNextAttribute(response); if (attrptr) { @@ -2090,7 +2317,7 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ attrptr = print_line(data, response, attrptr, data->num_displayed, data->displayed, widths); while (attrptr && ippGetGroupTag(attrptr) > IPP_TAG_OPERATION) - attrptr = ippNextAttribute(response); + attrptr = ippGetNextAttribute(response); } } } @@ -2101,9 +2328,9 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ cupsFilePuts(data->outfile, "Errors\n"); cupsFilePuts(data->outfile, "\n"); - for (error = (char *)cupsArrayFirst(data->errors); + for (error = (char *)cupsArrayGetFirst(data->errors); error; - error = (char *)cupsArrayNext(data->errors)) + error = (char *)cupsArrayGetNext(data->errors)) print_xml_string(data->outfile, "string", error); cupsFilePuts(data->outfile, "\n"); @@ -2111,16 +2338,16 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) { - for (error = (char *)cupsArrayFirst(data->errors); + for (error = (char *)cupsArrayGetFirst(data->errors); error; - error = (char *)cupsArrayNext(data->errors)) + error = (char *)cupsArrayGetNext(data->errors)) cupsFilePrintf(cupsFileStdout(), " %s\n", error); } } if (data->num_displayed > 0 && !data->verbosity && response && (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout()))) { - for (attrptr = ippFirstAttribute(response); attrptr; attrptr = ippNextAttribute(response)) + for (attrptr = ippGetFirstAttribute(response); attrptr; attrptr = ippGetNextAttribute(response)) { if (ippGetName(attrptr)) { @@ -2150,101 +2377,44 @@ do_test(_ipp_file_t *f, /* I - IPP data file */ ippDelete(response); response = NULL; - for (i = 0; i < data->num_statuses; i ++) + clear_data(data); + + return (data->ignore_errors || data->prev_pass); +} + + +// +// 'do_tests()' - Do tests as specified in the test file. +// + +static bool // O - `true` on success, `false` on failure +do_tests(const char *testfile, // I - Test file to use + ipptool_test_t *data) // I - Test data +{ + ipp_file_t *file; // IPP data file + + + // Connect to the printer/server... + data->http = connect_printer(data); + + // Run tests... + if ((file = ippFileNew(data->parent, NULL, (ipp_ferror_cb_t)error_cb, data)) == NULL) { - free(data->statuses[i].if_defined); - free(data->statuses[i].if_not_defined); - free(data->statuses[i].define_match); - free(data->statuses[i].define_no_match); + print_fatal_error(data, "Unable to create test file parser: %s", cupsGetErrorString()); + return (false); } - data->num_statuses = 0; - for (i = data->num_expects, expect = data->expects; i > 0; i --, expect ++) + if (!ippFileOpen(file, testfile, "r")) { - free(expect->name); - free(expect->of_type); - free(expect->same_count_as); - free(expect->if_defined); - free(expect->if_not_defined); - free(expect->with_value); - free(expect->define_match); - free(expect->define_no_match); - free(expect->define_value); - free(expect->display_match); + print_fatal_error(data, "Unable to open '%s': %s", testfile, cupsGetErrorString()); + return (false); } - data->num_expects = 0; - for (i = 0; i < data->num_displayed; i ++) - free(data->displayed[i]); - data->num_displayed = 0; - - free(data->monitor_uri); - data->monitor_uri = NULL; - - for (i = data->num_monitor_expects, expect = data->monitor_expects; i > 0; i --, expect ++) - { - free(expect->name); - free(expect->of_type); - free(expect->same_count_as); - free(expect->if_defined); - free(expect->if_not_defined); - free(expect->with_value); - free(expect->define_match); - free(expect->define_no_match); - free(expect->define_value); - free(expect->display_match); - } - data->num_monitor_expects = 0; - - return (data->ignore_errors || data->prev_pass); -} - - -/* - * 'do_tests()' - Do tests as specified in the test file. - */ - -static int /* O - 1 on success, 0 on failure */ -do_tests(const char *testfile, /* I - Test file to use */ - ipptool_test_t *data) /* I - Test data */ -{ - http_encryption_t encryption; /* Encryption mode */ - - - /* - * Connect to the printer/server... - */ - - if (!_cups_strcasecmp(data->vars->scheme, "https") || !_cups_strcasecmp(data->vars->scheme, "ipps") || data->vars->port == 443) - encryption = HTTP_ENCRYPTION_ALWAYS; - else - encryption = data->encryption; + ippFileRead(file, (ipp_ftoken_cb_t)token_cb, true); - if ((data->http = httpConnect2(data->vars->host, data->vars->port, NULL, data->family, encryption, 1, 30000, NULL)) == NULL) - { - print_fatal_error(data, "Unable to connect to \"%s\" on port %d - %s", data->vars->host, data->vars->port, cupsGetErrorString()); - return (0); - } - -#ifdef HAVE_LIBZ - httpSetDefaultField(data->http, HTTP_FIELD_ACCEPT_ENCODING, "deflate, gzip, identity"); -#else - httpSetDefaultField(data->http, HTTP_FIELD_ACCEPT_ENCODING, "identity"); -#endif /* HAVE_LIBZ */ - - if (data->timeout > 0.0) - httpSetTimeout(data->http, data->timeout, timeout_cb, NULL); - - /* - * Run tests... - */ - - _ippFileParse(data->vars, testfile, (void *)data); - - /* - * Close connection and return... - */ + ippFileDelete(file); + // Close connection and return... httpClose(data->http); data->http = NULL; @@ -2252,73 +2422,61 @@ do_tests(const char *testfile, /* I - Test file to use */ } -/* - * 'error_cb()' - Print/add an error message. - */ +// +// 'error_cb()' - Print/add an error message. +// -static int /* O - 1 to continue, 0 to stop */ -error_cb(_ipp_file_t *f, /* I - IPP file data */ - ipptool_test_t *data, /* I - Test data */ - const char *error) /* I - Error message */ +static bool // O - `true` to continue, `false` to stop +error_cb(ipp_file_t *f, // I - IPP file data (not used) + ipptool_test_t *data, // I - Test data + const char *error) // I - Error message { (void)f; print_fatal_error(data, "%s", error); - return (1); + return (true); } -/* - * 'expect_matches()' - Return true if the tag matches the specification. - */ +// +// 'expect_matches()' - Return true if the tag matches the specification. +// -static int /* O - 1 if matches, 0 otherwise */ +static bool // O - `true` on match, `false` on non-match expect_matches( - ipptool_expect_t *expect, /* I - Expected attribute */ - ipp_attribute_t *attr) /* I - Attribute */ + ipptool_expect_t *expect, // I - Expected attribute + ipp_attribute_t *attr) // I - Attribute { - int i, /* Looping var */ - count, /* Number of values */ - match; /* Match? */ - char *of_type, /* Type name to match */ - *paren, /* Pointer to opening parenthesis */ - *next, /* Next name to match */ - sep; /* Separator character */ - ipp_tag_t value_tag; /* Syntax/value tag */ - int lower, upper; /* Lower and upper bounds for syntax */ - + int i, // Looping var + count; // Number of values + bool match; // Match? + char *of_type, // Type name to match + *paren, // Pointer to opening parenthesis + *next, // Next name to match + sep; // Separator character + ipp_tag_t value_tag; // Syntax/value tag + int lower, upper; // Lower and upper bounds for syntax - /* - * If we don't expect a particular type, return immediately... - */ + // If we don't expect a particular type, return immediately... if (!expect->of_type) - return (1); - - /* - * Parse the "of_type" value since the string can contain multiple attribute - * types separated by "," or "|"... - */ + return (true); + // Parse the "of_type" value since the string can contain multiple attribute + // types separated by "," or "|"... value_tag = ippGetValueTag(attr); count = ippGetCount(attr); - for (of_type = expect->of_type, match = 0; !match && *of_type; of_type = next) + for (of_type = expect->of_type, match = false; !match && *of_type; of_type = next) { - /* - * Find the next separator, and set it (temporarily) to nul if present. - */ - + // Find the next separator, and set it (temporarily) to nul if present. for (next = of_type; *next && *next != '|' && *next != ','; next ++); if ((sep = *next) != '\0') *next = '\0'; - /* - * Support some meta-types to make it easier to write the test file. - */ - + // Support some meta-types to make it easier to write the test file. if ((paren = strchr(of_type, '(')) != NULL) { char *ptr; // Pointer into syntax string @@ -2333,6 +2491,7 @@ expect_matches( else if ((ptr = strchr(paren + 1, ':')) != NULL) { lower = atoi(paren + 1); + ptr ++; } else { @@ -2455,15 +2614,12 @@ expect_matches( default : // No other constraints, so this is a match - match = 1; + match = true; break; } } - /* - * Restore the separators if we have them... - */ - + // Restore the separators if we have them... if (paren) *paren = '('; @@ -2475,27 +2631,106 @@ expect_matches( } -/* - * 'get_filename()' - Get a filename based on the current test file. - */ +// +// 'free_data()' - Free test data. +// -static char * /* O - Filename */ -get_filename(const char *testfile, /* I - Current test file */ - char *dst, /* I - Destination filename */ - const char *src, /* I - Source filename */ - size_t dstsize) /* I - Size of destination buffer */ +static void +free_data(ipptool_test_t *data) // I - Test data { - char *dstptr; /* Pointer into destination */ + clear_data(data); + + ippFileDelete(data->parent); + cupsArrayDelete(data->errors); + + free(data); +} + + +// +// 'generate_file()' - Generate a print file. +// + +static http_status_t // O - HTTP status +generate_file( + http_t *http, // I - HTTP connection + ipptool_generate_t *params) // I - GENERATE-FILE parameters +{ + cups_raster_mode_t mode; // Raster output mode + cups_raster_t *ras; // Raster stream + cups_page_header2_t header; // Raster page header (front side) + cups_page_header2_t back_header; // Raster page header (back side) + pwg_media_t *pwg; // PWG media information + cups_media_t media; // CUPS media information + + + // Set the output mode... + if (!strcmp(params->format, "image/pwg-raster")) + mode = CUPS_RASTER_WRITE_PWG; + else if (!strcmp(params->format, "image/urf")) + mode = CUPS_RASTER_WRITE_APPLE; + else + mode = CUPS_RASTER_WRITE_COMPRESSED; + + // Create the raster header... + if ((pwg = pwgMediaForPWG(params->media)) == NULL) + { + fprintf(stderr, "ipptool: Unable to parse media size '%s'.\n", params->media); + return (HTTP_STATUS_SERVER_ERROR); + } + + memset(&media, 0, sizeof(media)); + cupsCopyString(media.media, pwg->pwg, sizeof(media.media)); + media.width = pwg->width; + media.length = pwg->length; + + cupsRasterInitHeader(&header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, params->orientation, params->sides, params->type, params->xdpi, params->ydpi, /*sheet_back*/NULL); + cupsRasterInitHeader(&back_header, &media, /*optimize*/NULL, IPP_QUALITY_NORMAL, /*intent*/NULL, params->orientation, params->sides, params->type, params->xdpi, params->ydpi, params->sheet_back); + +#if 0 + fprintf(stderr, "ipptool: media='%s'\n", params->media); + fprintf(stderr, "ipptool: type='%s'\n", params->type); + fprintf(stderr, "ipptool: resolution=%dx%d\n", params->xdpi, params->ydpi); + fprintf(stderr, "ipptool: orientation=%d\n", params->orientation); + fprintf(stderr, "ipptool: sides='%s'\n", params->sides); + fprintf(stderr, "ipptool: num_copies=%d\n", params->num_copies); + fprintf(stderr, "ipptool: num_pages=%d\n", params->num_pages); + fprintf(stderr, "ipptool: format='%s'\n", params->format); + fprintf(stderr, "ipptool: sheet_back='%s'\n", params->sheet_back); +#endif // 0 + + // Create the raster stream... + if ((ras = cupsRasterOpenIO((cups_raster_cb_t)httpWrite, http, mode)) == NULL) + return (HTTP_STATUS_SERVER_ERROR); + + // Write it... + if (!cupsRasterWriteTest(ras, &header, &back_header, params->sheet_back, params->orientation, params->num_copies, params->num_pages)) + return (HTTP_STATUS_SERVER_ERROR); + + cupsRasterClose(ras); + + return (HTTP_STATUS_CONTINUE); +} + + +// +// 'get_filename()' - Get a filename based on the current test file. +// + +static char * // O - Filename +get_filename(const char *testfile, // I - Current test file + char *dst, // I - Destination filename + const char *src, // I - Source filename + size_t dstsize) // I - Size of destination buffer +{ + char *dstptr; // Pointer into destination _cups_globals_t *cg = _cupsGlobals(); - /* Global data */ + // Global data if (*src == '<' && src[strlen(src) - 1] == '>') { - /* - * Map to CUPS_DATADIR/ipptool/filename... - */ - + // Map to CUPS_DATADIR/ipptool/filename... snprintf(dst, dstsize, "%s/ipptool/%s", cg->cups_datadir, src + 1); dstptr = dst + strlen(dst) - 1; if (*dstptr == '>') @@ -2504,221 +2739,857 @@ get_filename(const char *testfile, /* I - Current test file */ else if (!access(src, R_OK) || *src == '/' #ifdef _WIN32 || (isalpha(*src & 255) && src[1] == ':') -#endif /* _WIN32 */ +#endif // _WIN32 ) { - /* - * Use the path as-is... - */ - + // Use the path as-is... cupsCopyString(dst, src, dstsize); } else { - /* - * Make path relative to testfile... - */ - + // Make path relative to testfile... cupsCopyString(dst, testfile, dstsize); if ((dstptr = strrchr(dst, '/')) != NULL) dstptr ++; else - dstptr = dst; /* Should never happen */ + dstptr = dst; // Should never happen cupsCopyString(dstptr, src, dstsize - (size_t)(dstptr - dst)); #if _WIN32 if (_access(dst, 0)) { - /* - * Not available relative to the testfile, see if it can be found on the - * desktop... - */ + // Not available relative to the testfile, see if it can be found on the desktop... const char *userprofile = getenv("USERPROFILE"); - /* User home directory */ + // User home directory if (userprofile) snprintf(dst, dstsize, "%s/Desktop/%s", userprofile, src); } -#endif /* _WIN32 */ +#endif // _WIN32 } return (dst); } -/* - * 'get_string()' - Get a pointer to a string value or the portion of interest. - */ +// +// 'get_string()' - Get a pointer to a string value or the portion of interest. +// -static const char * /* O - Pointer to string */ -get_string(ipp_attribute_t *attr, /* I - IPP attribute */ - int element, /* I - Element to fetch */ - int flags, /* I - Value ("with") flags */ - char *buffer, /* I - Temporary buffer */ - size_t bufsize) /* I - Size of temporary buffer */ +static const char * // O - Pointer to string +get_string(ipp_attribute_t *attr, // I - IPP attribute + int element, // I - Element to fetch + int flags, // I - Value ("with") flags + char *buffer, // I - Temporary buffer + size_t bufsize) // I - Size of temporary buffer { - const char *value; /* Value */ - char *ptr, /* Pointer into value */ - scheme[256], /* URI scheme */ - userpass[256], /* Username/password */ - hostname[256], /* Hostname */ - resource[1024]; /* Resource */ - int port; /* Port number */ + const char *value; // Value + char *ptr, // Pointer into value + scheme[256], // URI scheme + userpass[256], // Username/password + hostname[256], // Hostname + resource[1024]; // Resource + int port; // Port number value = ippGetString(attr, element, NULL); if (flags & IPPTOOL_WITH_HOSTNAME) { - if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), buffer, (int)bufsize, &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) + if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), buffer, bufsize, &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) buffer[0] = '\0'; ptr = buffer + strlen(buffer) - 1; if (ptr >= buffer && *ptr == '.') - *ptr = '\0'; /* Drop trailing "." */ + *ptr = '\0'; // Drop trailing "." return (buffer); } else if (flags & IPPTOOL_WITH_RESOURCE) { - if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, buffer, (int)bufsize) < HTTP_URI_STATUS_OK) + if (httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, buffer, bufsize) < HTTP_URI_STATUS_OK) + buffer[0] = '\0'; + + return (buffer); + } + else if (flags & IPPTOOL_WITH_SCHEME) + { + if (httpSeparateURI(HTTP_URI_CODING_ALL, value, buffer, bufsize, userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) buffer[0] = '\0'; - return (buffer); - } - else if (flags & IPPTOOL_WITH_SCHEME) - { - if (httpSeparateURI(HTTP_URI_CODING_ALL, value, buffer, (int)bufsize, userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)) < HTTP_URI_STATUS_OK) - buffer[0] = '\0'; + return (buffer); + } + else if (ippGetValueTag(attr) == IPP_TAG_URI && (!strncmp(value, "ipp://", 6) || !strncmp(value, "http://", 7) || !strncmp(value, "ipps://", 7) || !strncmp(value, "https://", 8))) + { + http_uri_status_t status = httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)); + + if (status < HTTP_URI_STATUS_OK) + { + // Bad URI... + buffer[0] = '\0'; + } + else + { + // Normalize URI with no trailing dot... + if ((ptr = hostname + strlen(hostname) - 1) >= hostname && *ptr == '.') + *ptr = '\0'; + + httpAssembleURI(HTTP_URI_CODING_ALL, buffer, bufsize, scheme, userpass, hostname, port, resource); + } + + return (buffer); + } + else + { + return (value); + } +} + + +// +// 'iso_date()' - Return an ISO 8601 date/time string for the given IPP dateTime +// value. +// + +static char * // O - ISO 8601 date/time string +iso_date(const ipp_uchar_t *date) // I - IPP (RFC 1903) date/time value +{ + time_t utctime; // UTC time since 1970 + struct tm utcdate; // UTC date/time + static char buffer[255]; // String buffer + + + utctime = ippDateToTime(date); + gmtime_r(&utctime, &utcdate); + + snprintf(buffer, sizeof(buffer), "%04d-%02d-%02dT%02d:%02d:%02dZ", + utcdate.tm_year + 1900, utcdate.tm_mon + 1, utcdate.tm_mday, + utcdate.tm_hour, utcdate.tm_min, utcdate.tm_sec); + + return (buffer); +} + + +// +// 'parse_generate_file()' - Parse the GENERATE-FILE directive. +// +// GENERATE-FILE { +// MEDIA "media size name, default, ready" +// COLORSPACE "colorspace_bits, auto, color, monochrome, bi-level" +// RESOLUTION "resolution, min, max, default" +// ORIENTATION "portrait, landscape, reverse-landscape, reverse-portrait" +// SIDES "one-sided, two-sided-long-edge, two-sided-short-edge" +// NUM-COPIES "copies" +// NUM-PAGES "pages, min" +// FORMAT "image/pwg-raster, image/urf" +// } +// + +static bool // O - `true` to continue, `false` to stop +parse_generate_file( + ipp_file_t *f, // I - IPP file data + ipptool_test_t *data) // I - Test data +{ + int i; // Looping var + ipptool_generate_t *params = NULL; // Generation parameters + http_t *http; // Connection to printer + ipp_t *request, // Get-Printer-Attributes request + *response = NULL;// Get-Printer-Attributes response + ipp_attribute_t *attr; // Current attribute + const char *keyword; // Keyword value + char token[256], // Token string + temp[1024], // Temporary string + value[1024], // Value string + *ptr; // Pointer into value + static const char *autos[][2] = // Automatic color/monochrome keywords + { + { "SRGB24", "srgb_8" }, + { "ADOBERGB24", "adobe-rgb_8" }, + { "DEVRGB24", "rgb_8" }, + { "DEVCMYK32", "cmyk_8" }, + { "ADOBERGB48", "adobe-rgb_16" }, + { "DEVRGB48", "rgb_16" }, + { "DEVCMYK64", "cmyk_16" }, + { "W8", "sgray_8" }, + { NULL, "black_8" }, + { "W16", "sgray_16" }, + { NULL, "black_16" }, + { NULL, "sgray_1" }, + { NULL, "black_1" } + }; + static const char *bi_levels[][2] = // Bi-level keywords + { + { NULL, "sgray_1" }, + { NULL, "black_1" } + }; + static const char *colors[][2] = // Color keywords + { + { "SRGB24", "srgb_8" }, + { "ADOBERGB24", "adobe-rgb_8" }, + { "DEVRGB24", "rgb_8" }, + { "DEVCMYK32", "cmyk_8" }, + { "ADOBERGB48", "adobe-rgb_16" }, + { "DEVRGB48", "rgb_16" }, + { "DEVCMYK64", "cmyk_16" } + }; + static const char *monochromes[][2] = // Monochrome keywords + { + { "W8", "sgray_8" }, + { NULL, "black_8" }, + { "W16", "sgray_16" }, + { NULL, "black_16" }, + { NULL, "sgray_1" }, + { NULL, "black_1" } + }; + + + // Make sure we have an open brace after the GENERATE-FILE... + if (!ippFileReadToken(f, token, sizeof(token)) || strcmp(token, "{")) + { + print_fatal_error(data, "Missing open brace on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (0); + } + + // Get printer attributes... + if ((http = connect_printer(data)) == NULL) + { + print_fatal_error(data, "GENERATE-FILE connection failure on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); + } + + request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, ippFileGetVar(data->parent, "uri")); + + response = cupsDoRequest(http, request, ippFileGetVar(data->parent, "resource")); + + httpClose(http); + + if (cupsGetError() >= IPP_STATUS_ERROR_BAD_REQUEST) + { + print_fatal_error(data, "GENERATE-FILE query failure on line %d of '%s': %s", ippFileGetLineNumber(f), ippFileGetFilename(f), cupsGetErrorString()); + ippDelete(response); + return (false); + } + + // Allocate parameters... + if ((params = calloc(1, sizeof(ipptool_generate_t))) == NULL) + { + print_fatal_error(data, "GENERATE-FILE memory allocation failure on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); + } + + // Loop until we get a closing brace... + while (ippFileReadToken(f, token, sizeof(token))) + { + if (!strcmp(token, "}")) + { + // Update the raster type as needed... + if (!params->type[0]) + { + // Get request/printer default value for print-color-mode, default to "auto"... + if ((attr = ippFileGetAttribute(f, "print-color-mode", IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(response, "print-color-mode-default", IPP_TAG_KEYWORD); + + if (attr) + cupsCopyString(params->type, ippGetString(attr, 0, NULL), sizeof(params->type)); + else + cupsCopyString(params->type, "auto", sizeof(params->type)); + } + + if (!strcmp(params->type, "auto")) + { + // Find auto keyword... + params->type[0] = '\0'; + + if ((attr = ippFindAttribute(response, "pwg-raster-document-type-supported", IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD); + + for (i = 0; i < (int)(sizeof(autos) / sizeof(autos[0])); i ++) + { + if (ippContainsString(attr, autos[i][0]) || ippContainsString(attr, autos[i][1])) + { + cupsCopyString(params->type, autos[i][1], sizeof(params->type)); + break; + } + } + + if (!params->type[0]) + { + print_fatal_error(data, "Printer does not support COLORSPACE \"auto\" on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + } + else if (!strcmp(params->type, "bi-level")) + { + // Find bi-level keyword... + params->type[0] = '\0'; + + attr = ippFindAttribute(response, "pwg-raster-document-type-supported", IPP_TAG_KEYWORD); + + for (i = 0; i < (int)(sizeof(bi_levels) / sizeof(bi_levels[0])); i ++) + { + if (ippContainsString(attr, bi_levels[i][1])) + { + cupsCopyString(params->type, bi_levels[i][1], sizeof(params->type)); + break; + } + } + + if (!params->type[0]) + { + print_fatal_error(data, "Printer does not support COLORSPACE \"bi-level\" on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + } + else if (!strcmp(params->type, "color")) + { + // Find color keyword... + params->type[0] = '\0'; + + if ((attr = ippFindAttribute(response, "pwg-raster-document-type-supported", IPP_TAG_KEYWORD)) != NULL) + attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD); + + for (i = 0; i < (int)(sizeof(colors) / sizeof(colors[0])); i ++) + { + if (ippContainsString(attr, colors[i][0]) || ippContainsString(attr, colors[i][1])) + { + cupsCopyString(params->type, colors[i][1], sizeof(params->type)); + break; + } + } + + if (!params->type[0]) + { + print_fatal_error(data, "Printer does not support COLORSPACE \"color\" on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + } + else if (!strcmp(params->type, "monochrome")) + { + // Find grayscale keyword... + params->type[0] = '\0'; + + if ((attr = ippFindAttribute(response, "pwg-raster-document-type-supported", IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD); + + for (i = 0; i < (int)(sizeof(monochromes) / sizeof(monochromes[0])); i ++) + { + if (ippContainsString(attr, monochromes[i][0]) || ippContainsString(attr, monochromes[i][1])) + { + cupsCopyString(params->type, monochromes[i][1], sizeof(params->type)); + break; + } + } + + if (!params->type[0]) + { + print_fatal_error(data, "Printer does not support COLORSPACE \"monochrome\" on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + } + + // Make sure we have an output format... + if (!params->format[0]) + { + // Check the supported formats and choose a suitable one... + if ((keyword = ippGetString(ippFileGetAttribute(f, "document-format", IPP_TAG_MIMETYPE), 0, NULL)) != NULL) + { + if (strcmp(keyword, "image/pwg-raster") && strcmp(keyword, "image/urf")) + { + print_fatal_error(data, "Unsupported \"document-format\" value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + cupsCopyString(params->format, keyword, sizeof(params->format)); + } + else if ((attr = ippFindAttribute(response, "document-format-supported", IPP_TAG_MIMETYPE)) != NULL) + { + // Default to Apple Raster unless sending bitmaps, which are only + // supported by PWG Raster... + if (ippContainsString(attr, "image/urf") && strncmp(params->type, "black_", 6) && strcmp(params->type, "srgb_1")) + cupsCopyString(params->format, "image/urf", sizeof(params->format)); + else if (ippContainsString(attr, "image/pwg-raster")) + cupsCopyString(params->format, "image/pwg-raster", sizeof(params->format)); + } + + if (!params->format[0]) + { + print_fatal_error(data, "Printer does not support a compatible FORMAT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + } + + // Get default/ready media... + if (!params->media[0] || !strcmp(params->media, "default")) + { + // Use job ticket or default media... + if (!params->media[0] && (keyword = ippGetString(ippFileGetAttribute(f, "media", IPP_TAG_ZERO), 0, NULL)) != NULL) + { + cupsCopyString(params->media, keyword, sizeof(params->media)); + } + else if ((keyword = ippGetString(ippFindAttribute(response, "media-default", IPP_TAG_ZERO), 0, NULL)) != NULL) + { + cupsCopyString(params->media, keyword, sizeof(params->media)); + } + else + { + print_fatal_error(data, "Printer does not report a default MEDIA size name on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + } + else if (!strcmp(params->media, "ready")) + { + // Use ready media + if ((keyword = ippGetString(ippFindAttribute(response, "media-ready", IPP_TAG_ZERO), 0, NULL)) != NULL) + { + cupsCopyString(params->media, keyword, sizeof(params->media)); + } + else + { + print_fatal_error(data, "Printer does not report a ready MEDIA size name on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + } + + // Default resolution + if (!params->xdpi || !params->ydpi) + { + if ((attr = ippFindAttribute(response, "pwg-raster-document-resolution-supported", IPP_TAG_RESOLUTION)) != NULL) + { + ipp_res_t units; // Resolution units + + // Use the middle resolution in the list... + params->xdpi = ippGetResolution(attr, ippGetCount(attr) / 2, ¶ms->ydpi, &units); + + if (units == IPP_RES_PER_CM) + { + params->xdpi = (int)(params->xdpi * 2.54); + params->ydpi = (int)(params->ydpi * 2.54); + } + } + else if ((attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD)) != NULL) + { + int count = ippGetCount(attr); // Number of values + + for (i = 0; i < count; i ++) + { + keyword = ippGetString(attr, i, NULL); + if (!strncmp(keyword, "RS", 2)) + { + // Use the first resolution in the list... + params->xdpi = params->ydpi = atoi(keyword + 2); + break; + } + } + } + + if (!params->xdpi || !params->ydpi) + { + print_fatal_error(data, "Printer does not report a supported RESOLUTION on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + } + + // Default duplex/sides + if (!params->sides[0]) + { + if ((keyword = ippGetString(ippFileGetAttribute(f, "sides", IPP_TAG_ZERO), 0, NULL)) != NULL) + { + // Use the setting from the job ticket... + cupsCopyString(params->sides, keyword, sizeof(params->sides)); + } + else if (params->num_pages != 1 && (attr = ippFindAttribute(response, "sides-supported", IPP_TAG_KEYWORD)) != NULL && ippGetCount(attr) > 1) + { + // Default to two-sided for capable printers... + if (params->orientation == IPP_ORIENT_LANDSCAPE || params->orientation == IPP_ORIENT_REVERSE_LANDSCAPE) + cupsCopyString(params->sides, "two-sided-short-edge", sizeof(params->sides)); + else + cupsCopyString(params->sides, "two-sided-long-edge", sizeof(params->sides)); + } + else + { + // Fall back to 1-sided output... + cupsCopyString(params->sides, "one-sided", sizeof(params->sides)); + } + } + + // Default orientation + if (!params->orientation) + { + // Use the job ticket value, otherwise use landscape for short-edge duplex + if ((attr = ippFileGetAttribute(f, "orientation-requested", IPP_TAG_ENUM)) != NULL) + params->orientation = (ipp_orient_t)ippGetInteger(attr, 0); + else + params->orientation = !strcmp(params->sides, "two-sided-short-edge") ? IPP_ORIENT_LANDSCAPE : IPP_ORIENT_PORTRAIT; + } + + // Default number of copies and pages... + if (!params->num_copies) + params->num_copies = 1; + + if (!params->num_pages) + params->num_pages = !strncmp(params->sides, "two-sided-", 10) ? 2 : 1; + + // Back side transform, if any + if (!params->sheet_back[0]) + { + if ((attr = ippFindAttribute(response, "pwg-raster-document-sheet-back", IPP_TAG_KEYWORD)) != NULL) + { + cupsCopyString(params->sheet_back, ippGetString(attr, 0, NULL), sizeof(params->sheet_back)); + } + else if ((attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD)) != NULL) + { + if (ippContainsString(attr, "DM1")) + cupsCopyString(params->sheet_back, "flip", sizeof(params->sheet_back)); + else if (ippContainsString(attr, "DM2")) + cupsCopyString(params->sheet_back, "manual-tumble", sizeof(params->sheet_back)); + else if (ippContainsString(attr, "DM3")) + cupsCopyString(params->sheet_back, "rotated", sizeof(params->sheet_back)); + else + cupsCopyString(params->sheet_back, "normal", sizeof(params->sheet_back)); + } + else + { + cupsCopyString(params->sheet_back, "normal", sizeof(params->sheet_back)); + } + } + + // Everything is good, save the parameters and return... + data->generate_params = params; + ippDelete(response); + + return (1); + } + else if (!_cups_strcasecmp(token, "COLORSPACE")) + { + if (params->type[0]) + { + print_fatal_error(data, "Unexpected extra COLORSPACE on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + if (!ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing COLORSPACE value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + ippFileExpandVars(f, value, temp, sizeof(value)); + + if (!strcmp(value, "auto") || !strcmp(value, "bi-level") || !strcmp(value, "color") || !strcmp(value, "monochrome") || !strcmp(value, "adobe-rgb_8") || !strcmp(value, "adobe-rgb_16") || !strcmp(value, "black_1") || !strcmp(value, "black_8") || !strcmp(value, "black_16") || !strcmp(value, "cmyk_8") || !strcmp(value, "cmyk_16") || !strcmp(value, "rgb_8") || !strcmp(value, "rgb_16") || !strcmp(value, "sgray_1") || !strcmp(value, "sgray_8") || !strcmp(value, "sgray_16") || !strcmp(value, "srgb_8") || !strcmp(value, "srgb_16")) + { + // Use "print-color-mode" or "pwg-raster-document-type-supported" keyword... + cupsCopyString(params->type, value, sizeof(params->type)); + } + else + { + print_fatal_error(data, "Bad COLORSPACE \"%s\" on line %d of '%s'.", value, ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + } + else if (!_cups_strcasecmp(token, "FORMAT")) + { + if (params->format[0]) + { + print_fatal_error(data, "Unexpected extra FORMAT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + if (!ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing FORMAT MIME media type on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + ippFileExpandVars(f, value, temp, sizeof(value)); + + if (!strcmp(value, "image/pwg-raster") || !strcmp(value, "image/urf")) + { + cupsCopyString(params->format, value, sizeof(params->format)); + } + else + { + print_fatal_error(data, "Bad FORMAT \"%s\" on line %d of '%s'.", value, ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + } + else if (!_cups_strcasecmp(token, "MEDIA")) + { + if (params->media[0]) + { + print_fatal_error(data, "Unexpected extra MEDIA on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + if (!ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing MEDIA size name on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + ippFileExpandVars(f, value, temp, sizeof(value)); + + if (!strcmp(value, "default") || !strcmp(value, "ready") || pwgMediaForPWG(value) != NULL) + { + cupsCopyString(params->media, value, sizeof(params->media)); + } + else + { + print_fatal_error(data, "Bad MEDIA \"%s\" on line %d of '%s'.", value, ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + } + else if (!_cups_strcasecmp(token, "NUM-COPIES")) + { + int intvalue; // Number of copies value + + if (params->num_copies) + { + print_fatal_error(data, "Unexpected extra NUM-COPIES on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + if (!ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing NUM-COPIES number on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + ippFileExpandVars(f, value, temp, sizeof(value)); + + if ((intvalue = strtol(value, NULL, 10)) > INT_MAX || intvalue < 1) + { + print_fatal_error(data, "Bad NUM-COPIES \"%s\" on line %d of '%s'.", value, ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + params->num_copies = intvalue; + } + else if (!_cups_strcasecmp(token, "NUM-PAGES")) + { + int intvalue; // Number of pages value + + if (params->num_pages) + { + print_fatal_error(data, "Unexpected extra NUM-PAGES on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + if (!ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing NUM-PAGES number on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + ippFileExpandVars(f, value, temp, sizeof(value)); + + if ((intvalue = strtol(value, NULL, 10)) > INT_MAX || intvalue < 1) + { + print_fatal_error(data, "Bad NUM-PAGES \"%s\" on line %d of '%s'.", value, ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + params->num_pages = (int)intvalue; + } + else if (!_cups_strcasecmp(token, "ORIENTATION")) + { + if (params->orientation) + { + print_fatal_error(data, "Unexpected extra ORIENTATION on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + if (!ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing ORIENTATION on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + ippFileExpandVars(f, value, temp, sizeof(value)); + + if (!strcmp(value, "portrait")) + params->orientation = IPP_ORIENT_PORTRAIT; + else if (!strcmp(value, "landscape")) + params->orientation = IPP_ORIENT_LANDSCAPE; + else if (!strcmp(value, "reverse-landscape")) + params->orientation = IPP_ORIENT_REVERSE_LANDSCAPE; + else if (!strcmp(value, "reverse-portrait")) + params->orientation = IPP_ORIENT_REVERSE_PORTRAIT; + else + { + print_fatal_error(data, "Bad ORIENTATION \"%s\" on line %d of '%s'.", value, ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + } + else if (!_cups_strcasecmp(token, "RESOLUTION")) + { + if (params->xdpi || params->ydpi) + { + print_fatal_error(data, "Unexpected extra RESOLUTION on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + if (!ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing RESOLUTION on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + + ippFileExpandVars(f, value, temp, sizeof(value)); + + if (!strcmp(value, "min") || !strcmp(value, "max")) + { + if ((attr = ippFindAttribute(response, "pwg-raster-document-resolution-supported", IPP_TAG_RESOLUTION)) != NULL) + { + ipp_res_t units; // Resolution units + + // Use the first or last resolution in the list... + params->xdpi = ippGetResolution(attr, !strcmp(value, "min") ? 0 : ippGetCount(attr) - 1, ¶ms->ydpi, &units); + + if (units == IPP_RES_PER_CM) + { + params->xdpi = (int)(params->xdpi * 2.54); + params->ydpi = (int)(params->ydpi * 2.54); + } + } + else if ((attr = ippFindAttribute(response, "urf-supported", IPP_TAG_KEYWORD)) != NULL) + { + int count = ippGetCount(attr); // Number of values + + for (i = 0; i < count; i ++) + { + keyword = ippGetString(attr, i, NULL); + if (!strncmp(keyword, "RS", 2)) + { + if (!strcmp(value, "min")) + { + // Use the first resolution in the list... + params->xdpi = params->ydpi = atoi(keyword + 2); + } + else + { + // Use the last resolution in the list... + params->xdpi = params->ydpi = (int)strtol(keyword + 2, &ptr, 10); + while (ptr && *ptr && *ptr == '-') + params->xdpi = params->ydpi = (int)strtol(ptr + 1, &ptr, 10); + } + break; + } + } + } + } + else if (strcmp(value, "default")) + { + char units[8] = ""; // Resolution units (dpi or dpcm) + + if (sscanf(value, "%dx%d%7s", ¶ms->xdpi, ¶ms->ydpi, units) == 1) + { + sscanf(value, "%d%7s", ¶ms->xdpi, units); + params->ydpi = params->xdpi; + } - return (buffer); - } - else if (ippGetValueTag(attr) == IPP_TAG_URI && (!strncmp(value, "ipp://", 6) || !strncmp(value, "http://", 7) || !strncmp(value, "ipps://", 7) || !strncmp(value, "https://", 8))) - { - http_uri_status_t status = httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource)); + if (!strcmp(units, "dpcm")) + { + params->xdpi = (int)(params->xdpi * 2.54); + params->ydpi = (int)(params->ydpi * 2.54); + } + else if (strcmp(units, "dpi")) + params->xdpi = params->ydpi = 0; + } - if (status < HTTP_URI_STATUS_OK) + if (strcmp(value, "default") && (params->xdpi <= 0 || params->ydpi <= 0)) + { + print_fatal_error(data, "Bad RESOLUTION \"%s\" on line %d of '%s'.", value, ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } + } + else if (!_cups_strcasecmp(token, "SIDES")) { - /* - * Bad URI... - */ + if (!ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing SIDES on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } - buffer[0] = '\0'; + ippFileExpandVars(f, value, temp, sizeof(value)); + + if (!strcmp(value, "one-sided") || !strcmp(value, "two-sided-long-edge") || !strcmp(value, "two-sided-short-edge")) + { + cupsCopyString(params->sides, value, sizeof(params->sides)); + } + else + { + print_fatal_error(data, "Bad SIDES \"%s\" on line %d of '%s'.", value, ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; + } } else { - /* - * Normalize URI with no trailing dot... - */ - - if ((ptr = hostname + strlen(hostname) - 1) >= hostname && *ptr == '.') - *ptr = '\0'; - - httpAssembleURI(HTTP_URI_CODING_ALL, buffer, (int)bufsize, scheme, userpass, hostname, port, resource); + print_fatal_error(data, "Unknown %s on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + goto fail; } - - return (buffer); } - else - return (value); -} - - -/* - * 'init_data()' - Initialize test data. - */ - -static void -init_data(ipptool_test_t *data) /* I - Data */ -{ - memset(data, 0, sizeof(ipptool_test_t)); - - data->output = IPPTOOL_OUTPUT_LIST; - data->outfile = cupsFileStdout(); - data->family = AF_UNSPEC; - data->def_transfer = IPPTOOL_TRANSFER_AUTO; - data->def_version = 11; - data->errors = cupsArrayNew3(NULL, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); - data->pass = 1; - data->prev_pass = 1; - data->request_id = (CUPS_RAND() % 1000) * 137; - data->show_header = 1; -} - - -/* - * 'iso_date()' - Return an ISO 8601 date/time string for the given IPP dateTime - * value. - */ - -static char * /* O - ISO 8601 date/time string */ -iso_date(const ipp_uchar_t *date) /* I - IPP (RFC 1903) date/time value */ -{ - time_t utctime; /* UTC time since 1970 */ - struct tm utcdate; /* UTC date/time */ - static char buffer[255]; /* String buffer */ - - utctime = ippDateToTime(date); - gmtime_r(&utctime, &utcdate); + print_fatal_error(data, "Missing closing brace on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); - snprintf(buffer, sizeof(buffer), "%04d-%02d-%02dT%02d:%02d:%02dZ", - utcdate.tm_year + 1900, utcdate.tm_mon + 1, utcdate.tm_mday, - utcdate.tm_hour, utcdate.tm_min, utcdate.tm_sec); + fail: - return (buffer); + free(params); + ippDelete(response); + return (0); } -/* - * 'parse_monitor_printer_state()' - Parse the MONITOR-PRINTER-STATE directive. - * - * MONITOR-PRINTER-STATE [printer-uri] { - * DELAY nnn - * EXPECT attribute-name ... - * } - */ +// +// 'parse_monitor_printer_state()' - Parse the MONITOR-PRINTER-STATE directive. +// +// MONITOR-PRINTER-STATE [printer-uri] { +// DELAY nnn +// EXPECT attribute-name ... +// } +// -static int /* O - 1 to continue, 0 to stop */ +static bool // O - `true` to continue, `false` to stop parse_monitor_printer_state( - _ipp_file_t *f, /* I - IPP file data */ - ipptool_test_t *data) /* I - Test data */ + ipp_file_t *f, // I - IPP file data + ipptool_test_t *data) // I - Test data { - char token[256], /* Token string */ - name[1024], /* Name string */ - temp[1024], /* Temporary string */ - value[1024], /* Value string */ - *ptr; /* Pointer into value */ + char token[256], // Token string + name[1024], // Name string + temp[1024], // Temporary string + value[1024], // Value string + *ptr; // Pointer into value + const char *uri; // Printer URI - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing printer URI on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Missing printer URI on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } if (strcmp(temp, "{")) { // Got a printer URI so copy it... - _ippVarsExpand(data->vars, value, temp, sizeof(value)); + ippFileExpandVars(f, value, temp, sizeof(value)); data->monitor_uri = strdup(value); // Then see if we have an opening brace... - if (!_ippFileReadToken(f, temp, sizeof(temp)) || strcmp(temp, "{")) + if (!ippFileReadToken(f, temp, sizeof(temp)) || strcmp(temp, "{")) { - print_fatal_error(data, "Missing opening brace on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Missing opening brace on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } } - else + else if ((uri = ippFileGetVar(data->parent, "uri")) != NULL) { // Use the default printer URI... - data->monitor_uri = strdup(data->vars->uri); + data->monitor_uri = strdup(uri); } // Loop until we get a closing brace... - while (_ippFileReadToken(f, token, sizeof(token))) + while (ippFileReadToken(f, token, sizeof(token))) { if (_cups_strcasecmp(token, "COUNT") && _cups_strcasecmp(token, "DEFINE-MATCH") && @@ -2737,19 +3608,16 @@ parse_monitor_printer_state( return (1); else if (!_cups_strcasecmp(token, "EXPECT")) { - /* - * Expected attributes... - */ - + // Expected attributes... if (data->num_monitor_expects >= (int)(sizeof(data->monitor_expects) / sizeof(data->monitor_expects[0]))) { - print_fatal_error(data, "Too many EXPECT's on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Too many EXPECT's on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } - if (!_ippFileReadToken(f, name, sizeof(name))) + if (!ippFileReadToken(f, name, sizeof(name))) { - print_fatal_error(data, "Missing EXPECT name on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Missing EXPECT name on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } @@ -2774,17 +3642,17 @@ parse_monitor_printer_state( } else if (!_cups_strcasecmp(token, "COUNT")) { - int count; /* Count value */ + int count; // Count value - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing COUNT number on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Missing COUNT number on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } - if ((count = atoi(temp)) <= 0) + if ((count = strtol(temp, NULL, 10)) > INT_MAX) { - print_fatal_error(data, "Bad COUNT \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); + print_fatal_error(data, "Bad COUNT \"%s\" on line %d of '%s'.", temp, ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } @@ -2794,15 +3662,15 @@ parse_monitor_printer_state( } else { - print_fatal_error(data, "COUNT without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "COUNT without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } } else if (!_cups_strcasecmp(token, "DEFINE-MATCH")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing DEFINE-MATCH variable on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Missing DEFINE-MATCH variable on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } @@ -2812,15 +3680,15 @@ parse_monitor_printer_state( } else { - print_fatal_error(data, "DEFINE-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "DEFINE-MATCH without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } } else if (!_cups_strcasecmp(token, "DEFINE-NO-MATCH")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing DEFINE-NO-MATCH variable on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Missing DEFINE-NO-MATCH variable on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } @@ -2830,15 +3698,15 @@ parse_monitor_printer_state( } else { - print_fatal_error(data, "DEFINE-NO-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "DEFINE-NO-MATCH without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } } else if (!_cups_strcasecmp(token, "DEFINE-VALUE")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing DEFINE-VALUE variable on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Missing DEFINE-VALUE variable on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } @@ -2848,15 +3716,15 @@ parse_monitor_printer_state( } else { - print_fatal_error(data, "DEFINE-VALUE without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "DEFINE-VALUE without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } } else if (!_cups_strcasecmp(token, "DISPLAY-MATCH")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing DISPLAY-MATCH message on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Missing DISPLAY-MATCH message on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } @@ -2866,29 +3734,26 @@ parse_monitor_printer_state( } else { - print_fatal_error(data, "DISPLAY-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "DISPLAY-MATCH without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } } else if (!_cups_strcasecmp(token, "DELAY")) { - /* - * Delay before operation... - */ - - double dval; /* Delay value */ + // Delay before operation... + double dval; // Delay value - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing DELAY value on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Missing DELAY value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } - _ippVarsExpand(data->vars, value, temp, sizeof(value)); + ippFileExpandVars(f, value, temp, sizeof(value)); if ((dval = _cupsStrScand(value, &ptr, localeconv())) < 0.0 || (*ptr && *ptr != ',')) { - print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); + print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of '%s'.", value, ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } @@ -2898,7 +3763,7 @@ parse_monitor_printer_state( { if ((dval = _cupsStrScand(ptr + 1, &ptr, localeconv())) <= 0.0 || *ptr) { - print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); + print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of '%s'.", value, ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } @@ -2909,9 +3774,9 @@ parse_monitor_printer_state( } else if (!_cups_strcasecmp(token, "OF-TYPE")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing OF-TYPE value tag(s) on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Missing OF-TYPE value tag(s) on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } @@ -2921,23 +3786,23 @@ parse_monitor_printer_state( } else { - print_fatal_error(data, "OF-TYPE without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "OF-TYPE without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } } else if (!_cups_strcasecmp(token, "IN-GROUP")) { - ipp_tag_t in_group; /* IN-GROUP value */ + ipp_tag_t in_group; // IN-GROUP value - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing IN-GROUP group tag on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Missing IN-GROUP group tag on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } if ((in_group = ippTagValue(temp)) == IPP_TAG_ZERO || in_group >= IPP_TAG_UNSUPPORTED_VALUE) { - print_fatal_error(data, "Bad IN-GROUP group tag \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); + print_fatal_error(data, "Bad IN-GROUP group tag \"%s\" on line %d of '%s'.", temp, ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } else if (data->last_expect) @@ -2946,15 +3811,15 @@ parse_monitor_printer_state( } else { - print_fatal_error(data, "IN-GROUP without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "IN-GROUP without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } } else if (!_cups_strcasecmp(token, "IF-DEFINED")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing IF-DEFINED name on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Missing IF-DEFINED name on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } @@ -2964,15 +3829,15 @@ parse_monitor_printer_state( } else { - print_fatal_error(data, "IF-DEFINED without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "IF-DEFINED without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } } else if (!_cups_strcasecmp(token, "IF-NOT-DEFINED")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing IF-NOT-DEFINED name on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Missing IF-NOT-DEFINED name on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } @@ -2982,7 +3847,7 @@ parse_monitor_printer_state( } else { - print_fatal_error(data, "IF-NOT-DEFINED without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "IF-NOT-DEFINED without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } } @@ -2994,56 +3859,43 @@ parse_monitor_printer_state( } else { - print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename); + print_fatal_error(data, "%s without a preceding EXPECT on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } } else if (!_cups_strcasecmp(token, "WITH-VALUE")) { - off_t lastpos; /* Last file position */ - int lastline; /* Last line number */ - - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing %s value on line %d of \"%s\".", token, f->linenum, f->filename); + print_fatal_error(data, "Missing %s value on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } - /* - * Read additional comma-delimited values - needed since legacy test files - * will have unquoted WITH-VALUE values with commas... - */ - + // Read additional comma-delimited values - needed since legacy test files + // will have unquoted WITH-VALUE values with commas... ptr = temp + strlen(temp); for (;;) { - lastpos = cupsFileTell(f->fp); - lastline = f->linenum; - ptr += strlen(ptr); + ippFileSavePosition(f); - if (!_ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp)))) + ptr += strlen(ptr); + + if (!ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp)))) break; if (!strcmp(ptr, ",")) { - /* - * Append a value... - */ - + // Append a value... ptr += strlen(ptr); - if (!_ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp)))) + if (!ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp)))) break; } else { - /* - * Not another value, stop here... - */ - - cupsFileSeek(f->fp, lastpos); - f->linenum = lastline; + // Not another value, stop here... + ippFileRestorePosition(f); *ptr = '\0'; break; } @@ -3051,20 +3903,14 @@ parse_monitor_printer_state( if (data->last_expect) { - /* - * Expand any variables in the value and then save it. - */ - - _ippVarsExpand(data->vars, value, temp, sizeof(value)); + // Expand any variables in the value and then save it. + ippFileExpandVars(f, value, temp, sizeof(value)); ptr = value + strlen(value) - 1; if (value[0] == '/' && ptr > value && *ptr == '/') { - /* - * WITH-VALUE is a POSIX extended regular expression. - */ - + // WITH-VALUE is a POSIX extended regular expression. data->last_expect->with_value = calloc(1, (size_t)(ptr - value)); data->last_expect->with_flags |= IPPTOOL_WITH_REGEX; @@ -3073,18 +3919,12 @@ parse_monitor_printer_state( } else { - /* - * WITH-VALUE is a literal value... - */ - + // WITH-VALUE is a literal value... for (ptr = value; *ptr; ptr ++) { if (*ptr == '\\' && ptr[1]) { - /* - * Remove \ from \foo... - */ - + // Remove \ from \foo... _cups_strcpy(ptr, ptr + 1); } } @@ -3095,36 +3935,73 @@ parse_monitor_printer_state( } else { - print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename); + print_fatal_error(data, "%s without a preceding EXPECT on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } } } - print_fatal_error(data, "Missing closing brace on line %d of \"%s\".", f->linenum, f->filename); + print_fatal_error(data, "Missing closing brace on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); return (0); } -/* - * 'pause_message()' - Display the message and pause until the user presses a key. - */ +// +// 'password_cb()' - Password callback using the IPP variables. +// + +const char * // O - Password string or @code NULL@ +password_cb( + const char *prompt, // I - Prompt string (not used) + http_t *http, // I - HTTP connection (not used) + const char *method, // I - HTTP method (not used) + const char *resource, // I - Resource path (not used) + void *user_data) // I - IPP test data +{ + ipptool_test_t *test = (ipptool_test_t *)user_data; + // IPP test data + const char *uriuser = ippFileGetVar(test->parent, "uriuser"), + // Username + *uripassword = ippFileGetVar(test->parent, "uripassword"); + // Password + + + (void)prompt; + (void)http; + (void)method; + (void)resource; + + if (uriuser && uripassword && test->password_tries < 3) + { + test->password_tries ++; + + cupsSetUser(uriuser); + + return (uripassword); + } + else + { + return (NULL); + } +} + + +// +// 'pause_message()' - Display the message and pause until the user presses a key. +// static void -pause_message(const char *message) /* I - Message */ +pause_message(const char *message) // I - Message { #ifdef _WIN32 - HANDLE tty; /* Console handle */ - DWORD mode; /* Console mode */ - char key; /* Key press */ - DWORD bytes; /* Bytes read for key press */ + HANDLE tty; // Console handle + DWORD mode; // Console mode + char key; // Key press + DWORD bytes; // Bytes read for key press - /* - * Disable input echo and set raw input... - */ - + // Disable input echo and set raw input... if ((tty = GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) return; @@ -3135,16 +4012,13 @@ pause_message(const char *message) /* I - Message */ return; #else - int tty; /* /dev/tty - never read from stdin */ - struct termios original, /* Original input mode */ - noecho; /* No echo input mode */ - char key; /* Current key press */ - + int tty; // /dev/tty - never read from stdin + struct termios original, // Original input mode + noecho; // No echo input mode + char key; // Current key press - /* - * Disable input echo and set raw input... - */ + // Disable input echo and set raw input... if ((tty = open("/dev/tty", O_RDONLY)) < 0) return; @@ -3162,63 +4036,45 @@ pause_message(const char *message) /* I - Message */ close(tty); return; } -#endif /* _WIN32 */ - - /* - * Display the prompt... - */ +#endif // _WIN32 + // Display the prompt... cupsFilePrintf(cupsFileStdout(), "\n%s\n\n---- PRESS ANY KEY ----", message); #ifdef _WIN32 - /* - * Read a key... - */ - + // Read a key... ReadFile(tty, &key, 1, &bytes, NULL); - /* - * Cleanup... - */ - + // Cleanup... SetConsoleMode(tty, mode); #else - /* - * Read a key... - */ - + // Read a key... read(tty, &key, 1); - /* - * Cleanup... - */ - + // Cleanup... tcsetattr(tty, TCSAFLUSH, &original); close(tty); -#endif /* _WIN32 */ - - /* - * Erase the "press any key" prompt... - */ +#endif // _WIN32 + // Erase the "press any key" prompt... cupsFilePuts(cupsFileStdout(), "\r \r"); } -/* - * 'print_attr()' - Print an attribute on the screen. - */ +// +// 'print_attr()' - Print an attribute on the screen. +// static void -print_attr(cups_file_t *outfile, /* I - Output file */ - ipptool_output_t output, /* I - Output format */ - ipp_attribute_t *attr, /* I - Attribute to print */ - ipp_tag_t *group) /* IO - Current group */ +print_attr(cups_file_t *outfile, // I - Output file + ipptool_output_t output, // I - Output format + ipp_attribute_t *attr, // I - Attribute to print + ipp_tag_t *group) // IO - Current group { - int i, /* Looping var */ - count; /* Number of values */ - ipp_attribute_t *colattr; /* Collection attribute */ + int i, // Looping var + count; // Number of values + ipp_attribute_t *colattr; // Collection attribute if (output == IPPTOOL_OUTPUT_PLIST) @@ -3258,7 +4114,7 @@ print_attr(cups_file_t *outfile, /* I - Output file */ case IPP_TAG_RANGE : for (i = 0; i < count; i ++) { - int lower, upper; /* Lower and upper ranges */ + int lower, upper; // Lower and upper ranges lower = ippGetRange(attr, i, &upper); cupsFilePrintf(outfile, "lower%dupper%d\n", lower, upper); @@ -3268,8 +4124,8 @@ print_attr(cups_file_t *outfile, /* I - Output file */ case IPP_TAG_RESOLUTION : for (i = 0; i < count; i ++) { - int xres, yres; /* Resolution values */ - ipp_res_t units; /* Resolution units */ + int xres, yres; // Resolution values + ipp_res_t units; // Resolution units xres = ippGetResolution(attr, i, &yres, &units); cupsFilePrintf(outfile, "xres%dyres%dunits%s\n", xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); @@ -3284,13 +4140,13 @@ print_attr(cups_file_t *outfile, /* I - Output file */ case IPP_TAG_STRING : for (i = 0; i < count; i ++) { - int datalen; /* Length of data */ + int datalen; // Length of data void *data = ippGetOctetString(attr, i, &datalen); - /* Data */ + // Data char buffer[IPP_MAX_LENGTH * 5 / 4 + 1]; - /* Base64 output buffer */ + // Base64 output buffer - cupsFilePrintf(outfile, "%s\n", httpEncode64_2(buffer, sizeof(buffer), data, datalen)); + cupsFilePrintf(outfile, "%s\n", httpEncode64_3(buffer, sizeof(buffer), data, (size_t)datalen, false)); } break; @@ -3310,8 +4166,8 @@ print_attr(cups_file_t *outfile, /* I - Output file */ case IPP_TAG_NAMELANG : for (i = 0; i < count; i ++) { - const char *s, /* String */ - *lang; /* Language */ + const char *s, // String + *lang; // Language s = ippGetString(attr, i, &lang); cupsFilePuts(outfile, "language"); @@ -3326,10 +4182,10 @@ print_attr(cups_file_t *outfile, /* I - Output file */ for (i = 0; i < count; i ++) { ipp_t *col = ippGetCollection(attr, i); - /* Collection value */ + // Collection value cupsFilePuts(outfile, "\n"); - for (colattr = ippFirstAttribute(col); colattr; colattr = ippNextAttribute(col)) + for (colattr = ippGetFirstAttribute(col); colattr; colattr = ippGetNextAttribute(col)) print_attr(outfile, output, colattr, NULL); cupsFilePuts(outfile, "\n"); } @@ -3345,7 +4201,15 @@ print_attr(cups_file_t *outfile, /* I - Output file */ } else { - char buffer[131072]; /* Value buffer */ + size_t attrsize; // Size of current attribute + static char *buffer = NULL; // Value buffer + static size_t bufsize = 0; // Current size of value buffer + + if (!buffer) + { + bufsize = 65536; + buffer = malloc(bufsize); + } if (output == IPPTOOL_OUTPUT_TEST) { @@ -3358,51 +4222,61 @@ print_attr(cups_file_t *outfile, /* I - Output file */ cupsFilePrintf(outfile, " %s (%s%s) = ", ippGetName(attr), ippGetCount(attr) > 1 ? "1setOf " : "", ippTagString(ippGetValueTag(attr))); } - ippAttributeString(attr, buffer, sizeof(buffer)); + if ((attrsize = ippAttributeString(attr, buffer, bufsize)) >= bufsize) + { + // Expand attribute value buffer... + char *temp = realloc(buffer, attrsize + 1); + // New buffer pointer + + if (temp) + { + buffer = temp; + bufsize = attrsize + 1; + + ippAttributeString(attr, buffer, bufsize); + } + + } cupsFilePrintf(outfile, "%s\n", buffer); } } -/* - * 'print_csv()' - Print a line of CSV text. - */ +// +// 'print_csv()' - Print a line of CSV text. +// -static ipp_attribute_t * /* O - Next attribute */ +static ipp_attribute_t * // O - Next attribute print_csv( - ipptool_test_t *data, /* I - Test data */ - ipp_t *ipp, /* I - Response message */ - ipp_attribute_t *attr, /* I - First attribute for line */ - int num_displayed, /* I - Number of attributes to display */ - char **displayed, /* I - Attributes to display */ - size_t *widths) /* I - Column widths */ + ipptool_test_t *data, // I - Test data + ipp_t *ipp, // I - Response message + ipp_attribute_t *attr, // I - First attribute for line + int num_displayed, // I - Number of attributes to display + char **displayed, // I - Attributes to display + int *widths) // I - Column widths { - int i; /* Looping var */ - size_t maxlength; /* Max length of all columns */ - ipp_attribute_t *current = attr; /* Current attribute */ - char *values[MAX_DISPLAY], /* Strings to display */ - *valptr; /* Pointer into value */ - - /* - * Get the maximum string length we have to show and allocate... - */ + int i; // Looping var + int maxlength; // Max length of all columns + ipp_attribute_t *current = attr; // Current attribute + char *values[MAX_DISPLAY], // Strings to display + *valptr; // Pointer into value + // Get the maximum string length we have to show and allocate... for (i = 1, maxlength = widths[0]; i < num_displayed; i ++) + { if (widths[i] > maxlength) maxlength = widths[i]; + } maxlength += 2; - /* - * Loop through the attributes to display... - */ - + // Loop through the attributes to display... if (attr) { // Collect the values... memset(values, 0, sizeof(values)); - for (; current; current = ippNextAttribute(ipp)) + for (; current; current = ippGetNextAttribute(ipp)) { if (!ippGetName(current)) break; @@ -3411,8 +4285,8 @@ print_csv( { if (!strcmp(ippGetName(current), displayed[i])) { - if ((values[i] = (char *)calloc(1, maxlength)) != NULL) - ippAttributeString(current, values[i], maxlength); + if ((values[i] = (char *)calloc(1, (size_t)maxlength)) != NULL) + ippAttributeString(current, values[i], (size_t)maxlength); break; } } @@ -3466,32 +4340,26 @@ print_csv( } -/* - * 'print_fatal_error()' - Print a fatal error message. - */ +// +// 'print_fatal_error()' - Print a fatal error message. +// static void print_fatal_error( - ipptool_test_t *data, /* I - Test data */ - const char *s, /* I - Printf-style format string */ - ...) /* I - Additional arguments as needed */ + ipptool_test_t *data, // I - Test data + const char *s, // I - Printf-style format string + ...) // I - Additional arguments as needed { - char buffer[10240]; /* Format buffer */ - va_list ap; /* Pointer to arguments */ + char buffer[10240]; // Format buffer + va_list ap; // Pointer to arguments - /* - * Format the error message... - */ - + // Format the error message... va_start(ap, s); vsnprintf(buffer, sizeof(buffer), s, ap); va_end(ap); - /* - * Then output it... - */ - + // Then output it... if (data->output == IPPTOOL_OUTPUT_PLIST) { print_xml_header(data); @@ -3502,20 +4370,20 @@ print_fatal_error( } -/* - * 'print_ippserver_attr()' - Print an attribute suitable for use by ippserver. - */ +// +// 'print_ippserver_attr()' - Print a attribute suitable for use by ippserver. +// static void print_ippserver_attr( - ipptool_test_t *data, /* I - Test data */ - ipp_attribute_t *attr, /* I - Attribute to print */ - int indent) /* I - Indentation level */ + ipptool_test_t *data, // I - Test data + ipp_attribute_t *attr, // I - Attribute to print + int indent) // I - Indentation level { - int i, /* Looping var */ + int i, // Looping var count = ippGetCount(attr); - /* Number of values */ - ipp_attribute_t *colattr; /* Collection attribute */ + // Number of values + ipp_attribute_t *colattr; // Collection attribute if (indent == 0) @@ -3598,14 +4466,14 @@ print_ippserver_attr( ipp_t *col = ippGetCollection(attr, i); cupsFilePuts(data->outfile, i ? ",{\n" : " {\n"); - for (colattr = ippFirstAttribute(col); colattr; colattr = ippNextAttribute(col)) + for (colattr = ippGetFirstAttribute(col); colattr; colattr = ippGetNextAttribute(col)) print_ippserver_attr(data, colattr, indent + 4); cupsFilePrintf(data->outfile, "%*s}", indent, ""); } break; default : - /* Out-of-band value */ + // Out-of-band value break; } @@ -3613,15 +4481,15 @@ print_ippserver_attr( } -/* - * 'print_ippserver_string()' - Print a string suitable for use by ippserver. - */ +// +// 'print_ippserver_string()' - Print a string suitable for use by ippserver. +// static void print_ippserver_string( - ipptool_test_t *data, /* I - Test data */ - const char *s, /* I - String to print */ - size_t len) /* I - Length of string */ + ipptool_test_t *data, // I - Test data + const char *s, // I - String to print + size_t len) // I - Length of string { cupsFilePutChar(data->outfile, '\"'); while (len > 0) @@ -3637,22 +4505,22 @@ print_ippserver_string( } -/* - * 'print_json_attr()' - Print an attribute in JSON format. - */ +// +// 'print_json_attr()' - Print an attribute in JSON format. +// static void print_json_attr( - ipptool_test_t *data, /* I - Test data */ - ipp_attribute_t *attr, /* I - IPP attribute */ - int indent) /* I - Indentation */ + ipptool_test_t *data, // I - Test data + ipp_attribute_t *attr, // I - IPP attribute + int indent) // I - Indentation { const char *name = ippGetName(attr); - /* Name of attribute */ - int i, /* Looping var */ + // Name of attribute + int i, // Looping var count = ippGetCount(attr); - /* Number of values */ - ipp_attribute_t *colattr; /* Collection attribute */ + // Number of values + ipp_attribute_t *colattr; // Collection attribute cupsFilePrintf(data->outfile, "%*s", indent, ""); @@ -3817,11 +4685,11 @@ print_json_attr( ipp_t *col = ippGetCollection(attr, 0); cupsFilePuts(data->outfile, ": {\n"); - colattr = ippFirstAttribute(col); + colattr = ippGetFirstAttribute(col); while (colattr) { print_json_attr(data, colattr, indent + 4); - colattr = ippNextAttribute(col); + colattr = ippGetNextAttribute(col); cupsFilePuts(data->outfile, colattr ? ",\n" : "\n"); } cupsFilePrintf(data->outfile, "%*s}", indent, ""); @@ -3834,11 +4702,11 @@ print_json_attr( ipp_t *col = ippGetCollection(attr, i); cupsFilePrintf(data->outfile, "%*s{\n", indent + 4, ""); - colattr = ippFirstAttribute(col); + colattr = ippGetFirstAttribute(col); while (colattr) { print_json_attr(data, colattr, indent + 8); - colattr = ippNextAttribute(col); + colattr = ippGetNextAttribute(col); cupsFilePuts(data->outfile, colattr ? ",\n" : "\n"); } cupsFilePrintf(data->outfile, "%*s}%s", indent + 4, "", (i + 1) < count ? ",\n" : "\n"); @@ -3848,22 +4716,22 @@ print_json_attr( break; default : - /* Out-of-band value */ - cupsFilePrintf(data->outfile, ": null"); + // Out-of-band value + cupsFilePrintf(data->outfile, ": null"); break; } } -/* - * 'print_json_string()' - Print a string in JSON format. - */ +// +// 'print_json_string()' - Print a string in JSON format. +// static void print_json_string( - ipptool_test_t *data, /* I - Test data */ - const char *s, /* I - String to print */ - size_t len) /* I - Length of string */ + ipptool_test_t *data, // I - Test data + const char *s, // I - String to print + size_t len) // I - Length of string { cupsFilePutChar(data->outfile, '\"'); while (len > 0) @@ -3903,45 +4771,41 @@ print_json_string( } -/* - * 'print_line()' - Print a line of formatted or CSV text. - */ +// +// 'print_line()' - Print a line of formatted or CSV text. +// -static ipp_attribute_t * /* O - Next attribute */ +static ipp_attribute_t * // O - Next attribute print_line( - ipptool_test_t *data, /* I - Test data */ - ipp_t *ipp, /* I - Response message */ - ipp_attribute_t *attr, /* I - First attribute for line */ - int num_displayed, /* I - Number of attributes to display */ - char **displayed, /* I - Attributes to display */ - size_t *widths) /* I - Column widths */ + ipptool_test_t *data, // I - Test data + ipp_t *ipp, // I - Response message + ipp_attribute_t *attr, // I - First attribute for line + int num_displayed, // I - Number of attributes to display + char **displayed, // I - Attributes to display + int *widths) // I - Column widths { - int i; /* Looping var */ - size_t maxlength; /* Max length of all columns */ - ipp_attribute_t *current = attr; /* Current attribute */ - char *values[MAX_DISPLAY]; /* Strings to display */ - + int i; // Looping var + int maxlength; // Max length of all columns + ipp_attribute_t *current = attr; // Current attribute + char *values[MAX_DISPLAY]; // Strings to display - /* - * Get the maximum string length we have to show and allocate... - */ + // Get the maximum string length we have to show and allocate... for (i = 1, maxlength = widths[0]; i < num_displayed; i ++) + { if (widths[i] > maxlength) maxlength = widths[i]; + } maxlength += 2; - /* - * Loop through the attributes to display... - */ - + // Loop through the attributes to display... if (attr) { // Collect the values... memset(values, 0, sizeof(values)); - for (; current; current = ippNextAttribute(ipp)) + for (; current; current = ippGetNextAttribute(ipp)) { if (!ippGetName(current)) break; @@ -3950,8 +4814,8 @@ print_line( { if (!strcmp(ippGetName(current), displayed[i])) { - if ((values[i] = (char *)calloc(1, maxlength)) != NULL) - ippAttributeString(current, values[i], maxlength); + if ((values[i] = (char *)calloc(1, (size_t)maxlength)) != NULL) + ippAttributeString(current, values[i], (size_t)maxlength); break; } } @@ -3971,7 +4835,7 @@ print_line( else { // Show column headings... - char *buffer = (char *)malloc(maxlength); + char *buffer = (char *)malloc((size_t)maxlength); // Buffer for separator lines if (!buffer) @@ -4003,12 +4867,12 @@ print_line( } -/* - * 'print_xml_header()' - Print a standard XML plist header. - */ +// +// 'print_xml_header()' - Print a standard XML plist header. +// static void -print_xml_header(ipptool_test_t *data)/* I - Test data */ +print_xml_header(ipptool_test_t *data)// I - Test data { if (!data->xml_header) { @@ -4028,14 +4892,14 @@ print_xml_header(ipptool_test_t *data)/* I - Test data */ } -/* - * 'print_xml_string()' - Print an XML string with escaping. - */ +// +// 'print_xml_string()' - Print an XML string with escaping. +// static void -print_xml_string(cups_file_t *outfile, /* I - Test data */ - const char *element, /* I - Element name or NULL */ - const char *s) /* I - String to print */ +print_xml_string(cups_file_t *outfile, // I - Test data + const char *element, // I - Element name or NULL + const char *s) // I - String to print { if (element) cupsFilePrintf(outfile, "<%s>", element); @@ -4043,17 +4907,20 @@ print_xml_string(cups_file_t *outfile, /* I - Test data */ while (*s) { if (*s == '&') + { cupsFilePuts(outfile, "&"); + } else if (*s == '<') + { cupsFilePuts(outfile, "<"); + } else if (*s == '>') + { cupsFilePuts(outfile, ">"); + } else if ((*s & 0xe0) == 0xc0) { - /* - * Validate UTF-8 two-byte sequence... - */ - + // Validate UTF-8 two-byte sequence... if ((s[1] & 0xc0) != 0x80) { cupsFilePutChar(outfile, '?'); @@ -4067,10 +4934,7 @@ print_xml_string(cups_file_t *outfile, /* I - Test data */ } else if ((*s & 0xf0) == 0xe0) { - /* - * Validate UTF-8 three-byte sequence... - */ - + // Validate UTF-8 three-byte sequence... if ((s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80) { cupsFilePutChar(outfile, '?'); @@ -4085,12 +4949,8 @@ print_xml_string(cups_file_t *outfile, /* I - Test data */ } else if ((*s & 0xf8) == 0xf0) { - /* - * Validate UTF-8 four-byte sequence... - */ - - if ((s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80 || - (s[3] & 0xc0) != 0x80) + // Validate UTF-8 four-byte sequence... + if ((s[1] & 0xc0) != 0x80 || (s[2] & 0xc0) != 0x80 || (s[3] & 0xc0) != 0x80) { cupsFilePutChar(outfile, '?'); s += 3; @@ -4105,14 +4965,13 @@ print_xml_string(cups_file_t *outfile, /* I - Test data */ } else if ((*s & 0x80) || (*s < ' ' && !isspace(*s & 255))) { - /* - * Invalid control character... - */ - + // Invalid control character... cupsFilePutChar(outfile, '?'); } else + { cupsFilePutChar(outfile, *s); + } s ++; } @@ -4122,15 +4981,15 @@ print_xml_string(cups_file_t *outfile, /* I - Test data */ } -/* - * 'print_xml_trailer()' - Print the XML trailer with success/fail value. - */ +// +// 'print_xml_trailer()' - Print the XML trailer with success/fail value. +// static void print_xml_trailer( - ipptool_test_t *data, /* I - Test data */ - int success, /* I - 1 on success, 0 on failure */ - const char *message) /* I - Error message or NULL */ + ipptool_test_t *data, // I - Test data + int success, // I - 1 on success, 0 on failure + const char *message) // I - Error message or NULL { if (data->xml_header) { @@ -4151,90 +5010,78 @@ print_xml_trailer( #ifndef _WIN32 -/* - * 'sigterm_handler()' - Handle SIGINT and SIGTERM. - */ +// +// 'sigterm_handler()' - Handle SIGINT and SIGTERM. +// static void -sigterm_handler(int sig) /* I - Signal number (unused) */ +sigterm_handler(int sig) // I - Signal number (unused) { (void)sig; - Cancel = 1; + Cancel = true; signal(SIGINT, SIG_DFL); signal(SIGTERM, SIG_DFL); } -#endif /* !_WIN32 */ +#endif // !_WIN32 -/* - * 'timeout_cb()' - Handle HTTP timeouts. - */ +// +// 'timeout_cb()' - Handle HTTP timeouts. +// -static int /* O - 1 to continue, 0 to cancel */ -timeout_cb(http_t *http, /* I - Connection to server */ - void *user_data) /* I - User data (unused) */ +static int // O - 1 to continue, 0 to cancel +timeout_cb(http_t *http, // I - Connection to server + void *user_data) // I - User data (unused) { - int buffered = 0; /* Bytes buffered but not yet sent */ + int buffered = 0; // Bytes buffered but not yet sent (void)user_data; - /* - * If the socket still have data waiting to be sent to the printer (as can - * happen if the printer runs out of paper), continue to wait until the output - * buffer is empty... - */ - -#ifdef SO_NWRITE /* macOS and some versions of Linux */ - socklen_t len = sizeof(buffered); /* Size of return value */ + // If the socket still have data waiting to be sent to the printer (as can + // happen if the printer runs out of paper), continue to wait until the output + // buffer is empty... +#ifdef SO_NWRITE // macOS and some versions of Linux + socklen_t len = sizeof(buffered); // Size of return value if (getsockopt(httpGetFd(http), SOL_SOCKET, SO_NWRITE, &buffered, &len)) buffered = 0; -#elif defined(SIOCOUTQ) /* Others except Windows */ +#elif defined(SIOCOUTQ) // Others except Windows if (ioctl(httpGetFd(http), SIOCOUTQ, &buffered)) buffered = 0; -#else /* Windows (not possible) */ +#else // Windows (not possible) (void)http; -#endif /* SO_NWRITE */ +#endif // SO_NWRITE return (buffered > 0); } -/* - * 'token_cb()' - Parse test file-specific tokens and run tests. - */ +// +// 'token_cb()' - Parse test file-specific tokens and run tests. +// -static int /* O - 1 to continue, 0 to stop */ -token_cb(_ipp_file_t *f, /* I - IPP file data */ - _ipp_vars_t *vars, /* I - IPP variables */ - ipptool_test_t *data, /* I - Test data */ - const char *token) /* I - Current token */ +static bool // O - `true` to continue, `false` to stop +token_cb(ipp_file_t *f, // I - IPP file data + ipptool_test_t *data, // I - Test data + const char *token) // I - Current token { - char name[1024], /* Name string */ - temp[1024], /* Temporary string */ - value[1024], /* Value string */ - *ptr; /* Pointer into value */ + char name[1024], // Name string + temp[1024], // Temporary string + value[1024], // Value string + *ptr; // Pointer into value - if (!token) - { - /* - * Initialize state as needed (nothing for now...) - */ + if (getenv("IPPTOOL_DEBUG")) + fprintf(stderr, "ipptool: token='%s'\n", token); - return (1); - } - else if (f->attrs) + if (ippFileGetAttributes(f)) { - /* - * Parse until we see a close brace... - */ - + // Parse until we see a close brace... if (_cups_strcasecmp(token, "COUNT") && _cups_strcasecmp(token, "DEFINE-MATCH") && _cups_strcasecmp(token, "DEFINE-NO-MATCH") && @@ -4248,12 +5095,19 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ _cups_strcasecmp(token, "REPEAT-MATCH") && _cups_strcasecmp(token, "REPEAT-NO-MATCH") && _cups_strcasecmp(token, "SAME-COUNT-AS") && + _cups_strcasecmp(token, "SAVE-ALL-CONTENT") && + _cups_strcasecmp(token, "SAVE-CONTENT") && + _cups_strcasecmp(token, "WITH-ALL-CONTENT") && + _cups_strcasecmp(token, "WITH-ALL-MIME-TYPES") && _cups_strcasecmp(token, "WITH-ALL-VALUES") && + _cups_strcasecmp(token, "WITH-ALL-VALUES-FROM") && _cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") && _cups_strcasecmp(token, "WITH-ALL-RESOURCES") && _cups_strcasecmp(token, "WITH-ALL-SCHEMES") && + _cups_strcasecmp(token, "WITH-CONTENT") && _cups_strcasecmp(token, "WITH-DISTINCT-VALUES") && _cups_strcasecmp(token, "WITH-HOSTNAME") && + _cups_strcasecmp(token, "WITH-MIME-TYPES") && _cups_strcasecmp(token, "WITH-RESOURCE") && _cups_strcasecmp(token, "WITH-SCHEME") && _cups_strcasecmp(token, "WITH-VALUE") && @@ -4273,36 +5127,43 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ { return (do_test(f, data)); } + else if (!strcmp(token, "GENERATE-FILE")) + { + if (data->generate_params) + { + print_fatal_error(data, "Extra GENERATE-FILE seen on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); + } + else if (data->file[0]) + { + print_fatal_error(data, "Cannot use GENERATE-FILE on line %d of '%s' with FILE.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); + } + + return (parse_generate_file(f, data)); + } else if (!strcmp(token, "MONITOR-PRINTER-STATE")) { if (data->monitor_uri) { - print_fatal_error(data, "Extra MONITOR-PRINTER-STATE seen on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Extra MONITOR-PRINTER-STATE seen on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } return (parse_monitor_printer_state(f, data)); } else if (!strcmp(token, "COMPRESSION")) { - /* - * COMPRESSION none - * COMPRESSION deflate - * COMPRESSION gzip - */ - - if (_ippFileReadToken(f, temp, sizeof(temp))) + // COMPRESSION none + // COMPRESSION deflate + // COMPRESSION gzip + if (ippFileReadToken(f, temp, sizeof(temp))) { - _ippVarsExpand(vars, data->compression, temp, sizeof(data->compression)); -#ifdef HAVE_LIBZ - if (strcmp(data->compression, "none") && strcmp(data->compression, "deflate") && - strcmp(data->compression, "gzip")) -#else - if (strcmp(data->compression, "none")) -#endif /* HAVE_LIBZ */ + ippFileExpandVars(f, data->compression, temp, sizeof(data->compression)); + if (strcmp(data->compression, "none") && strcmp(data->compression, "deflate") && strcmp(data->compression, "gzip")) { - print_fatal_error(data, "Unsupported COMPRESSION value \"%s\" on line %d of \"%s\".", data->compression, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Unsupported COMPRESSION value \"%s\" on line %d of '%s'.", data->compression, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } if (!strcmp(data->compression, "none")) @@ -4310,84 +5171,69 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "Missing COMPRESSION value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing COMPRESSION value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "DEFINE")) { - /* - * DEFINE name value - */ - - if (_ippFileReadToken(f, name, sizeof(name)) && _ippFileReadToken(f, temp, sizeof(temp))) + // DEFINE name value + if (ippFileReadToken(f, name, sizeof(name)) && ippFileReadToken(f, temp, sizeof(temp))) { - _ippVarsExpand(vars, value, temp, sizeof(value)); - _ippVarsSet(vars, name, value); + ippFileExpandVars(f, value, temp, sizeof(value)); + ippFileSetVar(f, name, value); } else { - print_fatal_error(data, "Missing DEFINE name and/or value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing DEFINE name and/or value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "IGNORE-ERRORS")) { - /* - * IGNORE-ERRORS yes - * IGNORE-ERRORS no - */ - - if (_ippFileReadToken(f, temp, sizeof(temp)) && (!_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "no"))) + // IGNORE-ERRORS yes + // IGNORE-ERRORS no + if (ippFileReadToken(f, temp, sizeof(temp)) && (!_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "no"))) { data->ignore_errors = !_cups_strcasecmp(temp, "yes"); } else { - print_fatal_error(data, "Missing IGNORE-ERRORS value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing IGNORE-ERRORS value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "NAME")) { - /* - * Name of test... - */ - - if (_ippFileReadToken(f, temp, sizeof(temp))) + // Name of test... + if (ippFileReadToken(f, temp, sizeof(temp))) { - _ippVarsExpand(vars, data->name, temp, sizeof(data->name)); + ippFileExpandVars(f, data->name, temp, sizeof(data->name)); } else { - print_fatal_error(data, "Missing NAME string on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing NAME string on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "PAUSE")) { - /* - * Pause with a message... - */ - - if (_ippFileReadToken(f, temp, sizeof(temp))) + // Pause with a message... + if (ippFileReadToken(f, temp, sizeof(temp))) { cupsCopyString(data->pause, temp, sizeof(data->pause)); } else { - print_fatal_error(data, "Missing PAUSE message on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing PAUSE message on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "REQUEST-ID")) { - /* - * REQUEST-ID # - * REQUEST-ID random - */ - - if (_ippFileReadToken(f, temp, sizeof(temp))) + // REQUEST-ID # + // REQUEST-ID random + if (ippFileReadToken(f, temp, sizeof(temp))) { if (isdigit(temp[0] & 255)) { @@ -4395,152 +5241,128 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else if (!_cups_strcasecmp(temp, "random")) { - data->request_id = (CUPS_RAND() % 1000) * 137; + data->request_id = (cupsGetRand() % 1000) * 137; } else { - print_fatal_error(data, "Bad REQUEST-ID value \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Bad REQUEST-ID value \"%s\" on line %d of '%s'.", temp, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else { - print_fatal_error(data, "Missing REQUEST-ID value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing REQUEST-ID value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "PASS-IF-DEFINED")) { - /* - * PASS-IF-DEFINED variable - */ - - if (_ippFileReadToken(f, name, sizeof(name))) + // PASS-IF-DEFINED variable + if (ippFileReadToken(f, name, sizeof(name))) { - if (_ippVarsGet(vars, name)) + if (ippFileGetVar(f, name)) data->pass_test = 1; } else { - print_fatal_error(data, "Missing PASS-IF-DEFINED value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing PASS-IF-DEFINED value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "PASS-IF-NOT-DEFINED")) { - /* - * PASS-IF-NOT-DEFINED variable - */ - - if (_ippFileReadToken(f, name, sizeof(name))) + // PASS-IF-NOT-DEFINED variable + if (ippFileReadToken(f, name, sizeof(name))) { - if (!_ippVarsGet(vars, name)) + if (!ippFileGetVar(f, name)) data->pass_test = 1; } else { - print_fatal_error(data, "Missing PASS-IF-NOT-DEFINED value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing PASS-IF-NOT-DEFINED value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "SKIP-IF-DEFINED")) { - /* - * SKIP-IF-DEFINED variable - */ - - if (_ippFileReadToken(f, name, sizeof(name))) + // SKIP-IF-DEFINED variable + if (ippFileReadToken(f, name, sizeof(name))) { - if (_ippVarsGet(vars, name)) - data->skip_test = 1; + if (ippFileGetVar(f, name) || getenv(name)) + data->skip_test = true; } else { - print_fatal_error(data, "Missing SKIP-IF-DEFINED value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing SKIP-IF-DEFINED value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "SKIP-IF-MISSING")) { - /* - * SKIP-IF-MISSING filename - */ - - if (_ippFileReadToken(f, temp, sizeof(temp))) + // SKIP-IF-MISSING filename + if (ippFileReadToken(f, temp, sizeof(temp))) { - char filename[1024]; /* Filename */ + char filename[1024]; // Filename - _ippVarsExpand(vars, value, temp, sizeof(value)); - get_filename(f->filename, filename, temp, sizeof(filename)); + ippFileExpandVars(f, value, temp, sizeof(value)); + get_filename(ippFileGetFilename(f), filename, temp, sizeof(filename)); if (access(filename, R_OK)) - data->skip_test = 1; + data->skip_test = true; } else { - print_fatal_error(data, "Missing SKIP-IF-MISSING filename on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing SKIP-IF-MISSING filename on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "SKIP-IF-NOT-DEFINED")) { - /* - * SKIP-IF-NOT-DEFINED variable - */ - - if (_ippFileReadToken(f, name, sizeof(name))) + // SKIP-IF-NOT-DEFINED variable + if (ippFileReadToken(f, name, sizeof(name))) { - if (!_ippVarsGet(vars, name)) - data->skip_test = 1; + if (!ippFileGetVar(f, name) && !getenv(name)) + data->skip_test = true; } else { - print_fatal_error(data, "Missing SKIP-IF-NOT-DEFINED value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing SKIP-IF-NOT-DEFINED value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "SKIP-PREVIOUS-ERROR")) { - /* - * SKIP-PREVIOUS-ERROR yes - * SKIP-PREVIOUS-ERROR no - */ - - if (_ippFileReadToken(f, temp, sizeof(temp)) && (!_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "no"))) + // SKIP-PREVIOUS-ERROR yes + // SKIP-PREVIOUS-ERROR no + if (ippFileReadToken(f, temp, sizeof(temp)) && (!_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "no"))) { data->skip_previous = !_cups_strcasecmp(temp, "yes"); } else { - print_fatal_error(data, "Missing SKIP-PREVIOUS-ERROR value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing SKIP-PREVIOUS-ERROR value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "TEST-ID")) { - /* - * TEST-ID "string" - */ - - if (_ippFileReadToken(f, temp, sizeof(temp))) + // TEST-ID "string" + if (ippFileReadToken(f, temp, sizeof(temp))) { - _ippVarsExpand(vars, data->test_id, temp, sizeof(data->test_id)); + ippFileExpandVars(f, data->test_id, temp, sizeof(data->test_id)); } else { - print_fatal_error(data, "Missing TEST-ID value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing TEST-ID value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "TRANSFER")) { - /* - * TRANSFER auto - * TRANSFER chunked - * TRANSFER length - */ - - if (_ippFileReadToken(f, temp, sizeof(temp))) + // TRANSFER auto + // TRANSFER chunked + // TRANSFER length + if (ippFileReadToken(f, temp, sizeof(temp))) { if (!strcmp(temp, "auto")) { @@ -4556,19 +5378,19 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "Bad TRANSFER value \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Bad TRANSFER value \"%s\" on line %d of '%s'.", temp, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else { - print_fatal_error(data, "Missing TRANSFER value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing TRANSFER value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "VERSION")) { - if (_ippFileReadToken(f, temp, sizeof(temp))) + if (ippFileReadToken(f, temp, sizeof(temp))) { if (!strcmp(temp, "0.0")) { @@ -4596,97 +5418,63 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "Bad VERSION \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Bad VERSION \"%s\" on line %d of '%s'.", temp, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else { - print_fatal_error(data, "Missing VERSION number on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing VERSION number on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "RESOURCE")) { - /* - * Resource name... - */ - - if (!_ippFileReadToken(f, data->resource, sizeof(data->resource))) + // Resource name... + if (!ippFileReadToken(f, data->resource, sizeof(data->resource))) { - print_fatal_error(data, "Missing RESOURCE path on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing RESOURCE path on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "OPERATION")) { - /* - * Operation... - */ - - ipp_op_t op; /* Operation code */ + // Operation... + ipp_op_t op; // Operation code - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing OPERATION code on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing OPERATION code on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } - _ippVarsExpand(vars, value, temp, sizeof(value)); + ippFileExpandVars(f, value, temp, sizeof(value)); if ((op = ippOpValue(value)) == (ipp_op_t)-1 && (op = (ipp_op_t)strtol(value, NULL, 0)) == 0) { - print_fatal_error(data, "Bad OPERATION code \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); - return (0); - } - - ippSetOperation(f->attrs, op); - } - else if (!_cups_strcasecmp(token, "GROUP")) - { - /* - * Attribute group... - */ - - ipp_tag_t group_tag; /* Group tag */ - - if (!_ippFileReadToken(f, temp, sizeof(temp))) - { - print_fatal_error(data, "Missing GROUP tag on line %d of \"%s\".", f->linenum, f->filename); - return (0); - } - - if ((group_tag = ippTagValue(temp)) == IPP_TAG_ZERO || group_tag >= IPP_TAG_UNSUPPORTED_VALUE) - { - print_fatal_error(data, "Bad GROUP tag \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Bad OPERATION code \"%s\" on line %d of '%s'.", temp, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } - if (group_tag == f->group_tag) - ippAddSeparator(f->attrs); - - f->group_tag = group_tag; + data->op = op; } else if (!_cups_strcasecmp(token, "DELAY")) { - /* - * Delay before operation... - */ - - double dval; /* Delay value */ + // Delay before operation... + double dval; // Delay value - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing DELAY value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing DELAY value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } - _ippVarsExpand(vars, value, temp, sizeof(value)); + ippFileExpandVars(f, value, temp, sizeof(value)); if ((dval = _cupsStrScand(value, &ptr, localeconv())) < 0.0 || (*ptr && *ptr != ',')) { - print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of '%s'.", value, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } data->delay = (useconds_t)(1000000.0 * dval); @@ -4695,58 +5483,65 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ { if ((dval = _cupsStrScand(ptr + 1, &ptr, localeconv())) <= 0.0 || *ptr) { - print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of \"%s\".", value, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Bad DELAY value \"%s\" on line %d of '%s'.", value, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } data->repeat_interval = (useconds_t)(1000000.0 * dval); } else + { data->repeat_interval = data->delay; + } } else if (!_cups_strcasecmp(token, "FILE")) { - /* - * File... - */ + // File... + if (data->file[0]) + { + print_fatal_error(data, "Extra FILE seen on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); + } + else if (data->generate_params) + { + print_fatal_error(data, "Cannot use FILE on line %d of '%s' with GENERATE-FILE.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); + } - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing FILE filename on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing FILE filename on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } - _ippVarsExpand(vars, value, temp, sizeof(value)); - get_filename(f->filename, data->file, value, sizeof(data->file)); + ippFileExpandVars(f, value, temp, sizeof(value)); + get_filename(ippFileGetFilename(f), data->file, value, sizeof(data->file)); if (access(data->file, R_OK)) { - print_fatal_error(data, "Filename \"%s\" (mapped to \"%s\") on line %d of \"%s\" cannot be read.", value, data->file, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Filename \"%s\" (mapped to \"%s\") on line %d of '%s' cannot be read.", value, data->file, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "STATUS")) { - /* - * Status... - */ - + // Status... if (data->num_statuses >= (int)(sizeof(data->statuses) / sizeof(data->statuses[0]))) { - print_fatal_error(data, "Too many STATUS's on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Too many STATUS's on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing STATUS code on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing STATUS code on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } if ((data->statuses[data->num_statuses].status = ippErrorValue(temp)) == (ipp_status_t)-1 && (data->statuses[data->num_statuses].status = (ipp_status_t)strtol(temp, NULL, 0)) == 0) { - print_fatal_error(data, "Bad STATUS code \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Bad STATUS code \"%s\" on line %d of '%s'.", temp, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } data->last_status = data->statuses + data->num_statuses; @@ -4762,22 +5557,19 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else if (!_cups_strcasecmp(token, "EXPECT") || !_cups_strcasecmp(token, "EXPECT-ALL")) { - /* - * Expected attributes... - */ - + // Expected attributes... int expect_all = !_cups_strcasecmp(token, "EXPECT-ALL"); if (data->num_expects >= (int)(sizeof(data->expects) / sizeof(data->expects[0]))) { - print_fatal_error(data, "Too many EXPECT's on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Too many EXPECT's on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } - if (!_ippFileReadToken(f, name, sizeof(name))) + if (!ippFileReadToken(f, name, sizeof(name))) { - print_fatal_error(data, "Missing EXPECT name on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing EXPECT name on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } data->last_expect = data->expects + data->num_expects; @@ -4802,18 +5594,18 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else if (!_cups_strcasecmp(token, "COUNT")) { - int count; /* Count value */ + int count; // Count value - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing COUNT number on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing COUNT number on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } - if ((count = atoi(temp)) <= 0) + if ((count = strtol(temp, NULL, 10)) > INT_MAX) { - print_fatal_error(data, "Bad COUNT \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Bad COUNT \"%s\" on line %d of '%s'.", temp, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } if (data->last_expect) @@ -4822,16 +5614,16 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "COUNT without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "COUNT without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "DEFINE-MATCH")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing DEFINE-MATCH variable on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing DEFINE-MATCH variable on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } if (data->last_expect) @@ -4844,16 +5636,16 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "DEFINE-MATCH without a preceding EXPECT or STATUS on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "DEFINE-MATCH without a preceding EXPECT or STATUS on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "DEFINE-NO-MATCH")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing DEFINE-NO-MATCH variable on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing DEFINE-NO-MATCH variable on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } if (data->last_expect) @@ -4866,16 +5658,16 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "DEFINE-NO-MATCH without a preceding EXPECT or STATUS on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "DEFINE-NO-MATCH without a preceding EXPECT or STATUS on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "DEFINE-VALUE")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing DEFINE-VALUE variable on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing DEFINE-VALUE variable on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } if (data->last_expect) @@ -4884,16 +5676,16 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "DEFINE-VALUE without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "DEFINE-VALUE without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "DISPLAY-MATCH")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing DISPLAY-MATCH mesaage on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing DISPLAY-MATCH mesaage on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } if (data->last_expect) @@ -4902,16 +5694,16 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "DISPLAY-MATCH without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "DISPLAY-MATCH without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "OF-TYPE")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing OF-TYPE value tag(s) on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing OF-TYPE value tag(s) on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } if (data->last_expect) @@ -4920,24 +5712,24 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "OF-TYPE without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "OF-TYPE without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "IN-GROUP")) { - ipp_tag_t in_group; /* IN-GROUP value */ + ipp_tag_t in_group; // IN-GROUP value - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing IN-GROUP group tag on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing IN-GROUP group tag on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } if ((in_group = ippTagValue(temp)) == IPP_TAG_ZERO || in_group >= IPP_TAG_UNSUPPORTED_VALUE) { - print_fatal_error(data, "Bad IN-GROUP group tag \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Bad IN-GROUP group tag \"%s\" on line %d of '%s'.", temp, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } else if (data->last_expect) { @@ -4945,21 +5737,21 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "IN-GROUP without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "IN-GROUP without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "REPEAT-LIMIT")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing REPEAT-LIMIT value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing REPEAT-LIMIT value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } else if (atoi(temp) <= 0) { - print_fatal_error(data, "Bad REPEAT-LIMIT value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Bad REPEAT-LIMIT value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } if (data->last_status) @@ -4972,8 +5764,8 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "REPEAT-LIMIT without a preceding EXPECT or STATUS on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "REPEAT-LIMIT without a preceding EXPECT or STATUS on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "REPEAT-MATCH")) @@ -4988,8 +5780,8 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "REPEAT-MATCH without a preceding EXPECT or STATUS on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "REPEAT-MATCH without a preceding EXPECT or STATUS on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "REPEAT-NO-MATCH")) @@ -5004,34 +5796,52 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "REPEAT-NO-MATCH without a preceding EXPECT or STATUS on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "REPEAT-NO-MATCH without a preceding EXPECT or STATUS on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); + } + } + else if (!_cups_strcasecmp(token, "SAME-COUNT-AS")) + { + if (!ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing SAME-COUNT-AS name on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); + } + + if (data->last_expect) + { + data->last_expect->same_count_as = strdup(temp); + } + else + { + print_fatal_error(data, "SAME-COUNT-AS without a preceding EXPECT on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } - else if (!_cups_strcasecmp(token, "SAME-COUNT-AS")) + else if (!_cups_strcasecmp(token, "SAVE-ALL-CONTENT") || !_cups_strcasecmp(token, "SAVE-CONTENT")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing SAME-COUNT-AS name on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing %s filespec on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } if (data->last_expect) { - data->last_expect->same_count_as = strdup(temp); + data->last_expect->save_filespec = strdup(temp); } else { - print_fatal_error(data, "SAME-COUNT-AS without a preceding EXPECT on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "%s without a preceding EXPECT on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "IF-DEFINED")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing IF-DEFINED name on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing IF-DEFINED name on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } if (data->last_expect) @@ -5044,16 +5854,16 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "IF-DEFINED without a preceding EXPECT or STATUS on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "IF-DEFINED without a preceding EXPECT or STATUS on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "IF-NOT-DEFINED")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing IF-NOT-DEFINED name on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing IF-NOT-DEFINED name on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } if (data->last_expect) @@ -5066,8 +5876,60 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "IF-NOT-DEFINED without a preceding EXPECT or STATUS on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "IF-NOT-DEFINED without a preceding EXPECT or STATUS on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); + } + } + else if (!_cups_strcasecmp(token, "WITH-ALL-CONTENT") || !_cups_strcasecmp(token, "WITH-CONTENT")) + { + if (!ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing %s condition on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); + } + + if (data->last_expect) + { + if (!_cups_strcasecmp(temp, "available")) + { + data->last_expect->with_content = IPPTOOL_CONTENT_AVAILABLE; + } + else if (!_cups_strcasecmp(temp, "valid")) + { + data->last_expect->with_content = IPPTOOL_CONTENT_VALID; + } + else if (!_cups_strcasecmp(temp, "valid-icon")) + { + data->last_expect->with_content = IPPTOOL_CONTENT_VALID_ICON; + } + else + { + print_fatal_error(data, "Unsupported %s %s on line %d of '%s'.", token, temp, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); + } + } + else + { + print_fatal_error(data, "%s without a preceding EXPECT on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); + } + } + else if (!_cups_strcasecmp(token, "WITH-ALL-MIME-TYPES") || !_cups_strcasecmp(token, "WITH-MIME-TYPES")) + { + if (!ippFileReadToken(f, temp, sizeof(temp))) + { + print_fatal_error(data, "Missing %s MIME media type(s) on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); + } + + if (data->last_expect) + { + data->last_expect->with_mime_types = cupsArrayNewStrings(temp, ','); + } + else + { + print_fatal_error(data, "%s without a preceding EXPECT on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "WITH-DISTINCT-VALUES")) @@ -5078,8 +5940,8 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename); - return (0); + print_fatal_error(data, "%s without a preceding EXPECT on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "WITH-ALL-VALUES") || @@ -5091,9 +5953,6 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ !_cups_strcasecmp(token, "WITH-SCHEME") || !_cups_strcasecmp(token, "WITH-VALUE")) { - off_t lastpos; /* Last file position */ - int lastline; /* Last line number */ - if (data->last_expect) { if (!_cups_strcasecmp(token, "WITH-ALL-HOSTNAMES") || !_cups_strcasecmp(token, "WITH-HOSTNAME")) @@ -5107,47 +5966,38 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ data->last_expect->with_flags |= IPPTOOL_WITH_ALL; } - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing %s value on line %d of \"%s\".", token, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing %s value on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } - /* - * Read additional comma-delimited values - needed since legacy test files - * will have unquoted WITH-VALUE values with commas... - */ - + // Read additional comma-delimited values - needed since legacy test files + // will have unquoted WITH-VALUE values with commas... ptr = temp + strlen(temp); for (;;) { - lastpos = cupsFileTell(f->fp); - lastline = f->linenum; - ptr += strlen(ptr); + ippFileSavePosition(f); + + ptr += strlen(ptr); - if (!_ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp)))) + if (!ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp)))) break; if (!strcmp(ptr, ",")) { - /* - * Append a value... - */ - + // Append a value... ptr += strlen(ptr); - if (!_ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp)))) + if (!ippFileReadToken(f, ptr, (sizeof(temp) - (size_t)(ptr - temp)))) break; } else { - /* - * Not another value, stop here... - */ + // Not another value, stop here... + ippFileRestorePosition(f); - cupsFileSeek(f->fp, lastpos); - f->linenum = lastline; *ptr = '\0'; break; } @@ -5155,20 +6005,14 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ if (data->last_expect) { - /* - * Expand any variables in the value and then save it. - */ - - _ippVarsExpand(vars, value, temp, sizeof(value)); + // Expand any variables in the value and then save it. + ippFileExpandVars(f, value, temp, sizeof(value)); ptr = value + strlen(value) - 1; if (value[0] == '/' && ptr > value && *ptr == '/') { - /* - * WITH-VALUE is a POSIX extended regular expression. - */ - + // WITH-VALUE is a POSIX extended regular expression. data->last_expect->with_value = calloc(1, (size_t)(ptr - value)); data->last_expect->with_flags |= IPPTOOL_WITH_REGEX; @@ -5177,18 +6021,12 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - /* - * WITH-VALUE is a literal value... - */ - + // WITH-VALUE is a literal value... for (ptr = value; *ptr; ptr ++) { if (*ptr == '\\' && ptr[1]) { - /* - * Remove \ from \foo... - */ - + // Remove \ from \foo... _cups_strcpy(ptr, ptr + 1); } } @@ -5199,51 +6037,49 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename); - return (0); + print_fatal_error(data, "%s without a preceding EXPECT on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } - else if (!_cups_strcasecmp(token, "WITH-VALUE-FROM")) + else if (!_cups_strcasecmp(token, "WITH-ALL-VALUES-FROM") || + !_cups_strcasecmp(token, "WITH-VALUE-FROM")) { - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing %s value on line %d of \"%s\".", token, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing %s value on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } if (data->last_expect) { - /* - * Expand any variables in the value and then save it. - */ - - _ippVarsExpand(vars, value, temp, sizeof(value)); + // Expand any variables in the value and then save it. + ippFileExpandVars(f, value, temp, sizeof(value)); data->last_expect->with_value_from = strdup(value); data->last_expect->with_flags = IPPTOOL_WITH_LITERAL; + + if (!_cups_strncasecmp(token, "WITH-ALL-", 9)) + data->last_expect->with_flags |= IPPTOOL_WITH_ALL; } else { - print_fatal_error(data, "%s without a preceding EXPECT on line %d of \"%s\".", token, f->linenum, f->filename); - return (0); + print_fatal_error(data, "%s without a preceding EXPECT on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!_cups_strcasecmp(token, "DISPLAY")) { - /* - * Display attributes... - */ - + // Display attributes... if (data->num_displayed >= (int)(sizeof(data->displayed) / sizeof(data->displayed[0]))) { - print_fatal_error(data, "Too many DISPLAY's on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Too many DISPLAY's on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } - if (!_ippFileReadToken(f, temp, sizeof(temp))) + if (!ippFileReadToken(f, temp, sizeof(temp))) { - print_fatal_error(data, "Missing DISPLAY name on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing DISPLAY name on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } data->displayed[data->num_displayed] = strdup(temp); @@ -5251,21 +6087,17 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ } else { - print_fatal_error(data, "Unexpected token %s seen on line %d of \"%s\".", token, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Unexpected token %s seen on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else { - /* - * Scan for the start of a test (open brace)... - */ - + // Scan for the start of a test (open brace)... if (!strcmp(token, "{")) { - /* - * Start new test... - */ + // Start new test... + const char *resource; // Resource path if (data->show_header) { @@ -5273,25 +6105,28 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ print_xml_header(data); if (data->output == IPPTOOL_OUTPUT_TEST || (data->output == IPPTOOL_OUTPUT_PLIST && data->outfile != cupsFileStdout())) - cupsFilePrintf(cupsFileStdout(), "\"%s\":\n", f->filename); + cupsFilePrintf(cupsFileStdout(), "\"%s\":\n", ippFileGetFilename(f)); - data->show_header = 0; + data->show_header = false; } + if ((resource = ippFileGetVar(data->parent, "resource")) == NULL) + resource = "/ipp/print"; + data->compression[0] = '\0'; data->delay = 0; data->num_expects = 0; data->last_expect = NULL; data->file[0] = '\0'; data->ignore_errors = data->def_ignore_errors; - cupsCopyString(data->name, f->filename, sizeof(data->name)); + cupsCopyString(data->name, ippFileGetFilename(f), sizeof(data->name)); if ((ptr = strrchr(data->name, '.')) != NULL) *ptr = '\0'; data->repeat_interval = 5000000; - cupsCopyString(data->resource, data->vars->resource, sizeof(data->resource)); - data->skip_previous = 0; - data->pass_test = 0; - data->skip_test = 0; + cupsCopyString(data->resource, resource, sizeof(data->resource)); + data->skip_previous = false; + data->pass_test = false; + data->skip_test = false; data->num_statuses = 0; data->last_status = NULL; data->test_id[0] = '\0'; @@ -5304,252 +6139,244 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ data->monitor_interval = 5000000; data->num_monitor_expects = 0; - _ippVarsSet(vars, "date-current", iso_date(ippTimeToDate(time(NULL)))); - - f->attrs = ippNew(); - f->group_tag = IPP_TAG_ZERO; + ippFileSetAttributes(f, ippNew()); + ippFileSetVar(f, "date-current", iso_date(ippTimeToDate(time(NULL)))); } else if (!strcmp(token, "DEFINE")) { - /* - * DEFINE name value - */ - - if (_ippFileReadToken(f, name, sizeof(name)) && _ippFileReadToken(f, temp, sizeof(temp))) + // DEFINE name value + if (ippFileReadToken(f, name, sizeof(name)) && ippFileReadToken(f, temp, sizeof(temp))) { - _ippVarsSet(vars, "date-current", iso_date(ippTimeToDate(time(NULL)))); - _ippVarsExpand(vars, value, temp, sizeof(value)); - _ippVarsSet(vars, name, value); + ippFileSetVar(f, "date-current", iso_date(ippTimeToDate(time(NULL)))); + ippFileExpandVars(f, value, temp, sizeof(value)); + ippFileSetVar(f, name, value); } else { - print_fatal_error(data, "Missing DEFINE name and/or value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing DEFINE name and/or value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "DEFINE-DEFAULT")) { - /* - * DEFINE-DEFAULT name value - */ - - if (_ippFileReadToken(f, name, sizeof(name)) && _ippFileReadToken(f, temp, sizeof(temp))) + // DEFINE-DEFAULT name value + if (ippFileReadToken(f, name, sizeof(name)) && ippFileReadToken(f, temp, sizeof(temp))) { - if (!_ippVarsGet(vars, name)) + if (!ippFileGetVar(f, name)) { - _ippVarsSet(vars, "date-current", iso_date(ippTimeToDate(time(NULL)))); - _ippVarsExpand(vars, value, temp, sizeof(value)); - _ippVarsSet(vars, name, value); + ippFileSetVar(f, "date-current", iso_date(ippTimeToDate(time(NULL)))); + ippFileExpandVars(f, value, temp, sizeof(value)); + ippFileSetVar(f, name, value); } } else { - print_fatal_error(data, "Missing DEFINE-DEFAULT name and/or value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing DEFINE-DEFAULT name and/or value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "FILE-ID")) { - /* - * FILE-ID "string" - */ - - if (_ippFileReadToken(f, temp, sizeof(temp))) + // FILE-ID "string" + if (ippFileReadToken(f, temp, sizeof(temp))) { - _ippVarsSet(vars, "date-current", iso_date(ippTimeToDate(time(NULL)))); - _ippVarsExpand(vars, data->file_id, temp, sizeof(data->file_id)); + ippFileSetVar(f, "date-current", iso_date(ippTimeToDate(time(NULL)))); + ippFileExpandVars(f, data->file_id, temp, sizeof(data->file_id)); } else { - print_fatal_error(data, "Missing FILE-ID value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing FILE-ID value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "IGNORE-ERRORS")) { - /* - * IGNORE-ERRORS yes - * IGNORE-ERRORS no - */ - - if (_ippFileReadToken(f, temp, sizeof(temp)) && (!_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "no"))) + // IGNORE-ERRORS yes + // IGNORE-ERRORS no + if (ippFileReadToken(f, temp, sizeof(temp)) && (!_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "no"))) { data->def_ignore_errors = !_cups_strcasecmp(temp, "yes"); } else { - print_fatal_error(data, "Missing IGNORE-ERRORS value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing IGNORE-ERRORS value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "INCLUDE")) { - /* - * INCLUDE "filename" - * INCLUDE - */ - - if (_ippFileReadToken(f, temp, sizeof(temp))) + // INCLUDE "filename" + // INCLUDE + if (ippFileReadToken(f, temp, sizeof(temp))) { - /* - * Map the filename to and then run the tests... - */ - - ipptool_test_t inc_data; /* Data for included file */ - char filename[1024]; /* Mapped filename */ + // Map the filename to and then run the tests... + ipptool_test_t inc_data; // Data for included file + bool inc_pass; // Include file passed? + char filename[1024]; // Mapped filename memcpy(&inc_data, data, sizeof(inc_data)); + inc_data.test_count = 0; + inc_data.pass_count = 0; + inc_data.fail_count = 0; + inc_data.skip_count = 0; inc_data.http = NULL; - inc_data.pass = 1; - inc_data.prev_pass = 1; - inc_data.show_header = 1; + inc_data.pass = true; + inc_data.prev_pass = true; + inc_data.show_header = true; + + inc_pass = do_tests(get_filename(ippFileGetFilename(f), filename, temp, sizeof(filename)), &inc_data); - if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error) + data->test_count += inc_data.test_count; + data->pass_count += inc_data.pass_count; + data->fail_count += inc_data.fail_count; + data->skip_count += inc_data.skip_count; + + if (!inc_pass && data->stop_after_include_error) { - data->pass = data->prev_pass = 0; - return (0); + data->pass = data->prev_pass = false; + return (false); } } else { - print_fatal_error(data, "Missing INCLUDE filename on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing INCLUDE filename on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } - data->show_header = 1; + data->show_header = true; } else if (!strcmp(token, "INCLUDE-IF-DEFINED")) { - /* - * INCLUDE-IF-DEFINED name "filename" - * INCLUDE-IF-DEFINED name - */ - - if (_ippFileReadToken(f, name, sizeof(name)) && _ippFileReadToken(f, temp, sizeof(temp))) + // INCLUDE-IF-DEFINED name "filename" + // INCLUDE-IF-DEFINED name + if (ippFileReadToken(f, name, sizeof(name)) && ippFileReadToken(f, temp, sizeof(temp))) { - /* - * Map the filename to and then run the tests... - */ - - ipptool_test_t inc_data; /* Data for included file */ - char filename[1024]; /* Mapped filename */ + // Map the filename to and then run the tests... + ipptool_test_t inc_data; // Data for included file + bool inc_pass; // Include file passed? + char filename[1024]; // Mapped filename memcpy(&inc_data, data, sizeof(inc_data)); + inc_data.test_count = 0; + inc_data.pass_count = 0; + inc_data.fail_count = 0; + inc_data.skip_count = 0; inc_data.http = NULL; - inc_data.pass = 1; - inc_data.prev_pass = 1; - inc_data.show_header = 1; + inc_data.pass = true; + inc_data.prev_pass = true; + inc_data.show_header = true; + + inc_pass = do_tests(get_filename(ippFileGetFilename(f), filename, temp, sizeof(filename)), &inc_data); - if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error) + data->test_count += inc_data.test_count; + data->pass_count += inc_data.pass_count; + data->fail_count += inc_data.fail_count; + data->skip_count += inc_data.skip_count; + + if (!inc_pass && data->stop_after_include_error) { - data->pass = data->prev_pass = 0; - return (0); + data->pass = data->prev_pass = false; + return (false); } } else { - print_fatal_error(data, "Missing INCLUDE-IF-DEFINED name or filename on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing INCLUDE-IF-DEFINED name or filename on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } - data->show_header = 1; + data->show_header = true; } else if (!strcmp(token, "INCLUDE-IF-NOT-DEFINED")) { - /* - * INCLUDE-IF-NOT-DEFINED name "filename" - * INCLUDE-IF-NOT-DEFINED name - */ - - if (_ippFileReadToken(f, name, sizeof(name)) && _ippFileReadToken(f, temp, sizeof(temp))) + // INCLUDE-IF-NOT-DEFINED name "filename" + // INCLUDE-IF-NOT-DEFINED name + if (ippFileReadToken(f, name, sizeof(name)) && ippFileReadToken(f, temp, sizeof(temp))) { - /* - * Map the filename to and then run the tests... - */ - - ipptool_test_t inc_data; /* Data for included file */ - char filename[1024]; /* Mapped filename */ + // Map the filename to and then run the tests... + ipptool_test_t inc_data; // Data for included file + bool inc_pass; // Include file passed? + char filename[1024]; // Mapped filename memcpy(&inc_data, data, sizeof(inc_data)); + inc_data.test_count = 0; + inc_data.pass_count = 0; + inc_data.fail_count = 0; + inc_data.skip_count = 0; inc_data.http = NULL; - inc_data.pass = 1; - inc_data.prev_pass = 1; - inc_data.show_header = 1; + inc_data.pass = true; + inc_data.prev_pass = true; + inc_data.show_header = true; + + inc_pass = do_tests(get_filename(ippFileGetFilename(f), filename, temp, sizeof(filename)), &inc_data); - if (!do_tests(get_filename(f->filename, filename, temp, sizeof(filename)), &inc_data) && data->stop_after_include_error) + data->test_count += inc_data.test_count; + data->pass_count += inc_data.pass_count; + data->fail_count += inc_data.fail_count; + data->skip_count += inc_data.skip_count; + + if (!inc_pass && data->stop_after_include_error) { - data->pass = data->prev_pass = 0; - return (0); + data->pass = data->prev_pass = false; + return (false); } } else { - print_fatal_error(data, "Missing INCLUDE-IF-NOT-DEFINED name or filename on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing INCLUDE-IF-NOT-DEFINED name or filename on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } - data->show_header = 1; + data->show_header = true; } else if (!strcmp(token, "SKIP-IF-DEFINED")) { - /* - * SKIP-IF-DEFINED variable - */ - - if (_ippFileReadToken(f, name, sizeof(name))) + // SKIP-IF-DEFINED variable + if (ippFileReadToken(f, name, sizeof(name))) { - if (_ippVarsGet(vars, name)) - data->skip_test = 1; + if (ippFileGetVar(f, name) || getenv(name)) + data->skip_test = true; } else { - print_fatal_error(data, "Missing SKIP-IF-DEFINED variable on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing SKIP-IF-DEFINED variable on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "SKIP-IF-NOT-DEFINED")) { - /* - * SKIP-IF-NOT-DEFINED variable - */ - - if (_ippFileReadToken(f, name, sizeof(name))) + // SKIP-IF-NOT-DEFINED variable + if (ippFileReadToken(f, name, sizeof(name))) { - if (!_ippVarsGet(vars, name)) - data->skip_test = 1; + if (!ippFileGetVar(f, name) && !getenv(name)) + data->skip_test = true; } else { - print_fatal_error(data, "Missing SKIP-IF-NOT-DEFINED variable on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing SKIP-IF-NOT-DEFINED variable on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "STOP-AFTER-INCLUDE-ERROR")) { - /* - * STOP-AFTER-INCLUDE-ERROR yes - * STOP-AFTER-INCLUDE-ERROR no - */ - - if (_ippFileReadToken(f, temp, sizeof(temp)) && (!_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "no"))) + // STOP-AFTER-INCLUDE-ERROR yes + // STOP-AFTER-INCLUDE-ERROR no + if (ippFileReadToken(f, temp, sizeof(temp)) && (!_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "no"))) { data->stop_after_include_error = !_cups_strcasecmp(temp, "yes"); } else { - print_fatal_error(data, "Missing STOP-AFTER-INCLUDE-ERROR value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing STOP-AFTER-INCLUDE-ERROR value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "TRANSFER")) { - /* - * TRANSFER auto - * TRANSFER chunked - * TRANSFER length - */ - - if (_ippFileReadToken(f, temp, sizeof(temp))) + // TRANSFER auto + // TRANSFER chunked + // TRANSFER length + if (ippFileReadToken(f, temp, sizeof(temp))) { if (!strcmp(temp, "auto")) data->def_transfer = IPPTOOL_TRANSFER_AUTO; @@ -5559,19 +6386,19 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ data->def_transfer = IPPTOOL_TRANSFER_LENGTH; else { - print_fatal_error(data, "Bad TRANSFER value \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Bad TRANSFER value \"%s\" on line %d of '%s'.", temp, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else { - print_fatal_error(data, "Missing TRANSFER value on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing TRANSFER value on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else if (!strcmp(token, "VERSION")) { - if (_ippFileReadToken(f, temp, sizeof(temp))) + if (ippFileReadToken(f, temp, sizeof(temp))) { if (!strcmp(temp, "1.0")) data->def_version = 10; @@ -5585,30 +6412,30 @@ token_cb(_ipp_file_t *f, /* I - IPP file data */ data->def_version = 22; else { - print_fatal_error(data, "Bad VERSION \"%s\" on line %d of \"%s\".", temp, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Bad VERSION \"%s\" on line %d of '%s'.", temp, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else { - print_fatal_error(data, "Missing VERSION number on line %d of \"%s\".", f->linenum, f->filename); - return (0); + print_fatal_error(data, "Missing VERSION number on line %d of '%s'.", ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } else { - print_fatal_error(data, "Unexpected token %s seen on line %d of \"%s\".", token, f->linenum, f->filename); - return (0); + print_fatal_error(data, "Unexpected token %s seen on line %d of '%s'.", token, ippFileGetLineNumber(f), ippFileGetFilename(f)); + return (false); } } - return (1); + return (true); } -/* - * 'usage()' - Show program usage. - */ +// +// 'usage()' - Show program usage. +// static void usage(void) @@ -5646,26 +6473,370 @@ usage(void) } -/* - * 'with_distinct_values()' - Verify that an attribute contains unique values. - */ +// +// 'valid_image()' - Validate an image. +// +// Supports JPEG and PNG images. +// + +static bool // O - `true` if valid, `false` if not +valid_image(const char *filename, // I - Image filename + int *width, // O - Width in columns + int *height, // O - Height in lines + int *depth) // O - Number of color planes +{ + bool ret = true; // Return value + int fd; // File descriptor + unsigned char buffer[16384], // Read buffer + *bufptr, // Pointer into buffer + *bufend; // End of buffer + ssize_t bytes; // Number of bytes read + + + // Initialize things... + *width = *height = *depth = 0; + + // Try opening the file and reading from it... + if ((fd = open(filename, O_RDONLY | O_BINARY)) < 0) + { + // Unable to open... + ret = false; + } + else if ((bytes = read(fd, buffer, sizeof(buffer))) < 16) + { + // Unable to read... + ret = false; + } + else if (!memcmp(buffer, "\211PNG\015\012\032\012\000\000\000\015IHDR", 16) && bytes > 25) + { + // PNG image... + *width = (int)((buffer[16] << 24) | (buffer[17] << 16) | (buffer[18] << 8) | buffer[19]); + *height = (int)((buffer[20] << 24) | (buffer[21] << 16) | (buffer[22] << 8) | buffer[23]); + *depth = ((buffer[25] & 3) == 0 ? 1 : 3) + ((buffer[25] & 4) ? 1 : 0); + } + else if (!memcmp(buffer, "\377\330\377", 3)) + { + // JPEG image... + size_t length; // Length of chunk + + for (bufptr = buffer + 2, bufend = buffer + bytes; bufptr < bufend;) + { + if (*bufptr == 0xff) + { + bufptr ++; + + if (bufptr >= bufend) + { + // If we are at the end of the current buffer, re-fill and continue... + if ((bytes = read(fd, buffer, sizeof(buffer))) <= 0) + break; + + bufptr = buffer; + bufend = buffer + bytes; + } + + if (*bufptr == 0xff) + continue; + + if ((bufptr + 16) >= bufend) + { + // Read more of the marker... + bytes = bufend - bufptr; + + memmove(buffer, bufptr, (size_t)bytes); + bufptr = buffer; + bufend = buffer + bytes; + + if ((bytes = read(fd, bufend, sizeof(buffer) - (size_t)bytes)) <= 0) + break; + + bufend += bytes; + } + + length = (size_t)((bufptr[1] << 8) | bufptr[2]); + + if ((*bufptr >= 0xc0 && *bufptr <= 0xc3) || (*bufptr >= 0xc5 && *bufptr <= 0xc7) || (*bufptr >= 0xc9 && *bufptr <= 0xcb) || (*bufptr >= 0xcd && *bufptr <= 0xcf)) + { + // SOFn marker, look for dimensions... + if (bufptr[3] != 8) + { + ret = false; + break; + } + + *width = (int)((bufptr[6] << 8) | bufptr[7]); + *height = (int)((bufptr[4] << 8) | bufptr[5]); + *depth = (int)bufptr[8]; + break; + } + + // Skip past this marker... + bufptr ++; + bytes = bufend - bufptr; + + while (length >= (size_t)bytes) + { + length -= (size_t)bytes; + + if ((bytes = read(fd, buffer, sizeof(buffer))) <= 0) + break; + + bufptr = buffer; + bufend = buffer + bytes; + } + + if (length > (size_t)bytes) + break; + + bufptr += length; + } + } + + if (*width == 0 || *height == 0 || (*depth != 1 && *depth != 3)) + ret = false; + } + else + { + // Something we don't recognize... + ret = false; + } + + if (fd >= 0) + close(fd); + + return (ret); +} + + +// +// 'with_content()' - Verify that URIs meet content/MIME media type requirements +// and save as needed. +// + +static bool // O - `true` if valid, `false` otherwise +with_content( + cups_array_t *errors, // I - Array of errors + ipp_attribute_t *attr, // I - Attribute + ipptool_content_t content, // I - Content validation rule + cups_array_t *mime_types, // I - Comma-delimited list of MIME media types + const char *filespec) // I - Output filename specification +{ + bool ret = true; // Return value + int i, // Looping var + count; // Number of values + const char *uri; // URI value + char scheme[256], // Scheme + userpass[256], // Username:password (not used) + host[256], // Hostname + resource[256]; // Resource path + int port; // Port number + http_encryption_t encryption; // Encryption mode + http_uri_status_t uri_status; // URI decoding status + http_t *http; // Connection to server + http_status_t status; // Request status + const char *content_type; // Content-Type header + + + for (i = 0, count = ippGetCount(attr); i < count; i ++) + { + uri = ippGetString(attr, i, NULL); + + if ((uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, sizeof(userpass), host, sizeof(host), &port, resource, sizeof(resource))) < HTTP_URI_STATUS_OK) + { + add_stringf(errors, "Bad URI value '%s': %s", uri, httpURIStatusString(uri_status)); + ret = false; + continue; + } + + if (strcmp(scheme, "http") && strcmp(scheme, "https") && strcmp(scheme, "ipp") && strcmp(scheme, "ipps")) + { + add_stringf(errors, "Unsupported URI scheme for '%s'.", uri); + ret = false; + continue; + } + + encryption = (!strcmp(scheme, "https") || !strcmp(scheme, "ipps") || port == 443) ? HTTP_ENCRYPTION_ALWAYS : HTTP_ENCRYPTION_IF_REQUESTED; + + if ((http = httpConnect2(host, port, NULL, AF_UNSPEC, encryption, 1, 30000, NULL)) == NULL) + { + add_stringf(errors, "Unable to connect to '%s' on port %d: %s", host, port, cupsGetErrorString()); + ret = false; + continue; + } + + if (content == IPPTOOL_CONTENT_AVAILABLE) + { + if (!httpWriteRequest(http, "HEAD", resource)) + { + add_stringf(errors, "Unable to send HEAD request to '%s': %s", uri, cupsGetErrorString()); + ret = false; + goto http_done; + } + + while ((status = httpUpdate(http)) == HTTP_STATUS_CONTINUE) + { + // Do nothing + } + + if (status != HTTP_STATUS_OK) + { + add_stringf(errors, "Got unexpected status %d for HEAD request to '%s'.", (int)status, uri); + ret = false; + goto http_done; + } + + content_type = httpGetField(http, HTTP_FIELD_CONTENT_TYPE); + if ((!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")) != !_cups_strcasecmp(content_type, "application/ipp") || (mime_types && !cupsArrayFind(mime_types, (void *)content_type))) + { + add_stringf(errors, "Got unexpected Content-Type '%s' for HEAD request to '%s'.", content_type, uri); + ret = false; + goto http_done; + } + } + else if (!strcmp(scheme, "http") || !strcmp(scheme, "https")) + { + // Check HTTP resource with a GET... + char filename[1024]; // Temporary filename + int fd; // Temporary file + struct stat fileinfo; // Temporary file information + int width, // Image width + height, // Image height + depth; // Image color depth + + if ((fd = create_file(filespec, resource, i + 1, filename, sizeof(filename))) < 0) + { + add_stringf(errors, "Unable to create temporary file for WITH-CONTENT: %s", strerror(errno)); + ret = false; + goto http_done; + } + + status = cupsGetFd(http, resource, fd); + if (fstat(fd, &fileinfo)) + memset(&fileinfo, 0, sizeof(fileinfo)); + close(fd); + + if (status != HTTP_STATUS_OK) + { + add_stringf(errors, "Got unexpected status %d for HEAD request to '%s'.", (int)status, uri); + ret = false; + goto get_done; + } + + content_type = httpGetField(http, HTTP_FIELD_CONTENT_TYPE); + + if (mime_types && !cupsArrayFind(mime_types, (void *)content_type)) + { + add_stringf(errors, "Got unexpected Content-Type '%s' for GET request to '%s'.", content_type, uri); + ret = false; + goto get_done; + } + + if (content == IPPTOOL_CONTENT_VALID_ICON) + { + if (_cups_strcasecmp(content_type, "image/png")) + { + add_stringf(errors, "Got unexpected Content-Type '%s' for GET request to '%s'.", content_type, uri); + ret = false; + goto get_done; + } + + if (!valid_image(filename, &width, &height, &depth)) + { + add_stringf(errors, "Unable to load image '%s'.", uri); + ret = false; + goto get_done; + } + else if (width != height || (width != 48 && width != 128 && width != 512)) + { + add_stringf(errors, "Image '%s' has bad dimensions %dx%d.", uri, width, height); + ret = false; + goto get_done; + } + else if (depth & 1) + { + add_stringf(errors, "Image '%s' doesn't have transparency information.", uri); + ret = false; + goto get_done; + } + } + else if (!_cups_strcasecmp(content_type, "image/jpeg") || !_cups_strcasecmp(content_type, "image/png")) + { + if (!valid_image(filename, &width, &height, &depth)) + { + add_stringf(errors, "Unable to load image '%s'.", uri); + ret = false; + goto get_done; + } + } + else if (!_cups_strcasecmp(content_type, "application/pdf") || !_cups_strcasecmp(content_type, "application/ipp") || !_cups_strcasecmp(content_type, "application/vnd.iccprofile") || !_cups_strcasecmp(content_type, "text/css") || !_cups_strcasecmp(content_type, "text/html") || !_cups_strcasecmp(content_type, "text/strings")) + { + // Just require these files to be non-empty for now, might add more checks in the future... + if (fileinfo.st_size == 0) + { + add_stringf(errors, "Empty resource '%s'.", uri); + ret = false; + goto get_done; + } + } + else + { + add_stringf(errors, "Got unexpected Content-Type '%s' for HEAD request to '%s'.", content_type, uri); + ret = false; + goto get_done; + } + + get_done: + + if (!filespec) + unlink(filename); + } + else + { + // Check IPP resource... + ipp_t *request; // IPP Get-Printer-Attributes request + + request = ippNewRequest(IPP_OP_GET_PRINTER_ATTRIBUTES); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); + + ippDelete(cupsDoRequest(http, request, resource)); + + if (cupsGetError() > IPP_STATUS_OK_EVENTS_COMPLETE) + { + add_stringf(errors, "Got unexpected status-code '%s' (%s) for Get-Printer-Attributes request to '%s'.", ippErrorString(cupsGetError()), cupsGetErrorString(), uri); + ret = false; + } + } + + http_done: + + httpClose(http); + } + + return (ret); +} + + +// +// 'with_distinct_values()' - Verify that an attribute contains unique values. +// -static int // O - 1 if distinct, 0 if duplicate +static bool // O - `true` if distinct, `false` if duplicate with_distinct_values( cups_array_t *errors, // I - Array of errors ipp_attribute_t *attr) // I - Attribute to test { + bool ret; // Return value int i, // Looping var count; // Number of values ipp_tag_t value_tag; // Value syntax const char *value; // Current value - char buffer[8192]; // Temporary buffer + char buffer[131072]; // Temporary buffer cups_array_t *values; // Array of values as strings // If there is only 1 value, it must be distinct if ((count = ippGetCount(attr)) == 1) - return (1); + return (true); // Only check integers, enums, rangeOfInteger, resolution, and nul-terminated // strings... @@ -5685,11 +6856,11 @@ with_distinct_values( default : add_stringf(errors, "WITH-DISTINCT-VALUES %s not supported for 1setOf %s", ippGetName(attr), ippTagString(value_tag)); - return (0); + return (false); } // Collect values and determine they are all unique... - values = cupsArrayNew3((cups_array_func_t)strcmp, NULL, NULL, 0, (cups_acopy_func_t)strdup, (cups_afree_func_t)free); + values = cupsArrayNew3((cups_array_cb_t)strcmp, NULL, NULL, 0, (cups_acopy_cb_t)strdup, (cups_afree_cb_t)free); for (i = 0; i < count; i ++) { @@ -5738,7 +6909,7 @@ with_distinct_values( *bufend, // End of buffer prefix; // Prefix character - for (prefix = '{', bufptr = buffer, bufend = buffer + sizeof(buffer) - 2, member = ippFirstAttribute(col); member && bufptr < bufend; member = ippNextAttribute(col)) + for (prefix = '{', bufptr = buffer, bufend = buffer + sizeof(buffer) - 2, member = ippGetFirstAttribute(col); member && bufptr < bufend; member = ippGetNextAttribute(col)) { *bufptr++ = prefix; prefix = ' '; @@ -5764,20 +6935,20 @@ with_distinct_values( } // Cleanup... - i = cupsArrayCount(values) == count; + ret = cupsArrayGetCount(values) == count; cupsArrayDelete(values); - return (i); + return (ret); } -/* - * 'with_flags_string()' - Return the "WITH-xxx" predicate that corresponds to - * the flags. - */ +// +// 'with_flags_string()' - Return the "WITH-xxx" predicate that corresponds to +// the flags. +// -static const char * /* O - WITH-xxx string */ -with_flags_string(int flags) /* I - WITH flags */ +static const char * // O - WITH-xxx string +with_flags_string(int flags) // I - WITH flags { if (flags & IPPTOOL_WITH_ALL) { @@ -5801,41 +6972,35 @@ with_flags_string(int flags) /* I - WITH flags */ } -/* - * 'with_value()' - Test a WITH-VALUE predicate. - */ +// +// 'with_value()' - Test a WITH-VALUE predicate. +// -static int /* O - 1 on match, 0 on non-match */ -with_value(ipptool_test_t *data, /* I - Test data */ - cups_array_t *errors, /* I - Errors array */ - char *value, /* I - Value string */ - int flags, /* I - Flags for match */ - ipp_attribute_t *attr, /* I - Attribute to compare */ - char *matchbuf, /* I - Buffer to hold matching value */ - size_t matchlen) /* I - Length of match buffer */ +static bool // O - `true` on match, `false` on non-match +with_value(ipptool_test_t *data, // I - Test data + cups_array_t *errors, // I - Errors array + char *value, // I - Value string + int flags, // I - Flags for match + ipp_attribute_t *attr, // I - Attribute to compare + char *matchbuf, // I - Buffer to hold matching value + size_t matchlen) // I - Length of match buffer { - int i, /* Looping var */ - count, /* Number of values */ - match; /* Match? */ - char temp[1024], /* Temporary value string */ - *valptr; /* Pointer into value */ - const char *name; /* Attribute name */ + int i, // Looping var + count; // Number of values + bool match; // Match? + char temp[1024], // Temporary value string + *valptr; // Pointer into value + const char *name; // Attribute name *matchbuf = '\0'; - match = (flags & IPPTOOL_WITH_ALL) ? 1 : 0; - - /* - * NULL matches everything. - */ + match = (flags & IPPTOOL_WITH_ALL) ? true : false; + // NULL matches everything. if (!value || !*value) - return (1); - - /* - * Compare the value string to the attribute value. - */ + return (true); + // Compare the value string to the attribute value. name = ippGetName(attr); count = ippGetCount(attr); @@ -5845,12 +7010,12 @@ with_value(ipptool_test_t *data, /* I - Test data */ case IPP_TAG_ENUM : for (i = 0; i < count; i ++) { - char op, /* Comparison operator */ - *nextptr; /* Next pointer */ - int intvalue, /* Integer value */ - attrvalue = ippGetInteger(attr, i), - /* Attribute value */ - valmatch = 0; /* Does the current value match? */ + char op, // Comparison operator + *nextptr; // Next pointer + int intvalue, // Integer value + attrvalue = ippGetInteger(attr, i); + // Attribute value + bool valmatch = false; // Does the current value match? valptr = value; @@ -5881,7 +7046,7 @@ with_value(ipptool_test_t *data, /* I - Test data */ if (!matchbuf[0]) snprintf(matchbuf, matchlen, "%d", attrvalue); - valmatch = 1; + valmatch = true; break; } } @@ -5890,13 +7055,13 @@ with_value(ipptool_test_t *data, /* I - Test data */ { if (!valmatch) { - match = 0; + match = false; break; } } else if (valmatch) { - match = 1; + match = true; break; } } @@ -5911,12 +7076,12 @@ with_value(ipptool_test_t *data, /* I - Test data */ case IPP_TAG_RANGE : for (i = 0; i < count; i ++) { - char op, /* Comparison operator */ - *nextptr; /* Next pointer */ - int intvalue, /* Integer value */ - lower, /* Lower range */ - upper, /* Upper range */ - valmatch = 0; /* Does the current value match? */ + char op, // Comparison operator + *nextptr; // Next pointer + int intvalue, // Integer value + lower, // Lower range + upper; // Upper range + bool valmatch = false; // Does the current value match? lower = ippGetRange(attr, i, &upper); valptr = value; @@ -5948,7 +7113,7 @@ with_value(ipptool_test_t *data, /* I - Test data */ if (!matchbuf[0]) snprintf(matchbuf, matchlen, "%d-%d", lower, upper); - valmatch = 1; + valmatch = true; break; } } @@ -5957,13 +7122,13 @@ with_value(ipptool_test_t *data, /* I - Test data */ { if (!valmatch) { - match = 0; + match = false; break; } } else if (valmatch) { - match = 1; + match = true; break; } } @@ -5972,7 +7137,7 @@ with_value(ipptool_test_t *data, /* I - Test data */ { for (i = 0; i < count; i ++) { - int lower, upper; /* Range values */ + int lower, upper; // Range values lower = ippGetRange(attr, i, &upper); add_stringf(data->errors, "GOT: %s=%d-%d", name, lower, upper); @@ -5990,13 +7155,13 @@ with_value(ipptool_test_t *data, /* I - Test data */ if (!(flags & IPPTOOL_WITH_ALL)) { - match = 1; + match = true; break; } } else if (flags & IPPTOOL_WITH_ALL) { - match = 0; + match = false; break; } } @@ -6011,8 +7176,8 @@ with_value(ipptool_test_t *data, /* I - Test data */ case IPP_TAG_RESOLUTION : for (i = 0; i < count; i ++) { - int xres, yres; /* Resolution values */ - ipp_res_t units; /* Resolution units */ + int xres, yres; // Resolution values + ipp_res_t units; // Resolution units xres = ippGetResolution(attr, i, &yres, &units); if (xres == yres) @@ -6027,13 +7192,13 @@ with_value(ipptool_test_t *data, /* I - Test data */ if (!(flags & IPPTOOL_WITH_ALL)) { - match = 1; + match = true; break; } } else if (flags & IPPTOOL_WITH_ALL) { - match = 0; + match = false; break; } } @@ -6042,8 +7207,8 @@ with_value(ipptool_test_t *data, /* I - Test data */ { for (i = 0; i < count; i ++) { - int xres, yres; /* Resolution values */ - ipp_res_t units; /* Resolution units */ + int xres, yres; // Resolution values + ipp_res_t units; // Resolution units xres = ippGetResolution(attr, i, &yres, &units); if (xres == yres) @@ -6059,7 +7224,7 @@ with_value(ipptool_test_t *data, /* I - Test data */ case IPP_TAG_NOVALUE : case IPP_TAG_UNKNOWN : - return (1); + return (true); case IPP_TAG_CHARSET : case IPP_TAG_KEYWORD : @@ -6073,24 +7238,19 @@ with_value(ipptool_test_t *data, /* I - Test data */ case IPP_TAG_URISCHEME : if (flags & IPPTOOL_WITH_REGEX) { - /* - * Value is an extended, case-sensitive POSIX regular expression... - */ + // Value is an extended, case-sensitive POSIX regular expression... + int r; // Error, if any + regex_t re; // Regular expression - regex_t re; /* Regular expression */ - - if ((i = regcomp(&re, value, REG_EXTENDED | REG_NOSUB)) != 0) + if ((r = regcomp(&re, value, REG_EXTENDED | REG_NOSUB)) != 0) { - regerror(i, &re, temp, sizeof(temp)); + regerror(r, &re, temp, sizeof(temp)); print_fatal_error(data, "Unable to compile WITH-VALUE regular expression \"%s\" - %s", value, temp); - return (0); + return (false); } - /* - * See if ALL of the values match the given regular expression. - */ - + // See if ALL of the values match the given regular expression. for (i = 0; i < count; i ++) { if (!regexec(&re, get_string(attr, i, flags, temp, sizeof(temp)), @@ -6101,13 +7261,13 @@ with_value(ipptool_test_t *data, /* I - Test data */ if (!(flags & IPPTOOL_WITH_ALL)) { - match = 1; + match = true; break; } } else if (flags & IPPTOOL_WITH_ALL) { - match = 0; + match = false; break; } } @@ -6116,10 +7276,7 @@ with_value(ipptool_test_t *data, /* I - Test data */ } else if (ippGetValueTag(attr) == IPP_TAG_URI && !(flags & (IPPTOOL_WITH_SCHEME | IPPTOOL_WITH_HOSTNAME | IPPTOOL_WITH_RESOURCE))) { - /* - * Value is a literal URI string, see if the value(s) match... - */ - + // Value is a literal URI string, see if the value(s) match... for (i = 0; i < count; i ++) { if (!compare_uris(value, get_string(attr, i, flags, temp, sizeof(temp)))) @@ -6129,23 +7286,20 @@ with_value(ipptool_test_t *data, /* I - Test data */ if (!(flags & IPPTOOL_WITH_ALL)) { - match = 1; + match = true; break; } } else if (flags & IPPTOOL_WITH_ALL) { - match = 0; + match = false; break; } } } else { - /* - * Value is a literal string, see if the value(s) match... - */ - + // Value is a literal string, see if the value(s) match... for (i = 0; i < count; i ++) { int result; @@ -6153,10 +7307,7 @@ with_value(ipptool_test_t *data, /* I - Test data */ switch (ippGetValueTag(attr)) { case IPP_TAG_URI : - /* - * Some URI components are case-sensitive, some not... - */ - + // Some URI components are case-sensitive, some not... if (flags & (IPPTOOL_WITH_SCHEME | IPPTOOL_WITH_HOSTNAME)) result = _cups_strcasecmp(value, get_string(attr, i, flags, temp, sizeof(temp))); else @@ -6168,21 +7319,15 @@ with_value(ipptool_test_t *data, /* I - Test data */ case IPP_TAG_NAMELANG : case IPP_TAG_TEXT : case IPP_TAG_TEXTLANG : - /* - * mimeMediaType, nameWithoutLanguage, nameWithLanguage, - * textWithoutLanguage, and textWithLanguage are defined to - * be case-insensitive strings... - */ - + // mimeMediaType, nameWithoutLanguage, nameWithLanguage, + // textWithoutLanguage, and textWithLanguage are defined to + // be case-insensitive strings... result = _cups_strcasecmp(value, get_string(attr, i, flags, temp, sizeof(temp))); break; default : - /* - * Other string syntaxes are defined as lowercased so we use - * case-sensitive comparisons to catch problems... - */ - + // Other string syntaxes are defined as lowercased so we use + // case-sensitive comparisons to catch problems... result = strcmp(value, get_string(attr, i, flags, temp, sizeof(temp))); break; } @@ -6194,13 +7339,13 @@ with_value(ipptool_test_t *data, /* I - Test data */ if (!(flags & IPPTOOL_WITH_ALL)) { - match = 1; + match = true; break; } } else if (flags & IPPTOOL_WITH_ALL) { - match = 0; + match = false; break; } } @@ -6216,31 +7361,26 @@ with_value(ipptool_test_t *data, /* I - Test data */ case IPP_TAG_STRING : if (flags & IPPTOOL_WITH_REGEX) { - /* - * Value is an extended, case-sensitive POSIX regular expression... - */ - - void *adata; /* Pointer to octetString data */ - int adatalen; /* Length of octetString */ - regex_t re; /* Regular expression */ + // Value is an extended, case-sensitive POSIX regular expression... + void *adata; // Pointer to octetString data + int adatalen; // Length of octetString + int r; // Error, if any + regex_t re; // Regular expression - if ((i = regcomp(&re, value, REG_EXTENDED | REG_NOSUB)) != 0) + if ((r = regcomp(&re, value, REG_EXTENDED | REG_NOSUB)) != 0) { - regerror(i, &re, temp, sizeof(temp)); + regerror(r, &re, temp, sizeof(temp)); print_fatal_error(data, "Unable to compile WITH-VALUE regular expression \"%s\" - %s", value, temp); - return (0); + return (false); } - /* - * See if ALL of the values match the given regular expression. - */ - + // See if ALL of the values match the given regular expression. for (i = 0; i < count; i ++) { if ((adata = ippGetOctetString(attr, i, &adatalen)) == NULL || adatalen >= (int)sizeof(temp)) { - match = 0; + match = false; break; } memcpy(temp, adata, (size_t)adatalen); @@ -6253,13 +7393,13 @@ with_value(ipptool_test_t *data, /* I - Test data */ if (!(flags & IPPTOOL_WITH_ALL)) { - match = 1; + match = true; break; } } else if (flags & IPPTOOL_WITH_ALL) { - match = 0; + match = false; break; } } @@ -6278,32 +7418,26 @@ with_value(ipptool_test_t *data, /* I - Test data */ } else { - /* - * Value is a literal or hex-encoded string... - */ - - unsigned char withdata[1023], /* WITH-VALUE data */ - *adata; /* Pointer to octetString data */ - int withlen, /* Length of WITH-VALUE data */ - adatalen; /* Length of octetString */ + // Value is a literal or hex-encoded string... + unsigned char withdata[1023], // WITH-VALUE data + *adata; // Pointer to octetString data + int withlen, // Length of WITH-VALUE data + adatalen; // Length of octetString if (*value == '<') { - /* - * Grab hex-encoded value... - */ - + // Grab hex-encoded value... if ((withlen = (int)strlen(value)) & 1 || withlen > (int)(2 * (sizeof(withdata) + 1))) { print_fatal_error(data, "Bad WITH-VALUE hex value."); - return (0); + return (false); } withlen = withlen / 2 - 1; for (valptr = value + 1, adata = withdata; *valptr; valptr += 2) { - int ch; /* Current character/byte */ + int ch; // Current character/byte if (isdigit(valptr[0])) ch = (valptr[0] - '0') << 4; @@ -6325,16 +7459,13 @@ with_value(ipptool_test_t *data, /* I - Test data */ if (*valptr) { print_fatal_error(data, "Bad WITH-VALUE hex value."); - return (0); + return (false); } } else { - /* - * Copy literal string value... - */ - - withlen = (int)strlen(value); + // Copy literal string value... + withlen = strlen(value); memcpy(withdata, value, (size_t)withlen); } @@ -6350,13 +7481,13 @@ with_value(ipptool_test_t *data, /* I - Test data */ if (!(flags & IPPTOOL_WITH_ALL)) { - match = 1; + match = true; break; } } else if (flags & IPPTOOL_WITH_ALL) { - match = 0; + match = false; break; } } @@ -6381,29 +7512,27 @@ with_value(ipptool_test_t *data, /* I - Test data */ } -/* - * 'with_value_from()' - Test a WITH-VALUE-FROM predicate. - */ +// +// 'with_value_from()' - Test a WITH-VALUE-FROM predicate. +// -static int /* O - 1 on match, 0 on non-match */ +static bool // O - `true` on match, `false` on non-match with_value_from( - cups_array_t *errors, /* I - Errors array */ - ipp_attribute_t *fromattr, /* I - "From" attribute */ - ipp_attribute_t *attr, /* I - Attribute to compare */ - char *matchbuf, /* I - Buffer to hold matching value */ - size_t matchlen) /* I - Length of match buffer */ + cups_array_t *errors, // I - Errors array + ipp_attribute_t *fromattr, // I - "From" attribute + ipp_attribute_t *attr, // I - Attribute to compare + char *matchbuf, // I - Buffer to hold matching value + size_t matchlen) // I - Length of match buffer { - int i, j, /* Looping vars */ - count = ippGetCount(attr), /* Number of attribute values */ - match = 1; /* Match? */ + int i, j, // Looping vars + count = ippGetCount(attr); + // Number of attribute values + bool match = true; // Match? *matchbuf = '\0'; - /* - * Compare the from value(s) to the attribute value(s)... - */ - + // Compare the from value(s) to the attribute value(s)... switch (ippGetValueTag(attr)) { case IPP_TAG_INTEGER : @@ -6413,7 +7542,7 @@ with_value_from( for (i = 0; i < count; i ++) { int value = ippGetInteger(attr, i); - /* Current integer value */ + // Current integer value if (ippContainsInteger(fromattr, value)) { @@ -6423,7 +7552,7 @@ with_value_from( else { add_stringf(errors, "GOT: %s=%d", ippGetName(attr), value); - match = 0; + match = false; } } break; @@ -6435,7 +7564,7 @@ with_value_from( for (i = 0; i < count; i ++) { int value = ippGetInteger(attr, i); - /* Current integer value */ + // Current integer value if (ippContainsInteger(fromattr, value)) { @@ -6445,7 +7574,7 @@ with_value_from( else { add_stringf(errors, "GOT: %s=%d", ippGetName(attr), value); - match = 0; + match = false; } } break; @@ -6456,11 +7585,13 @@ with_value_from( for (i = 0; i < count; i ++) { - int xres, yres; - ipp_res_t units; - int fromcount = ippGetCount(fromattr); - int fromxres, fromyres; - ipp_res_t fromunits; + int xres, yres; // Current X,Y resolution + ipp_res_t units; // Current units + int fromcount = ippGetCount(fromattr); + // From count + int fromxres, fromyres; + // From X,Y resolution + ipp_res_t fromunits; // From units xres = ippGetResolution(attr, i, &yres, &units); @@ -6488,14 +7619,14 @@ with_value_from( else add_stringf(errors, "GOT: %s=%dx%d%s", ippGetName(attr), xres, yres, units == IPP_RES_PER_INCH ? "dpi" : "dpcm"); - match = 0; + match = false; } } break; case IPP_TAG_NOVALUE : case IPP_TAG_UNKNOWN : - return (1); + return (true); case IPP_TAG_CHARSET : case IPP_TAG_KEYWORD : @@ -6509,7 +7640,7 @@ with_value_from( for (i = 0; i < count; i ++) { const char *value = ippGetString(attr, i, NULL); - /* Current string value */ + // Current string value if (ippContainsString(fromattr, value)) { @@ -6519,7 +7650,7 @@ with_value_from( else { add_stringf(errors, "GOT: %s='%s'", ippGetName(attr), value); - match = 0; + match = false; } } break; @@ -6527,9 +7658,10 @@ with_value_from( case IPP_TAG_URI : for (i = 0; i < count; i ++) { - const char *value = ippGetString(attr, i, NULL); - /* Current string value */ - int fromcount = ippGetCount(fromattr); + const char *value = ippGetString(attr, i, NULL); + // Current string value + int fromcount = ippGetCount(fromattr); + // From count for (j = 0; j < fromcount; j ++) { @@ -6544,22 +7676,22 @@ with_value_from( if (j >= fromcount) { add_stringf(errors, "GOT: %s='%s'", ippGetName(attr), value); - match = 0; + match = false; } } break; default : - match = 0; + match = false; break; } return (match); - /* value tag mismatch between fromattr and attr */ + // value tag mismatch between fromattr and attr... wrong_value_tag : add_stringf(errors, "GOT: %s OF-TYPE %s", ippGetName(attr), ippTagString(ippGetValueTag(attr))); - return (0); + return (false); } diff --git a/xcode/CUPS.xcodeproj/project.pbxproj b/xcode/CUPS.xcodeproj/project.pbxproj index 552eaa2d1f..9d98ed4119 100644 --- a/xcode/CUPS.xcodeproj/project.pbxproj +++ b/xcode/CUPS.xcodeproj/project.pbxproj @@ -179,7 +179,6 @@ 270696461CADF3E200FFE5FB /* md5-internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EEE133305BB00FCA411 /* md5-internal.h */; settings = {ATTRIBUTES = (Private, ); }; }; 270696481CADF3E200FFE5FB /* pwg-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EF9133305BB00FCA411 /* pwg-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2706964A1CADF3E200FFE5FB /* string-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F01133305BB00FCA411 /* string-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 2706964B1CADF3E200FFE5FB /* thread-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F04133305BB00FCA411 /* thread-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2706964C1CADF3E200FFE5FB /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F471333063D00FCA411 /* config.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2706964D1CADF3E200FFE5FB /* cups.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EC11333056300FCA411 /* cups.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2706964E1CADF3E200FFE5FB /* dir.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220ED4133305BB00FCA411 /* dir.h */; settings = {ATTRIBUTES = (); }; }; @@ -486,14 +485,24 @@ 279AE6F52395B80F004DD600 /* libpam.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 279AE6F42395B80F004DD600 /* libpam.tbd */; }; 27A034821A8BDC3A00650675 /* lpadmin.c in Sources */ = {isa = PBXBuildFile; fileRef = 2732E08D137A3F5200FAFEF6 /* lpadmin.c */; }; 27A034851A8BDC5C00650675 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 27F515462AAFBECF0045EE21 /* raster-testpage.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F515432AAFBECF0045EE21 /* raster-testpage.h */; }; + 27F515472AAFBECF0045EE21 /* raster-testpage.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F515432AAFBECF0045EE21 /* raster-testpage.h */; }; + 27F515482AAFBECF0045EE21 /* raster-testpage.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F515432AAFBECF0045EE21 /* raster-testpage.h */; }; + 27F515492AAFBECF0045EE21 /* rand.c in Sources */ = {isa = PBXBuildFile; fileRef = 27F515442AAFBECF0045EE21 /* rand.c */; }; + 27F5154A2AAFBECF0045EE21 /* rand.c in Sources */ = {isa = PBXBuildFile; fileRef = 27F515442AAFBECF0045EE21 /* rand.c */; }; + 27F5154B2AAFBECF0045EE21 /* rand.c in Sources */ = {isa = PBXBuildFile; fileRef = 27F515442AAFBECF0045EE21 /* rand.c */; }; + 27F5154C2AAFBECF0045EE21 /* test-internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F515452AAFBECF0045EE21 /* test-internal.h */; }; + 27F5154D2AAFBECF0045EE21 /* test-internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F515452AAFBECF0045EE21 /* test-internal.h */; }; + 27F5154E2AAFBECF0045EE21 /* test-internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F515452AAFBECF0045EE21 /* test-internal.h */; }; + 27F515502AAFCCDA0045EE21 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F5154F2AAFCCDA0045EE21 /* thread.h */; }; + 27F515512AAFCCDA0045EE21 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F5154F2AAFCCDA0045EE21 /* thread.h */; }; + 27F515522AAFCCDA0045EE21 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F5154F2AAFCCDA0045EE21 /* thread.h */; }; 7200511218F492F200E7B81B /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; 720DD6CD1358FD720064AA82 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 720DD6D31358FDDE0064AA82 /* snmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 720DD6D21358FDDE0064AA82 /* snmp.c */; }; 720DD6D413590AB90064AA82 /* ieee1284.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379CA1334000E009631B9 /* ieee1284.c */; }; 720E854320164E7B00C6C411 /* ipp-file.c in Sources */ = {isa = PBXBuildFile; fileRef = 720E854120164E7A00C6C411 /* ipp-file.c */; }; 720E854420164E7B00C6C411 /* ipp-file.c in Sources */ = {isa = PBXBuildFile; fileRef = 720E854120164E7A00C6C411 /* ipp-file.c */; }; - 720E854520164E7B00C6C411 /* ipp-vars.c in Sources */ = {isa = PBXBuildFile; fileRef = 720E854220164E7A00C6C411 /* ipp-vars.c */; }; - 720E854620164E7B00C6C411 /* ipp-vars.c in Sources */ = {isa = PBXBuildFile; fileRef = 720E854220164E7A00C6C411 /* ipp-vars.c */; }; 72220EB61333052D00FCA411 /* adminutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EB51333052D00FCA411 /* adminutil.c */; }; 72220EC41333056300FCA411 /* adminutil.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EB71333056300FCA411 /* adminutil.h */; settings = {ATTRIBUTES = (Public, ); }; }; 72220EC51333056300FCA411 /* array.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EB81333056300FCA411 /* array.c */; }; @@ -557,7 +566,6 @@ 72220F3B133305BB00FCA411 /* string-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F01133305BB00FCA411 /* string-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72220F3C133305BB00FCA411 /* string.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F02133305BB00FCA411 /* string.c */; }; 72220F3D133305BB00FCA411 /* tempfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F03133305BB00FCA411 /* tempfile.c */; }; - 72220F3E133305BB00FCA411 /* thread-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F04133305BB00FCA411 /* thread-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 72220F3F133305BB00FCA411 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F05133305BB00FCA411 /* thread.c */; }; 72220F40133305BB00FCA411 /* transcode.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F06133305BB00FCA411 /* transcode.c */; }; 72220F41133305BB00FCA411 /* transcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F07133305BB00FCA411 /* transcode.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -601,7 +609,6 @@ 722A24F32178D091000CAB20 /* debug-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 722A24F22178D090000CAB20 /* debug-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 722A24F42178D091000CAB20 /* debug-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 722A24F22178D090000CAB20 /* debug-private.h */; }; 722A24F52178D091000CAB20 /* debug-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 722A24F22178D090000CAB20 /* debug-private.h */; }; - 7234F4201378A16F00D3E9C9 /* array-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7234F41F1378A16F00D3E9C9 /* array-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 724379081333E4A5009631B9 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 7243790D1333E4E3009631B9 /* ipp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790A1333E4E3009631B9 /* ipp.c */; }; 7243790E1333E4E3009631B9 /* network.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790B1333E4E3009631B9 /* network.c */; }; @@ -858,7 +865,6 @@ 7253C46C216ED5E500494ADD /* raster-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 2767FC76192696A0000F61D3 /* raster-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 7253C46F216ED69200494ADD /* pwg.h in Headers */ = {isa = PBXBuildFile; fileRef = 2767FC7519269687000F61D3 /* pwg.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7253C470216ED69400494ADD /* pwg.h in Headers */ = {isa = PBXBuildFile; fileRef = 2767FC7519269687000F61D3 /* pwg.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7253C471216ED6C400494ADD /* array-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7234F41F1378A16F00D3E9C9 /* array-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; 7258EAED134594EB009286F1 /* rastertopwg.c in Sources */ = {isa = PBXBuildFile; fileRef = 7258EAEC134594EB009286F1 /* rastertopwg.c */; }; 7258EAF413459B6D009286F1 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; 7258EAF513459B6D009286F1 /* libcupsimage.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A611336F9A3004BB496 /* libcupsimage.dylib */; }; @@ -3197,7 +3203,6 @@ /* Begin PBXFileReference section */ 2706965A1CADF3E200FFE5FB /* libcups_ios.a */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcups_ios.a; sourceTree = BUILT_PRODUCTS_DIR; }; 270B267E17F5C06700C8A3A9 /* tls-gnutls.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tls-gnutls.c"; path = "../cups/tls-gnutls.c"; sourceTree = ""; }; - 270B268117F5C5D600C8A3A9 /* tls-sspi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tls-sspi.c"; path = "../cups/tls-sspi.c"; sourceTree = ""; }; 270CCDA7135E3C9E00007BE2 /* testmime */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testmime; sourceTree = BUILT_PRODUCTS_DIR; }; 270CCDBB135E3D3E00007BE2 /* testmime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testmime.c; path = ../scheduler/testmime.c; sourceTree = ""; }; 270D02241D707E0200EA9403 /* testcreds */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testcreds; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -3340,12 +3345,15 @@ 27A0347B1A8BDB1300650675 /* lpadmin */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lpadmin; sourceTree = BUILT_PRODUCTS_DIR; }; 27C89C902613E7C300A58F43 /* cups-tls.m4 */ = {isa = PBXFileReference; lastKnownFileType = text; name = "cups-tls.m4"; path = "../config-scripts/cups-tls.m4"; sourceTree = ""; }; 27D3037D134148CB00F022B1 /* libcups2.def */ = {isa = PBXFileReference; lastKnownFileType = text; name = libcups2.def; path = ../cups/libcups2.def; sourceTree = ""; }; + 27F515432AAFBECF0045EE21 /* raster-testpage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "raster-testpage.h"; path = "../cups/raster-testpage.h"; sourceTree = ""; }; + 27F515442AAFBECF0045EE21 /* rand.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rand.c; path = ../cups/rand.c; sourceTree = ""; }; + 27F515452AAFBECF0045EE21 /* test-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "test-internal.h"; path = "../cups/test-internal.h"; sourceTree = ""; }; + 27F5154F2AAFCCDA0045EE21 /* thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = thread.h; path = ../cups/thread.h; sourceTree = ""; }; 27F89DA21B3AC43B00E5A4B7 /* testraster.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testraster.c; path = ../cups/testraster.c; sourceTree = ""; }; 27F9A76D28CBFC03002CCEE0 /* tls-openssl.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "tls-openssl.c"; path = "../cups/tls-openssl.c"; sourceTree = ""; }; 720DD6C21358FD5F0064AA82 /* snmp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = snmp; sourceTree = BUILT_PRODUCTS_DIR; }; 720DD6D21358FDDE0064AA82 /* snmp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = snmp.c; path = ../backend/snmp.c; sourceTree = ""; }; 720E854120164E7A00C6C411 /* ipp-file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ipp-file.c"; path = "../cups/ipp-file.c"; sourceTree = ""; }; - 720E854220164E7A00C6C411 /* ipp-vars.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ipp-vars.c"; path = "../cups/ipp-vars.c"; sourceTree = ""; }; 72220EAE1333047D00FCA411 /* libcups.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcups.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; 72220EB51333052D00FCA411 /* adminutil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = adminutil.c; path = ../cups/adminutil.c; sourceTree = ""; }; 72220EB71333056300FCA411 /* adminutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = adminutil.h; path = ../cups/adminutil.h; sourceTree = ""; }; @@ -3411,7 +3419,6 @@ 72220F01133305BB00FCA411 /* string-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "string-private.h"; path = "../cups/string-private.h"; sourceTree = ""; }; 72220F02133305BB00FCA411 /* string.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = string.c; path = ../cups/string.c; sourceTree = ""; }; 72220F03133305BB00FCA411 /* tempfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tempfile.c; path = ../cups/tempfile.c; sourceTree = ""; }; - 72220F04133305BB00FCA411 /* thread-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "thread-private.h"; path = "../cups/thread-private.h"; sourceTree = ""; }; 72220F05133305BB00FCA411 /* thread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = thread.c; path = ../cups/thread.c; sourceTree = ""; }; 72220F06133305BB00FCA411 /* transcode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = transcode.c; path = ../cups/transcode.c; sourceTree = ""; }; 72220F07133305BB00FCA411 /* transcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = transcode.h; path = ../cups/transcode.h; sourceTree = ""; }; @@ -3468,7 +3475,6 @@ 7226369D18AE73BB004ED309 /* config.h.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = config.h.in; path = ../config.h.in; sourceTree = ""; }; 722A24EE2178D00C000CAB20 /* debug-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "debug-internal.h"; path = "../cups/debug-internal.h"; sourceTree = ""; }; 722A24F22178D090000CAB20 /* debug-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "debug-private.h"; path = "../cups/debug-private.h"; sourceTree = ""; }; - 7234F41F1378A16F00D3E9C9 /* array-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "array-private.h"; path = "../cups/array-private.h"; sourceTree = ""; }; 724378FD1333E43E009631B9 /* ipp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ipp; sourceTree = BUILT_PRODUCTS_DIR; }; 724379091333E4E3009631B9 /* backend-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "backend-private.h"; path = "../backend/backend-private.h"; sourceTree = ""; }; 7243790A1333E4E3009631B9 /* ipp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipp.c; path = ../backend/ipp.c; sourceTree = ""; }; @@ -4981,7 +4987,6 @@ 72220EB41333050100FCA411 /* libcups */ = { isa = PBXGroup; children = ( - 272A5C0D2AA41D6B00027F9B /* dnssd.c */, 72220EB51333052D00FCA411 /* adminutil.c */, 72220EB81333056300FCA411 /* array.c */, 72220EBB1333056300FCA411 /* auth.c */, @@ -4990,12 +4995,12 @@ 276683561337A8C5000D33D0 /* cups.strings */, 722A24EE2178D00C000CAB20 /* debug-internal.h */, 72220ED1133305BB00FCA411 /* debug.c */, + 72220ED2133305BB00FCA411 /* dest.c */, 72CF95E018A13543000FCAE4 /* dest-job.c */, 72CF95E118A13543000FCAE4 /* dest-localization.c */, 72CF95E218A13543000FCAE4 /* dest-options.c */, - 72220ED2133305BB00FCA411 /* dest.c */, 72220ED3133305BB00FCA411 /* dir.c */, - 72220ED4133305BB00FCA411 /* dir.h */, + 272A5C0D2AA41D6B00027F9B /* dnssd.c */, 72220ED6133305BB00FCA411 /* encode.c */, 72220ED8133305BB00FCA411 /* file.c */, 72220EDA133305BB00FCA411 /* getdevices.c */, @@ -5003,13 +5008,12 @@ 72220EDC133305BB00FCA411 /* getputfile.c */, 72220EDD133305BB00FCA411 /* globals.c */, 7284F9EF1BFCCD940026F886 /* hash.c */, + 72220EE2133305BB00FCA411 /* http.c */, 72220EDE133305BB00FCA411 /* http-addr.c */, 72220EDF133305BB00FCA411 /* http-addrlist.c */, 72220EE1133305BB00FCA411 /* http-support.c */, - 72220EE2133305BB00FCA411 /* http.c */, 720E854120164E7A00C6C411 /* ipp-file.c */, 72220EE5133305BB00FCA411 /* ipp-support.c */, - 720E854220164E7A00C6C411 /* ipp-vars.c */, 72220EE6133305BB00FCA411 /* ipp.c */, 72220EE8133305BB00FCA411 /* langprintf.c */, 72220EEA133305BB00FCA411 /* language.c */, @@ -5019,6 +5023,7 @@ 72220EF0133305BB00FCA411 /* md5passwd.c */, 72220EF1133305BB00FCA411 /* notify.c */, 72220EF2133305BB00FCA411 /* options.c */, + 72220EF6133305BB00FCA411 /* ppd.c */, 72220EBA1333056300FCA411 /* ppd-attr.c */, 72220EF4133305BB00FCA411 /* ppd-cache.c */, 72220EBF1333056300FCA411 /* ppd-conflicts.c */, @@ -5028,22 +5033,23 @@ 72220EED133305BB00FCA411 /* ppd-mark.c */, 72220EF3133305BB00FCA411 /* ppd-page.c */, 72A8B3D61C188BDE00A1A547 /* ppd-util.c */, - 72220EF6133305BB00FCA411 /* ppd.c */, 72220EF8133305BB00FCA411 /* pwg-media.c */, + 27F515442AAFBECF0045EE21 /* rand.c */, 72F75A691336FA8A004BB496 /* raster-error.c */, 72F75A6A1336FA8A004BB496 /* raster-interpret.c */, 72F75A6B1336FA8A004BB496 /* raster-stream.c */, + 27F515432AAFBECF0045EE21 /* raster-testpage.h */, 72220EFB133305BB00FCA411 /* request.c */, 72220EFC133305BB00FCA411 /* sidechannel.c */, 72220EFF133305BB00FCA411 /* snmp.c */, 72220F00133305BB00FCA411 /* snprintf.c */, 72220F02133305BB00FCA411 /* string.c */, 72220F03133305BB00FCA411 /* tempfile.c */, + 27F515452AAFBECF0045EE21 /* test-internal.h */, 72220F05133305BB00FCA411 /* thread.c */, + 727AD5B619100A58009F6862 /* tls.c */, 270B267E17F5C06700C8A3A9 /* tls-gnutls.c */, 27F9A76D28CBFC03002CCEE0 /* tls-openssl.c */, - 270B268117F5C5D600C8A3A9 /* tls-sspi.c */, - 727AD5B619100A58009F6862 /* tls.c */, 72220F06133305BB00FCA411 /* transcode.c */, 72220F08133305BB00FCA411 /* usersys.c */, 72220F09133305BB00FCA411 /* util.c */, @@ -5059,6 +5065,7 @@ 72220EB91333056300FCA411 /* array.h */, 72220EBE1333056300FCA411 /* backend.h */, 72220EC11333056300FCA411 /* cups.h */, + 72220ED4133305BB00FCA411 /* dir.h */, 272A5C0A2AA41D5A00027F9B /* dnssd.h */, 72220ED9133305BB00FCA411 /* file.h */, 72220EE3133305BB00FCA411 /* http.h */, @@ -5068,6 +5075,7 @@ 2767FC7519269687000F61D3 /* pwg.h */, 72220EFA133305BB00FCA411 /* raster.h */, 72220EFD133305BB00FCA411 /* sidechannel.h */, + 27F5154F2AAFCCDA0045EE21 /* thread.h */, 72220F07133305BB00FCA411 /* transcode.h */, 72220F0A133305BB00FCA411 /* versioning.h */, ); @@ -5078,7 +5086,6 @@ 72220F461333060C00FCA411 /* Private Headers */ = { isa = PBXGroup; children = ( - 7234F41F1378A16F00D3E9C9 /* array-private.h */, 72220F471333063D00FCA411 /* config.h */, 72220EC01333056300FCA411 /* cups-private.h */, 722A24F22178D090000CAB20 /* debug-private.h */, @@ -5091,7 +5098,6 @@ 2767FC76192696A0000F61D3 /* raster-private.h */, 72220EFE133305BB00FCA411 /* snmp-private.h */, 72220F01133305BB00FCA411 /* string-private.h */, - 72220F04133305BB00FCA411 /* thread-private.h */, ); name = "Private Headers"; sourceTree = ""; @@ -5372,11 +5378,12 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 27F515512AAFCCDA0045EE21 /* thread.h in Headers */, 2706963E1CADF3E200FFE5FB /* array.h in Headers */, 7253C469216ED5D400494ADD /* raster.h in Headers */, 722A24F42178D091000CAB20 /* debug-private.h in Headers */, + 27F5154D2AAFBECF0045EE21 /* test-internal.h in Headers */, 270696401CADF3E200FFE5FB /* cups-private.h in Headers */, - 7253C471216ED6C400494ADD /* array-private.h in Headers */, 270696421CADF3E200FFE5FB /* file-private.h in Headers */, 270696431CADF3E200FFE5FB /* http-private.h in Headers */, 270696441CADF3E200FFE5FB /* ipp-private.h in Headers */, @@ -5385,9 +5392,9 @@ 270696481CADF3E200FFE5FB /* pwg-private.h in Headers */, 2706964A1CADF3E200FFE5FB /* string-private.h in Headers */, 7253C46C216ED5E500494ADD /* raster-private.h in Headers */, - 2706964B1CADF3E200FFE5FB /* thread-private.h in Headers */, 2706964C1CADF3E200FFE5FB /* config.h in Headers */, 2706964D1CADF3E200FFE5FB /* cups.h in Headers */, + 27F515472AAFBECF0045EE21 /* raster-testpage.h in Headers */, 722A24F02178D00D000CAB20 /* debug-internal.h in Headers */, 2706964E1CADF3E200FFE5FB /* dir.h in Headers */, 2706964F1CADF3E200FFE5FB /* file.h in Headers */, @@ -5414,8 +5421,11 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 27F515522AAFCCDA0045EE21 /* thread.h in Headers */, + 27F5154E2AAFBECF0045EE21 /* test-internal.h in Headers */, 722A24F52178D091000CAB20 /* debug-private.h in Headers */, 274FF6C61333B1C400317ECB /* dir.h in Headers */, + 27F515482AAFBECF0045EE21 /* raster-testpage.h in Headers */, 722A24F12178D00D000CAB20 /* debug-internal.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -5433,13 +5443,13 @@ 72220F13133305BB00FCA411 /* file.h in Headers */, 72220F1D133305BB00FCA411 /* http.h in Headers */, 72220F21133305BB00FCA411 /* ipp.h in Headers */, + 27F5154C2AAFBECF0045EE21 /* test-internal.h in Headers */, 72220F25133305BB00FCA411 /* language.h in Headers */, 72220F31133305BB00FCA411 /* ppd.h in Headers */, 722A24F32178D091000CAB20 /* debug-private.h in Headers */, 72220F37133305BB00FCA411 /* sidechannel.h in Headers */, 72220F41133305BB00FCA411 /* transcode.h in Headers */, 72220F44133305BB00FCA411 /* versioning.h in Headers */, - 7234F4201378A16F00D3E9C9 /* array-private.h in Headers */, 72220ECD1333056300FCA411 /* cups-private.h in Headers */, 72220F11133305BB00FCA411 /* file-private.h in Headers */, 72220F1A133305BB00FCA411 /* http-private.h in Headers */, @@ -5452,9 +5462,10 @@ 272A5C0B2AA41D5A00027F9B /* dnssd.h in Headers */, 72220F38133305BB00FCA411 /* snmp-private.h in Headers */, 72220F3B133305BB00FCA411 /* string-private.h in Headers */, - 72220F3E133305BB00FCA411 /* thread-private.h in Headers */, 722A24EF2178D00D000CAB20 /* debug-internal.h in Headers */, 72220F481333063D00FCA411 /* config.h in Headers */, + 27F515502AAFCCDA0045EE21 /* thread.h in Headers */, + 27F515462AAFBECF0045EE21 /* raster-testpage.h in Headers */, 7253C468216ED5D300494ADD /* raster.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -7508,6 +7519,7 @@ 270696181CADF3E200FFE5FB /* ipp.c in Sources */, 270696191CADF3E200FFE5FB /* langprintf.c in Sources */, 2706961A1CADF3E200FFE5FB /* language.c in Sources */, + 27F5154A2AAFBECF0045EE21 /* rand.c in Sources */, 2706961D1CADF3E200FFE5FB /* md5.c in Sources */, 2706961E1CADF3E200FFE5FB /* md5passwd.c in Sources */, 2706961F1CADF3E200FFE5FB /* hash.c in Sources */, @@ -7920,7 +7932,6 @@ 274FF68D1333B1C400317ECB /* ppd-attr.c in Sources */, 274FF68E1333B1C400317ECB /* auth.c in Sources */, 274FF68F1333B1C400317ECB /* backchannel.c in Sources */, - 720E854620164E7B00C6C411 /* ipp-vars.c in Sources */, 274FF6901333B1C400317ECB /* backend.c in Sources */, 274FF6911333B1C400317ECB /* ppd-conflicts.c in Sources */, 274FF6921333B1C400317ECB /* ppd-custom.c in Sources */, @@ -7954,6 +7965,7 @@ 274FF6A91333B1C400317ECB /* notify.c in Sources */, 274FF6AA1333B1C400317ECB /* options.c in Sources */, 727AD5B819100A58009F6862 /* tls.c in Sources */, + 27F5154B2AAFBECF0045EE21 /* rand.c in Sources */, 7253C465216ED51500494ADD /* raster-stubs.c in Sources */, 274FF6AB1333B1C400317ECB /* ppd-page.c in Sources */, 7253C456216E980200494ADD /* raster-error.c in Sources */, @@ -8075,7 +8087,6 @@ 72220EC71333056300FCA411 /* ppd-attr.c in Sources */, 727AD5B719100A58009F6862 /* tls.c in Sources */, 72220EC81333056300FCA411 /* auth.c in Sources */, - 720E854520164E7B00C6C411 /* ipp-vars.c in Sources */, 72220EC91333056300FCA411 /* backchannel.c in Sources */, 72220ECA1333056300FCA411 /* backend.c in Sources */, 72220ECC1333056300FCA411 /* ppd-conflicts.c in Sources */, @@ -8100,6 +8111,7 @@ 72220F1C133305BB00FCA411 /* http.c in Sources */, 72CF95E518A13543000FCAE4 /* dest-options.c in Sources */, 72220F1F133305BB00FCA411 /* ipp-support.c in Sources */, + 27F515492AAFBECF0045EE21 /* rand.c in Sources */, 72220F20133305BB00FCA411 /* ipp.c in Sources */, 72220F22133305BB00FCA411 /* langprintf.c in Sources */, 72220F24133305BB00FCA411 /* language.c in Sources */,
Job #NameOwnerStatus
%s:
%s:
%s: