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

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: Clang fixes 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 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 const base::Closure& callback, 181 const base::Closure& callback,
182 const ErrorCallback& error_callback) OVERRIDE { 182 const ErrorCallback& error_callback) OVERRIDE {
183 dbus::MethodCall method_call(flimflam::kFlimflamDeviceInterface, 183 dbus::MethodCall method_call(flimflam::kFlimflamDeviceInterface,
184 shill::kSetCarrierFunction); 184 shill::kSetCarrierFunction);
185 dbus::MessageWriter writer(&method_call); 185 dbus::MessageWriter writer(&method_call);
186 writer.AppendString(carrier); 186 writer.AppendString(carrier);
187 GetHelper(device_path)->CallVoidMethodWithErrorCallback( 187 GetHelper(device_path)->CallVoidMethodWithErrorCallback(
188 &method_call, callback, error_callback); 188 &method_call, callback, error_callback);
189 } 189 }
190 190
191 virtual TestInterface* GetTestInterface() OVERRIDE {
192 return NULL;
193 }
194
191 private: 195 private:
192 typedef std::map<std::string, ShillClientHelper*> HelperMap; 196 typedef std::map<std::string, ShillClientHelper*> HelperMap;
193 197
194 // Returns the corresponding ShillClientHelper for the profile. 198 // Returns the corresponding ShillClientHelper for the profile.
195 ShillClientHelper* GetHelper(const dbus::ObjectPath& device_path) { 199 ShillClientHelper* GetHelper(const dbus::ObjectPath& device_path) {
196 HelperMap::iterator it = helpers_.find(device_path.value()); 200 HelperMap::iterator it = helpers_.find(device_path.value());
197 if (it != helpers_.end()) 201 if (it != helpers_.end())
198 return it->second; 202 return it->second;
199 203
200 // There is no helper for the profile, create it. 204 // There is no helper for the profile, create it.
201 dbus::ObjectProxy* object_proxy = 205 dbus::ObjectProxy* object_proxy =
202 bus_->GetObjectProxy(flimflam::kFlimflamServiceName, device_path); 206 bus_->GetObjectProxy(flimflam::kFlimflamServiceName, device_path);
203 ShillClientHelper* helper = new ShillClientHelper(bus_, object_proxy); 207 ShillClientHelper* helper = new ShillClientHelper(bus_, object_proxy);
204 helper->MonitorPropertyChanged(flimflam::kFlimflamDeviceInterface); 208 helper->MonitorPropertyChanged(flimflam::kFlimflamDeviceInterface);
205 helpers_.insert(HelperMap::value_type(device_path.value(), helper)); 209 helpers_.insert(HelperMap::value_type(device_path.value(), helper));
206 return helper; 210 return helper;
207 } 211 }
208 212
209 dbus::Bus* bus_; 213 dbus::Bus* bus_;
210 HelperMap helpers_; 214 HelperMap helpers_;
211 STLValueDeleter<HelperMap> helpers_deleter_; 215 STLValueDeleter<HelperMap> helpers_deleter_;
212 216
213 DISALLOW_COPY_AND_ASSIGN(ShillDeviceClientImpl); 217 DISALLOW_COPY_AND_ASSIGN(ShillDeviceClientImpl);
214 }; 218 };
215 219
216 // A stub implementation of ShillDeviceClient. 220 // A stub implementation of ShillDeviceClient.
217 // Implemented: Stub cellular device for SMS testing. 221 // Implemented: Stub cellular device for SMS testing.
218 class ShillDeviceClientStubImpl : public ShillDeviceClient { 222 class ShillDeviceClientStubImpl : public ShillDeviceClient,
223 public ShillDeviceClient::TestInterface {
219 public: 224 public:
220 ShillDeviceClientStubImpl() : weak_ptr_factory_(this) { 225 ShillDeviceClientStubImpl() : weak_ptr_factory_(this) {
221 // Add a cellular device for SMS. Note: name matches Manager entry. 226 SetDefaultProperties();
222 const char kStubCellular1[] = "stub_cellular1";
223 base::DictionaryValue* cellular_properties = new base::DictionaryValue;
224 cellular_properties->SetWithoutPathExpansion(
225 flimflam::kTypeProperty,
226 base::Value::CreateStringValue(flimflam::kTypeCellular));
227 cellular_properties->SetWithoutPathExpansion(
228 flimflam::kDBusConnectionProperty,
229 base::Value::CreateStringValue("/stub"));
230 cellular_properties->SetWithoutPathExpansion(
231 flimflam::kDBusObjectProperty,
232 base::Value::CreateStringValue("/device/cellular1"));
233 stub_devices_.Set(kStubCellular1, cellular_properties);
234
235 // Create a second device stubbing a modem managed by
236 // ModemManager1 interfaces.
237 // Note: name matches Manager entry.
238 const char kStubCellular2[] = "stub_cellular2";
239 cellular_properties = new base::DictionaryValue;
240 cellular_properties->SetWithoutPathExpansion(
241 flimflam::kTypeProperty,
242 base::Value::CreateStringValue(flimflam::kTypeCellular));
243 cellular_properties->SetWithoutPathExpansion(
244 flimflam::kDBusConnectionProperty,
245 base::Value::CreateStringValue(":stub.0"));
246 cellular_properties->SetWithoutPathExpansion(
247 flimflam::kDBusObjectProperty,
248 base::Value::CreateStringValue(
249 "/org/freedesktop/ModemManager1/stub/0"));
250 stub_devices_.Set(kStubCellular2, cellular_properties);
251 } 227 }
252 228
253 virtual ~ShillDeviceClientStubImpl() {} 229 virtual ~ShillDeviceClientStubImpl() {}
254 230
255 ///////////////////////////////////
256 // ShillDeviceClient overrides. 231 // ShillDeviceClient overrides.
232
257 virtual void AddPropertyChangedObserver( 233 virtual void AddPropertyChangedObserver(
258 const dbus::ObjectPath& device_path, 234 const dbus::ObjectPath& device_path,
259 ShillPropertyChangedObserver* observer) OVERRIDE {} 235 ShillPropertyChangedObserver* observer) OVERRIDE {
236 observer_list_.AddObserver(observer);
237 }
260 238
261 virtual void RemovePropertyChangedObserver( 239 virtual void RemovePropertyChangedObserver(
262 const dbus::ObjectPath& device_path, 240 const dbus::ObjectPath& device_path,
263 ShillPropertyChangedObserver* observer) OVERRIDE {} 241 ShillPropertyChangedObserver* observer) OVERRIDE {
242 observer_list_.RemoveObserver(observer);
243 }
264 244
265 virtual void GetProperties(const dbus::ObjectPath& device_path, 245 virtual void GetProperties(const dbus::ObjectPath& device_path,
266 const DictionaryValueCallback& callback) OVERRIDE { 246 const DictionaryValueCallback& callback) OVERRIDE {
267 MessageLoop::current()->PostTask( 247 MessageLoop::current()->PostTask(
268 FROM_HERE, 248 FROM_HERE,
269 base::Bind(&ShillDeviceClientStubImpl::PassStubDeviceProperties, 249 base::Bind(&ShillDeviceClientStubImpl::PassStubDeviceProperties,
270 weak_ptr_factory_.GetWeakPtr(), 250 weak_ptr_factory_.GetWeakPtr(),
271 device_path, callback)); 251 device_path, callback));
272 } 252 }
273 253
(...skipping 17 matching lines...) Expand all
291 std::string error_name("org.chromium.flimflam.Error.Failure"); 271 std::string error_name("org.chromium.flimflam.Error.Failure");
292 std::string error_message("Failed"); 272 std::string error_message("Failed");
293 MessageLoop::current()->PostTask(FROM_HERE, 273 MessageLoop::current()->PostTask(FROM_HERE,
294 base::Bind(error_callback, 274 base::Bind(error_callback,
295 error_name, 275 error_name,
296 error_message)); 276 error_message));
297 return; 277 return;
298 } 278 }
299 device_properties->Set(name, value.DeepCopy()); 279 device_properties->Set(name, value.DeepCopy());
300 MessageLoop::current()->PostTask(FROM_HERE, callback); 280 MessageLoop::current()->PostTask(FROM_HERE, callback);
281 MessageLoop::current()->PostTask(
282 FROM_HERE,
283 base::Bind(&ShillDeviceClientStubImpl::NotifyObserversPropertyChanged,
284 weak_ptr_factory_.GetWeakPtr(), device_path, name));
301 } 285 }
302 286
303 virtual void ClearProperty(const dbus::ObjectPath& device_path, 287 virtual void ClearProperty(const dbus::ObjectPath& device_path,
304 const std::string& name, 288 const std::string& name,
305 const VoidDBusMethodCallback& callback) OVERRIDE { 289 const VoidDBusMethodCallback& callback) OVERRIDE {
306 base::DictionaryValue* device_properties = NULL; 290 base::DictionaryValue* device_properties = NULL;
307 if (!stub_devices_.GetDictionary(device_path.value(), &device_properties)) { 291 if (!stub_devices_.GetDictionary(device_path.value(), &device_properties)) {
308 PostVoidCallback(callback, DBUS_METHOD_CALL_FAILURE); 292 PostVoidCallback(callback, DBUS_METHOD_CALL_FAILURE);
309 return; 293 return;
310 } 294 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 MessageLoop::current()->PostTask(FROM_HERE, callback); 343 MessageLoop::current()->PostTask(FROM_HERE, callback);
360 } 344 }
361 345
362 virtual void Register(const dbus::ObjectPath& device_path, 346 virtual void Register(const dbus::ObjectPath& device_path,
363 const std::string& network_id, 347 const std::string& network_id,
364 const base::Closure& callback, 348 const base::Closure& callback,
365 const ErrorCallback& error_callback) OVERRIDE { 349 const ErrorCallback& error_callback) OVERRIDE {
366 MessageLoop::current()->PostTask(FROM_HERE, callback); 350 MessageLoop::current()->PostTask(FROM_HERE, callback);
367 } 351 }
368 352
369 // ShillDeviceClient override.
370 virtual void SetCarrier(const dbus::ObjectPath& device_path, 353 virtual void SetCarrier(const dbus::ObjectPath& device_path,
371 const std::string& carrier, 354 const std::string& carrier,
372 const base::Closure& callback, 355 const base::Closure& callback,
373 const ErrorCallback& error_callback) OVERRIDE { 356 const ErrorCallback& error_callback) OVERRIDE {
374 MessageLoop::current()->PostTask(FROM_HERE, callback); 357 MessageLoop::current()->PostTask(FROM_HERE, callback);
375 } 358 }
376 359
360 virtual ShillDeviceClient::TestInterface* GetTestInterface() OVERRIDE {
361 return this;
362 }
363
364 // ShillDeviceClient::TestInterface overrides.
365
366 virtual void AddDevice(const std::string& device_path,
367 const std::string& type,
368 const std::string& object_path,
369 const std::string& connection_path) OVERRIDE {
370 base::DictionaryValue* properties = GetDeviceProperties(device_path);
371 properties->SetWithoutPathExpansion(
372 flimflam::kTypeProperty,
373 base::Value::CreateStringValue(type));
374 properties->SetWithoutPathExpansion(
375 flimflam::kDBusObjectProperty,
376 base::Value::CreateStringValue(object_path));
377 properties->SetWithoutPathExpansion(
378 flimflam::kDBusConnectionProperty,
379 base::Value::CreateStringValue(connection_path));
380 }
381
382 virtual void RemoveDevice(const std::string& device_path) OVERRIDE {
383 stub_devices_.RemoveWithoutPathExpansion(device_path, NULL);
384 }
385
386 virtual void ClearDevices() OVERRIDE {
387 stub_devices_.Clear();
388 }
389
377 private: 390 private:
391 void SetDefaultProperties() {
392 // Add a wifi device. Note: path matches Manager entry.
393 AddDevice("stub_wifi_device1", flimflam::kTypeWifi,
394 "/device/wifi1", "/stub");
395
396 // Add a cellular device. Used in SMS stub. Note: path matches
397 // Manager entry.
398 AddDevice("stub_cellular_device1", flimflam::kTypeCellular,
399 "/device/cellular1", "/stub");
400 }
401
378 void PassStubDeviceProperties(const dbus::ObjectPath& device_path, 402 void PassStubDeviceProperties(const dbus::ObjectPath& device_path,
379 const DictionaryValueCallback& callback) const { 403 const DictionaryValueCallback& callback) const {
380 const base::DictionaryValue* device_properties = NULL; 404 const base::DictionaryValue* device_properties = NULL;
381 if (!stub_devices_.GetDictionary(device_path.value(), &device_properties)) { 405 if (!stub_devices_.GetDictionaryWithoutPathExpansion(
406 device_path.value(), &device_properties)) {
382 base::DictionaryValue empty_dictionary; 407 base::DictionaryValue empty_dictionary;
383 callback.Run(DBUS_METHOD_CALL_FAILURE, empty_dictionary); 408 callback.Run(DBUS_METHOD_CALL_FAILURE, empty_dictionary);
384 return; 409 return;
385 } 410 }
386 callback.Run(DBUS_METHOD_CALL_SUCCESS, *device_properties); 411 callback.Run(DBUS_METHOD_CALL_SUCCESS, *device_properties);
387 } 412 }
388 413
389 // Posts a task to run a void callback with status code |status|. 414 // Posts a task to run a void callback with status code |status|.
390 void PostVoidCallback(const VoidDBusMethodCallback& callback, 415 void PostVoidCallback(const VoidDBusMethodCallback& callback,
391 DBusMethodCallStatus status) { 416 DBusMethodCallStatus status) {
392 MessageLoop::current()->PostTask(FROM_HERE, 417 MessageLoop::current()->PostTask(FROM_HERE,
393 base::Bind(callback, status)); 418 base::Bind(callback, status));
394 } 419 }
395 420
421 void NotifyObserversPropertyChanged(const dbus::ObjectPath& device_path,
422 const std::string& property) {
423 base::DictionaryValue* dict = NULL;
424 std::string path = device_path.value();
425 if (!stub_devices_.GetDictionaryWithoutPathExpansion(path, &dict)) {
426 LOG(ERROR) << "Notify for unknown service: " << path;
427 return;
428 }
429 base::Value* value = NULL;
430 if (!dict->GetWithoutPathExpansion(property, &value)) {
431 LOG(ERROR) << "Notify for unknown property: "
432 << path << " : " << property;
433 return;
434 }
435 FOR_EACH_OBSERVER(ShillPropertyChangedObserver,
436 observer_list_,
437 OnPropertyChanged(property, *value));
438 }
439
440 base::DictionaryValue* GetDeviceProperties(const std::string& device_path) {
441 base::DictionaryValue* properties = NULL;
442 if (!stub_devices_.GetDictionaryWithoutPathExpansion(
443 device_path, &properties)) {
444 properties = new base::DictionaryValue;
445 stub_devices_.Set(device_path, properties);
446 }
447 return properties;
448 }
449
396 // Dictionary of <device_name, Dictionary>. 450 // Dictionary of <device_name, Dictionary>.
397 base::DictionaryValue stub_devices_; 451 base::DictionaryValue stub_devices_;
452 ObserverList<ShillPropertyChangedObserver> observer_list_;
398 453
399 // Note: This should remain the last member so it'll be destroyed and 454 // Note: This should remain the last member so it'll be destroyed and
400 // invalidate its weak pointers before any other members are destroyed. 455 // invalidate its weak pointers before any other members are destroyed.
401 base::WeakPtrFactory<ShillDeviceClientStubImpl> weak_ptr_factory_; 456 base::WeakPtrFactory<ShillDeviceClientStubImpl> weak_ptr_factory_;
402 457
403 DISALLOW_COPY_AND_ASSIGN(ShillDeviceClientStubImpl); 458 DISALLOW_COPY_AND_ASSIGN(ShillDeviceClientStubImpl);
404 }; 459 };
405 460
406 } // namespace 461 } // namespace
407 462
408 ShillDeviceClient::ShillDeviceClient() {} 463 ShillDeviceClient::ShillDeviceClient() {}
409 464
410 ShillDeviceClient::~ShillDeviceClient() {} 465 ShillDeviceClient::~ShillDeviceClient() {}
411 466
412 // static 467 // static
413 ShillDeviceClient* ShillDeviceClient::Create( 468 ShillDeviceClient* ShillDeviceClient::Create(
414 DBusClientImplementationType type, 469 DBusClientImplementationType type,
415 dbus::Bus* bus) { 470 dbus::Bus* bus) {
416 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) 471 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION)
417 return new ShillDeviceClientImpl(bus); 472 return new ShillDeviceClientImpl(bus);
418 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); 473 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type);
419 return new ShillDeviceClientStubImpl(); 474 return new ShillDeviceClientStubImpl();
420 } 475 }
421 476
422 } // namespace chromeos 477 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698