OLD | NEW |
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_service_client.h" | 5 #include "chromeos/dbus/shill_service_client.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/chromeos/chromeos_version.h" | 8 #include "base/chromeos/chromeos_version.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 | 184 |
185 // A stub implementation of ShillServiceClient. | 185 // A stub implementation of ShillServiceClient. |
186 class ShillServiceClientStubImpl : public ShillServiceClient, | 186 class ShillServiceClientStubImpl : public ShillServiceClient, |
187 public ShillServiceClient::TestInterface { | 187 public ShillServiceClient::TestInterface { |
188 public: | 188 public: |
189 ShillServiceClientStubImpl() : weak_ptr_factory_(this) { | 189 ShillServiceClientStubImpl() : weak_ptr_factory_(this) { |
190 SetDefaultProperties(); | 190 SetDefaultProperties(); |
191 } | 191 } |
192 | 192 |
193 virtual ~ShillServiceClientStubImpl() { | 193 virtual ~ShillServiceClientStubImpl() { |
| 194 STLDeleteContainerPairSecondPointers( |
| 195 observer_list_.begin(), observer_list_.end()); |
194 } | 196 } |
195 | 197 |
196 // ShillServiceClient overrides. | 198 // ShillServiceClient overrides. |
197 | 199 |
198 virtual void AddPropertyChangedObserver( | 200 virtual void AddPropertyChangedObserver( |
199 const dbus::ObjectPath& service_path, | 201 const dbus::ObjectPath& service_path, |
200 ShillPropertyChangedObserver* observer) OVERRIDE { | 202 ShillPropertyChangedObserver* observer) OVERRIDE { |
201 observer_list_.AddObserver(observer); | 203 GetObserverList(service_path).AddObserver(observer); |
202 } | 204 } |
203 | 205 |
204 virtual void RemovePropertyChangedObserver( | 206 virtual void RemovePropertyChangedObserver( |
205 const dbus::ObjectPath& service_path, | 207 const dbus::ObjectPath& service_path, |
206 ShillPropertyChangedObserver* observer) OVERRIDE { | 208 ShillPropertyChangedObserver* observer) OVERRIDE { |
207 observer_list_.RemoveObserver(observer); | 209 GetObserverList(service_path).RemoveObserver(observer); |
208 } | 210 } |
209 | 211 |
210 virtual void GetProperties(const dbus::ObjectPath& service_path, | 212 virtual void GetProperties(const dbus::ObjectPath& service_path, |
211 const DictionaryValueCallback& callback) OVERRIDE { | 213 const DictionaryValueCallback& callback) OVERRIDE { |
212 MessageLoop::current()->PostTask( | 214 MessageLoop::current()->PostTask( |
213 FROM_HERE, | 215 FROM_HERE, |
214 base::Bind(&ShillServiceClientStubImpl::PassStubDictionaryValue, | 216 base::Bind(&ShillServiceClientStubImpl::PassStubDictionaryValue, |
215 weak_ptr_factory_.GetWeakPtr(), | 217 weak_ptr_factory_.GetWeakPtr(), |
216 service_path, | 218 service_path, |
217 callback)); | 219 callback)); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 | 286 |
285 virtual ShillServiceClient::TestInterface* GetTestInterface() OVERRIDE { | 287 virtual ShillServiceClient::TestInterface* GetTestInterface() OVERRIDE { |
286 return this; | 288 return this; |
287 } | 289 } |
288 | 290 |
289 // ShillServiceClient::TestInterface overrides. | 291 // ShillServiceClient::TestInterface overrides. |
290 | 292 |
291 virtual void AddService(const std::string& service_path, | 293 virtual void AddService(const std::string& service_path, |
292 const std::string& name, | 294 const std::string& name, |
293 const std::string& type, | 295 const std::string& type, |
294 const std::string& state, | 296 const std::string& state) OVERRIDE { |
295 const std::string& security) OVERRIDE { | |
296 base::DictionaryValue* properties = GetServiceProperties(service_path); | 297 base::DictionaryValue* properties = GetServiceProperties(service_path); |
297 properties->SetWithoutPathExpansion( | 298 properties->SetWithoutPathExpansion( |
298 flimflam::kSSIDProperty, | 299 flimflam::kSSIDProperty, |
299 base::Value::CreateStringValue(service_path)); | 300 base::Value::CreateStringValue(service_path)); |
300 properties->SetWithoutPathExpansion( | 301 properties->SetWithoutPathExpansion( |
301 flimflam::kNameProperty, | 302 flimflam::kNameProperty, |
302 base::Value::CreateStringValue(name)); | 303 base::Value::CreateStringValue(name)); |
303 properties->SetWithoutPathExpansion( | 304 properties->SetWithoutPathExpansion( |
304 flimflam::kTypeProperty, | 305 flimflam::kTypeProperty, |
305 base::Value::CreateStringValue(type)); | 306 base::Value::CreateStringValue(type)); |
306 properties->SetWithoutPathExpansion( | 307 properties->SetWithoutPathExpansion( |
307 flimflam::kStateProperty, | 308 flimflam::kStateProperty, |
308 base::Value::CreateStringValue(state)); | 309 base::Value::CreateStringValue(state)); |
309 properties->SetWithoutPathExpansion( | |
310 flimflam::kSecurityProperty, | |
311 base::Value::CreateStringValue(security)); | |
312 } | 310 } |
313 | 311 |
314 virtual void RemoveService(const std::string& service_path) { | 312 virtual void RemoveService(const std::string& service_path) { |
315 stub_services_.RemoveWithoutPathExpansion(service_path, NULL); | 313 stub_services_.RemoveWithoutPathExpansion(service_path, NULL); |
316 } | 314 } |
317 | 315 |
318 virtual void SetServiceProperty(const std::string& service_path, | 316 virtual void SetServiceProperty(const std::string& service_path, |
319 const std::string& property, | 317 const std::string& property, |
320 const base::Value& value) OVERRIDE { | 318 const base::Value& value) OVERRIDE { |
321 SetProperty(dbus::ObjectPath(service_path), property, value, | 319 SetProperty(dbus::ObjectPath(service_path), property, value, |
322 base::Bind(&base::DoNothing), ErrorCallback()); | 320 base::Bind(&base::DoNothing), |
| 321 base::Bind(&ShillServiceClientStubImpl::ErrorFunction)); |
323 } | 322 } |
324 | 323 |
325 virtual void ClearServices() OVERRIDE { | 324 virtual void ClearServices() OVERRIDE { |
326 stub_services_.Clear(); | 325 stub_services_.Clear(); |
327 } | 326 } |
328 | 327 |
329 private: | 328 private: |
| 329 typedef ObserverList<ShillPropertyChangedObserver> PropertyObserverList; |
| 330 |
330 void SetDefaultProperties() { | 331 void SetDefaultProperties() { |
331 // Add stub services. Note: names match Manager stub impl. | 332 // Add stub services. Note: names match Manager stub impl. |
332 AddService("stub_ethernet", "eth0", | 333 AddService("stub_ethernet", "eth0", |
333 flimflam::kTypeEthernet, | 334 flimflam::kTypeEthernet, |
334 flimflam::kStateOnline, | 335 flimflam::kStateOnline); |
335 flimflam::kSecurityNone); | 336 |
336 AddService("stub_wifi1", "wifi1", | 337 AddService("stub_wifi1", "wifi1", |
337 flimflam::kTypeWifi, | 338 flimflam::kTypeWifi, |
338 flimflam::kStateOnline, | 339 flimflam::kStateOnline); |
339 flimflam::kSecurityNone); | 340 |
340 AddService("stub_wifi2", "wifi2_PSK", | 341 AddService("stub_wifi2", "wifi2_PSK", |
341 flimflam::kTypeWifi, | 342 flimflam::kTypeWifi, |
342 flimflam::kStateIdle, | 343 flimflam::kStateIdle); |
343 flimflam::kSecurityPsk); | 344 base::StringValue psk_value(flimflam::kSecurityPsk); |
| 345 SetServiceProperty("stub_wifi2", |
| 346 flimflam::kSecurityProperty, |
| 347 psk_value); |
| 348 |
344 AddService("stub_cellular1", "cellular1", | 349 AddService("stub_cellular1", "cellular1", |
345 flimflam::kTypeCellular, | 350 flimflam::kTypeCellular, |
346 flimflam::kStateIdle, | 351 flimflam::kStateIdle); |
347 flimflam::kSecurityNone); | |
348 base::StringValue technology_value(flimflam::kNetworkTechnologyGsm); | 352 base::StringValue technology_value(flimflam::kNetworkTechnologyGsm); |
349 SetServiceProperty("stub_cellular1", | 353 SetServiceProperty("stub_cellular1", |
350 flimflam::kNetworkTechnologyProperty, | 354 flimflam::kNetworkTechnologyProperty, |
351 technology_value); | 355 technology_value); |
352 } | 356 } |
353 | 357 |
354 void PassStubDictionaryValue(const dbus::ObjectPath& service_path, | 358 void PassStubDictionaryValue(const dbus::ObjectPath& service_path, |
355 const DictionaryValueCallback& callback) { | 359 const DictionaryValueCallback& callback) { |
356 base::DictionaryValue* dict = NULL; | 360 base::DictionaryValue* dict = NULL; |
357 if (!stub_services_.GetDictionaryWithoutPathExpansion( | 361 if (!stub_services_.GetDictionaryWithoutPathExpansion( |
(...skipping 13 matching lines...) Expand all Loading... |
371 LOG(ERROR) << "Notify for unknown service: " << path; | 375 LOG(ERROR) << "Notify for unknown service: " << path; |
372 return; | 376 return; |
373 } | 377 } |
374 base::Value* value = NULL; | 378 base::Value* value = NULL; |
375 if (!dict->GetWithoutPathExpansion(property, &value)) { | 379 if (!dict->GetWithoutPathExpansion(property, &value)) { |
376 LOG(ERROR) << "Notify for unknown property: " | 380 LOG(ERROR) << "Notify for unknown property: " |
377 << path << " : " << property; | 381 << path << " : " << property; |
378 return; | 382 return; |
379 } | 383 } |
380 FOR_EACH_OBSERVER(ShillPropertyChangedObserver, | 384 FOR_EACH_OBSERVER(ShillPropertyChangedObserver, |
381 observer_list_, | 385 GetObserverList(service_path), |
382 OnPropertyChanged(property, *value)); | 386 OnPropertyChanged(property, *value)); |
383 } | 387 } |
384 | 388 |
385 base::DictionaryValue* GetServiceProperties(const std::string& service_path) { | 389 base::DictionaryValue* GetServiceProperties(const std::string& service_path) { |
386 base::DictionaryValue* properties = NULL; | 390 base::DictionaryValue* properties = NULL; |
387 if (!stub_services_.GetDictionaryWithoutPathExpansion( | 391 if (!stub_services_.GetDictionaryWithoutPathExpansion( |
388 service_path, &properties)) { | 392 service_path, &properties)) { |
389 properties = new base::DictionaryValue; | 393 properties = new base::DictionaryValue; |
390 stub_services_.Set(service_path, properties); | 394 stub_services_.Set(service_path, properties); |
391 } | 395 } |
392 return properties; | 396 return properties; |
393 } | 397 } |
394 | 398 |
| 399 PropertyObserverList& GetObserverList(const dbus::ObjectPath& device_path) { |
| 400 std::map<dbus::ObjectPath, PropertyObserverList*>::iterator iter = |
| 401 observer_list_.find(device_path); |
| 402 if (iter != observer_list_.end()) |
| 403 return *(iter->second); |
| 404 PropertyObserverList* observer_list = new PropertyObserverList(); |
| 405 observer_list_[device_path] = observer_list; |
| 406 return *observer_list; |
| 407 } |
| 408 |
| 409 static void ErrorFunction(const std::string& error_name, |
| 410 const std::string& error_message) { |
| 411 LOG(ERROR) << "Shill Error: " << error_name << " : " << error_message; |
| 412 } |
395 | 413 |
396 base::DictionaryValue stub_services_; | 414 base::DictionaryValue stub_services_; |
397 ObserverList<ShillPropertyChangedObserver> observer_list_; | 415 // Observer list for each service. |
| 416 std::map<dbus::ObjectPath, PropertyObserverList*> observer_list_; |
398 | 417 |
399 // Note: This should remain the last member so it'll be destroyed and | 418 // Note: This should remain the last member so it'll be destroyed and |
400 // invalidate its weak pointers before any other members are destroyed. | 419 // invalidate its weak pointers before any other members are destroyed. |
401 base::WeakPtrFactory<ShillServiceClientStubImpl> weak_ptr_factory_; | 420 base::WeakPtrFactory<ShillServiceClientStubImpl> weak_ptr_factory_; |
402 | 421 |
403 DISALLOW_COPY_AND_ASSIGN(ShillServiceClientStubImpl); | 422 DISALLOW_COPY_AND_ASSIGN(ShillServiceClientStubImpl); |
404 }; | 423 }; |
405 | 424 |
406 } // namespace | 425 } // namespace |
407 | 426 |
408 ShillServiceClient::ShillServiceClient() {} | 427 ShillServiceClient::ShillServiceClient() {} |
409 | 428 |
410 ShillServiceClient::~ShillServiceClient() {} | 429 ShillServiceClient::~ShillServiceClient() {} |
411 | 430 |
412 // static | 431 // static |
413 ShillServiceClient* ShillServiceClient::Create( | 432 ShillServiceClient* ShillServiceClient::Create( |
414 DBusClientImplementationType type, | 433 DBusClientImplementationType type, |
415 dbus::Bus* bus) { | 434 dbus::Bus* bus) { |
416 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) | 435 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) |
417 return new ShillServiceClientImpl(bus); | 436 return new ShillServiceClientImpl(bus); |
418 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); | 437 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); |
419 return new ShillServiceClientStubImpl(); | 438 return new ShillServiceClientStubImpl(); |
420 } | 439 } |
421 | 440 |
422 } // namespace chromeos | 441 } // namespace chromeos |
OLD | NEW |