// Copyright (c) 2012 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 CHROME_BROWSER_EXTENSIONS_API_USB_USB_API_H_ #define CHROME_BROWSER_EXTENSIONS_API_USB_USB_API_H_ #include #include "base/memory/ref_counted.h" #include "chrome/browser/extensions/api/api_function.h" #include "chrome/browser/extensions/api/api_resource_manager.h" #include "chrome/browser/usb/usb_device.h" #include "chrome/common/extensions/api/usb.h" #include "net/base/io_buffer.h" class UsbDevice; namespace extensions { class UsbDeviceResource; class UsbAsyncApiFunction : public AsyncApiFunction { public: UsbAsyncApiFunction(); protected: virtual ~UsbAsyncApiFunction(); virtual bool PrePrepare() OVERRIDE; virtual bool Respond() OVERRIDE; UsbDeviceResource* GetUsbDeviceResource(int api_resource_id); void RemoveUsbDeviceResource(int api_resource_id); void CompleteWithError(const std::string& error); ApiResourceManager* manager_; }; class UsbAsyncApiTransferFunction : public UsbAsyncApiFunction { protected: UsbAsyncApiTransferFunction(); virtual ~UsbAsyncApiTransferFunction(); bool ConvertDirectionSafely(const extensions::api::usb::Direction& input, UsbEndpointDirection* output); bool ConvertRequestTypeSafely(const extensions::api::usb::RequestType& input, UsbDevice::TransferRequestType* output); bool ConvertRecipientSafely(const extensions::api::usb::Recipient& input, UsbDevice::TransferRecipient* output); void OnCompleted(UsbTransferStatus status, scoped_refptr data, size_t length); }; class UsbFindDevicesFunction : public UsbAsyncApiFunction { public: DECLARE_EXTENSION_FUNCTION("usb.findDevices", USB_FINDDEVICES) UsbFindDevicesFunction(); static void SetDeviceForTest(UsbDevice* device); protected: virtual ~UsbFindDevicesFunction(); virtual bool Prepare() OVERRIDE; virtual void AsyncWorkStart() OVERRIDE; private: void OnCompleted(); scoped_ptr result_; std::vector > devices_; scoped_ptr parameters_; }; class UsbListInterfacesFunction : public UsbAsyncApiFunction { public: DECLARE_EXTENSION_FUNCTION("usb.listInterfaces", USB_LISTINTERFACES) UsbListInterfacesFunction(); protected: virtual ~UsbListInterfacesFunction(); virtual bool Prepare() OVERRIDE; virtual void AsyncWorkStart() OVERRIDE; private: void OnCompleted(bool success); bool ConvertDirectionSafely(const UsbEndpointDirection& input, extensions::api::usb::Direction* output); bool ConvertSynchronizationTypeSafely( const UsbSynchronizationType& input, extensions::api::usb::SynchronizationType* output); bool ConvertTransferTypeSafely(const UsbTransferType& input, extensions::api::usb::TransferType* output); bool ConvertUsageTypeSafely(const UsbUsageType& input, extensions::api::usb::UsageType* output); scoped_ptr result_; scoped_refptr config_; scoped_ptr parameters_; }; class UsbCloseDeviceFunction : public UsbAsyncApiFunction { public: DECLARE_EXTENSION_FUNCTION("usb.closeDevice", USB_CLOSEDEVICE) UsbCloseDeviceFunction(); protected: virtual ~UsbCloseDeviceFunction(); virtual bool Prepare() OVERRIDE; virtual void AsyncWorkStart() OVERRIDE; void OnCompleted(); private: scoped_ptr parameters_; }; class UsbClaimInterfaceFunction : public UsbAsyncApiFunction { public: DECLARE_EXTENSION_FUNCTION("usb.claimInterface", USB_CLAIMINTERFACE) UsbClaimInterfaceFunction(); protected: virtual ~UsbClaimInterfaceFunction(); virtual bool Prepare() OVERRIDE; virtual void AsyncWorkStart() OVERRIDE; private: void OnCompleted(bool success); scoped_ptr parameters_; }; class UsbReleaseInterfaceFunction : public UsbAsyncApiFunction { public: DECLARE_EXTENSION_FUNCTION("usb.releaseInterface", USB_RELEASEINTERFACE) UsbReleaseInterfaceFunction(); protected: virtual ~UsbReleaseInterfaceFunction(); virtual bool Prepare() OVERRIDE; virtual void AsyncWorkStart() OVERRIDE; private: void OnCompleted(bool success); scoped_ptr parameters_; }; class UsbSetInterfaceAlternateSettingFunction : public UsbAsyncApiFunction { public: DECLARE_EXTENSION_FUNCTION("usb.setInterfaceAlternateSetting", USB_SETINTERFACEALTERNATESETTING) UsbSetInterfaceAlternateSettingFunction(); private: virtual ~UsbSetInterfaceAlternateSettingFunction(); virtual bool Prepare() OVERRIDE; virtual void AsyncWorkStart() OVERRIDE; void OnCompleted(bool success); scoped_ptr parameters_; }; class UsbControlTransferFunction : public UsbAsyncApiTransferFunction { public: DECLARE_EXTENSION_FUNCTION("usb.controlTransfer", USB_CONTROLTRANSFER) UsbControlTransferFunction(); protected: virtual ~UsbControlTransferFunction(); virtual bool Prepare() OVERRIDE; virtual void AsyncWorkStart() OVERRIDE; private: scoped_ptr parameters_; }; class UsbBulkTransferFunction : public UsbAsyncApiTransferFunction { public: DECLARE_EXTENSION_FUNCTION("usb.bulkTransfer", USB_BULKTRANSFER) UsbBulkTransferFunction(); protected: virtual ~UsbBulkTransferFunction(); virtual bool Prepare() OVERRIDE; virtual void AsyncWorkStart() OVERRIDE; private: scoped_ptr parameters_; }; class UsbInterruptTransferFunction : public UsbAsyncApiTransferFunction { public: DECLARE_EXTENSION_FUNCTION("usb.interruptTransfer", USB_INTERRUPTTRANSFER) UsbInterruptTransferFunction(); protected: virtual ~UsbInterruptTransferFunction(); virtual bool Prepare() OVERRIDE; virtual void AsyncWorkStart() OVERRIDE; private: scoped_ptr parameters_; }; class UsbIsochronousTransferFunction : public UsbAsyncApiTransferFunction { public: DECLARE_EXTENSION_FUNCTION("usb.isochronousTransfer", USB_ISOCHRONOUSTRANSFER) UsbIsochronousTransferFunction(); protected: virtual ~UsbIsochronousTransferFunction(); virtual bool Prepare() OVERRIDE; virtual void AsyncWorkStart() OVERRIDE; private: scoped_ptr parameters_; }; class UsbResetDeviceFunction : public UsbAsyncApiFunction { public: DECLARE_EXTENSION_FUNCTION("usb.resetDevice", USB_RESETDEVICE) UsbResetDeviceFunction(); protected: virtual ~UsbResetDeviceFunction(); virtual bool Prepare() OVERRIDE; virtual void AsyncWorkStart() OVERRIDE; private: // FILE thread. void OnStartResest(UsbDeviceResource* resource); void OnCompletedFileThread(bool success); // IO thread. void OnCompleted(bool success); void OnError(); scoped_ptr parameters_; }; } // namespace extensions #endif // CHROME_BROWSER_EXTENSIONS_API_USB_USB_API_H_