#ifndef SERVICES_DEVICE_USB_USB_DEVICE_H_
#define SERVICES_DEVICE_USB_USB_DEVICE_H_
#include <stdint.h>
#include <list>
#include <memory>
#include <string>
#include <vector>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/observer_list.h"
#include "base/strings/string_util.h"
#include "services/device/usb/usb_descriptors.h"
#include "url/gurl.h"
namespace device {
class UsbDeviceHandle;
class UsbDevice : public base::RefCountedThreadSafe<UsbDevice> {
public:
using OpenCallback = base::OnceCallback<void(scoped_refptr<UsbDeviceHandle>)>;
using ResultCallback = base::OnceCallback<void(bool success)>;
class Observer {
public:
virtual ~Observer();
virtual void OnDeviceRemoved(scoped_refptr<UsbDevice> device);
};
UsbDevice(const UsbDevice&) = delete;
UsbDevice& operator=(const UsbDevice&) = delete;
const mojom::UsbDeviceInfo& device_info() const { return *device_info_; }
const std::string& guid() const { return device_info_->guid; }
uint32_t bus_number() const { return device_info_->bus_number; }
uint32_t port_number() const { return device_info_->port_number; }
uint8_t device_class() const { return device_info_->class_code; }
uint8_t device_subclass() const { return device_info_->subclass_code; }
uint8_t device_protocol() const { return device_info_->protocol_code; }
uint16_t vendor_id() const { return device_info_->vendor_id; }
uint16_t product_id() const { return device_info_->product_id; }
uint16_t usb_version() const;
uint16_t device_version() const;
const std::u16string& manufacturer_string() const {
if (device_info_->manufacturer_name)
return *device_info_->manufacturer_name;
return base::EmptyString16();
}
const std::u16string& product_string() const {
if (device_info_->product_name)
return *device_info_->product_name;
return base::EmptyString16();
}
const std::u16string& serial_number() const {
if (device_info_->serial_number)
return *device_info_->serial_number;
return base::EmptyString16();
}
const GURL& webusb_landing_page() const {
if (device_info_->webusb_landing_page)
return *device_info_->webusb_landing_page;
return GURL::EmptyGURL();
}
const std::vector<mojom::UsbConfigurationInfoPtr>& configurations() const {
return device_info_->configurations;
}
const mojom::UsbConfigurationInfo* GetActiveConfiguration() const;
virtual void CheckUsbAccess(ResultCallback callback);
virtual void RequestPermission(ResultCallback callback);
virtual bool permission_granted() const;
virtual void Open(OpenCallback callback) = 0;
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
protected:
friend class UsbService;
UsbDevice(uint32_t bus_number, uint32_t port_number);
explicit UsbDevice(mojom::UsbDeviceInfoPtr device_info);
UsbDevice(uint16_t usb_version,
uint8_t device_class,
uint8_t device_subclass,
uint8_t device_protocol,
uint16_t vendor_id,
uint16_t product_id,
uint16_t device_version,
const std::u16string& manufacturer_string,
const std::u16string& product_string,
const std::u16string& serial_number,
uint32_t bus_number,
uint32_t port_number);
virtual ~UsbDevice();
void ActiveConfigurationChanged(int configuration_value);
void NotifyDeviceRemoved();
std::list<raw_ptr<UsbDeviceHandle, CtnExperimental>>& handles() {
return handles_;
}
mojom::UsbDeviceInfoPtr device_info_;
private:
friend class base::RefCountedThreadSafe<UsbDevice>;
friend class UsbDeviceHandleImpl;
friend class UsbDeviceHandleMac;
friend class UsbDeviceHandleUsbfs;
friend class UsbDeviceHandleUsbfsTest;
friend class UsbDeviceHandleWin;
friend class UsbServiceAndroid;
friend class UsbServiceImpl;
friend class UsbServiceLinux;
friend class UsbServiceMac;
friend class UsbServiceWin;
void OnDisconnect();
void HandleClosed(UsbDeviceHandle* handle);
std::list<raw_ptr<UsbDeviceHandle, CtnExperimental>> handles_;
base::ObserverList<Observer, true>::Unchecked observer_list_;
};
}
#endif