// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef DEVICE_USB_MOJO_DEVICE_IMPL_H_ #define DEVICE_USB_MOJO_DEVICE_IMPL_H_ #include #include #include "base/callback_forward.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observer.h" #include "device/usb/mojo/permission_provider.h" #include "device/usb/public/interfaces/device.mojom.h" #include "device/usb/usb_device.h" #include "device/usb/usb_device_handle.h" #include "mojo/public/cpp/bindings/strong_binding.h" namespace device { namespace usb { class PermissionProvider; // Implementation of the public Device interface. Instances of this class are // constructed by DeviceManagerImpl and are strongly bound to their MessagePipe // lifetime. class DeviceImpl : public mojom::UsbDevice, public device::UsbDevice::Observer { public: static void Create(scoped_refptr device, base::WeakPtr permission_provider, mojom::UsbDeviceRequest request); ~DeviceImpl() override; private: DeviceImpl(scoped_refptr device, base::WeakPtr permission_provider); // Closes the device if it's open. This will always set |device_handle_| to // null. void CloseHandle(); // Checks interface permissions for control transfers. bool HasControlTransferPermission( mojom::UsbControlTransferRecipient recipient, uint16_t index); // Handles completion of an open request. static void OnOpen(base::WeakPtr device, const OpenCallback& callback, scoped_refptr handle); void OnPermissionGrantedForOpen(const OpenCallback& callback, bool granted); // Device implementation: void Open(const OpenCallback& callback) override; void Close(const CloseCallback& callback) override; void SetConfiguration(uint8_t value, const SetConfigurationCallback& callback) override; void ClaimInterface(uint8_t interface_number, const ClaimInterfaceCallback& callback) override; void ReleaseInterface(uint8_t interface_number, const ReleaseInterfaceCallback& callback) override; void SetInterfaceAlternateSetting( uint8_t interface_number, uint8_t alternate_setting, const SetInterfaceAlternateSettingCallback& callback) override; void Reset(const ResetCallback& callback) override; void ClearHalt(uint8_t endpoint, const ClearHaltCallback& callback) override; void ControlTransferIn(mojom::UsbControlTransferParamsPtr params, uint32_t length, uint32_t timeout, const ControlTransferInCallback& callback) override; void ControlTransferOut(mojom::UsbControlTransferParamsPtr params, const std::vector& data, uint32_t timeout, const ControlTransferOutCallback& callback) override; void GenericTransferIn(uint8_t endpoint_number, uint32_t length, uint32_t timeout, const GenericTransferInCallback& callback) override; void GenericTransferOut(uint8_t endpoint_number, const std::vector& data, uint32_t timeout, const GenericTransferOutCallback& callback) override; void IsochronousTransferIn( uint8_t endpoint_number, const std::vector& packet_lengths, uint32_t timeout, const IsochronousTransferInCallback& callback) override; void IsochronousTransferOut( uint8_t endpoint_number, const std::vector& data, const std::vector& packet_lengths, uint32_t timeout, const IsochronousTransferOutCallback& callback) override; // device::UsbDevice::Observer implementation: void OnDeviceRemoved(scoped_refptr device) override; const scoped_refptr device_; base::WeakPtr permission_provider_; ScopedObserver observer_; // The device handle. Will be null before the device is opened and after it // has been closed. scoped_refptr device_handle_; mojo::StrongBindingPtr binding_; base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(DeviceImpl); }; } // namespace usb } // namespace device #endif // DEVICE_USB_MOJO_DEVICE_IMPL_H_