Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(112)

Unified Diff: chromeos/dbus/shill_device_client.cc

Issue 11192024: Add chromeos::NetworkStateManager (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address feedback Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698