113-cups-remote-printing.diff [plain text]
Index: samba/source/printing/print_cups.c
===================================================================
RCS file: /cvs/root/samba/samba/source/printing/print_cups.c,v
retrieving revision 1.1.1.6
diff -u -d -b -r1.1.1.6 print_cups.c
--- samba/source/printing/print_cups.c.orig 2003/12/18 22:01:21 1.1.1.6
+++ samba/source/printing/print_cups.c 2004/06/12 01:56:05
@@ -82,13 +82,18 @@
char *name, /* printer-name attribute */
*make_model, /* printer-make-and-model attribute */
*info; /* printer-info attribute */
+ int remote; /* filter out remote printers and classes */
static const char *requested[] =/* Requested attributes */
{
"printer-name",
"printer-make-and-model",
- "printer-info"
+ "printer-info",
+ "printer-type"
};
+ char* printerprefsfile = "/Library/Preferences/com.apple.printservice.plist";
+ Boolean displayPrinter = true;
+ CFArrayRef smbQarray = NULL;
DEBUG(5,("cups_printer_fn(%p)\n", fn));
@@ -148,8 +153,26 @@
return;
}
+
+ CFDataRef xmlData = NULL;
+ CFURLRef prefsurl = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (const UInt8*)printerprefsfile, (CFIndex)strlen(printerprefsfile), false);
+ Boolean printerprefs = CFURLCreateDataAndPropertiesFromResource(kCFAllocatorDefault, prefsurl, &xmlData, NULL, NULL, NULL);
+ CFStringRef printername = NULL;
+
+ if (printerprefs) {
+ CFPropertyListRef plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, xmlData, kCFPropertyListImmutable, NULL);
+ CFRelease(xmlData);
+ if (plist) {
+ CFDictionaryRef dict = (CFDictionaryRef)plist;
+ smbQarray = (CFArrayRef)CFDictionaryGetValue(dict, CFSTR("smbSharedQueues"));
+ CFRetain(smbQarray);
+ CFRelease(plist);
+ }
+ }
+
for (attr = response->attrs; attr != NULL;)
{
+ displayPrinter = true;
/*
* Skip leading attributes until we hit a printer...
*/
@@ -167,12 +190,13 @@
name = NULL;
make_model = NULL;
info = NULL;
+ remote = 0;
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;
+ info = attr->values[0].string.text; /* printer-name is the CUPS ID */
if (strcmp(attr->name, "printer-make-and-model") == 0 &&
attr->value_tag == IPP_TAG_TEXT)
@@ -180,8 +204,12 @@
if (strcmp(attr->name, "printer-info") == 0 &&
attr->value_tag == IPP_TAG_TEXT)
- info = attr->values[0].string.text;
+ name = attr->values[0].string.text; /* printer-info is the CUPS descriptive name we use for sharing */
+ if (strcmp(attr->name, "printer-type") == 0 &&
+ attr->value_tag == IPP_TAG_ENUM)
+ remote = attr->values[0].integer & CUPS_PRINTER_REMOTE;
+
attr = attr->next;
}
@@ -190,15 +218,28 @@
*/
if (name == NULL)
- break;
+ continue;
+
+ if (remote != 0)
+ continue;
+
+ if (info == NULL)
+ continue;
+
+ if (smbQarray) {
+ printername = CFStringCreateWithCString( kCFAllocatorDefault, info, kCFStringEncodingUTF8 );
+ if (!CFArrayContainsValue (smbQarray, CFRangeMake(0, CFArrayGetCount(smbQarray)), printername))
+ displayPrinter = false;
+ CFRelease(printername);
+ }
+ if (displayPrinter) {
if (info == NULL || !info[0])
(*fn)(name, make_model);
else
(*fn)(name, info);
-
-
}
+ }
ippDelete(response);
@@ -244,6 +285,7 @@
for (attr = response->attrs; attr != NULL;)
{
+ displayPrinter = true;
/*
* Skip leading attributes until we hit a printer...
*/
@@ -261,12 +303,14 @@
name = NULL;
make_model = NULL;
info = NULL;
+ remote = 0;
+
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;
+ info = attr->values[0].string.text; /* printer-name is the CUPS ID */
if (strcmp(attr->name, "printer-make-and-model") == 0 &&
attr->value_tag == IPP_TAG_TEXT)
@@ -274,8 +318,12 @@
if (strcmp(attr->name, "printer-info") == 0 &&
attr->value_tag == IPP_TAG_TEXT)
- info = attr->values[0].string.text;
+ name = attr->values[0].string.text; /* printer-info is the CUPS descriptive name we use for sharing */
+ if (strcmp(attr->name, "printer-type") == 0 &&
+ attr->value_tag == IPP_TAG_ENUM)
+ remote = attr->values[0].integer & CUPS_PRINTER_REMOTE;
+
attr = attr->next;
}
@@ -284,14 +332,27 @@
*/
if (name == NULL)
- break;
+ continue;
+
+ if (remote != 0)
+ continue;
+ if (info == NULL)
+ continue;
+
+ if (smbQarray) {
+ printername = CFStringCreateWithCString( kCFAllocatorDefault, info, kCFStringEncodingUTF8 );
+ if (!CFArrayContainsValue (smbQarray, CFRangeMake(0, CFArrayGetCount(smbQarray)), printername))
+ displayPrinter = false;
+ CFRelease(printername);
+ }
+
+ if (displayPrinter) {
if (info == NULL || !info[0])
(*fn)(name, make_model);
else
(*fn)(name, info);
-
-
+ }
}
ippDelete(response);
@@ -301,6 +362,9 @@
*/
httpClose(http);
+
+ if (smbQarray)
+ CFRelease(smbQarray);
}