Chromium Code Reviews| Index: ui/events/ozone/device/device_manager_manual.cc |
| diff --git a/ui/events/ozone/device/device_manager_manual.cc b/ui/events/ozone/device/device_manager_manual.cc |
| index c86ffccf62bdae50079e2927d77841a24cefdc7d..09c6efb620b1c26d72c154e7652011718b1e0a2f 100644 |
| --- a/ui/events/ozone/device/device_manager_manual.cc |
| +++ b/ui/events/ozone/device/device_manager_manual.cc |
| @@ -4,30 +4,75 @@ |
| #include "ui/events/ozone/device/device_manager_manual.h" |
| +#include "base/bind.h" |
| +#include "base/callback.h" |
| #include "base/files/file_enumerator.h" |
| +#include "base/location.h" |
| +#include "base/threading/worker_pool.h" |
| #include "ui/events/ozone/device/device_event.h" |
| #include "ui/events/ozone/device/device_event_observer.h" |
| namespace ui { |
| -DeviceManagerManual::DeviceManagerManual() {} |
| +namespace { |
| -DeviceManagerManual::~DeviceManagerManual() {} |
| - |
| -void DeviceManagerManual::ScanDevices(DeviceEventObserver* observer) { |
| +void ScanDevicesOnWorkerThread(std::vector<base::FilePath>* result) { |
| base::FileEnumerator file_enum(base::FilePath("/dev/input"), |
| false, |
| base::FileEnumerator::FILES, |
| "event*[0-9]"); |
| for (base::FilePath path = file_enum.Next(); !path.empty(); |
| path = file_enum.Next()) { |
| - DeviceEvent event(DeviceEvent::INPUT, DeviceEvent::ADD, path); |
| - observer->OnDeviceEvent(event); |
| + result->push_back(path); |
| + } |
| +} |
| + |
| +} |
| + |
| +DeviceManagerManual::DeviceManagerManual() |
| + : have_scanned_devices_(false) |
| + , weak_ptr_factory_(this) { |
|
spang
2015/01/22 20:45:57
whitespace issue, please git cl format.
halliwell
2015/01/22 21:56:52
Done.
|
| +} |
| + |
| +DeviceManagerManual::~DeviceManagerManual() {} |
| + |
| +void DeviceManagerManual::ScanDevices(DeviceEventObserver* observer) { |
| + if (have_scanned_devices_) { |
| + std::vector<base::FilePath>::const_iterator it = devices_.begin(); |
| + for (; it != devices_.end(); ++it) { |
| + DeviceEvent event(DeviceEvent::INPUT, DeviceEvent::ADD, *it); |
| + observer->OnDeviceEvent(event); |
| + } |
| + } else { |
| + std::vector<base::FilePath>* result = new std::vector<base::FilePath>(); |
| + base::WorkerPool::PostTaskAndReply( |
| + FROM_HERE, |
| + base::Bind(&ScanDevicesOnWorkerThread, result), |
| + base::Bind(&DeviceManagerManual::OnDevicesScanned, |
| + weak_ptr_factory_.GetWeakPtr(), |
| + base::Owned(result)), |
| + true /* task_is_slow */); |
|
jochen (gone - plz use gerrit)
2015/01/22 16:28:15
not sure this is a slow task - this will start a n
halliwell
2015/01/22 21:56:52
Done.
|
| + have_scanned_devices_ = true; |
| } |
| } |
| -void DeviceManagerManual::AddObserver(DeviceEventObserver* observer) {} |
| +void DeviceManagerManual::AddObserver(DeviceEventObserver* observer) { |
| + observers_.AddObserver(observer); |
| +} |
| -void DeviceManagerManual::RemoveObserver(DeviceEventObserver* observer) {} |
| +void DeviceManagerManual::RemoveObserver(DeviceEventObserver* observer) { |
| + observers_.RemoveObserver(observer); |
| +} |
| + |
| +void DeviceManagerManual::OnDevicesScanned( |
| + std::vector<base::FilePath>* result) { |
| + std::vector<base::FilePath>::const_iterator it = result->begin(); |
| + for (; it != result->end(); ++it) { |
| + devices_.push_back(*it); |
| + DeviceEvent event(DeviceEvent::INPUT, DeviceEvent::ADD, *it); |
| + FOR_EACH_OBSERVER( |
| + DeviceEventObserver, observers_, OnDeviceEvent(event)); |
| + } |
| +} |
| } // namespace ui |