#ifndef SERVICES_DEVICE_USB_USB_SERVICE_LINUX_H_
#define SERVICES_DEVICE_USB_USB_SERVICE_LINUX_H_
#include <list>
#include <memory>
#include <string>
#include <unordered_map>
#include "base/memory/weak_ptr.h"
#include "base/threading/sequence_bound.h"
#include "services/device/usb/usb_service.h"
namespace device {
struct UsbDeviceDescriptor;
class UsbDeviceLinux;
class UsbServiceLinux final : public UsbService {
public:
UsbServiceLinux();
UsbServiceLinux(const UsbServiceLinux&) = delete;
UsbServiceLinux& operator=(const UsbServiceLinux&) = delete;
~UsbServiceLinux() override;
void GetDevices(GetDevicesCallback callback) override;
private:
using DeviceMap =
std::unordered_map<std::string, scoped_refptr<UsbDeviceLinux>>;
class BlockingTaskRunnerHelper;
void OnDeviceAdded(const std::string& device_path,
std::unique_ptr<UsbDeviceDescriptor> descriptor);
void DeviceReady(scoped_refptr<UsbDeviceLinux> device);
void OnDeviceRemoved(const std::string& device_path);
void HelperStarted();
bool enumeration_ready() {
return helper_started_ && first_enumeration_countdown_ == 0;
}
bool helper_started_ = false;
uint32_t first_enumeration_countdown_ = 0;
std::list<GetDevicesCallback> enumeration_callbacks_;
base::SequenceBound<BlockingTaskRunnerHelper> helper_;
DeviceMap devices_by_path_;
base::WeakPtrFactory<UsbServiceLinux> weak_factory_{this};
};
}
#endif