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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromeos/dbus/shill_device_client.h" 5 #include "chromeos/dbus/shill_device_client.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "base/values.h" 10 #include "base/values.h"
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 219
220 // A stub implementation of ShillDeviceClient. 220 // A stub implementation of ShillDeviceClient.
221 // Implemented: Stub cellular device for SMS testing. 221 // Implemented: Stub cellular device for SMS testing.
222 class ShillDeviceClientStubImpl : public ShillDeviceClient, 222 class ShillDeviceClientStubImpl : public ShillDeviceClient,
223 public ShillDeviceClient::TestInterface { 223 public ShillDeviceClient::TestInterface {
224 public: 224 public:
225 ShillDeviceClientStubImpl() : weak_ptr_factory_(this) { 225 ShillDeviceClientStubImpl() : weak_ptr_factory_(this) {
226 SetDefaultProperties(); 226 SetDefaultProperties();
227 } 227 }
228 228
229 virtual ~ShillDeviceClientStubImpl() {} 229 virtual ~ShillDeviceClientStubImpl() {
230 STLDeleteContainerPairSecondPointers(
231 observer_list_.begin(), observer_list_.end());
232 }
230 233
231 // ShillDeviceClient overrides. 234 // ShillDeviceClient overrides.
232 235
233 virtual void AddPropertyChangedObserver( 236 virtual void AddPropertyChangedObserver(
234 const dbus::ObjectPath& device_path, 237 const dbus::ObjectPath& device_path,
235 ShillPropertyChangedObserver* observer) OVERRIDE {} 238 ShillPropertyChangedObserver* observer) OVERRIDE {
239 GetObserverList(device_path).AddObserver(observer);
240 }
236 241
237 virtual void RemovePropertyChangedObserver( 242 virtual void RemovePropertyChangedObserver(
238 const dbus::ObjectPath& device_path, 243 const dbus::ObjectPath& device_path,
239 ShillPropertyChangedObserver* observer) OVERRIDE {} 244 ShillPropertyChangedObserver* observer) OVERRIDE {
245 GetObserverList(device_path).RemoveObserver(observer);
246 }
240 247
241 virtual void GetProperties(const dbus::ObjectPath& device_path, 248 virtual void GetProperties(const dbus::ObjectPath& device_path,
242 const DictionaryValueCallback& callback) OVERRIDE { 249 const DictionaryValueCallback& callback) OVERRIDE {
243 MessageLoop::current()->PostTask( 250 MessageLoop::current()->PostTask(
244 FROM_HERE, 251 FROM_HERE,
245 base::Bind(&ShillDeviceClientStubImpl::PassStubDeviceProperties, 252 base::Bind(&ShillDeviceClientStubImpl::PassStubDeviceProperties,
246 weak_ptr_factory_.GetWeakPtr(), 253 weak_ptr_factory_.GetWeakPtr(),
247 device_path, callback)); 254 device_path, callback));
248 } 255 }
249 256
(...skipping 20 matching lines...) Expand all
270 std::string error_name("org.chromium.flimflam.Error.Failure"); 277 std::string error_name("org.chromium.flimflam.Error.Failure");
271 std::string error_message("Failed"); 278 std::string error_message("Failed");
272 MessageLoop::current()->PostTask(FROM_HERE, 279 MessageLoop::current()->PostTask(FROM_HERE,
273 base::Bind(error_callback, 280 base::Bind(error_callback,
274 error_name, 281 error_name,
275 error_message)); 282 error_message));
276 return; 283 return;
277 } 284 }
278 device_properties->Set(name, value.DeepCopy()); 285 device_properties->Set(name, value.DeepCopy());
279 MessageLoop::current()->PostTask(FROM_HERE, callback); 286 MessageLoop::current()->PostTask(FROM_HERE, callback);
287 MessageLoop::current()->PostTask(
288 FROM_HERE,
289 base::Bind(&ShillDeviceClientStubImpl::NotifyObserversPropertyChanged,
290 weak_ptr_factory_.GetWeakPtr(), device_path, name));
280 } 291 }
281 292
282 virtual void ClearProperty(const dbus::ObjectPath& device_path, 293 virtual void ClearProperty(const dbus::ObjectPath& device_path,
283 const std::string& name, 294 const std::string& name,
284 const VoidDBusMethodCallback& callback) OVERRIDE { 295 const VoidDBusMethodCallback& callback) OVERRIDE {
285 base::DictionaryValue* device_properties = NULL; 296 base::DictionaryValue* device_properties = NULL;
286 if (!stub_devices_.GetDictionary(device_path.value(), &device_properties)) { 297 if (!stub_devices_.GetDictionary(device_path.value(), &device_properties)) {
287 PostVoidCallback(callback, DBUS_METHOD_CALL_FAILURE); 298 PostVoidCallback(callback, DBUS_METHOD_CALL_FAILURE);
288 return; 299 return;
289 } 300 }
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 387
377 virtual void RemoveDevice(const std::string& device_path) OVERRIDE { 388 virtual void RemoveDevice(const std::string& device_path) OVERRIDE {
378 stub_devices_.RemoveWithoutPathExpansion(device_path, NULL); 389 stub_devices_.RemoveWithoutPathExpansion(device_path, NULL);
379 } 390 }
380 391
381 virtual void ClearDevices() OVERRIDE { 392 virtual void ClearDevices() OVERRIDE {
382 stub_devices_.Clear(); 393 stub_devices_.Clear();
383 } 394 }
384 395
385 private: 396 private:
397 typedef ObserverList<ShillPropertyChangedObserver> PropertyObserverList;
398
386 void SetDefaultProperties() { 399 void SetDefaultProperties() {
387 // Add a wifi device. Note: path matches Manager entry. 400 // Add a wifi device. Note: path matches Manager entry.
388 AddDevice("stub_wifi_device1", flimflam::kTypeWifi, 401 AddDevice("stub_wifi_device1", flimflam::kTypeWifi,
389 "/device/wifi1", "/stub"); 402 "/device/wifi1", "/stub");
390 403
391 // Add a cellular device. Used in SMS stub. Note: path matches 404 // Add a cellular device. Used in SMS stub. Note: path matches
392 // Manager entry. 405 // Manager entry.
393 AddDevice("stub_cellular_device1", flimflam::kTypeCellular, 406 AddDevice("stub_cellular_device1", flimflam::kTypeCellular,
394 "/device/cellular1", "/stub"); 407 "/device/cellular1", "/stub");
395 } 408 }
(...skipping 10 matching lines...) Expand all
406 callback.Run(DBUS_METHOD_CALL_SUCCESS, *device_properties); 419 callback.Run(DBUS_METHOD_CALL_SUCCESS, *device_properties);
407 } 420 }
408 421
409 // Posts a task to run a void callback with status code |status|. 422 // Posts a task to run a void callback with status code |status|.
410 void PostVoidCallback(const VoidDBusMethodCallback& callback, 423 void PostVoidCallback(const VoidDBusMethodCallback& callback,
411 DBusMethodCallStatus status) { 424 DBusMethodCallStatus status) {
412 MessageLoop::current()->PostTask(FROM_HERE, 425 MessageLoop::current()->PostTask(FROM_HERE,
413 base::Bind(callback, status)); 426 base::Bind(callback, status));
414 } 427 }
415 428
429 void NotifyObserversPropertyChanged(const dbus::ObjectPath& device_path,
430 const std::string& property) {
431 base::DictionaryValue* dict = NULL;
432 std::string path = device_path.value();
433 if (!stub_devices_.GetDictionaryWithoutPathExpansion(path, &dict)) {
434 LOG(ERROR) << "Notify for unknown service: " << path;
435 return;
436 }
437 base::Value* value = NULL;
438 if (!dict->GetWithoutPathExpansion(property, &value)) {
439 LOG(ERROR) << "Notify for unknown property: "
440 << path << " : " << property;
441 return;
442 }
443 FOR_EACH_OBSERVER(ShillPropertyChangedObserver,
444 GetObserverList(device_path),
445 OnPropertyChanged(property, *value));
446 }
447
416 base::DictionaryValue* GetDeviceProperties(const std::string& device_path) { 448 base::DictionaryValue* GetDeviceProperties(const std::string& device_path) {
417 base::DictionaryValue* properties = NULL; 449 base::DictionaryValue* properties = NULL;
418 if (!stub_devices_.GetDictionaryWithoutPathExpansion( 450 if (!stub_devices_.GetDictionaryWithoutPathExpansion(
419 device_path, &properties)) { 451 device_path, &properties)) {
420 properties = new base::DictionaryValue; 452 properties = new base::DictionaryValue;
421 stub_devices_.Set(device_path, properties); 453 stub_devices_.Set(device_path, properties);
422 } 454 }
423 return properties; 455 return properties;
424 } 456 }
425 457
458 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
459 std::map<dbus::ObjectPath, PropertyObserverList*>::iterator iter =
460 observer_list_.find(device_path);
461 if (iter != observer_list_.end())
462 return *(iter->second);
463 PropertyObserverList* observer_list = new PropertyObserverList();
464 observer_list_[device_path] = observer_list;
465 return *observer_list;
466 }
467
426 // Dictionary of <device_name, Dictionary>. 468 // Dictionary of <device_name, Dictionary>.
427 base::DictionaryValue stub_devices_; 469 base::DictionaryValue stub_devices_;
470 // Observer list for each device.
471 std::map<dbus::ObjectPath, PropertyObserverList*> observer_list_;
428 472
429 // Note: This should remain the last member so it'll be destroyed and 473 // Note: This should remain the last member so it'll be destroyed and
430 // invalidate its weak pointers before any other members are destroyed. 474 // invalidate its weak pointers before any other members are destroyed.
431 base::WeakPtrFactory<ShillDeviceClientStubImpl> weak_ptr_factory_; 475 base::WeakPtrFactory<ShillDeviceClientStubImpl> weak_ptr_factory_;
432 476
433 DISALLOW_COPY_AND_ASSIGN(ShillDeviceClientStubImpl); 477 DISALLOW_COPY_AND_ASSIGN(ShillDeviceClientStubImpl);
434 }; 478 };
435 479
436 } // namespace 480 } // namespace
437 481
438 ShillDeviceClient::ShillDeviceClient() {} 482 ShillDeviceClient::ShillDeviceClient() {}
439 483
440 ShillDeviceClient::~ShillDeviceClient() {} 484 ShillDeviceClient::~ShillDeviceClient() {}
441 485
442 // static 486 // static
443 ShillDeviceClient* ShillDeviceClient::Create( 487 ShillDeviceClient* ShillDeviceClient::Create(
444 DBusClientImplementationType type, 488 DBusClientImplementationType type,
445 dbus::Bus* bus) { 489 dbus::Bus* bus) {
446 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) 490 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION)
447 return new ShillDeviceClientImpl(bus); 491 return new ShillDeviceClientImpl(bus);
448 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); 492 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type);
449 return new ShillDeviceClientStubImpl(); 493 return new ShillDeviceClientStubImpl();
450 } 494 }
451 495
452 } // namespace chromeos 496 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698