1 // Copyright 2014 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef SERVICES_DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_H_
6 #define SERVICES_DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_H_
12 #include "base/observer_list.h"
13 #include "base/sequence_checker.h"
14 #include "base/unguessable_token.h"
15 #include "services/device/public/mojom/serial.mojom.h"
16 #include "services/device/serial/serial_io_handler.h"
17 #include "third_party/abseil-cpp/absl/types/optional.h"
25 // Discovers and enumerates serial devices available to the host.
26 class SerialDeviceEnumerator {
28 class Observer : public base::CheckedObserver {
30 virtual void OnPortAdded(const mojom::SerialPortInfo& port) = 0;
31 virtual void OnPortRemoved(const mojom::SerialPortInfo& port) = 0;
34 static std::unique_ptr<SerialDeviceEnumerator> Create(
35 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner);
37 SerialDeviceEnumerator();
38 virtual ~SerialDeviceEnumerator();
40 std::vector<mojom::SerialPortInfoPtr> GetDevices();
41 void AddObserver(Observer* observer);
42 void RemoveObserver(Observer* observer);
44 absl::optional<base::FilePath> GetPathFromToken(
45 const base::UnguessableToken& token,
46 bool use_alternate_path);
49 // These helper methods take care of managing |ports_| and notifying
50 // observers. |port|s passed to AddPort() must be unique and the |token|
51 // passed to RemovePort() must have previously been added.
52 void AddPort(mojom::SerialPortInfoPtr port);
53 void RemovePort(base::UnguessableToken token);
55 SEQUENCE_CHECKER(sequence_checker_);
58 std::map<base::UnguessableToken, mojom::SerialPortInfoPtr> ports_;
59 base::ObserverList<Observer> observer_list_;
64 #endif // SERVICES_DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_H_