Commit bb32cb00 authored by reillyg's avatar reillyg Committed by Commit bot

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}
parent ecf63c8e
...@@ -81,6 +81,14 @@ void HidService::GetDevices(std::vector<HidDeviceInfo>* devices) { ...@@ -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. // Fills in the device info struct of the given device_id.
bool HidService::GetDeviceInfo(const HidDeviceId& device_id, bool HidService::GetDeviceInfo(const HidDeviceId& device_id,
HidDeviceInfo* info) const { HidDeviceInfo* info) const {
...@@ -99,14 +107,17 @@ void HidService::AddDevice(const HidDeviceInfo& info) { ...@@ -99,14 +107,17 @@ void HidService::AddDevice(const HidDeviceInfo& info) {
DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(thread_checker_.CalledOnValidThread());
if (!ContainsKey(devices_, info.device_id)) { if (!ContainsKey(devices_, info.device_id)) {
devices_[info.device_id] = info; devices_[info.device_id] = info;
FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceAdded(info));
} }
} }
void HidService::RemoveDevice(const HidDeviceId& device_id) { void HidService::RemoveDevice(const HidDeviceId& device_id) {
DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(thread_checker_.CalledOnValidThread());
DeviceMap::iterator it = devices_.find(device_id); DeviceMap::iterator it = devices_.find(device_id);
if (it != devices_.end()) if (it != devices_.end()) {
devices_.erase(it); devices_.erase(it);
FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceRemoved(device_id));
}
} }
} // namespace device } // namespace device
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <vector> #include <vector>
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/observer_list.h"
#include "base/single_thread_task_runner.h" #include "base/single_thread_task_runner.h"
#include "base/threading/thread_checker.h" #include "base/threading/thread_checker.h"
#include "device/hid/hid_device_info.h" #include "device/hid/hid_device_info.h"
...@@ -20,6 +21,12 @@ class HidConnection; ...@@ -20,6 +21,12 @@ class HidConnection;
class HidService { class HidService {
public: 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)> typedef base::Callback<void(scoped_refptr<HidConnection> connection)>
ConnectCallback; ConnectCallback;
...@@ -31,6 +38,9 @@ class HidService { ...@@ -31,6 +38,9 @@ class HidService {
// Enumerates and returns a list of device identifiers. // Enumerates and returns a list of device identifiers.
virtual void GetDevices(std::vector<HidDeviceInfo>* devices); 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. // Fills in a DeviceInfo struct with info for the given device_id.
// Returns |true| if successful or |false| if |device_id| is invalid. // Returns |true| if successful or |false| if |device_id| is invalid.
bool GetDeviceInfo(const HidDeviceId& device_id, HidDeviceInfo* info) const; bool GetDeviceInfo(const HidDeviceId& device_id, HidDeviceInfo* info) const;
...@@ -59,6 +69,7 @@ class HidService { ...@@ -59,6 +69,7 @@ class HidService {
class Destroyer; class Destroyer;
DeviceMap devices_; DeviceMap devices_;
ObserverList<Observer> observer_list_;
DISALLOW_COPY_AND_ASSIGN(HidService); DISALLOW_COPY_AND_ASSIGN(HidService);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment