mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
r21861: Pull the comment and location from CUPS if we don't have one
when fetching a printer from ntprinters.tdb.
Slightly modified from original version submitted on
samba-technical ml by Andy Polyakov <appro@fy.chalmers.se>
(This used to be commit e859e1fdcd
)
This commit is contained in:
parent
815fdf23c7
commit
b2bc94eeee
@ -3864,6 +3864,15 @@ static WERROR get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 *info, const char *servern
|
||||
|
||||
fstrcpy(info->printername, printername);
|
||||
|
||||
#ifdef HAVE_CUPS
|
||||
if ( (enum printing_types)lp_printing(snum) == PRINT_CUPS ) {
|
||||
/* Pull the location and comment strings from cups if we don't
|
||||
already have one */
|
||||
if ( !strlen(info->location) || !strlen(info->comment) )
|
||||
cups_pull_comment_location( info );
|
||||
}
|
||||
#endif
|
||||
|
||||
len += unpack_devicemode(&info->devmode,dbuf.dptr+len, dbuf.dsize-len);
|
||||
|
||||
/*
|
||||
|
@ -1198,6 +1198,145 @@ struct printif cups_printif =
|
||||
cups_job_submit,
|
||||
};
|
||||
|
||||
BOOL cups_pull_comment_location(NT_PRINTER_INFO_LEVEL_2 *printer)
|
||||
{
|
||||
http_t *http = NULL; /* HTTP connection to server */
|
||||
ipp_t *request = NULL, /* IPP Request */
|
||||
*response = NULL; /* IPP Response */
|
||||
ipp_attribute_t *attr; /* Current attribute */
|
||||
cups_lang_t *language = NULL; /* Default language */
|
||||
char *name, /* printer-name attribute */
|
||||
*info, /* printer-info attribute */
|
||||
*location; /* printer-location attribute */
|
||||
char uri[HTTP_MAX_URI];
|
||||
static const char *requested[] =/* Requested attributes */
|
||||
{
|
||||
"printer-name",
|
||||
"printer-info",
|
||||
"printer-location"
|
||||
};
|
||||
BOOL ret = False;
|
||||
|
||||
DEBUG(5, ("pulling %s location\n", printer->sharename));
|
||||
|
||||
/*
|
||||
* Make sure we don't ask for passwords...
|
||||
*/
|
||||
|
||||
cupsSetPasswordCB(cups_passwd_cb);
|
||||
|
||||
/*
|
||||
* Try to connect to the server...
|
||||
*/
|
||||
|
||||
if ((http = cups_connect()) == NULL) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
request = ippNew();
|
||||
|
||||
request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES;
|
||||
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);
|
||||
|
||||
slprintf(uri, sizeof(uri) - 1, "ipp://%s/printers/%s",
|
||||
lp_cups_server(), printer->sharename);
|
||||
|
||||
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
|
||||
"printer-uri", NULL, uri);
|
||||
|
||||
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 attributes - %s\n",
|
||||
ippErrorString(cupsLastError())));
|
||||
goto out;
|
||||
}
|
||||
|
||||
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;
|
||||
info = NULL;
|
||||
location = NULL;
|
||||
|
||||
while ( attr && (attr->group_tag == IPP_TAG_PRINTER) ) {
|
||||
/* Grab the comment if we don't have one */
|
||||
if ( (strcmp(attr->name, "printer-info") == 0)
|
||||
&& (attr->value_tag == IPP_TAG_TEXT)
|
||||
&& !strlen(printer->comment) )
|
||||
{
|
||||
DEBUG(5,("cups_pull_comment_location: Using cups comment: %s\n",
|
||||
attr->values[0].string.text));
|
||||
pstrcpy(printer->comment,attr->values[0].string.text);
|
||||
}
|
||||
|
||||
/* Grab the location if we don't have one */
|
||||
if ( (strcmp(attr->name, "printer-location") == 0)
|
||||
&& (attr->value_tag == IPP_TAG_TEXT)
|
||||
&& !strlen(printer->location) )
|
||||
{
|
||||
DEBUG(5,("cups_pull_comment_location: Using cups location: %s\n",
|
||||
attr->values[0].string.text));
|
||||
fstrcpy(printer->location,attr->values[0].string.text);
|
||||
}
|
||||
|
||||
attr = attr->next;
|
||||
}
|
||||
|
||||
/*
|
||||
* See if we have everything needed...
|
||||
*/
|
||||
|
||||
if (name == NULL)
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
ippDelete(response);
|
||||
response = NULL;
|
||||
|
||||
ret = True;
|
||||
|
||||
out:
|
||||
if (response)
|
||||
ippDelete(response);
|
||||
|
||||
if (language)
|
||||
cupsLangFree(language);
|
||||
|
||||
if (http)
|
||||
httpClose(http);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#else
|
||||
/* this keeps fussy compilers happy */
|
||||
void print_cups_dummy(void);
|
||||
|
Loading…
Reference in New Issue
Block a user