#ifndef SERVICES_DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_H_
#define SERVICES_DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_H_
#include <map>
#include <memory>
#include <optional>
#include <vector>
#include "base/observer_list.h"
#include "base/sequence_checker.h"
#include "base/task/single_thread_task_runner.h"
#include "base/unguessable_token.h"
#include "services/device/public/mojom/serial.mojom.h"
#include "services/device/serial/serial_io_handler.h"
namespace base {
class FilePath;
}
namespace device {
class SerialDeviceEnumerator {
public:
class Observer : public base::CheckedObserver {
public:
virtual void OnPortAdded(const mojom::SerialPortInfo& port) = 0;
virtual void OnPortRemoved(const mojom::SerialPortInfo& port) = 0;
virtual void OnPortConnectedStateChanged(
const mojom::SerialPortInfo& port) = 0;
};
static std::unique_ptr<SerialDeviceEnumerator> Create(
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner);
SerialDeviceEnumerator();
virtual ~SerialDeviceEnumerator();
std::vector<mojom::SerialPortInfoPtr> GetDevices();
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
std::optional<base::FilePath> GetPathFromToken(
const base::UnguessableToken& token,
bool use_alternate_path);
protected:
void AddPort(mojom::SerialPortInfoPtr port);
void RemovePort(base::UnguessableToken token);
void UpdatePortConnectedState(base::UnguessableToken token,
bool is_connected);
SEQUENCE_CHECKER(sequence_checker_);
private:
std::map<base::UnguessableToken, mojom::SerialPortInfoPtr> ports_;
base::ObserverList<Observer> observer_list_;
};
}
#endif