From: Michael R Sweet Date: Mon, 19 Apr 2021 12:44:29 +0000 (-0400) Subject: Mirror USB serial number change to macOS USB backend. X-Git-Tag: v2.4b1~138 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f3e223366e746deaa4e2bca51d96f65338eecb86;p=thirdparty%2Fcups.git Mirror USB serial number change to macOS USB backend. --- diff --git a/backend/usb-darwin.c b/backend/usb-darwin.c index 6bf4ba5668..7c25905319 100644 --- a/backend/usb-darwin.c +++ b/backend/usb-darwin.c @@ -1670,11 +1670,34 @@ static CFStringRef copy_printer_interface_deviceid(printer_interface_t printer, CFStringAppendFormat(extras, NULL, CFSTR("MDL:%@;"), model); } - if (serial == NULL && desc.iSerialNumber != 0) + if (desc.iSerialNumber != 0) { - serial = copy_printer_interface_indexed_description(printer, desc.iSerialNumber, kUSBLanguageEnglish); - if (serial && CFStringGetLength(serial) > 0) - CFStringAppendFormat(extras, NULL, CFSTR("SERN:%@;"), serial); + // Always look at the USB serial number since some printers + // incorrectly include a bogus static serial number in their + // IEEE-1284 device ID string... + CFStringRef userial = copy_printer_interface_indexed_description(printer, desc.iSerialNumber, kUSBLanguageEnglish); + if (userial && CFStringGetLength(userial) > 0 && (serial == NULL || CFStringCompare(serial, userial, kCFCompareCaseInsensitive) != kCFCompareEqualTo)) + { + if (serial != NULL) + { + // 1284 serial number doesn't match USB serial number, so replace the existing SERN: in device ID + CFRange range = CFStringFind(ret, serial, 0); + CFMutableStringRef deviceIDString = CFStringCreateMutableCopy(NULL, 0, ret); + CFStringReplace(deviceIDString, range, userial); + CFRelease(ret); + ret = deviceIDString; + + CFRelease(serial); + } + else + { + // No 1284 serial number so add SERN: with USB serial number to device ID + CFStringAppendFormat(extras, NULL, CFSTR("SERN:%@;"), userial); + } + serial = userial; + } + else if (userial != NULL) + CFRelease(userial); } if (ret != NULL) @@ -1693,18 +1716,18 @@ static CFStringRef copy_printer_interface_deviceid(printer_interface_t printer, if (ret != NULL) { - /* Remove special characters from the serial number */ - CFRange range = (serial != NULL ? CFStringFind(serial, CFSTR("+"), 0) : CFRangeMake(0, 0)); - if (range.length == 1) - { - range = CFStringFind(ret, serial, 0); + /* Remove special characters from the serial number */ + CFRange range = (serial != NULL ? CFStringFind(serial, CFSTR("+"), 0) : CFRangeMake(0, 0)); + if (range.length == 1) + { + range = CFStringFind(ret, serial, 0); - CFMutableStringRef deviceIDString = CFStringCreateMutableCopy(NULL, 0, ret); - CFRelease(ret); + CFMutableStringRef deviceIDString = CFStringCreateMutableCopy(NULL, 0, ret); + CFRelease(ret); - ret = deviceIDString; - CFStringFindAndReplace(deviceIDString, CFSTR("+"), CFSTR(""), range, 0); - } + ret = deviceIDString; + CFStringFindAndReplace(deviceIDString, CFSTR("+"), CFSTR(""), range, 0); + } } if (manufacturer != NULL)