diff options
Diffstat (limited to 'device/usb/mojo/device_impl.cc')
-rw-r--r-- | device/usb/mojo/device_impl.cc | 173 |
1 files changed, 66 insertions, 107 deletions
diff --git a/device/usb/mojo/device_impl.cc b/device/usb/mojo/device_impl.cc index ae5f4bb..9472571 100644 --- a/device/usb/mojo/device_impl.cc +++ b/device/usb/mojo/device_impl.cc @@ -50,16 +50,6 @@ base::Callback<void(Args...)> WrapMojoCallback( return base::Bind(&CallMojoCallback<Args...>, base::Passed(&callback_ptr)); } -void OnPermissionCheckComplete( - const base::Callback<void(bool)>& callback, - const base::Callback<void(const base::Callback<void(bool)>&)>& action, - bool allowed) { - if (allowed) - action.Run(callback); - else - callback.Run(false); -} - scoped_refptr<net::IOBuffer> CreateTransferBuffer(size_t size) { scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer( std::max(static_cast<size_t>(1u), static_cast<size_t>(size))); @@ -82,27 +72,6 @@ void OnTransferIn(scoped_ptr<MojoTransferInCallback> callback, callback->Run(mojo::ConvertTo<TransferStatus>(status), std::move(data)); } -void OnControlTransferInPermissionCheckComplete( - scoped_refptr<UsbDeviceHandle> device_handle, - ControlTransferParamsPtr params, - int length, - int timeout, - scoped_ptr<Device::ControlTransferInCallback> callback, - bool allowed) { - if (allowed) { - scoped_refptr<net::IOBuffer> buffer = CreateTransferBuffer(length); - device_handle->ControlTransfer( - USB_DIRECTION_INBOUND, - mojo::ConvertTo<UsbDeviceHandle::TransferRequestType>(params->type), - mojo::ConvertTo<UsbDeviceHandle::TransferRecipient>(params->recipient), - params->request, params->value, params->index, buffer, length, timeout, - base::Bind(&OnTransferIn, base::Passed(&callback))); - } else { - mojo::Array<uint8_t> data; - callback->Run(TransferStatus::PERMISSION_DENIED, std::move(data)); - } -} - void OnTransferOut(scoped_ptr<MojoTransferOutCallback> callback, UsbTransferStatus status, scoped_refptr<net::IOBuffer> buffer, @@ -110,28 +79,6 @@ void OnTransferOut(scoped_ptr<MojoTransferOutCallback> callback, callback->Run(mojo::ConvertTo<TransferStatus>(status)); } -void OnControlTransferOutPermissionCheckComplete( - scoped_refptr<UsbDeviceHandle> device_handle, - ControlTransferParamsPtr params, - mojo::Array<uint8_t> data, - int timeout, - scoped_ptr<Device::ControlTransferOutCallback> callback, - bool allowed) { - if (allowed) { - scoped_refptr<net::IOBuffer> buffer = CreateTransferBuffer(data.size()); - const std::vector<uint8_t>& storage = data.storage(); - std::copy(storage.begin(), storage.end(), buffer->data()); - device_handle->ControlTransfer( - USB_DIRECTION_OUTBOUND, - mojo::ConvertTo<UsbDeviceHandle::TransferRequestType>(params->type), - mojo::ConvertTo<UsbDeviceHandle::TransferRecipient>(params->recipient), - params->request, params->value, params->index, buffer, data.size(), - timeout, base::Bind(&OnTransferOut, base::Passed(&callback))); - } else { - callback->Run(TransferStatus::PERMISSION_DENIED); - } -} - mojo::Array<IsochronousPacketPtr> BuildIsochronousPacketArray( mojo::Array<uint32_t> packet_lengths, TransferStatus status) { @@ -177,21 +124,21 @@ void OnIsochronousTransferOut( } // namespace DeviceImpl::DeviceImpl(scoped_refptr<UsbDevice> device, - PermissionProviderPtr permission_provider, + DeviceInfoPtr device_info, + base::WeakPtr<PermissionProvider> permission_provider, mojo::InterfaceRequest<Device> request) : device_(device), + device_info_(std::move(device_info)), + permission_provider_(permission_provider), observer_(this), - permission_provider_(std::move(permission_provider)), binding_(this, std::move(request)), weak_factory_(this) { DCHECK(device_); // This object owns itself and will be destroyed if, - // * the device is disconnected, - // * the message pipe it is bound to is closed, or - // * the PermissionProvider it depends on is unavailable. + // * the device is disconnected or + // * the message pipe it is bound to is closed observer_.Add(device_.get()); binding_.set_connection_error_handler([this]() { delete this; }); - permission_provider_.set_connection_error_handler([this]() { delete this; }); } DeviceImpl::~DeviceImpl() { @@ -204,38 +151,35 @@ void DeviceImpl::CloseHandle() { device_handle_ = nullptr; } -void DeviceImpl::HasControlTransferPermission( +bool DeviceImpl::HasControlTransferPermission( ControlTransferRecipient recipient, - uint16_t index, - const base::Callback<void(bool)>& callback) { + uint16_t index) { DCHECK(device_handle_); const UsbConfigDescriptor* config = device_->GetActiveConfiguration(); + if (!permission_provider_) + return false; + if (recipient == ControlTransferRecipient::INTERFACE || recipient == ControlTransferRecipient::ENDPOINT) { - if (!config) { - callback.Run(false); - return; - } + if (!config) + return false; uint8_t interface_number = index & 0xff; - if (recipient == ControlTransferRecipient::ENDPOINT) { - if (!device_handle_->FindInterfaceByEndpoint(index & 0xff, - &interface_number)) { - callback.Run(false); - return; - } + if (recipient == ControlTransferRecipient::ENDPOINT && + !device_handle_->FindInterfaceByEndpoint(index & 0xff, + &interface_number)) { + return false; } - permission_provider_->HasInterfacePermission( - interface_number, config->configuration_value, - DeviceInfo::From(*device_), callback); + return permission_provider_->HasInterfacePermission( + interface_number, config->configuration_value, *device_info_); } else if (config) { - permission_provider_->HasConfigurationPermission( - config->configuration_value, DeviceInfo::From(*device_), callback); + return permission_provider_->HasConfigurationPermission( + config->configuration_value, *device_info_); } else { // Client must already have device permission to have gotten this far. - callback.Run(true); + return true; } } @@ -246,7 +190,7 @@ void DeviceImpl::OnOpen(const OpenCallback& callback, } void DeviceImpl::GetDeviceInfo(const GetDeviceInfoCallback& callback) { - callback.Run(DeviceInfo::From(*device_)); + callback.Run(device_info_->Clone()); } void DeviceImpl::GetConfiguration(const GetConfigurationCallback& callback) { @@ -274,12 +218,12 @@ void DeviceImpl::SetConfiguration(uint8_t value, return; } - auto set_configuration = - base::Bind(&UsbDeviceHandle::SetConfiguration, device_handle_, value); - permission_provider_->HasConfigurationPermission( - value, DeviceInfo::From(*device_), - base::Bind(&OnPermissionCheckComplete, WrapMojoCallback(callback), - set_configuration)); + if (permission_provider_ && + permission_provider_->HasConfigurationPermission(value, *device_info_)) { + device_handle_->SetConfiguration(value, WrapMojoCallback(callback)); + } else { + callback.Run(false); + } } void DeviceImpl::ClaimInterface(uint8_t interface_number, @@ -295,12 +239,14 @@ void DeviceImpl::ClaimInterface(uint8_t interface_number, return; } - auto claim_interface = base::Bind(&UsbDeviceHandle::ClaimInterface, - device_handle_, interface_number); - permission_provider_->HasInterfacePermission( - interface_number, config->configuration_value, DeviceInfo::From(*device_), - base::Bind(&OnPermissionCheckComplete, WrapMojoCallback(callback), - claim_interface)); + if (permission_provider_ && + permission_provider_->HasInterfacePermission( + interface_number, config->configuration_value, *device_info_)) { + device_handle_->ClaimInterface(interface_number, + WrapMojoCallback(callback)); + } else { + callback.Run(false); + } } void DeviceImpl::ReleaseInterface(uint8_t interface_number, @@ -355,14 +301,20 @@ void DeviceImpl::ControlTransferIn(ControlTransferParamsPtr params, return; } - auto callback_ptr = make_scoped_ptr(new ControlTransferInCallback(callback)); - ControlTransferRecipient recipient = params->recipient; - uint16_t index = params->index; - HasControlTransferPermission( - recipient, index, - base::Bind(&OnControlTransferInPermissionCheckComplete, device_handle_, - base::Passed(¶ms), length, timeout, - base::Passed(&callback_ptr))); + if (HasControlTransferPermission(params->recipient, params->index)) { + scoped_refptr<net::IOBuffer> buffer = CreateTransferBuffer(length); + auto callback_ptr = + make_scoped_ptr(new ControlTransferInCallback(callback)); + device_handle_->ControlTransfer( + USB_DIRECTION_INBOUND, + mojo::ConvertTo<UsbDeviceHandle::TransferRequestType>(params->type), + mojo::ConvertTo<UsbDeviceHandle::TransferRecipient>(params->recipient), + params->request, params->value, params->index, buffer, length, timeout, + base::Bind(&OnTransferIn, base::Passed(&callback_ptr))); + } else { + mojo::Array<uint8_t> data; + callback.Run(TransferStatus::PERMISSION_DENIED, std::move(data)); + } } void DeviceImpl::ControlTransferOut( @@ -375,14 +327,21 @@ void DeviceImpl::ControlTransferOut( return; } - auto callback_ptr = make_scoped_ptr(new ControlTransferOutCallback(callback)); - ControlTransferRecipient recipient = params->recipient; - uint16_t index = params->index; - HasControlTransferPermission( - recipient, index, - base::Bind(&OnControlTransferOutPermissionCheckComplete, device_handle_, - base::Passed(¶ms), base::Passed(&data), timeout, - base::Passed(&callback_ptr))); + if (HasControlTransferPermission(params->recipient, params->index)) { + scoped_refptr<net::IOBuffer> buffer = CreateTransferBuffer(data.size()); + const std::vector<uint8_t>& storage = data.storage(); + std::copy(storage.begin(), storage.end(), buffer->data()); + auto callback_ptr = + make_scoped_ptr(new ControlTransferOutCallback(callback)); + device_handle_->ControlTransfer( + USB_DIRECTION_OUTBOUND, + mojo::ConvertTo<UsbDeviceHandle::TransferRequestType>(params->type), + mojo::ConvertTo<UsbDeviceHandle::TransferRecipient>(params->recipient), + params->request, params->value, params->index, buffer, data.size(), + timeout, base::Bind(&OnTransferOut, base::Passed(&callback_ptr))); + } else { + callback.Run(TransferStatus::PERMISSION_DENIED); + } } void DeviceImpl::GenericTransferIn(uint8_t endpoint_number, |