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