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 #include "services/device/serial/serial_device_enumerator.h"
9 #include "base/observer_list.h"
10 #include "base/unguessable_token.h"
11 #include "build/build_config.h"
12 #include "components/device_event_log/device_event_log.h"
14 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
15 #include "services/device/serial/serial_device_enumerator_linux.h"
16 #elif BUILDFLAG(IS_MAC)
17 #include "services/device/serial/serial_device_enumerator_mac.h"
18 #elif BUILDFLAG(IS_WIN)
19 #include "services/device/serial/serial_device_enumerator_win.h"
25 std::unique_ptr<SerialDeviceEnumerator> SerialDeviceEnumerator::Create(
26 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) {
27 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
28 return SerialDeviceEnumeratorLinux::Create();
29 #elif BUILDFLAG(IS_MAC)
30 return std::make_unique<SerialDeviceEnumeratorMac>();
31 #elif BUILDFLAG(IS_WIN)
32 return std::make_unique<SerialDeviceEnumeratorWin>(std::move(ui_task_runner));
34 #error "No implementation of SerialDeviceEnumerator on this platform."
38 SerialDeviceEnumerator::SerialDeviceEnumerator() = default;
40 SerialDeviceEnumerator::~SerialDeviceEnumerator() = default;
42 std::vector<mojom::SerialPortInfoPtr> SerialDeviceEnumerator::GetDevices() {
43 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
45 std::vector<mojom::SerialPortInfoPtr> ports;
46 ports.reserve(ports_.size());
47 for (const auto& map_entry : ports_)
48 ports.push_back(map_entry.second->Clone());
52 void SerialDeviceEnumerator::AddObserver(Observer* observer) {
53 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
54 observer_list_.AddObserver(observer);
57 void SerialDeviceEnumerator::RemoveObserver(Observer* observer) {
58 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
59 observer_list_.RemoveObserver(observer);
62 absl::optional<base::FilePath> SerialDeviceEnumerator::GetPathFromToken(
63 const base::UnguessableToken& token,
64 bool use_alternate_path) {
65 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
67 auto it = ports_.find(token);
68 if (it == ports_.end())
72 if (use_alternate_path)
73 return it->second->alternate_path;
76 return it->second->path;
79 void SerialDeviceEnumerator::AddPort(mojom::SerialPortInfoPtr port) {
80 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
82 base::UnguessableToken token = port->token;
83 auto result = ports_.insert(std::make_pair(token, std::move(port)));
84 DCHECK(result.second); // |ports_| should not already contain |token|.
86 for (auto& observer : observer_list_)
87 observer.OnPortAdded(*result.first->second);
90 void SerialDeviceEnumerator::RemovePort(base::UnguessableToken token) {
91 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
93 auto it = ports_.find(token);
94 DCHECK(it != ports_.end());
95 mojom::SerialPortInfoPtr port = std::move(it->second);
97 SERIAL_LOG(EVENT) << "Serial device removed: path=" << port->path;
101 for (auto& observer : observer_list_)
102 observer.OnPortRemoved(*port);
105 } // namespace device