shill_property_handler.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/network/shill_property_handler.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <sstream> 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/format_macros.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_device_client.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_ipconfig_client.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_manager_client.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chromeos/dbus/shill_profile_client.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_service_client.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_event_log.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/network/network_state.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_path.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Limit the number of services or devices we observe. Since they are listed in 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// priority order, it should be reasonable to ignore services past this. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kMaxObserved = 100; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::ListValue* GetListValue(const std::string& key, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* vlist = NULL; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value.GetAsList(&vlist)) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Error parsing key as list: " << key; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return vlist; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Class to manage Shill service property changed observers. Observers are 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// added on construction and removed on destruction. Runs the handler when 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OnPropertyChanged is called. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ShillPropertyObserver : public ShillPropertyChangedObserver { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void(ManagedState::ManagedType type, 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& service, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value& value)> Handler; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShillPropertyObserver(ManagedState::ManagedType type, 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& path, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Handler& handler) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : type_(type), 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path_(path), 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) handler_(handler) { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ == ManagedState::MANAGED_TYPE_NETWORK) { 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(2) << "ShillPropertyObserver: Network: " << path; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()-> 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPropertyChangedObserver(dbus::ObjectPath(path_), this); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (type_ == ManagedState::MANAGED_TYPE_DEVICE) { 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(2) << "ShillPropertyObserver: Device: " << path; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillDeviceClient()-> 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPropertyChangedObserver(dbus::ObjectPath(path_), this); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ShillPropertyObserver() { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ == ManagedState::MANAGED_TYPE_NETWORK) { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()-> 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePropertyChangedObserver(dbus::ObjectPath(path_), this); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (type_ == ManagedState::MANAGED_TYPE_DEVICE) { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillDeviceClient()-> 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePropertyChangedObserver(dbus::ObjectPath(path_), this); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ShillPropertyChangedObserver overrides. 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPropertyChanged(const std::string& key, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value& value) OVERRIDE { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) handler_.Run(type_, path_, key, value); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedState::ManagedType type_; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string path_; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Handler handler_; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ShillPropertyObserver); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//------------------------------------------------------------------------------ 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ShillPropertyHandler 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShillPropertyHandler::ShillPropertyHandler(Listener* listener) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : listener_(listener), 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shill_manager_(DBusThreadManager::Get()->GetShillManagerClient()) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShillPropertyHandler::~ShillPropertyHandler() { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete network service observers. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteContainerPairSecondPointers( 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observed_networks_.begin(), observed_networks_.end()); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) STLDeleteContainerPairSecondPointers( 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observed_devices_.begin(), observed_devices_.end()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(shill_manager_ == DBusThreadManager::Get()->GetShillManagerClient()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shill_manager_->RemovePropertyChangedObserver(this); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::Init() { 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateManagerProperties(); 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch shill_manager_->AddPropertyChangedObserver(this); 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ShillPropertyHandler::UpdateManagerProperties() { 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NET_LOG_EVENT("UpdateManagerProperties", ""); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shill_manager_->GetProperties( 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ShillPropertyHandler::ManagerPropertiesCallback, 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr())); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShillPropertyHandler::IsTechnologyAvailable( 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& technology) const { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return available_technologies_.count(technology) != 0; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShillPropertyHandler::IsTechnologyEnabled( 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& technology) const { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return enabled_technologies_.count(technology) != 0; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShillPropertyHandler::IsTechnologyEnabling( 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& technology) const { 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return enabling_technologies_.count(technology) != 0; 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShillPropertyHandler::IsTechnologyUninitialized( 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& technology) const { 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return uninitialized_technologies_.count(technology) != 0; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::SetTechnologyEnabled( 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& technology, 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool enabled, 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::ErrorCallback& error_callback) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enabled) { 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabling_technologies_.insert(technology); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shill_manager_->EnableTechnology( 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) technology, 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&base::DoNothing), 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&ShillPropertyHandler::EnableTechnologyFailed, 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), technology, error_callback)); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Immediately clear locally from enabled and enabling lists. 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabled_technologies_.erase(technology); 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabling_technologies_.erase(technology); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shill_manager_->DisableTechnology( 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) technology, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&base::DoNothing), 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&network_handler::ShillErrorCallbackFunction, 1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "SetTechnologyEnabled Failed", 17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) technology, error_callback)); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ShillPropertyHandler::SetCheckPortalList( 177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& check_portal_list) { 178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::StringValue value(check_portal_list); 179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) shill_manager_->SetProperty( 18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) shill::kCheckPortalListProperty, 181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) value, 182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Bind(&base::DoNothing), 183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Bind(&network_handler::ShillErrorCallbackFunction, 1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "SetCheckPortalList Failed", 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "", network_handler::ErrorCallback())); 186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::RequestScan() const { 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shill_manager_->RequestScan( 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&base::DoNothing), 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&network_handler::ShillErrorCallbackFunction, 1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "RequestScan Failed", 19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "", network_handler::ErrorCallback())); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShillPropertyHandler::ConnectToBestServices() const { 19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_EVENT("ConnectToBestServices", ""); 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shill_manager_->ConnectToBestServices( 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&base::DoNothing), 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&network_handler::ShillErrorCallbackFunction, 2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "ConnectToBestServices Failed", 20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "", network_handler::ErrorCallback())); 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::RequestProperties(ManagedState::ManagedType type, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path) { 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_updates_[type].find(path) != pending_updates_[type].end()) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; // Update already requested. 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) NET_LOG_DEBUG("Request Properties: " + ManagedState::TypeToString(type), 21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) path); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_updates_[type].insert(path); 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == ManagedState::MANAGED_TYPE_NETWORK || 215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch type == ManagedState::MANAGED_TYPE_FAVORITE) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()->GetProperties( 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectPath(path), 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ShillPropertyHandler::GetPropertiesCallback, 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), type, path)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (type == ManagedState::MANAGED_TYPE_DEVICE) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusThreadManager::Get()->GetShillDeviceClient()->GetProperties( 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectPath(path), 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ShillPropertyHandler::GetPropertiesCallback, 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), type, path)); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::OnPropertyChanged(const std::string& key, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) { 232d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ManagerPropertyChanged(key, value); 233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CheckPendingStateListUpdates(key); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Private methods 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::ManagerPropertiesCallback( 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMethodCallStatus call_status, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& properties) { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (call_status != DBUS_METHOD_CALL_SUCCESS) { 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_ERROR("ManagerPropertiesCallback", 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::StringPrintf("Failed: %d", call_status)); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_EVENT("ManagerPropertiesCallback", "Success"); 248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Value* update_service_value = NULL; 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Value* update_service_complete_value = NULL; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (base::DictionaryValue::Iterator iter(properties); 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iter.IsAtEnd(); iter.Advance()) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defer updating Services until all other properties have been updated. 25368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (iter.key() == shill::kServicesProperty) 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch update_service_value = &iter.value(); 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else if (iter.key() == shill::kServiceCompleteListProperty) 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch update_service_complete_value = &iter.value(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 258d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ManagerPropertyChanged(iter.key(), iter.value()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Update Services which can safely assume other properties have been set. 261d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (update_service_value) 26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ManagerPropertyChanged(shill::kServicesProperty, *update_service_value); 263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Update ServiceCompleteList which skips entries that have already been 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // requested for Services. 265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (update_service_complete_value) { 266d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ManagerPropertyChanged(shill::kServiceCompleteListProperty, 267d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) *update_service_complete_value); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CheckPendingStateListUpdates(""); 271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ShillPropertyHandler::CheckPendingStateListUpdates( 274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& key) { 275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Once there are no pending updates, signal the state list changed callbacks. 27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if ((key.empty() || key == shill::kServicesProperty) && 277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pending_updates_[ManagedState::MANAGED_TYPE_NETWORK].size() == 0) { 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->ManagedStateListChanged(ManagedState::MANAGED_TYPE_NETWORK); 279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Both Network update requests and Favorite update requests will affect 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the list of favorites, so wait for both to complete. 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if ((key.empty() || key == shill::kServiceCompleteListProperty) && 283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pending_updates_[ManagedState::MANAGED_TYPE_NETWORK].size() == 0 && 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pending_updates_[ManagedState::MANAGED_TYPE_FAVORITE].size() == 0) { 285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch listener_->ManagedStateListChanged(ManagedState::MANAGED_TYPE_FAVORITE); 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 28768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if ((key.empty() || key == shill::kDevicesProperty) && 288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pending_updates_[ManagedState::MANAGED_TYPE_DEVICE].size() == 0) { 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->ManagedStateListChanged(ManagedState::MANAGED_TYPE_DEVICE); 290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 293d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ShillPropertyHandler::ManagerPropertyChanged(const std::string& key, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) { 29546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) NET_LOG_DEBUG("ManagerPropertyChanged", key); 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (key == shill::kDefaultServiceProperty) { 297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string service_path; 298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) value.GetAsString(&service_path); 299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) listener_->DefaultNetworkServiceChanged(service_path); 300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else if (key == shill::kServicesProperty) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* vlist = GetListValue(key, value); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vlist) { 303a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) listener_->UpdateManagedList(ManagedState::MANAGED_TYPE_NETWORK, *vlist); 304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateProperties(ManagedState::MANAGED_TYPE_NETWORK, *vlist); 305a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // UpdateObserved used to use kServiceWatchListProperty for TYPE_NETWORK, 306a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // however that prevents us from receiving Strength updates from inactive 307a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // networks. The overhead for observing all services is not unreasonable 308a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // (and we limit the max number of observed services to kMaxObserved). 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateObserved(ManagedState::MANAGED_TYPE_NETWORK, *vlist); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (key == shill::kServiceCompleteListProperty) { 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::ListValue* vlist = GetListValue(key, value); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (vlist) { 314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch listener_->UpdateManagedList(ManagedState::MANAGED_TYPE_FAVORITE, *vlist); 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateProperties(ManagedState::MANAGED_TYPE_FAVORITE, *vlist); 316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 31768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } else if (key == shill::kDevicesProperty) { 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::ListValue* vlist = GetListValue(key, value); 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (vlist) { 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->UpdateManagedList(ManagedState::MANAGED_TYPE_DEVICE, *vlist); 321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateProperties(ManagedState::MANAGED_TYPE_DEVICE, *vlist); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateObserved(ManagedState::MANAGED_TYPE_DEVICE, *vlist); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 32468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } else if (key == shill::kAvailableTechnologiesProperty) { 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* vlist = GetListValue(key, value); 326d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (vlist) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateAvailableTechnologies(*vlist); 32868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } else if (key == shill::kEnabledTechnologiesProperty) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* vlist = GetListValue(key, value); 330d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (vlist) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateEnabledTechnologies(*vlist); 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (key == shill::kUninitializedTechnologiesProperty) { 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* vlist = GetListValue(key, value); 334d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (vlist) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateUninitializedTechnologies(*vlist); 33668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } else if (key == shill::kProfilesProperty) { 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) listener_->ProfileListChanged(); 33868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } else if (key == shill::kCheckPortalListProperty) { 339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string check_portal_list; 340d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (value.GetAsString(&check_portal_list)) 341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) listener_->CheckPortalListChanged(check_portal_list); 342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VLOG(2) << "Ignored Manager Property: " << key; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ShillPropertyHandler::UpdateProperties(ManagedState::ManagedType type, 348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::ListValue& entries) { 349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::set<std::string>& requested_updates = requested_updates_[type]; 350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::set<std::string>& requested_service_updates = 351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch requested_updates_[ManagedState::MANAGED_TYPE_NETWORK]; // For favorites 352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::set<std::string> new_requested_updates; 35346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) NET_LOG_DEBUG("UpdateProperties: " + ManagedState::TypeToString(type), 35446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::StringPrintf("%" PRIuS, entries.GetSize())); 355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (base::ListValue::const_iterator iter = entries.begin(); 356eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter != entries.end(); ++iter) { 357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string path; 358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (*iter)->GetAsString(&path); 359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (path.empty()) 360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch continue; 361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Only request properties once. Favorites that are visible will be updated 362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // when the Network entry is updated. Since 'Services' is always processed 363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // before ServiceCompleteList, only Favorites that are not visible will be 364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // requested here, and GetPropertiesCallback() will only get called with 365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // type == FAVORITE for non-visible Favorites. 366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == ManagedState::MANAGED_TYPE_FAVORITE && 367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) requested_service_updates.count(path) > 0) { 368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) continue; 369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We add a special case for devices here to work around an issue in shill 372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // that prevents it from sending property changed signals for cellular 373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // devices (see crbug.com/321854). 374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (type == ManagedState::MANAGED_TYPE_DEVICE || 375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) requested_updates.find(path) == requested_updates.end()) 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RequestProperties(type, path); 377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new_requested_updates.insert(path); 378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch requested_updates.swap(new_requested_updates); 380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::UpdateObserved(ManagedState::ManagedType type, 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue& entries) { 384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(type == ManagedState::MANAGED_TYPE_NETWORK || 385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch type == ManagedState::MANAGED_TYPE_DEVICE); 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShillPropertyObserverMap& observer_map = 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (type == ManagedState::MANAGED_TYPE_NETWORK) 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ? observed_networks_ : observed_devices_; 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShillPropertyObserverMap new_observed; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (base::ListValue::const_iterator iter1 = entries.begin(); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter1 != entries.end(); ++iter1) { 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string path; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter1)->GetAsString(&path); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (path.empty()) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShillPropertyObserverMap::iterator iter2 = observer_map.find(path); 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter2 != observer_map.end()) { 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_observed[path] = iter2->second; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create an observer for future updates. 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_observed[path] = new ShillPropertyObserver( 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type, path, base::Bind( 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &ShillPropertyHandler::PropertyChangedCallback, AsWeakPtr())); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_map.erase(path); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Limit the number of observed services. 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_observed.size() >= kMaxObserved) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete network service observers still in observer_map. 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ShillPropertyObserverMap::iterator iter = observer_map.begin(); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != observer_map.end(); ++iter) { 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete iter->second; 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_map.swap(new_observed); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::UpdateAvailableTechnologies( 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue& technologies) { 420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::stringstream technologies_str; 421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) technologies_str << technologies; 422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NET_LOG_EVENT("AvailableTechnologies:", technologies_str.str()); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) available_technologies_.clear(); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (base::ListValue::const_iterator iter = technologies.begin(); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != technologies.end(); ++iter) { 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string technology; 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*iter)->GetAsString(&technology); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!technology.empty()); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) available_technologies_.insert(technology); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 431d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) listener_->TechnologyListChanged(); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::UpdateEnabledTechnologies( 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue& technologies) { 436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::stringstream technologies_str; 437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) technologies_str << technologies; 438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NET_LOG_EVENT("EnabledTechnologies:", technologies_str.str()); 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enabled_technologies_.clear(); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (base::ListValue::const_iterator iter = technologies.begin(); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != technologies.end(); ++iter) { 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string technology; 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*iter)->GetAsString(&technology); 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!technology.empty()); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enabled_technologies_.insert(technology); 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabling_technologies_.erase(technology); 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 448d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) listener_->TechnologyListChanged(); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::UpdateUninitializedTechnologies( 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue& technologies) { 453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::stringstream technologies_str; 454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) technologies_str << technologies; 455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NET_LOG_EVENT("UninitializedTechnologies:", technologies_str.str()); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uninitialized_technologies_.clear(); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (base::ListValue::const_iterator iter = technologies.begin(); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != technologies.end(); ++iter) { 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string technology; 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*iter)->GetAsString(&technology); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!technology.empty()); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uninitialized_technologies_.insert(technology); 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 464d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) listener_->TechnologyListChanged(); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShillPropertyHandler::EnableTechnologyFailed( 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& technology, 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const network_handler::ErrorCallback& error_callback, 4707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& dbus_error_name, 4717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& dbus_error_message) { 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabling_technologies_.erase(technology); 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_handler::ShillErrorCallbackFunction( 4747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "EnableTechnology Failed", 4757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch technology, error_callback, 4767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dbus_error_name, dbus_error_message); 477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::GetPropertiesCallback( 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagedState::ManagedType type, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMethodCallStatus call_status, 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& properties) { 484effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch NET_LOG_DEBUG("GetPropertiesCallback: " + ManagedState::TypeToString(type), 485effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch path); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_updates_[type].erase(path); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (call_status != DBUS_METHOD_CALL_SUCCESS) { 48858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The shill service no longer exists. This can happen when a network 48958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // has been removed. 49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NET_LOG_DEBUG("Failed to get properties", 491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::StringPrintf("%s: %d", path.c_str(), call_status)); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Update Favorite properties for networks in the Services list. Call this 495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // for all networks, regardless of whether or not Profile is set, because 496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // we track all networks in the Favorites list (even if they aren't saved 497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // in a Profile). See notes in UpdateProperties() and favorite_state.h. 498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == ManagedState::MANAGED_TYPE_NETWORK) { 499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) listener_->UpdateManagedStateProperties( 500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ManagedState::MANAGED_TYPE_FAVORITE, path, properties); 501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 5024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) listener_->UpdateManagedStateProperties(type, path, properties); 503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (type == ManagedState::MANAGED_TYPE_NETWORK) { 505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Request IPConfig properties. 506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::Value* value; 507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (properties.GetWithoutPathExpansion(shill::kIPConfigProperty, &value)) 508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RequestIPConfig(type, path, *value); 509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (type == ManagedState::MANAGED_TYPE_DEVICE) { 510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Clear and request IPConfig properties for each entry in IPConfigs. 511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::Value* value; 512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (properties.GetWithoutPathExpansion(shill::kIPConfigsProperty, &value)) 513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RequestIPConfigsList(type, path, *value); 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify the listener only when all updates for that type have completed. 517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (pending_updates_[type].size() == 0) { 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_->ManagedStateListChanged(type); 519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Notify that Favorites have changed when notifying for Networks if there 520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // are no additional Favorite updates pending. 521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == ManagedState::MANAGED_TYPE_NETWORK && 522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pending_updates_[ManagedState::MANAGED_TYPE_FAVORITE].size() == 0) { 523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch listener_->ManagedStateListChanged(ManagedState::MANAGED_TYPE_FAVORITE); 524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::PropertyChangedCallback( 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedState::ManagedType type, 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& path, 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& key, 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value& value) { 533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (type == ManagedState::MANAGED_TYPE_NETWORK && 534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) key == shill::kIPConfigProperty) { 535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RequestIPConfig(type, path, value); 536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else if (type == ManagedState::MANAGED_TYPE_DEVICE && 537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) key == shill::kIPConfigsProperty) { 538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RequestIPConfigsList(type, path, value); 539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type == ManagedState::MANAGED_TYPE_NETWORK) 542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) listener_->UpdateNetworkServiceProperty(path, key, value); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (type == ManagedState::MANAGED_TYPE_DEVICE) 544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) listener_->UpdateDeviceProperty(path, key, value); 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ShillPropertyHandler::RequestIPConfig( 550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ManagedState::ManagedType type, 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, 552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::Value& ip_config_path_value) { 553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string ip_config_path; 554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!ip_config_path_value.GetAsString(&ip_config_path) || 555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ip_config_path.empty()) { 556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NET_LOG_ERROR("Invalid IPConfig", path); 557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DBusThreadManager::Get()->GetShillIPConfigClient()->GetProperties( 560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) dbus::ObjectPath(ip_config_path), 561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&ShillPropertyHandler::GetIPConfigCallback, 562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AsWeakPtr(), type, path, ip_config_path)); 563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ShillPropertyHandler::RequestIPConfigsList( 566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ManagedState::ManagedType type, 567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& path, 568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::Value& ip_config_list_value) { 569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::ListValue* ip_configs; 570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!ip_config_list_value.GetAsList(&ip_configs)) 571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (base::ListValue::const_iterator iter = ip_configs->begin(); 573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) iter != ip_configs->end(); ++iter) { 574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) RequestIPConfig(type, path, **iter); 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::GetIPConfigCallback( 579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ManagedState::ManagedType type, 580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& path, 581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& ip_config_path, 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMethodCallStatus call_status, 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& properties) { 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (call_status != DBUS_METHOD_CALL_SUCCESS) { 585eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NET_LOG_ERROR("Failed to get IP Config properties", 586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::StringPrintf("%s: %d", path.c_str(), call_status)); 587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NET_LOG_EVENT("IP Config properties received", path); 590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) listener_->UpdateIPConfigProperties(type, path, ip_config_path, properties); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 595