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,29 +112,37 @@ 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
// Found a usable Printer interface! || alternate->Protocol() == PIT_BIDIRECTIONAL
for (uint32 endpointIdx = 0; endpointIdx < interface->CountEndpoints(); endpointIdx++) { || alternate->Protocol() == PIT_1284_4_COMPATIBLE)) {
const BUSBEndpoint *endpoint = interface->EndpointAt(endpointIdx); // Found a usable Printer interface!
if (!endpoint->IsBulk()) for (uint32 endpointIdx = 0;
continue; endpointIdx < alternate->CountEndpoints();
endpointIdx++) {
const BUSBEndpoint *endpoint =
alternate->EndpointAt(endpointIdx);
if (!endpoint->IsBulk())
continue;
if (endpoint->IsInput()) if (endpoint->IsInput())
in = endpoint; in = endpoint;
else if (endpoint->IsOutput()) else if (endpoint->IsOutput())
out = endpoint; out = endpoint;
if (!in || !out) if (!in || !out)
continue; continue;
printer = interface; printer = alternate;
break; ((BUSBInterface*)interface)->SetAlternate(alt);
break;
}
} }
} }
} }
@@ -168,7 +176,7 @@ USBPrinterRoster::DeviceAdded(BUSBDevice *dev)
} }
void void
USBPrinterRoster::DeviceRemoved(BUSBDevice *dev) USBPrinterRoster::DeviceRemoved(BUSBDevice *dev)
{ {
PrinterMap::Iterator iterator = fPrinters.GetIterator(); PrinterMap::Iterator iterator = fPrinters.GetIterator();
@@ -184,7 +192,7 @@ USBPrinterRoster::DeviceRemoved(BUSBDevice *dev)
} }
status_t status_t
USBPrinterRoster::ListPrinters(BMessage *msg) USBPrinterRoster::ListPrinters(BMessage *msg)
{ {
PrinterMap::Iterator iterator = fPrinters.GetIterator(); PrinterMap::Iterator iterator = fPrinters.GetIterator();
@@ -206,7 +214,7 @@ USBPrinter::USBPrinter(const BString& id, const BString& name,
//TODO: see usb_printer.cpp for error handling during read/write! //TODO: see usb_printer.cpp for error handling during read/write!
ssize_t ssize_t
USBPrinter::Write(const void *buf, size_t size) USBPrinter::Write(const void *buf, size_t size)
{ {
if (!buf || size <= 0) if (!buf || size <= 0)
@@ -229,20 +237,20 @@ USBPrinter::Read(void *buf, size_t size)
// Implementation of transport add-on interface // Implementation of transport add-on interface
BDataIO * BDataIO *
instantiate_transport(BDirectory *printer, BMessage *msg) instantiate_transport(BDirectory *printer, BMessage *msg)
{ {
USBTransport *transport = new(std::nothrow) USBTransport(printer, msg); USBTransport *transport = new(std::nothrow) USBTransport(printer, msg);
if (transport != NULL && transport->InitCheck() == B_OK) if (transport != NULL && transport->InitCheck() == B_OK)
return transport; return transport;
delete transport; delete transport;
return NULL; return NULL;
} }
// List detected printers // List detected printers
status_t status_t
list_transport_ports(BMessage *msg) list_transport_ports(BMessage *msg)
{ {
USBPrinterRoster roster; USBPrinterRoster roster;
@@ -253,7 +261,7 @@ list_transport_ports(BMessage *msg)
// Implementation of USBTransport // Implementation of USBTransport
USBTransport::USBTransport(BDirectory *printer, BMessage *msg) USBTransport::USBTransport(BDirectory *printer, BMessage *msg)
: fPrinter(NULL) : fPrinter(NULL)
{ {
BString key; BString key;