summaryrefslogtreecommitdiffstats
path: root/device
diff options
context:
space:
mode:
authorreillyg <reillyg@chromium.org>2014-12-05 15:22:35 -0800
committerCommit bot <commit-bot@chromium.org>2014-12-05 23:23:56 +0000
commitbb32cb00919d7192332f3270af9dbbf877208b5c (patch)
treeee588867e490b27e643c40ede37088dfce70687b /device
parentecf63c8e50754572ed642ac5a1e7789afef4e83c (diff)
downloadchromium_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.cc13
-rw-r--r--device/hid/hid_service.h11
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);
};