Upload upstream chromium 108.0.5359.1
[platform/framework/web/chromium-efl.git] / services / device / serial / serial_device_enumerator.cc
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.
4
5 #include "services/device/serial/serial_device_enumerator.h"
6
7 #include <utility>
8
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"
13
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"
20 #endif
21
22 namespace device {
23
24 // static
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));
33 #else
34 #error "No implementation of SerialDeviceEnumerator on this platform."
35 #endif
36 }
37
38 SerialDeviceEnumerator::SerialDeviceEnumerator() = default;
39
40 SerialDeviceEnumerator::~SerialDeviceEnumerator() = default;
41
42 std::vector<mojom::SerialPortInfoPtr> SerialDeviceEnumerator::GetDevices() {
43   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
44
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());
49   return ports;
50 }
51
52 void SerialDeviceEnumerator::AddObserver(Observer* observer) {
53   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
54   observer_list_.AddObserver(observer);
55 }
56
57 void SerialDeviceEnumerator::RemoveObserver(Observer* observer) {
58   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
59   observer_list_.RemoveObserver(observer);
60 }
61
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_);
66
67   auto it = ports_.find(token);
68   if (it == ports_.end())
69     return absl::nullopt;
70
71 #if BUILDFLAG(IS_MAC)
72   if (use_alternate_path)
73     return it->second->alternate_path;
74 #endif
75
76   return it->second->path;
77 }
78
79 void SerialDeviceEnumerator::AddPort(mojom::SerialPortInfoPtr port) {
80   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
81
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|.
85
86   for (auto& observer : observer_list_)
87     observer.OnPortAdded(*result.first->second);
88 }
89
90 void SerialDeviceEnumerator::RemovePort(base::UnguessableToken token) {
91   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
92
93   auto it = ports_.find(token);
94   DCHECK(it != ports_.end());
95   mojom::SerialPortInfoPtr port = std::move(it->second);
96
97   SERIAL_LOG(EVENT) << "Serial device removed: path=" << port->path;
98
99   ports_.erase(it);
100
101   for (auto& observer : observer_list_)
102     observer.OnPortRemoved(*port);
103 }
104
105 }  // namespace device