From f4733888873da451813f542284aa86869f266256 Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Tue, 28 Jan 2003 01:58:38 +0000 Subject: CUPS-PRINTER_CLASS patch from Michael Sweet (This used to be commit 8d0bde43156f5511df7a5a6865b361ebc2a933eb) --- source3/printing/print_cups.c | 103 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 2 deletions(-) (limited to 'source3/printing') diff --git a/source3/printing/print_cups.c b/source3/printing/print_cups.c index cc3941fe96..0c86c69ffd 100644 --- a/source3/printing/print_cups.c +++ b/source3/printing/print_cups.c @@ -1,7 +1,7 @@ /* * Support code for the Common UNIX Printing System ("CUPS") * - * Copyright 1999-2001 by Michael R Sweet. + * Copyright 1999-2003 by Michael R Sweet. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -194,12 +194,111 @@ void cups_printer_fn(void (*fn)(char *, char *)) if (info == NULL || !info[0]) (*fn)(name, make_model); else - (*fn)(name,info); + (*fn)(name, info); } ippDelete(response); + + + /* + * Build a CUPS_GET_CLASSES request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * requested-attributes + */ + + request = ippNew(); + + request->request.op.operation_id = CUPS_GET_CLASSES; + request->request.op.request_id = 1; + + language = cupsLangDefault(); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, + "attributes-charset", NULL, cupsLangEncoding(language)); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, + "attributes-natural-language", NULL, language->language); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requested-attributes", + (sizeof(requested) / sizeof(requested[0])), + NULL, requested); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/")) == NULL) + { + DEBUG(0,("Unable to get printer list - %s\n", + ippErrorString(cupsLastError()))); + httpClose(http); + return; + } + + for (attr = response->attrs; attr != NULL;) + { + /* + * Skip leading attributes until we hit a printer... + */ + + while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER) + attr = attr->next; + + if (attr == NULL) + break; + + /* + * Pull the needed attributes from this printer... + */ + + name = NULL; + make_model = NULL; + info = NULL; + + while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER) + { + if (strcmp(attr->name, "printer-name") == 0 && + attr->value_tag == IPP_TAG_NAME) + name = attr->values[0].string.text; + + if (strcmp(attr->name, "printer-make-and-model") == 0 && + attr->value_tag == IPP_TAG_TEXT) + make_model = attr->values[0].string.text; + + if (strcmp(attr->name, "printer-info") == 0 && + attr->value_tag == IPP_TAG_TEXT) + info = attr->values[0].string.text; + + attr = attr->next; + } + + /* + * See if we have everything needed... + */ + + if (name == NULL) + break; + + if (info == NULL || !info[0]) + (*fn)(name, make_model); + else + (*fn)(name, info); + + + } + + ippDelete(response); + + /* + * Close the connection to the server... + */ + httpClose(http); } -- cgit