OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdint.h> | 5 #include <stdint.h> |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <memory> | 8 #include <memory> |
9 #include <set> | 9 #include <set> |
10 #include <utility> | 10 #include <utility> |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 void RemoveObserver(UsbPrinterDetector::Observer* observer) override { | 100 void RemoveObserver(UsbPrinterDetector::Observer* observer) override { |
101 observer_list_->RemoveObserver(observer); | 101 observer_list_->RemoveObserver(observer); |
102 } | 102 } |
103 | 103 |
104 // PrinterDetector interface function. | 104 // PrinterDetector interface function. |
105 std::vector<Printer> GetPrinters() override { | 105 std::vector<Printer> GetPrinters() override { |
106 base::AutoLock auto_lock(pp_lock_); | 106 base::AutoLock auto_lock(pp_lock_); |
107 return GetPrintersLocked(); | 107 return GetPrintersLocked(); |
108 } | 108 } |
109 | 109 |
| 110 void Start() override { |
| 111 started_ = true; |
| 112 observer_list_->Notify(FROM_HERE, |
| 113 &PrinterDetector::Observer::OnPrintersFound, |
| 114 GetPrintersLocked()); |
| 115 observer_list_->Notify(FROM_HERE, |
| 116 &PrinterDetector::Observer::OnPrinterScanComplete); |
| 117 } |
| 118 |
110 private: | 119 private: |
111 std::vector<Printer> GetPrintersLocked() { | 120 std::vector<Printer> GetPrintersLocked() { |
112 pp_lock_.AssertAcquired(); | 121 pp_lock_.AssertAcquired(); |
113 std::vector<Printer> printers; | 122 std::vector<Printer> printers; |
114 printers.reserve(present_printers_.size()); | 123 printers.reserve(present_printers_.size()); |
115 for (const auto& entry : present_printers_) { | 124 for (const auto& entry : present_printers_) { |
116 printers.push_back(*entry.second); | 125 printers.push_back(*entry.second); |
117 } | 126 } |
118 return printers; | 127 return printers; |
119 } | 128 } |
(...skipping 16 matching lines...) Expand all Loading... |
136 // UsbService::observer override. | 145 // UsbService::observer override. |
137 void OnDeviceRemoved(scoped_refptr<device::UsbDevice> device) override { | 146 void OnDeviceRemoved(scoped_refptr<device::UsbDevice> device) override { |
138 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 147 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
139 if (!UsbDeviceIsPrinter(*device)) { | 148 if (!UsbDeviceIsPrinter(*device)) { |
140 return; | 149 return; |
141 } | 150 } |
142 | 151 |
143 base::AutoLock auto_lock(pp_lock_); | 152 base::AutoLock auto_lock(pp_lock_); |
144 if (base::ContainsKey(present_printers_, device->guid())) { | 153 if (base::ContainsKey(present_printers_, device->guid())) { |
145 present_printers_.erase(device->guid()); | 154 present_printers_.erase(device->guid()); |
146 auto printers = GetPrintersLocked(); | 155 if (started_) { |
147 // We already have pp_lock_, so need to call the pre-locked version of | 156 auto printers = GetPrintersLocked(); |
148 // GetPrinters to prevent deadlock. | 157 // We already have pp_lock_, so need to call the pre-locked version of |
149 observer_list_->Notify( | 158 // GetPrinters to prevent deadlock. |
150 FROM_HERE, | 159 observer_list_->Notify(FROM_HERE, |
151 &UsbPrinterDetector::Observer::OnAvailableUsbPrintersChanged, | 160 &PrinterDetector::Observer::OnPrintersFound, |
152 GetPrintersLocked()); | 161 GetPrintersLocked()); |
| 162 } |
153 } else { | 163 } else { |
154 // If the device has been removed but it's not in present_printers_, it | 164 // If the device has been removed but it's not in present_printers_, it |
155 // must still be in the setup flow. | 165 // must still be in the setup flow. |
156 deferred_printer_removals_.insert(device->guid()); | 166 deferred_printer_removals_.insert(device->guid()); |
157 } | 167 } |
158 } | 168 } |
159 | 169 |
160 // If this device is a printer and we haven't already tried to set it up, | 170 // If this device is a printer and we haven't already tried to set it up, |
161 // starts the process of setting the printer up. |hotplugged| | 171 // starts the process of setting the printer up. |hotplugged| |
162 // should be true if this was plugged in during the session. | 172 // should be true if this was plugged in during the session. |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 // tells the user automatic setup failed and offers to open the CUPS printer | 277 // tells the user automatic setup failed and offers to open the CUPS printer |
268 // configuration settings. | 278 // configuration settings. |
269 | 279 |
270 if (base::ContainsKey(deferred_printer_removals_, data->device->guid())) { | 280 if (base::ContainsKey(deferred_printer_removals_, data->device->guid())) { |
271 // The device was removed before we finished the flow, so just don't add | 281 // The device was removed before we finished the flow, so just don't add |
272 // it to present_printers_; | 282 // it to present_printers_; |
273 deferred_printer_removals_.erase(data->device->guid()); | 283 deferred_printer_removals_.erase(data->device->guid()); |
274 } else { | 284 } else { |
275 base::AutoLock auto_lock(pp_lock_); | 285 base::AutoLock auto_lock(pp_lock_); |
276 present_printers_.emplace(data->device->guid(), std::move(data->printer)); | 286 present_printers_.emplace(data->device->guid(), std::move(data->printer)); |
277 observer_list_->Notify( | 287 if (started_) { |
278 FROM_HERE, | 288 observer_list_->Notify(FROM_HERE, |
279 &UsbPrinterDetector::Observer::OnAvailableUsbPrintersChanged, | 289 &PrinterDetector::Observer::OnPrintersFound, |
280 GetPrintersLocked()); | 290 GetPrintersLocked()); |
| 291 } |
281 } | 292 } |
282 } | 293 } |
| 294 // Has Start() been called yet? |
| 295 bool started_ = false; |
283 | 296 |
284 // Map from USB GUID to Printer that we have detected as being currently | 297 // Map from USB GUID to Printer that we have detected as being currently |
285 // plugged in and have finished processing. Note present_printers_ may be | 298 // plugged in and have finished processing. Note present_printers_ may be |
286 // accessed from multiple threads, so is protected by pp_lock_. | 299 // accessed from multiple threads, so is protected by pp_lock_. |
287 std::map<std::string, std::unique_ptr<Printer>> present_printers_; | 300 std::map<std::string, std::unique_ptr<Printer>> present_printers_; |
288 base::Lock pp_lock_; | 301 base::Lock pp_lock_; |
289 | 302 |
290 // If the usb device is removed before we've finished processing it, we'll | 303 // If the usb device is removed before we've finished processing it, we'll |
291 // defer the cleanup until the setup flow finishes. This is the set of | 304 // defer the cleanup until the setup flow finishes. This is the set of |
292 // guids which have been removed before the flow finished. | 305 // guids which have been removed before the flow finished. |
293 std::set<std::string> deferred_printer_removals_; | 306 std::set<std::string> deferred_printer_removals_; |
294 | 307 |
295 Profile* profile_; | 308 Profile* profile_; |
296 ScopedObserver<device::UsbService, device::UsbService::Observer> | 309 ScopedObserver<device::UsbService, device::UsbService::Observer> |
297 usb_observer_; | 310 usb_observer_; |
298 scoped_refptr<base::ObserverListThreadSafe<UsbPrinterDetector::Observer>> | 311 scoped_refptr<base::ObserverListThreadSafe<UsbPrinterDetector::Observer>> |
299 observer_list_; | 312 observer_list_; |
300 base::WeakPtrFactory<UsbPrinterDetectorImpl> weak_ptr_factory_; | 313 base::WeakPtrFactory<UsbPrinterDetectorImpl> weak_ptr_factory_; |
301 }; | 314 }; |
302 | 315 |
303 } // namespace | 316 } // namespace |
304 | 317 |
305 // static | 318 // static |
306 std::unique_ptr<UsbPrinterDetector> UsbPrinterDetector::Create( | 319 std::unique_ptr<UsbPrinterDetector> UsbPrinterDetector::Create( |
307 Profile* profile) { | 320 Profile* profile) { |
308 return base::MakeUnique<UsbPrinterDetectorImpl>(profile); | 321 return base::MakeUnique<UsbPrinterDetectorImpl>(profile); |
309 } | 322 } |
310 | 323 |
311 } // namespace chromeos | 324 } // namespace chromeos |
OLD | NEW |