common: Fix querying of the IEEE1284 string when per-interface classes are used.
This commit is contained in:
parent
5ce907636f
commit
546dad9fae
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
#include "backend_common.h"
|
#include "backend_common.h"
|
||||||
|
|
||||||
#define BACKEND_VERSION "0.69"
|
#define BACKEND_VERSION "0.70"
|
||||||
#ifndef URI_PREFIX
|
#ifndef URI_PREFIX
|
||||||
#error "Must Define URI_PREFIX"
|
#error "Must Define URI_PREFIX"
|
||||||
#endif
|
#endif
|
||||||
|
@ -361,9 +361,14 @@ static int print_scan_output(struct libusb_device *device,
|
||||||
char buf[256];
|
char buf[256];
|
||||||
char *product = NULL, *serial = NULL, *manuf = NULL, *descr = NULL;
|
char *product = NULL, *serial = NULL, *manuf = NULL, *descr = NULL;
|
||||||
int iface = 0; // XXX loop through interfaces
|
int iface = 0; // XXX loop through interfaces
|
||||||
|
int altset = 0; // XXX loop through altsetting
|
||||||
|
struct libusb_config_descriptor *config = NULL;
|
||||||
int dlen = 0;
|
int dlen = 0;
|
||||||
struct deviceid_dict dict[MAX_DICT];
|
struct deviceid_dict dict[MAX_DICT];
|
||||||
char *ieee_id = NULL;
|
char *ieee_id = NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
uint8_t endp_up = 0, endp_down = 0;
|
||||||
|
|
||||||
DEBUG("Probing VID: %04X PID: %04x\n", desc->idVendor, desc->idProduct);
|
DEBUG("Probing VID: %04X PID: %04x\n", desc->idVendor, desc->idProduct);
|
||||||
|
|
||||||
|
@ -381,8 +386,27 @@ static int print_scan_output(struct libusb_device *device,
|
||||||
goto abort_close;
|
goto abort_close;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (libusb_get_active_config_descriptor(device, &config)) {
|
||||||
|
found = -1;
|
||||||
|
goto abort_release;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find the endpoints */
|
||||||
|
for (i = 0 ; i < config->interface[iface].altsetting[altset].bNumEndpoints ; i++) {
|
||||||
|
if ((config->interface[iface].altsetting[altset].endpoint[i].bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) == LIBUSB_TRANSFER_TYPE_BULK) {
|
||||||
|
if (config->interface[iface].altsetting[altset].endpoint[i].bEndpointAddress & LIBUSB_ENDPOINT_IN)
|
||||||
|
endp_up = config->interface[iface].altsetting[altset].endpoint[i].bEndpointAddress;
|
||||||
|
else
|
||||||
|
endp_down = config->interface[iface].altsetting[altset].endpoint[i].bEndpointAddress;
|
||||||
|
}
|
||||||
|
if (endp_up && endp_down)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* Query IEEE1284 info only if it's a PRINTER class */
|
/* Query IEEE1284 info only if it's a PRINTER class */
|
||||||
if (desc->bDeviceClass == LIBUSB_CLASS_PRINTER) {
|
if (desc->bDeviceClass == LIBUSB_CLASS_PRINTER ||
|
||||||
|
(desc->bDeviceClass == LIBUSB_CLASS_PER_INTERFACE &&
|
||||||
|
config->interface[iface].altsetting[altset].bInterfaceClass == LIBUSB_CLASS_PRINTER)) {
|
||||||
ieee_id = get_device_id(dev, iface);
|
ieee_id = get_device_id(dev, iface);
|
||||||
dlen = parse1284_data(ieee_id, dict);
|
dlen = parse1284_data(ieee_id, dict);
|
||||||
}
|
}
|
||||||
|
@ -462,30 +486,10 @@ static int print_scan_output(struct libusb_device *device,
|
||||||
sanitize_string(buf);
|
sanitize_string(buf);
|
||||||
serial = url_encode(buf);
|
serial = url_encode(buf);
|
||||||
} else if (backend->query_serno) { /* Get from backend hook */
|
} else if (backend->query_serno) { /* Get from backend hook */
|
||||||
struct libusb_config_descriptor *config = NULL;
|
|
||||||
|
|
||||||
int i;
|
|
||||||
uint8_t endp_up = 0, endp_down = 0;
|
|
||||||
libusb_get_active_config_descriptor(device, &config);
|
|
||||||
// XXX loop through altsettings!
|
|
||||||
for (i = 0 ; i < config->interface[0].altsetting[0].bNumEndpoints ; i++) {
|
|
||||||
if ((config->interface[0].altsetting[0].endpoint[i].bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) == LIBUSB_TRANSFER_TYPE_BULK) {
|
|
||||||
if (config->interface[0].altsetting[0].endpoint[i].bEndpointAddress & LIBUSB_ENDPOINT_IN)
|
|
||||||
endp_up = config->interface[0].altsetting[0].endpoint[i].bEndpointAddress;
|
|
||||||
else
|
|
||||||
endp_down = config->interface[0].altsetting[0].endpoint[i].bEndpointAddress;
|
|
||||||
}
|
|
||||||
if (endp_up && endp_down)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf[0] = 0;
|
buf[0] = 0;
|
||||||
/* Ignore result since a failure isn't critical here */
|
/* Ignore result since a failure isn't critical here */
|
||||||
backend->query_serno(dev, endp_up, endp_down, buf, STR_LEN_MAX);
|
backend->query_serno(dev, endp_up, endp_down, buf, STR_LEN_MAX);
|
||||||
serial = url_encode(buf);
|
serial = url_encode(buf);
|
||||||
|
|
||||||
if (config)
|
|
||||||
libusb_free_config_descriptor(config);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!serial || !strlen(serial)) { /* Last-ditch */
|
if (!serial || !strlen(serial)) { /* Last-ditch */
|
||||||
|
@ -529,8 +533,14 @@ static int print_scan_output(struct libusb_device *device,
|
||||||
if(descr) free(descr);
|
if(descr) free(descr);
|
||||||
if(ieee_id) free(ieee_id);
|
if(ieee_id) free(ieee_id);
|
||||||
|
|
||||||
|
if (config) libusb_free_config_descriptor(config);
|
||||||
|
|
||||||
|
abort_release:
|
||||||
|
|
||||||
libusb_release_interface(dev, iface);
|
libusb_release_interface(dev, iface);
|
||||||
|
|
||||||
abort_close:
|
abort_close:
|
||||||
|
|
||||||
libusb_close(dev);
|
libusb_close(dev);
|
||||||
abort:
|
abort:
|
||||||
/* Clean up the dictionary */
|
/* Clean up the dictionary */
|
||||||
|
@ -739,13 +749,16 @@ int main (int argc, char **argv)
|
||||||
uint8_t endp_up = 0;
|
uint8_t endp_up = 0;
|
||||||
uint8_t endp_down = 0;
|
uint8_t endp_down = 0;
|
||||||
|
|
||||||
|
int iface = 0; // XXX loop through interfaces
|
||||||
|
int altset = 0; // XXX loop through altsetting
|
||||||
|
|
||||||
int data_fd = fileno(stdin);
|
int data_fd = fileno(stdin);
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
int claimed;
|
int claimed;
|
||||||
|
|
||||||
int ret = CUPS_BACKEND_OK;
|
int ret = CUPS_BACKEND_OK;
|
||||||
int iface = 0; // XXX loop through interfaces
|
|
||||||
int found = -1;
|
int found = -1;
|
||||||
int jobid = 0;
|
int jobid = 0;
|
||||||
int current_page = 0;
|
int current_page = 0;
|
||||||
|
@ -916,13 +929,12 @@ int main (int argc, char **argv)
|
||||||
goto done_close;
|
goto done_close;
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX loop through altsettings!
|
for (i = 0 ; i < config->interface[iface].altsetting[altset].bNumEndpoints ; i++) {
|
||||||
for (i = 0 ; i < config->interface[0].altsetting[0].bNumEndpoints ; i++) {
|
if ((config->interface[iface].altsetting[altset].endpoint[i].bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) == LIBUSB_TRANSFER_TYPE_BULK) {
|
||||||
if ((config->interface[0].altsetting[0].endpoint[i].bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) == LIBUSB_TRANSFER_TYPE_BULK) {
|
if (config->interface[iface].altsetting[altset].endpoint[i].bEndpointAddress & LIBUSB_ENDPOINT_IN)
|
||||||
if (config->interface[0].altsetting[0].endpoint[i].bEndpointAddress & LIBUSB_ENDPOINT_IN)
|
endp_up = config->interface[iface].altsetting[altset].endpoint[i].bEndpointAddress;
|
||||||
endp_up = config->interface[0].altsetting[0].endpoint[i].bEndpointAddress;
|
|
||||||
else
|
else
|
||||||
endp_down = config->interface[0].altsetting[0].endpoint[i].bEndpointAddress;
|
endp_down = config->interface[iface].altsetting[altset].endpoint[i].bEndpointAddress;
|
||||||
}
|
}
|
||||||
if (endp_up && endp_down)
|
if (endp_up && endp_down)
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue