Chromium Code Reviews| Index: chromeos/dbus/shill_device_client.cc |
| diff --git a/chromeos/dbus/shill_device_client.cc b/chromeos/dbus/shill_device_client.cc |
| index 39ca916bebb16c1d2713e5300ae9ce930dadf04c..077c3fb36df65f5836f0ff2a9f367e9038b94a54 100644 |
| --- a/chromeos/dbus/shill_device_client.cc |
| +++ b/chromeos/dbus/shill_device_client.cc |
| @@ -226,17 +226,24 @@ class ShillDeviceClientStubImpl : public ShillDeviceClient, |
| SetDefaultProperties(); |
| } |
| - virtual ~ShillDeviceClientStubImpl() {} |
| + virtual ~ShillDeviceClientStubImpl() { |
| + STLDeleteContainerPairSecondPointers( |
| + observer_list_.begin(), observer_list_.end()); |
| + } |
| // ShillDeviceClient overrides. |
| virtual void AddPropertyChangedObserver( |
| const dbus::ObjectPath& device_path, |
| - ShillPropertyChangedObserver* observer) OVERRIDE {} |
| + ShillPropertyChangedObserver* observer) OVERRIDE { |
| + GetObserverList(device_path).AddObserver(observer); |
| + } |
| virtual void RemovePropertyChangedObserver( |
| const dbus::ObjectPath& device_path, |
| - ShillPropertyChangedObserver* observer) OVERRIDE {} |
| + ShillPropertyChangedObserver* observer) OVERRIDE { |
| + GetObserverList(device_path).RemoveObserver(observer); |
| + } |
| virtual void GetProperties(const dbus::ObjectPath& device_path, |
| const DictionaryValueCallback& callback) OVERRIDE { |
| @@ -277,6 +284,10 @@ class ShillDeviceClientStubImpl : public ShillDeviceClient, |
| } |
| device_properties->Set(name, value.DeepCopy()); |
| MessageLoop::current()->PostTask(FROM_HERE, callback); |
| + MessageLoop::current()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&ShillDeviceClientStubImpl::NotifyObserversPropertyChanged, |
| + weak_ptr_factory_.GetWeakPtr(), device_path, name)); |
| } |
| virtual void ClearProperty(const dbus::ObjectPath& device_path, |
| @@ -383,6 +394,8 @@ class ShillDeviceClientStubImpl : public ShillDeviceClient, |
| } |
| private: |
| + typedef ObserverList<ShillPropertyChangedObserver> PropertyObserverList; |
| + |
| void SetDefaultProperties() { |
| // Add a wifi device. Note: path matches Manager entry. |
| AddDevice("stub_wifi_device1", flimflam::kTypeWifi, |
| @@ -413,6 +426,25 @@ class ShillDeviceClientStubImpl : public ShillDeviceClient, |
| base::Bind(callback, status)); |
| } |
| + void NotifyObserversPropertyChanged(const dbus::ObjectPath& device_path, |
| + const std::string& property) { |
| + base::DictionaryValue* dict = NULL; |
| + std::string path = device_path.value(); |
| + if (!stub_devices_.GetDictionaryWithoutPathExpansion(path, &dict)) { |
| + LOG(ERROR) << "Notify for unknown service: " << path; |
| + return; |
| + } |
| + base::Value* value = NULL; |
| + if (!dict->GetWithoutPathExpansion(property, &value)) { |
| + LOG(ERROR) << "Notify for unknown property: " |
| + << path << " : " << property; |
| + return; |
| + } |
| + FOR_EACH_OBSERVER(ShillPropertyChangedObserver, |
| + GetObserverList(device_path), |
| + OnPropertyChanged(property, *value)); |
| + } |
| + |
| base::DictionaryValue* GetDeviceProperties(const std::string& device_path) { |
| base::DictionaryValue* properties = NULL; |
| if (!stub_devices_.GetDictionaryWithoutPathExpansion( |
| @@ -423,8 +455,20 @@ class ShillDeviceClientStubImpl : public ShillDeviceClient, |
| return properties; |
| } |
| + PropertyObserverList& GetObserverList(const dbus::ObjectPath& device_path) { |
|
hashimoto
2012/11/06 01:51:24
nit: Please use pointer instead of reference if th
stevenjb
2012/11/06 03:17:03
I originally returned a pointer but then I had '*G
|
| + std::map<dbus::ObjectPath, PropertyObserverList*>::iterator iter = |
| + observer_list_.find(device_path); |
| + if (iter != observer_list_.end()) |
| + return *(iter->second); |
| + PropertyObserverList* observer_list = new PropertyObserverList(); |
| + observer_list_[device_path] = observer_list; |
| + return *observer_list; |
| + } |
| + |
| // Dictionary of <device_name, Dictionary>. |
| base::DictionaryValue stub_devices_; |
| + // Observer list for each device. |
| + std::map<dbus::ObjectPath, PropertyObserverList*> observer_list_; |
| // Note: This should remain the last member so it'll be destroyed and |
| // invalidate its weak pointers before any other members are destroyed. |