diff options
Diffstat (limited to 'usr/src/lib/print/libpapi-ipp/common/job.c')
-rw-r--r-- | usr/src/lib/print/libpapi-ipp/common/job.c | 666 |
1 files changed, 0 insertions, 666 deletions
diff --git a/usr/src/lib/print/libpapi-ipp/common/job.c b/usr/src/lib/print/libpapi-ipp/common/job.c deleted file mode 100644 index 65575d44db..0000000000 --- a/usr/src/lib/print/libpapi-ipp/common/job.c +++ /dev/null @@ -1,666 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - * - */ - -/* $Id: job.c 148 2006-04-25 16:54:17Z njacobs $ */ - - -/*LINTLIBRARY*/ - -#include <stdlib.h> -#include <errno.h> -#include <string.h> -#include <papi_impl.h> -#include <fcntl.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <libintl.h> - -#ifndef OPID_CUPS_MOVE_JOB -#define OPID_CUPS_MOVE_JOB 0x400D -#endif - -void -papiJobFree(papi_job_t job) -{ - job_t *tmp = (job_t *)job; - - if (tmp != NULL) { - if (tmp->attributes != NULL) - papiAttributeListFree(tmp->attributes); - free(tmp); - } -} - -void -papiJobListFree(papi_job_t *jobs) -{ - if (jobs != NULL) { - int i; - - for (i = 0; jobs[i] != NULL; i++) - papiJobFree(jobs[i]); - free(jobs); - } -} - -papi_attribute_t ** -papiJobGetAttributeList(papi_job_t job) -{ - papi_attribute_t **result = NULL; - job_t *j = job; - - if (j != NULL) - result = j->attributes; - - return (result); -} - -char * -papiJobGetPrinterName(papi_job_t job) -{ - char *result = NULL; - job_t *j = job; - - if (j != NULL) - (void) papiAttributeListGetString(j->attributes, NULL, - "printer-name", &result); - - return (result); -} - -int32_t -papiJobGetId(papi_job_t job) -{ - int32_t result = -1; - job_t *j = job; - - if (j != NULL) - (void) papiAttributeListGetInteger(j->attributes, NULL, - "job-id", &result); - - return (result); -} - -papi_job_ticket_t * -papiJobGetJobTicket(papi_job_t job) -{ - papi_job_ticket_t *result = NULL; - - return (result); -} - -static void -populate_job_request(service_t *svc, papi_attribute_t ***request, - papi_attribute_t **attributes, char *printer, uint16_t type) -{ - papi_attribute_t **operational = NULL, **job = NULL; - static char *operational_names[] = { - "job-name", "ipp-attribute-fidelity", "document-name", - "compression", "document-format", "document-natural-language", - "job-k-octets", "job-impressions", "job-media-sheets", NULL - }; - - /* create the base IPP request */ - ipp_initialize_request(svc, request, type); - - /* create an operational attributes group */ - ipp_initialize_operational_attributes(svc, &operational, printer, -1); - - /* split up the attributes into operational and job attributes */ - split_and_copy_attributes(operational_names, attributes, - &operational, &job); - - /* add the operational attributes group to the request */ - papiAttributeListAddCollection(request, PAPI_ATTR_REPLACE, - "operational-attributes-group", operational); - papiAttributeListFree(operational); - - /* add the job attributes group to the request */ - if (job != NULL) { - /* - * Add job-originating-host-name to attributes - * if not already set. - */ - char *hostname = NULL; - - papiAttributeListGetString(job, NULL, - "job-originating-host-name", &hostname); - - if (hostname == NULL) { - char host[BUFSIZ]; - - if (gethostname(host, sizeof (host)) == 0) - papiAttributeListAddString(&job, PAPI_ATTR_EXCL, - "job-originating-host-name", host); - } - - papiAttributeListAddCollection(request, PAPI_ATTR_REPLACE, - "job-attributes-group", job); - papiAttributeListFree(job); - } -} - -static papi_status_t -send_document_uri(service_t *svc, char *file, papi_attribute_t **attributes, - char *printer, int32_t id, char last, uint16_t type) -{ - papi_status_t result = PAPI_INTERNAL_ERROR; - papi_attribute_t **request = NULL, **op = NULL, **response = NULL; - - /* create the base IPP request */ - ipp_initialize_request(svc, &request, type); - - /* create an operational attributes group */ - ipp_initialize_operational_attributes(svc, &op, printer, id); - - papiAttributeListAddString(&op, PAPI_ATTR_REPLACE, "document-name", - file); - papiAttributeListAddBoolean(&op, PAPI_ATTR_REPLACE, "last-document", - (last ? PAPI_TRUE : PAPI_FALSE)); - papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE, - "operational-attributes-group", op); - papiAttributeListFree(op); - - /* send the IPP request to the server */ - result = ipp_send_request_with_file(svc, request, &response, file); - papiAttributeListFree(request); - papiAttributeListFree(response); - - return (result); -} - -typedef enum {_WITH_DATA, _BY_REFERENCE, _VALIDATE} call_type_t; - -papi_status_t -internal_job_submit(papi_service_t handle, char *printer, - papi_attribute_t **job_attributes, - papi_job_ticket_t *job_ticket, - char **files, papi_job_t *job, - call_type_t call_type) -{ - papi_status_t result = PAPI_INTERNAL_ERROR; - service_t *svc = handle; - struct stat statbuf; - job_t *j = NULL; - int i; - uint16_t req_type = OPID_PRINT_JOB; - uint16_t data_type = OPID_SEND_DOCUMENT; - papi_attribute_t **request = NULL, **response = NULL; - - if ((svc == NULL) || (printer == NULL) || (job == NULL)) - return (PAPI_BAD_ARGUMENT); - - switch (call_type) { - case _BY_REFERENCE: -#ifdef SOME_DAY_WE_WILL_BE_ABLE_TO_USE_URIS_FOR_JOB_DATA - /* - * For the time being, this is disabled. There are a number - * of issues to be dealt with before we can send a URI - * across the network to the server. For example, the file - * name(s) passed in are most likely relative to the current - * hosts filesystem. They also most likely will require some - * form of authentication information to be passed with the - * URI. - */ - req_type = OPID_PRINT_URI; - req_type = OPID_SEND_URI; -#endif - /* fall-through */ - case _WITH_DATA: - if ((files == NULL) || (files[0] == NULL)) - return (PAPI_BAD_ARGUMENT); - - if (files[1] != NULL) /* more than 1 file */ - req_type = OPID_CREATE_JOB; - - break; - case _VALIDATE: - req_type = OPID_VALIDATE_JOB; - /* if we have files, validate access to them */ - if (files != NULL) { - for (i = 0; files[i] != NULL; i++) { - if (access(files[i], R_OK) < 0) { - detailed_error(svc, "%s: %s", files[i], - strerror(errno)); - return (PAPI_DOCUMENT_ACCESS_ERROR); - } - - if (strcmp("standard input", files[i]) != 0) { - if (stat(files[i], &statbuf) < 0) { - detailed_error(svc, gettext( - "Cannot access file: %s:" - " %s"), files[i], - strerror(errno)); - return ( - PAPI_DOCUMENT_ACCESS_ERROR); - } - if (statbuf.st_size == 0) { - detailed_error(svc, - "Zero byte (empty) file: " - "%s", - files[i]); - return (PAPI_BAD_ARGUMENT); - } - } - } - files = NULL; - } - break; - } - - /* if we are already connected, use that connection. */ - if (svc->connection == NULL) - if ((result = service_connect(svc, printer)) != PAPI_OK) - return (result); - - if ((*job = j = calloc(1, sizeof (*j))) == NULL) - return (PAPI_TEMPORARY_ERROR); - - /* - * before creating IPP request - * add the job-name - */ - if ((files != NULL) && (files[0] != NULL)) - papiAttributeListAddString(&job_attributes, PAPI_ATTR_EXCL, - "job-name", files[0]); - - /* create IPP request */ - populate_job_request(svc, &request, job_attributes, printer, req_type); - - switch (req_type) { - case OPID_PRINT_JOB: - result = ipp_send_request_with_file(svc, request, &response, - files[0]); - break; - case OPID_CREATE_JOB: - case OPID_VALIDATE_JOB: - case OPID_PRINT_URI: - result = ipp_send_request(svc, request, &response); - break; - } - papiAttributeListFree(request); - - if (result == PAPI_OK) { - papi_attribute_t **op = NULL; - - /* retrieve the job attributes */ - papiAttributeListGetCollection(response, NULL, - "job-attributes-group", &op); - copy_attributes(&j->attributes, op); - - if (req_type == OPID_CREATE_JOB) { - int32_t id = 0; - - papiAttributeListGetInteger(j->attributes, NULL, - "job-id", &id); - /* send each document */ - for (i = 0; ((result == PAPI_OK) && (files[i] != NULL)); - i++) - result = send_document_uri(svc, files[i], - job_attributes, - printer, id, (files[i+1]?0:1), - data_type); - } - } - papiAttributeListFree(response); - - return (result); -} - -papi_status_t -papiJobSubmit(papi_service_t handle, char *printer, - papi_attribute_t **job_attributes, - papi_job_ticket_t *job_ticket, char **files, papi_job_t *job) -{ - return (internal_job_submit(handle, printer, job_attributes, - job_ticket, files, job, _WITH_DATA)); -} - -papi_status_t -papiJobSubmitByReference(papi_service_t handle, char *printer, - papi_attribute_t **job_attributes, - papi_job_ticket_t *job_ticket, char **files, papi_job_t *job) -{ - return (internal_job_submit(handle, printer, job_attributes, - job_ticket, files, job, _BY_REFERENCE)); -} - -papi_status_t -papiJobValidate(papi_service_t handle, char *printer, - papi_attribute_t **job_attributes, - papi_job_ticket_t *job_ticket, char **files, papi_job_t *job) -{ - return (internal_job_submit(handle, printer, job_attributes, - job_ticket, files, job, _VALIDATE)); -} - -papi_status_t -papiJobStreamOpen(papi_service_t handle, char *printer, - papi_attribute_t **job_attributes, - papi_job_ticket_t *job_ticket, papi_stream_t *stream) -{ - papi_status_t result = PAPI_INTERNAL_ERROR; - papi_attribute_t **request = NULL; - service_t *svc = handle; - - if ((svc == NULL) || (printer == NULL) || (stream == NULL)) - return (PAPI_BAD_ARGUMENT); - - /* if we are already connected, use that connection. */ - if (svc->connection == NULL) - if ((result = service_connect(svc, printer)) != PAPI_OK) - return (result); - - papiAttributeListAddString(&job_attributes, PAPI_ATTR_EXCL, - "job-name", "standard input"); - - /* create job request */ - populate_job_request(svc, &request, job_attributes, printer, - OPID_PRINT_JOB); - - *stream = svc->connection; - - result = ipp_send_initial_request_block(svc, request, 0); - papiAttributeListFree(request); - - return (result); -} - -papi_status_t -papiJobStreamWrite(papi_service_t handle, - papi_stream_t stream, void *buffer, size_t buflen) -{ - papi_status_t result = PAPI_OK; - service_t *svc = handle; - size_t rc; - -#ifdef DEBUG - printf("papiJobStreamWrite(0x%8.8x, 0x%8.8x, 0x%8.8x, %d)\n", - handle, stream, buffer, buflen); - httpDumpData(stdout, "papiJobStreamWrite:", buffer, buflen); -#endif - - if ((svc == NULL) || (stream == NULL) || (buffer == NULL) || - (buflen == 0)) - return (PAPI_BAD_ARGUMENT); - - while ((result == PAPI_OK) && (buflen > 0)) { - rc = ipp_request_write(svc, buffer, buflen); - if (rc < 0) - result = PAPI_TEMPORARY_ERROR; - else { - buffer = (char *)buffer + rc; - buflen -= rc; - } - } - -#ifdef DEBUG - printf("papiJobStreamWrite(): %s\n", papiStatusString(result)); -#endif - - return (result); -} - -papi_status_t -papiJobStreamClose(papi_service_t handle, - papi_stream_t stream, papi_job_t *job) -{ - papi_status_t result = PAPI_INTERNAL_ERROR; - http_status_t status = HTTP_CONTINUE; - service_t *svc = handle; - papi_attribute_t **response = NULL; - job_t *j = NULL; - - if ((svc == NULL) || (stream == NULL) || (job == NULL)) - return (PAPI_BAD_ARGUMENT); - - if ((*job = j = calloc(1, sizeof (*j))) == NULL) - return (PAPI_TEMPORARY_ERROR); - - (void) ipp_request_write(svc, "", 0); - - /* update our connection info */ - while (status == HTTP_CONTINUE) - status = httpUpdate(svc->connection); - - if (status != HTTP_OK) - return (http_to_papi_status(status)); - httpWait(svc->connection, 1000); - - /* read the IPP response */ - result = ipp_read_message(&ipp_request_read, svc, &response, - IPP_TYPE_RESPONSE); - if (result == PAPI_OK) - result = ipp_status_info(svc, response); - - if (result == PAPI_OK) { - papi_attribute_t **op = NULL; - - papiAttributeListGetCollection(response, NULL, - "job-attributes-group", &op); - copy_attributes(&j->attributes, op); - } - papiAttributeListFree(response); - - return (result); -} - -papi_status_t -papiJobQuery(papi_service_t handle, char *printer, int32_t job_id, - char **requested_attrs, - papi_job_t *job) -{ - papi_status_t result = PAPI_INTERNAL_ERROR; - service_t *svc = handle; - job_t *j = NULL; - papi_attribute_t **request = NULL, **op = NULL, **response = NULL; - - if ((svc == NULL) || (printer == NULL)) - return (PAPI_BAD_ARGUMENT); - - /* if we are already connected, use that connection. */ - if (svc->connection == NULL) - if ((result = service_connect(svc, printer)) != PAPI_OK) - return (result); - - if ((*job = j = calloc(1, sizeof (*j))) == NULL) - return (PAPI_TEMPORARY_ERROR); - - ipp_initialize_request(svc, &request, OPID_GET_JOB_ATTRIBUTES); - - ipp_initialize_operational_attributes(svc, &op, printer, job_id); - - if (requested_attrs != NULL) { - int i; - - for (i = 0; requested_attrs[i] != NULL; i++) - papiAttributeListAddString(&op, PAPI_ATTR_APPEND, - "requested-attributes", requested_attrs[i]); - } - - papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE, - "operational-attributes-group", op); - papiAttributeListFree(op); - result = ipp_send_request(svc, request, &response); - papiAttributeListFree(request); - - op = NULL; - papiAttributeListGetCollection(response, NULL, - "job-attributes-group", &op); - copy_attributes(&j->attributes, op); - papiAttributeListFree(response); - - return (result); -} - -/* papiJob{Cancel|Hold|Release|Restart|Promote} are all the same */ -static papi_status_t -_job_cancel_hold_release_restart_promote(papi_service_t handle, - char *printer, int32_t job_id, uint16_t type) -{ - papi_status_t result = PAPI_INTERNAL_ERROR; - service_t *svc = handle; - papi_attribute_t **request = NULL, **op = NULL, **response = NULL; - - if ((svc == NULL) || (printer == NULL) || (job_id < 0)) - return (PAPI_BAD_ARGUMENT); - - /* if we are already connected, use that connection. */ - if (svc->connection == NULL) - if ((result = service_connect(svc, printer)) != PAPI_OK) - return (result); - - ipp_initialize_request(svc, &request, type); - - ipp_initialize_operational_attributes(svc, &op, printer, job_id); - - papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE, - "operational-attributes-group", op); - papiAttributeListFree(op); - result = ipp_send_request(svc, request, &response); - papiAttributeListFree(request); - papiAttributeListFree(response); - - return (result); -} - -papi_status_t -papiJobCancel(papi_service_t handle, char *printer, int32_t job_id) -{ - return (_job_cancel_hold_release_restart_promote(handle, printer, - job_id, OPID_CANCEL_JOB)); -} - - -papi_status_t -papiJobHold(papi_service_t handle, char *printer, int32_t job_id) -{ - return (_job_cancel_hold_release_restart_promote(handle, printer, - job_id, OPID_HOLD_JOB)); -} - -papi_status_t -papiJobRelease(papi_service_t handle, char *printer, int32_t job_id) -{ - return (_job_cancel_hold_release_restart_promote(handle, printer, - job_id, OPID_RELEASE_JOB)); -} - -papi_status_t -papiJobRestart(papi_service_t handle, char *printer, int32_t job_id) -{ - return (_job_cancel_hold_release_restart_promote(handle, printer, - job_id, OPID_RESTART_JOB)); -} - -papi_status_t -papiJobPromote(papi_service_t handle, char *printer, int32_t job_id) -{ - return (_job_cancel_hold_release_restart_promote(handle, printer, - job_id, OPID_PROMOTE_JOB)); -} - -papi_status_t -papiJobMove(papi_service_t handle, char *printer, int32_t job_id, - char *destination) -{ - papi_status_t result = PAPI_INTERNAL_ERROR; - service_t *svc = handle; - papi_attribute_t **request = NULL, **op = NULL, **response = NULL; - - if ((svc == NULL) || (printer == NULL) || (job_id < 0) || - (destination == NULL)) - return (PAPI_BAD_ARGUMENT); - - /* if we are already connected, use that connection. */ - if (svc->connection == NULL) - if ((result = service_connect(svc, printer)) != PAPI_OK) - return (result); - - ipp_initialize_request(svc, &request, OPID_CUPS_MOVE_JOB); - - ipp_initialize_operational_attributes(svc, &op, printer, job_id); - - papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE, - "operational-attributes-group", op); - papiAttributeListFree(op); - - op = NULL; - papiAttributeListAddString(&op, PAPI_ATTR_EXCL, - "job-printer-uri", destination); - papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE, - "job-attributes-group", op); - papiAttributeListFree(op); - - result = ipp_send_request(svc, request, &response); - papiAttributeListFree(request); - papiAttributeListFree(response); - - return (result); -} - -papi_status_t -papiJobModify(papi_service_t handle, char *printer, int32_t job_id, - papi_attribute_t **attributes, papi_job_t *job) -{ - papi_status_t result = PAPI_INTERNAL_ERROR; - service_t *svc = handle; - papi_attribute_t **request = NULL, **op = NULL, **response = NULL; - job_t *j = NULL; - - if ((svc == NULL) || (printer == NULL) || (job_id < 0) || - (attributes == NULL)) - return (PAPI_BAD_ARGUMENT); - - if ((*job = j = calloc(1, sizeof (*j))) == NULL) - return (PAPI_TEMPORARY_ERROR); - - /* if we are already connected, use that connection. */ - if (svc->connection == NULL) - if ((result = service_connect(svc, printer)) != PAPI_OK) - return (result); - - ipp_initialize_request(svc, &request, OPID_SET_JOB_ATTRIBUTES); - - ipp_initialize_operational_attributes(svc, &op, printer, job_id); - - papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE, - "operational-attributes-group", op); - papiAttributeListFree(op); - papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE, - "job-attributes-group", attributes); - result = ipp_send_request(svc, request, &response); - papiAttributeListFree(request); - - op = NULL; - papiAttributeListGetCollection(response, NULL, - "job-attributes-group", &op); - copy_attributes(&j->attributes, op); - papiAttributeListFree(response); - - return (result); -} |