diff options
author | reillyg <reillyg@chromium.org> | 2014-12-05 15:22:35 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-12-05 23:23:56 +0000 |
commit | bb32cb00919d7192332f3270af9dbbf877208b5c (patch) | |
tree | ee588867e490b27e643c40ede37088dfce70687b /device | |
parent | ecf63c8e50754572ed642ac5a1e7789afef4e83c (diff) | |
download | chromium_src-bb32cb00919d7192332f3270af9dbbf877208b5c.zip chromium_src-bb32cb00919d7192332f3270af9dbbf877208b5c.tar.gz chromium_src-bb32cb00919d7192332f3270af9dbbf877208b5c.tar.bz2 |
Add basic observer support to devices::HidService.
Add an observer list to HidService that is notified when a device is
added or removed from the enumeration. This currently works as expected
on Linux and OS X while on Windows devices are only enumerated on request
and so these are not as useful.
BUG=376719
Review URL: https://codereview.chromium.org/779353003
Cr-Commit-Position: refs/heads/master@{#307105}
Diffstat (limited to 'device')
-rw-r--r-- | device/hid/hid_service.cc | 13 | ||||
-rw-r--r-- | device/hid/hid_service.h | 11 |
2 files changed, 23 insertions, 1 deletions
diff --git a/device/hid/hid_service.cc b/device/hid/hid_service.cc index 78273ae6..87ca56c 100644 --- a/device/hid/hid_service.cc +++ b/device/hid/hid_service.cc @@ -81,6 +81,14 @@ void HidService::GetDevices(std::vector<HidDeviceInfo>* devices) { } } +void HidService::AddObserver(HidService::Observer* observer) { + observer_list_.AddObserver(observer); +} + +void HidService::RemoveObserver(HidService::Observer* observer) { + observer_list_.RemoveObserver(observer); +} + // Fills in the device info struct of the given device_id. bool HidService::GetDeviceInfo(const HidDeviceId& device_id, HidDeviceInfo* info) const { @@ -99,14 +107,17 @@ void HidService::AddDevice(const HidDeviceInfo& info) { DCHECK(thread_checker_.CalledOnValidThread()); if (!ContainsKey(devices_, info.device_id)) { devices_[info.device_id] = info; + FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceAdded(info)); } } void HidService::RemoveDevice(const HidDeviceId& device_id) { DCHECK(thread_checker_.CalledOnValidThread()); DeviceMap::iterator it = devices_.find(device_id); - if (it != devices_.end()) + if (it != devices_.end()) { devices_.erase(it); + FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceRemoved(device_id)); + } } } // namespace device diff --git a/device/hid/hid_service.h b/device/hid/hid_service.h index 2df2864..5e29fb3 100644 --- a/device/hid/hid_service.h +++ b/device/hid/hid_service.h @@ -10,6 +10,7 @@ #include <vector> #include "base/memory/ref_counted.h" +#include "base/observer_list.h" #include "base/single_thread_task_runner.h" #include "base/threading/thread_checker.h" #include "device/hid/hid_device_info.h" @@ -20,6 +21,12 @@ class HidConnection; class HidService { public: + class Observer { + public: + virtual void OnDeviceAdded(const HidDeviceInfo& info) {} + virtual void OnDeviceRemoved(const HidDeviceId& device_id) {} + }; + typedef base::Callback<void(scoped_refptr<HidConnection> connection)> ConnectCallback; @@ -31,6 +38,9 @@ class HidService { // Enumerates and returns a list of device identifiers. virtual void GetDevices(std::vector<HidDeviceInfo>* devices); + void AddObserver(Observer* observer); + void RemoveObserver(Observer* observer); + // Fills in a DeviceInfo struct with info for the given device_id. // Returns |true| if successful or |false| if |device_id| is invalid. bool GetDeviceInfo(const HidDeviceId& device_id, HidDeviceInfo* info) const; @@ -59,6 +69,7 @@ class HidService { class Destroyer; DeviceMap devices_; + ObserverList<Observer> observer_list_; DISALLOW_COPY_AND_ASSIGN(HidService); }; |