USB transport addon: support for alternate interfaces.
* Tested with a Profilic USB-Parallel adapter and a Laserjet printer.
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user