// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef EXTENSIONS_BROWSER_API_USB_USB_DEVICE_RESOURCE_H_
#define EXTENSIONS_BROWSER_API_USB_USB_DEVICE_RESOURCE_H_

#include <string>

#include "content/public/browser/browser_thread.h"
#include "extensions/browser/api/api_resource.h"
#include "extensions/browser/api/api_resource_manager.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/device/public/mojom/usb_device.mojom.h"

namespace extensions {

// A UsbDeviceResource is an ApiResource wrapper for a
// mojo::Remote<device::mojom::UsbDevice> and its guid.
class UsbDeviceResource : public ApiResource {
 public:
  static const content::BrowserThread::ID kThreadId =
      content::BrowserThread::UI;

  UsbDeviceResource(const std::string& owner_extension_id,
                    const std::string& guid,
                    mojo::Remote<device::mojom::UsbDevice> device);

  UsbDeviceResource(const UsbDeviceResource&) = delete;
  UsbDeviceResource& operator=(const UsbDeviceResource&) = delete;

  ~UsbDeviceResource() override;

  device::mojom::UsbDevice* device() const {
    return device_ ? device_.get() : nullptr;
  }
  const std::string& guid() const { return guid_; }

  bool IsPersistent() const override;

 private:
  friend class ApiResourceManager<UsbDeviceResource>;
  static const char* service_name() { return "UsbDeviceResourceManager"; }

  void OnConnectionError();

  const std::string guid_;
  mojo::Remote<device::mojom::UsbDevice> device_;
};

}  // namespace extensions

#endif  // EXTENSIONS_BROWSER_API_USB_USB_DEVICE_RESOURCE_H_
