12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/shill_device_client_stub.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/shill_manager_client.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/shill_property_changed_observer.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/bus.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/message.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/object_path.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/object_proxy.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "dbus/values_util.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ErrorFunction(const std::string& error_name, 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& error_message) { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "Shill Error: " << error_name << " : " << error_message; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShillDeviceClientStub::ShillDeviceClientStub() : weak_ptr_factory_(this) { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetDefaultProperties(); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShillDeviceClientStub::~ShillDeviceClientStub() { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) STLDeleteContainerPairSecondPointers( 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_list_.begin(), observer_list_.end()); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ShillDeviceClient overrides. 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::AddPropertyChangedObserver( 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const dbus::ObjectPath& device_path, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShillPropertyChangedObserver* observer){ 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetObserverList(device_path).AddObserver(observer); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::RemovePropertyChangedObserver( 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const dbus::ObjectPath& device_path, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShillPropertyChangedObserver* observer){ 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetObserverList(device_path).RemoveObserver(observer); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::GetProperties( 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const dbus::ObjectPath& device_path, 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DictionaryValueCallback& callback){ 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask( 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&ShillDeviceClientStub::PassStubDeviceProperties, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_path, callback)); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::ProposeScan(const dbus::ObjectPath& device_path, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const VoidDBusMethodCallback& callback){ 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostVoidCallback(callback, DBUS_METHOD_CALL_SUCCESS); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::SetProperty(const dbus::ObjectPath& device_path, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value& value, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback){ 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* device_properties = NULL; 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!stub_devices_.GetDictionaryWithoutPathExpansion(device_path.value(), 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &device_properties)) { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error_name("org.chromium.flimflam.Error.Failure"); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string error_message("Failed"); 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::MessageLoop::current()->PostTask(FROM_HERE, 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(error_callback, 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_name, 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch error_message)); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch device_properties->SetWithoutPathExpansion(name, value.DeepCopy()); 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask( 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&ShillDeviceClientStub::NotifyObserversPropertyChanged, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), device_path, name)); 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, callback); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::ClearProperty( 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const dbus::ObjectPath& device_path, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name, 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const VoidDBusMethodCallback& callback){ 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* device_properties = NULL; 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!stub_devices_.GetDictionaryWithoutPathExpansion(device_path.value(), 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &device_properties)) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostVoidCallback(callback, DBUS_METHOD_CALL_FAILURE); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch device_properties->RemoveWithoutPathExpansion(name, NULL); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostVoidCallback(callback, DBUS_METHOD_CALL_SUCCESS); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::AddIPConfig( 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const dbus::ObjectPath& device_path, 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& method, 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ObjectPathDBusMethodCallback& callback){ 112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(callback, 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DBUS_METHOD_CALL_SUCCESS, 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dbus::ObjectPath())); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::RequirePin(const dbus::ObjectPath& device_path, 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& pin, 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool require, 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback){ 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, callback); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::EnterPin(const dbus::ObjectPath& device_path, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& pin, 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback){ 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, callback); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::UnblockPin(const dbus::ObjectPath& device_path, 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& puk, 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& pin, 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback){ 138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, callback); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::ChangePin(const dbus::ObjectPath& device_path, 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& old_pin, 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& new_pin, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback){ 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, callback); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::Register(const dbus::ObjectPath& device_path, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& network_id, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback){ 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, callback); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::SetCarrier(const dbus::ObjectPath& device_path, 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& carrier, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback){ 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, callback); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::Reset(const dbus::ObjectPath& device_path, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ErrorCallback& error_callback){ 166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, callback); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShillDeviceClient::TestInterface* ShillDeviceClientStub::GetTestInterface(){ 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return this; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ShillDeviceClient::TestInterface overrides. 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::AddDevice(const std::string& device_path, 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& type, 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& object_path){ 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface()-> 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddDevice(device_path); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* properties = GetDeviceProperties(device_path); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties->SetWithoutPathExpansion( 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flimflam::kTypeProperty, 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value::CreateStringValue(type)); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties->SetWithoutPathExpansion( 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flimflam::kDBusObjectProperty, 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value::CreateStringValue(object_path)); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties->SetWithoutPathExpansion( 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flimflam::kDBusConnectionProperty, 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value::CreateStringValue("/stub")); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::RemoveDevice(const std::string& device_path){ 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface()-> 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveDevice(device_path); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stub_devices_.RemoveWithoutPathExpansion(device_path, NULL); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::ClearDevices(){ 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface()-> 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClearDevices(); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stub_devices_.Clear(); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::SetDeviceProperty(const std::string& device_path, 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name, 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value& value){ 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(1) << "SetDeviceProperty: " << device_path 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << ": " << name << " = " << value; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetProperty(dbus::ObjectPath(device_path), name, value, 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&base::DoNothing), 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&ErrorFunction)); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string ShillDeviceClientStub::GetDevicePathForType( 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& type) { 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (base::DictionaryValue::Iterator iter(stub_devices_); 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iter.IsAtEnd(); iter.Advance()) { 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::DictionaryValue* properties = NULL; 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!iter.value().GetAsDictionary(&properties)) 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) continue; 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string prop_type; 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!properties->GetStringWithoutPathExpansion( 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) flimflam::kTypeProperty, &prop_type) || 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) prop_type != type) 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) continue; 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return iter.key(); 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::SetDefaultProperties() { 2352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Add a wifi device. 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddDevice("stub_wifi_device1", flimflam::kTypeWifi, "/device/wifi1"); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Add a cellular device. Used in SMS stub. 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddDevice("stub_cellular_device1", flimflam::kTypeCellular, 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "/device/cellular1"); 2412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Add a wimax device. 2432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch AddDevice("stub_wimax_device1", flimflam::kTypeWimax, 2442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch "/device/wimax1"); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::PassStubDeviceProperties( 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const dbus::ObjectPath& device_path, 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DictionaryValueCallback& callback) const { 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* device_properties = NULL; 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!stub_devices_.GetDictionaryWithoutPathExpansion( 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_path.value(), &device_properties)) { 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue empty_dictionary; 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(DBUS_METHOD_CALL_FAILURE, empty_dictionary); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(DBUS_METHOD_CALL_SUCCESS, *device_properties); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Posts a task to run a void callback with status code |status|. 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::PostVoidCallback( 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const VoidDBusMethodCallback& callback, 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusMethodCallStatus status) { 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(callback, status)); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillDeviceClientStub::NotifyObserversPropertyChanged( 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const dbus::ObjectPath& device_path, 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& property) { 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* dict = NULL; 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string path = device_path.value(); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!stub_devices_.GetDictionaryWithoutPathExpansion(path, &dict)) { 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "Notify for unknown service: " << path; 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* value = NULL; 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!dict->GetWithoutPathExpansion(property, &value)) { 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << "Notify for unknown property: " 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << path << " : " << property; 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER(ShillPropertyChangedObserver, 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetObserverList(device_path), 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnPropertyChanged(property, *value)); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::DictionaryValue* ShillDeviceClientStub::GetDeviceProperties( 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_path) { 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* properties = NULL; 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!stub_devices_.GetDictionaryWithoutPathExpansion( 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_path, &properties)) { 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties = new base::DictionaryValue; 2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch stub_devices_.SetWithoutPathExpansion(device_path, properties); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return properties; 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShillDeviceClientStub::PropertyObserverList& 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShillDeviceClientStub::GetObserverList(const dbus::ObjectPath& device_path) { 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<dbus::ObjectPath, PropertyObserverList*>::iterator iter = 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_list_.find(device_path); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter != observer_list_.end()) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *(iter->second); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PropertyObserverList* observer_list = new PropertyObserverList(); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_list_[device_path] = observer_list; 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *observer_list; 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chromeos 311