{
struct winusb_device_priv *priv = _device_priv(dev_handle->dev);
- if (priv->apib->open == NULL) {
- PRINT_UNSUPPORTED_API(open);
- }
+ CHECK_SUPPORTED_API(priv->apib, open);
return priv->apib->open(SUB_API_NOTSET, dev_handle);
}
struct winusb_device_priv *priv = _device_priv(dev_handle->dev);
int r;
- if (priv->apib->claim_interface == NULL) {
- PRINT_UNSUPPORTED_API(claim_interface);
- }
+ CHECK_SUPPORTED_API(priv->apib, claim_interface);
safe_free(priv->usb_interface[iface].endpoint);
priv->usb_interface[iface].nb_endpoints = 0;
struct winusb_device_priv *priv = _device_priv(dev_handle->dev);
int r;
- if (priv->apib->set_interface_altsetting == NULL) {
- PRINT_UNSUPPORTED_API(set_interface_altsetting);
- }
+ CHECK_SUPPORTED_API(priv->apib, set_interface_altsetting);
safe_free(priv->usb_interface[iface].endpoint);
priv->usb_interface[iface].nb_endpoints = 0;
{
struct winusb_device_priv *priv = _device_priv(dev_handle->dev);
- if (priv->apib->release_interface == NULL) {
- PRINT_UNSUPPORTED_API(release_interface);
- }
+ CHECK_SUPPORTED_API(priv->apib, release_interface);
return priv->apib->release_interface(SUB_API_NOTSET, dev_handle, iface);
}
{
struct winusb_device_priv *priv = _device_priv(dev_handle->dev);
- if (priv->apib->clear_halt == NULL) {
- PRINT_UNSUPPORTED_API(clear_halt);
- }
+ CHECK_SUPPORTED_API(priv->apib, clear_halt);
return priv->apib->clear_halt(SUB_API_NOTSET, dev_handle, endpoint);
}
{
struct winusb_device_priv *priv = _device_priv(dev_handle->dev);
- if (priv->apib->reset_device == NULL) {
- PRINT_UNSUPPORTED_API(reset_device);
- }
+ CHECK_SUPPORTED_API(priv->apib, reset_device);
return priv->apib->reset_device(SUB_API_NOTSET, dev_handle);
}
struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev);
- if (priv->apib->abort_control == NULL) {
- PRINT_UNSUPPORTED_API(abort_control);
- }
+ CHECK_SUPPORTED_API(priv->apib, abort_control);
return priv->apib->abort_control(SUB_API_NOTSET, itransfer);
}
struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev);
- if (priv->apib->abort_transfers == NULL) {
- PRINT_UNSUPPORTED_API(abort_transfers);
- }
+ CHECK_SUPPORTED_API(priv->apib, abort_transfers);
return priv->apib->abort_transfers(SUB_API_NOTSET, itransfer);
}
if ((sub_api != SUB_API_LIBUSBK) && (sub_api != SUB_API_LIBUSB0)) {
// iso only supported on libusbk-based backends
PRINT_UNSUPPORTED_API(submit_iso_transfer);
+ return LIBUSB_ERROR_NOT_SUPPORTED;
};
current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint);
} else {
// This should only occur if backend is not set correctly or other backend isoc is partially implemented
PRINT_UNSUPPORTED_API(copy_transfer_data);
+ return LIBUSB_ERROR_NOT_SUPPORTED;
}
}
{
struct winusb_device_priv *priv = _device_priv(dev_handle->dev);
+ CHECK_SUPPORTED_API(priv->usb_interface[iface].apib, claim_interface);
+
return priv->usb_interface[iface].apib->
claim_interface(priv->usb_interface[iface].sub_api, dev_handle, iface);
}
{
struct winusb_device_priv *priv = _device_priv(dev_handle->dev);
+ CHECK_SUPPORTED_API(priv->usb_interface[iface].apib, set_interface_altsetting);
+
return priv->usb_interface[iface].apib->
set_interface_altsetting(priv->usb_interface[iface].sub_api, dev_handle, iface, altsetting);
}
{
struct winusb_device_priv *priv = _device_priv(dev_handle->dev);
+ CHECK_SUPPORTED_API(priv->usb_interface[iface].apib, release_interface);
+
return priv->usb_interface[iface].apib->
release_interface(priv->usb_interface[iface].sub_api, dev_handle, iface);
}
// Try and target a specific interface if the control setup indicates such
if ((iface >= 0) && (iface < USB_MAXINTERFACES)) {
usbi_dbg("attempting control transfer targeted to interface %d", iface);
- if (priv->usb_interface[iface].path != NULL) {
+ if ((priv->usb_interface[iface].path != NULL)
+ && (priv->usb_interface[iface].apib->submit_control_transfer != NULL)) {
r = priv->usb_interface[iface].apib->submit_control_transfer(priv->usb_interface[iface].sub_api, itransfer);
if (r == LIBUSB_SUCCESS)
return r;
// Try a 2 pass approach with all interfaces.
for (pass = 0; pass < 2; pass++) {
for (iface = 0; iface < USB_MAXINTERFACES; iface++) {
- if (priv->usb_interface[iface].path != NULL) {
+ if ((priv->usb_interface[iface].path != NULL)
+ && (priv->usb_interface[iface].apib->submit_control_transfer != NULL)) {
if ((pass == 0) && (priv->usb_interface[iface].restricted_functionality)) {
usbi_dbg("trying to skip restricted interface #%d (HID keyboard or mouse?)", iface);
continue;
return LIBUSB_ERROR_NOT_FOUND;
}
+ CHECK_SUPPORTED_API(priv->usb_interface[current_interface].apib, submit_bulk_transfer);
+
return priv->usb_interface[current_interface].apib->
submit_bulk_transfer(priv->usb_interface[current_interface].sub_api, itransfer);
}
return LIBUSB_ERROR_NOT_FOUND;
}
+ CHECK_SUPPORTED_API(priv->usb_interface[current_interface].apib, submit_iso_transfer);
+
return priv->usb_interface[current_interface].apib->
submit_iso_transfer(priv->usb_interface[current_interface].sub_api, itransfer);
}
return LIBUSB_ERROR_NOT_FOUND;
}
+ CHECK_SUPPORTED_API(priv->usb_interface[current_interface].apib, clear_halt);
+
return priv->usb_interface[current_interface].apib->
clear_halt(priv->usb_interface[current_interface].sub_api, dev_handle, endpoint);
}
return LIBUSB_ERROR_NOT_FOUND;
}
+ CHECK_SUPPORTED_API(priv->usb_interface[current_interface].apib, abort_control);
+
return priv->usb_interface[current_interface].apib->
abort_control(priv->usb_interface[current_interface].sub_api, itransfer);
}
return LIBUSB_ERROR_NOT_FOUND;
}
+ CHECK_SUPPORTED_API(priv->usb_interface[current_interface].apib, abort_transfers);
+
return priv->usb_interface[current_interface].apib->
abort_transfers(priv->usb_interface[current_interface].sub_api, itransfer);
}
struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);
struct winusb_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);
struct winusb_device_priv *priv = _device_priv(transfer->dev_handle->dev);
+ int current_interface = transfer_priv->interface_number;
- return priv->usb_interface[transfer_priv->interface_number].apib->
- copy_transfer_data(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer, io_size);
+ CHECK_SUPPORTED_API(priv->usb_interface[current_interface].apib, copy_transfer_data);
+
+ return priv->usb_interface[current_interface].apib->
+ copy_transfer_data(priv->usb_interface[current_interface].sub_api, itransfer, io_size);
}