355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * CDDL HEADER START
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * The contents of this file are subject to the terms of the
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Common Development and Distribution License (the "License").
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * You may not use this file except in compliance with the License.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * or http://www.opensolaris.org/os/licensing.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * See the License for the specific language governing permissions
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * and limitations under the License.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * When distributing Covered Code, include this CDDL HEADER in each
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * If applicable, add the following below this CDDL HEADER, with the
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * fields enclosed by brackets "[]" replaced with your own identifying
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * information: Portions Copyright [yyyy] [name of copyright owner]
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * CDDL HEADER END
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
223f6c28404c8d330c123e98936160b8da9a26b2jacobs * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Use is subject to license terms.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/* $Id: printer.c 146 2006-03-24 00:26:54Z njacobs $ */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#pragma ident "%Z%%M% %I% %E% SMI"
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*LINTLIBRARY*/
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdlib.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <papi_impl.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <config-site.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsvoid
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiPrinterFree(papi_printer_t printer)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs printer_t *tmp = printer;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (tmp != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (tmp->attributes != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(tmp->attributes);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(tmp);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsvoid
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiPrinterListFree(papi_printer_t *printers)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (printers != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (i = 0; printers[i] != NULL; i++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiPrinterFree(printers[i]);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(printers);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Enumeration of printers is not part of the IPP specification, so many
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * servers will probably not respond back with a list of printers, but
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * CUPS has implemented an extension to IPP to enumerate printers and
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * classes. the Apache/mod_ipp IPP listener module available in Solaris
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * implements this IPP extension, so CUPS and Solaris can provide this
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * to IPP clients.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifndef OPID_CUPS_GET_PRINTERS /* for servers that will enumerate */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#define OPID_CUPS_GET_PRINTERS 0x4002
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif /* OPID_CUPS_GET_PRINTERS */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifndef OPID_CUPS_DELETE_PRINTER /* for servers that can delete */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#define OPID_CUPS_DELETE_PRINTER 0x4004
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif /* OPID_CUPS_DELETE_PRINTER */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifndef OPID_CUPS_GET_CLASSES /* for servers that will enumerate */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#define OPID_CUPS_GET_CLASSES 0x4005
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif /* OPID_CUPS_GET_CLASSES */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiPrintersList(papi_service_t handle, char **requested_attrs,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_filter_t *filter, papi_printer_t **printers)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t status, result = PAPI_INTERNAL_ERROR;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **request = NULL, **op = NULL, **response = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs void *iter = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((svc == NULL) || (printers == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* if we are already connected, use that connection. */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->connection == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((result = service_connect(svc, DEFAULT_DEST)) != PAPI_OK)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_initialize_request(svc, &request, OPID_CUPS_GET_PRINTERS);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
223f6c28404c8d330c123e98936160b8da9a26b2jacobs ipp_initialize_operational_attributes(svc, &op, NULL, -1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (requested_attrs != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (i = 0; requested_attrs[i] != NULL; i++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(&op, PAPI_ATTR_APPEND,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "requested-attributes", requested_attrs[i]);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "operational-attributes-group", op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_send_request(svc, request, &response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(request);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs op = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (status = papiAttributeListGetCollection(response, &iter,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "printer-attributes-group", &op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status == PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = papiAttributeListGetCollection(response, &iter,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs NULL, &op)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs printer_t *p = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((p = calloc(1, sizeof (*p))) == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_TEMPORARY_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs copy_attributes(&p->attributes, op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs op = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs list_append(printers, p);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiPrinterQuery(papi_service_t handle, char *name,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char **requested_attrs,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **job_attributes,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_printer_t *printer)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_INTERNAL_ERROR;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs printer_t *p = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **request = NULL, **op = NULL, **response = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((svc == NULL) || (name == NULL) || (printer == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* if we are already connected, use that connection. */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->connection == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((result = service_connect(svc, name)) != PAPI_OK)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((*printer = p = calloc(1, sizeof (*p))) == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_TEMPORARY_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_initialize_request(svc, &request, OPID_GET_PRINTER_ATTRIBUTES);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
223f6c28404c8d330c123e98936160b8da9a26b2jacobs ipp_initialize_operational_attributes(svc, &op, name, -1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (requested_attrs != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (i = 0; requested_attrs[i] != NULL; i++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(&op, PAPI_ATTR_APPEND,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "requested-attributes", requested_attrs[i]);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "operational-attributes-group", op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_send_request(svc, request, &response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(request);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs op = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetCollection(response, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "printer-attributes-group", &op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs copy_attributes(&p->attributes, op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobs_printer_enable_disable_pause_resume_delete(papi_service_t handle, char *name,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *message, uint16_t type)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_INTERNAL_ERROR;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **request = NULL, **op = NULL, **response = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((svc == NULL) || (name == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* if we are already connected, use that connection. */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->connection == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((result = service_connect(svc, name)) != PAPI_OK)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_initialize_request(svc, &request, type);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
223f6c28404c8d330c123e98936160b8da9a26b2jacobs ipp_initialize_operational_attributes(svc, &op, name, -1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs switch (type) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case OPID_DISABLE_PRINTER:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(&op, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "printer-message-from-operator", message);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case OPID_PAUSE_PRINTER:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(&op, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "printer-state-message", message);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs default: /* a message value is of no use */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "operational-attributes-group", op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_send_request(svc, request, &response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(request);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiPrinterEnable(papi_service_t handle, char *name)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (_printer_enable_disable_pause_resume_delete(handle, name,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs NULL, OPID_ENABLE_PRINTER));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiPrinterResume(papi_service_t handle, char *name)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (_printer_enable_disable_pause_resume_delete(handle, name,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs NULL, OPID_RESUME_PRINTER));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiPrinterPause(papi_service_t handle, char *name, char *message)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (_printer_enable_disable_pause_resume_delete(handle, name,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs message, OPID_PAUSE_PRINTER));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiPrinterDisable(papi_service_t handle, char *name, char *message)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (_printer_enable_disable_pause_resume_delete(handle, name,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs message, OPID_PAUSE_PRINTER));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * there is no IPP create operation, the set-printer-attibutes operation
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * is the closest we have, so we will assume that the server will create
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * a printer and set attributes if there is none.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiPrinterAdd(papi_service_t handle, char *name,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **attributes, papi_printer_t *printer)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (papiPrinterModify(handle, name, attributes, printer));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiPrinterModify(papi_service_t handle, char *name,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **attributes, papi_printer_t *printer)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_INTERNAL_ERROR;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs printer_t *p = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **request = NULL, **op = NULL, **response = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((svc == NULL) || (name == NULL) || (printer == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* if we are already connected, use that connection. */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->connection == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((result = service_connect(svc, name)) != PAPI_OK)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((*printer = p = calloc(1, sizeof (*p))) == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_TEMPORARY_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_initialize_request(svc, &request, OPID_SET_PRINTER_ATTRIBUTES);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
223f6c28404c8d330c123e98936160b8da9a26b2jacobs ipp_initialize_operational_attributes(svc, &op, name, -1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "operational-attributes-group", op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "printer-attributes-group", attributes);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_send_request(svc, request, &response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(request);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs op = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetCollection(response, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "printer-attributes-group", &op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs copy_attributes(&p->attributes, op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiPrinterRemove(papi_service_t handle, char *name)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (_printer_enable_disable_pause_resume_delete(handle, name,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs NULL, OPID_CUPS_DELETE_PRINTER));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiPrinterPurgeJobs(papi_service_t handle, char *name,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_job_t **jobs)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t status, result = PAPI_INTERNAL_ERROR;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **request = NULL, **op = NULL, **response = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs void *iter = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((svc == NULL) || (name == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* if we are already connected, use that connection. */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->connection == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((result = service_connect(svc, name)) != PAPI_OK)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_initialize_request(svc, &request, OPID_PURGE_JOBS);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
223f6c28404c8d330c123e98936160b8da9a26b2jacobs ipp_initialize_operational_attributes(svc, &op, name, -1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "operational-attributes-group", op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_send_request(svc, request, &response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(request);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs op = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (status = papiAttributeListGetCollection(response, &iter,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "job-attributes-group", &op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status == PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = papiAttributeListGetCollection(response, &iter,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs NULL, &op)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs job_t *j = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((j = calloc(1, sizeof (*j))) == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_TEMPORARY_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs copy_attributes(&j->attributes, op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs op = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs list_append(jobs, j);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiPrinterListJobs(papi_service_t handle, char *name,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char **requested_attrs, int type_mask,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int max_num_jobs, papi_job_t **jobs)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t status, result = PAPI_INTERNAL_ERROR;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **request = NULL, **op = NULL, **response = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs void *iter = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((svc == NULL) || (name == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* if we are already connected, use that connection. */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->connection == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((result = service_connect(svc, name)) != PAPI_OK)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ipp_initialize_request(svc, &request, OPID_GET_JOBS);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
223f6c28404c8d330c123e98936160b8da9a26b2jacobs ipp_initialize_operational_attributes(svc, &op, name, -1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (requested_attrs != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (i = 0; requested_attrs[i] != NULL; i++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(&op, PAPI_ATTR_APPEND,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "requested-attributes", requested_attrs[i]);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddCollection(&request, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "operational-attributes-group", op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_send_request(svc, request, &response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(request);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs op = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (status = papiAttributeListGetCollection(response, &iter,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "job-attributes-group", &op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status == PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = papiAttributeListGetCollection(response, &iter,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs NULL, &op)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs job_t *j = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((j = calloc(1, sizeof (*j))) == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_TEMPORARY_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs copy_attributes(&j->attributes, op);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs op = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs list_append(jobs, j);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(response);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_attribute_t **
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiPrinterGetAttributeList(papi_printer_t printer)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **result = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs printer_t *p = printer;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (p != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = p->attributes;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}