USB transport addon: support for alternate interfaces.

* Tested with a Profilic USB-Parallel adapter and a Laserjet printer.
This commit is contained in:
Jérôme Duval
2012-05-03 22:25:40 +02:00
parent 408c7ab11d
commit 91bc463512
@@ -112,16 +112,22 @@ USBPrinterRoster::DeviceAdded(BUSBDevice *dev)
// Try to find a working printer interface in this device // Try to find a working printer interface in this device
if (config) { if (config) {
for (uint32 idx = 0; printer == NULL && idx < config->CountInterfaces(); idx++) { for (uint32 idx = 0; printer == NULL
&& idx < config->CountInterfaces(); idx++) {
const BUSBInterface *interface = config->InterfaceAt(idx); const BUSBInterface *interface = config->InterfaceAt(idx);
if (interface->Class() == PRINTER_INTERFACE_CLASS for (uint32 alt = 0; alt < interface->CountAlternates(); alt++) {
&& interface->Subclass() == PRINTER_INTERFACE_SUBCLASS const BUSBInterface *alternate = interface->AlternateAt(alt);
&& (interface->Protocol() == PIT_UNIDIRECTIONAL if (alternate->Class() == PRINTER_INTERFACE_CLASS
|| interface->Protocol() == PIT_BIDIRECTIONAL && alternate->Subclass() == PRINTER_INTERFACE_SUBCLASS
|| interface->Protocol() == PIT_1284_4_COMPATIBLE)) { && (alternate->Protocol() == PIT_UNIDIRECTIONAL
|| alternate->Protocol() == PIT_BIDIRECTIONAL
|| alternate->Protocol() == PIT_1284_4_COMPATIBLE)) {
// Found a usable Printer interface! // Found a usable Printer interface!
for (uint32 endpointIdx = 0; endpointIdx < interface->CountEndpoints(); endpointIdx++) { for (uint32 endpointIdx = 0;
const BUSBEndpoint *endpoint = interface->EndpointAt(endpointIdx); endpointIdx < alternate->CountEndpoints();
endpointIdx++) {
const BUSBEndpoint *endpoint =
alternate->EndpointAt(endpointIdx);
if (!endpoint->IsBulk()) if (!endpoint->IsBulk())
continue; continue;
@@ -133,12 +139,14 @@ USBPrinterRoster::DeviceAdded(BUSBDevice *dev)
if (!in || !out) if (!in || !out)
continue; continue;
printer = interface; printer = alternate;
((BUSBInterface*)interface)->SetAlternate(alt);
break; break;
} }
} }
} }
} }
}
if (printer != NULL) { if (printer != NULL) {
// We found a working printer interface, lets determine a unique ID // We found a working printer interface, lets determine a unique ID