shill_property_handler.cc revision 58537e28ecd584eab876aee8be7156509866d23a
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) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/format_macros.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_device_client.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_ipconfig_client.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_manager_client.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chromeos/dbus/shill_profile_client.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_service_client.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_event_log.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/network/network_state.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_path.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Limit the number of services or devices we observe. Since they are listed in 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// priority order, it should be reasonable to ignore services past this. 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kMaxObserved = 100; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::ListValue* GetListValue(const std::string& key, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* vlist = NULL; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value.GetAsList(&vlist)) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Error parsing key as list: " << key; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return vlist; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Class to manage Shill service property changed observers. Observers are 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// added on construction and removed on destruction. Runs the handler when 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OnPropertyChanged is called. 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ShillPropertyObserver : public ShillPropertyChangedObserver { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void(ManagedState::ManagedType type, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& service, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name, 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value& value)> Handler; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShillPropertyObserver(ManagedState::ManagedType type, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& path, 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Handler& handler) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : type_(type), 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path_(path), 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) handler_(handler) { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ == ManagedState::MANAGED_TYPE_NETWORK) { 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()-> 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPropertyChangedObserver(dbus::ObjectPath(path_), this); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (type_ == ManagedState::MANAGED_TYPE_DEVICE) { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillDeviceClient()-> 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPropertyChangedObserver(dbus::ObjectPath(path_), this); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ShillPropertyObserver() { 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ == ManagedState::MANAGED_TYPE_NETWORK) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()-> 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePropertyChangedObserver(dbus::ObjectPath(path_), this); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (type_ == ManagedState::MANAGED_TYPE_DEVICE) { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillDeviceClient()-> 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePropertyChangedObserver(dbus::ObjectPath(path_), this); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ShillPropertyChangedObserver overrides. 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPropertyChanged(const std::string& key, 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value& value) OVERRIDE { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) handler_.Run(type_, path_, key, value); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedState::ManagedType type_; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string path_; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Handler handler_; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ShillPropertyObserver); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//------------------------------------------------------------------------------ 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ShillPropertyHandler 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShillPropertyHandler::ShillPropertyHandler(Listener* listener) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : listener_(listener), 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shill_manager_(DBusThreadManager::Get()->GetShillManagerClient()) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShillPropertyHandler::~ShillPropertyHandler() { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete network service observers. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteContainerPairSecondPointers( 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observed_networks_.begin(), observed_networks_.end()); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) STLDeleteContainerPairSecondPointers( 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observed_devices_.begin(), observed_devices_.end()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(shill_manager_ == DBusThreadManager::Get()->GetShillManagerClient()); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shill_manager_->RemovePropertyChangedObserver(this); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::Init() { 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateManagerProperties(); 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch shill_manager_->AddPropertyChangedObserver(this); 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ShillPropertyHandler::UpdateManagerProperties() { 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NET_LOG_EVENT("UpdateManagerProperties", ""); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shill_manager_->GetProperties( 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ShillPropertyHandler::ManagerPropertiesCallback, 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr())); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShillPropertyHandler::IsTechnologyAvailable( 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& technology) const { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return available_technologies_.count(technology) != 0; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShillPropertyHandler::IsTechnologyEnabled( 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& technology) const { 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return enabled_technologies_.count(technology) != 0; 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShillPropertyHandler::IsTechnologyEnabling( 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& technology) const { 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return enabling_technologies_.count(technology) != 0; 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShillPropertyHandler::IsTechnologyUninitialized( 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& technology) const { 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return uninitialized_technologies_.count(technology) != 0; 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::SetTechnologyEnabled( 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& technology, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool enabled, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::ErrorCallback& error_callback) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enabled) { 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabling_technologies_.insert(technology); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shill_manager_->EnableTechnology( 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) technology, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&base::DoNothing), 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&ShillPropertyHandler::EnableTechnologyFailed, 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), technology, error_callback)); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Immediately clear locally from enabled and enabling lists. 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabled_technologies_.erase(technology); 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabling_technologies_.erase(technology); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shill_manager_->DisableTechnology( 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) technology, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&base::DoNothing), 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&network_handler::ShillErrorCallbackFunction, 1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "SetTechnologyEnabled Failed", 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) technology, error_callback)); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ShillPropertyHandler::SetCheckPortalList( 173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& check_portal_list) { 174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::StringValue value(check_portal_list); 175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) shill_manager_->SetProperty( 176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) flimflam::kCheckPortalListProperty, 177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) value, 178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Bind(&base::DoNothing), 179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Bind(&network_handler::ShillErrorCallbackFunction, 1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "SetCheckPortalList Failed", 181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "", network_handler::ErrorCallback())); 182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::RequestScan() const { 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shill_manager_->RequestScan( 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&base::DoNothing), 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&network_handler::ShillErrorCallbackFunction, 1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "RequestScan Failed", 19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "", network_handler::ErrorCallback())); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShillPropertyHandler::ConnectToBestServices() const { 19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_EVENT("ConnectToBestServices", ""); 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shill_manager_->ConnectToBestServices( 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&base::DoNothing), 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&network_handler::ShillErrorCallbackFunction, 1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "ConnectToBestServices Failed", 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "", network_handler::ErrorCallback())); 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::RequestProperties(ManagedState::ManagedType type, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path) { 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VLOG(2) << "Request Properties: " << type << " : " << path; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_updates_[type].find(path) != pending_updates_[type].end()) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; // Update already requested. 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_updates_[type].insert(path); 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == ManagedState::MANAGED_TYPE_NETWORK || 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch type == ManagedState::MANAGED_TYPE_FAVORITE) { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()->GetProperties( 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectPath(path), 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ShillPropertyHandler::GetPropertiesCallback, 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), type, path)); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (type == ManagedState::MANAGED_TYPE_DEVICE) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusThreadManager::Get()->GetShillDeviceClient()->GetProperties( 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectPath(path), 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ShillPropertyHandler::GetPropertiesCallback, 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), type, path)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::OnPropertyChanged(const std::string& key, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) { 22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (ManagerPropertyChanged(key, value)) { 22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string detail = key; 22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) detail += " = " + network_event_log::ValueAsString(value); 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_DEBUG("ManagerPropertyChanged", detail); 23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) listener_->NotifyManagerPropertyChanged(); 23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 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"); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool notify = false; 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Value* update_service_value = NULL; 250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Value* update_service_complete_value = NULL; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (base::DictionaryValue::Iterator iter(properties); 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iter.IsAtEnd(); iter.Advance()) { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defer updating Services until all other properties have been updated. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter.key() == flimflam::kServicesProperty) 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch update_service_value = &iter.value(); 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else if (iter.key() == shill::kServiceCompleteListProperty) 257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch update_service_complete_value = &iter.value(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify |= ManagerPropertyChanged(iter.key(), iter.value()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Update Services which can safely assume other properties have been set. 262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (update_service_value) { 263eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch notify |= ManagerPropertyChanged(flimflam::kServicesProperty, 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *update_service_value); 265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Update ServiceCompleteList which skips entries that have already been 267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // requested for Services. 268eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (update_service_complete_value) { 269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch notify |= ManagerPropertyChanged(shill::kServiceCompleteListProperty, 270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *update_service_complete_value); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (notify) 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) listener_->NotifyManagerPropertyChanged(); 275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CheckPendingStateListUpdates(""); 276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ShillPropertyHandler::CheckPendingStateListUpdates( 279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& key) { 280eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Once there are no pending updates, signal the state list changed callbacks. 281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if ((key.empty() || key == flimflam::kServicesProperty) && 282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pending_updates_[ManagedState::MANAGED_TYPE_NETWORK].size() == 0) { 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->ManagedStateListChanged(ManagedState::MANAGED_TYPE_NETWORK); 284eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 285eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Both Network update requests and Favorite update requests will affect 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the list of favorites, so wait for both to complete. 287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if ((key.empty() || key == shill::kServiceCompleteListProperty) && 288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pending_updates_[ManagedState::MANAGED_TYPE_NETWORK].size() == 0 && 289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pending_updates_[ManagedState::MANAGED_TYPE_FAVORITE].size() == 0) { 290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch listener_->ManagedStateListChanged(ManagedState::MANAGED_TYPE_FAVORITE); 291eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if ((key.empty() || key == flimflam::kDevicesProperty) && 293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pending_updates_[ManagedState::MANAGED_TYPE_DEVICE].size() == 0) { 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->ManagedStateListChanged(ManagedState::MANAGED_TYPE_DEVICE); 295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ShillPropertyHandler::ManagerPropertyChanged(const std::string& key, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool notify_manager_changed = false; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key == flimflam::kServicesProperty) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* vlist = GetListValue(key, value); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vlist) { 304a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) listener_->UpdateManagedList(ManagedState::MANAGED_TYPE_NETWORK, *vlist); 305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateProperties(ManagedState::MANAGED_TYPE_NETWORK, *vlist); 306a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // UpdateObserved used to use kServiceWatchListProperty for TYPE_NETWORK, 307a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // however that prevents us from receiving Strength updates from inactive 308a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // networks. The overhead for observing all services is not unreasonable 309a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // (and we limit the max number of observed services to kMaxObserved). 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateObserved(ManagedState::MANAGED_TYPE_NETWORK, *vlist); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (key == shill::kServiceCompleteListProperty) { 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue* vlist = GetListValue(key, value); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (vlist) { 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch listener_->UpdateManagedList(ManagedState::MANAGED_TYPE_FAVORITE, *vlist); 316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateProperties(ManagedState::MANAGED_TYPE_FAVORITE, *vlist); 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else if (key == flimflam::kDevicesProperty) { 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::ListValue* vlist = GetListValue(key, value); 320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (vlist) { 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->UpdateManagedList(ManagedState::MANAGED_TYPE_DEVICE, *vlist); 322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateProperties(ManagedState::MANAGED_TYPE_DEVICE, *vlist); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateObserved(ManagedState::MANAGED_TYPE_DEVICE, *vlist); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (key == flimflam::kAvailableTechnologiesProperty) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* vlist = GetListValue(key, value); 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (vlist) { 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateAvailableTechnologies(*vlist); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_manager_changed = true; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (key == flimflam::kEnabledTechnologiesProperty) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* vlist = GetListValue(key, value); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vlist) { 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateEnabledTechnologies(*vlist); 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) notify_manager_changed = true; 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (key == shill::kUninitializedTechnologiesProperty) { 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* vlist = GetListValue(key, value); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (vlist) { 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateUninitializedTechnologies(*vlist); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_manager_changed = true; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (key == flimflam::kProfilesProperty) { 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) listener_->ProfileListChanged(); 345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (key == flimflam::kCheckPortalListProperty) { 346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string check_portal_list; 347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (value.GetAsString(&check_portal_list)) { 348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) listener_->CheckPortalListChanged(check_portal_list); 349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) notify_manager_changed = true; 350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VLOG(2) << "Ignored Manager Property: " << key; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notify_manager_changed; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ShillPropertyHandler::UpdateProperties(ManagedState::ManagedType type, 358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::ListValue& entries) { 359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::set<std::string>& requested_updates = requested_updates_[type]; 360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::set<std::string>& requested_service_updates = 361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch requested_updates_[ManagedState::MANAGED_TYPE_NETWORK]; // For favorites 362eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::set<std::string> new_requested_updates; 363eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch VLOG(2) << "Update Properties: " << type << " Entries: " << entries.GetSize(); 364eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (base::ListValue::const_iterator iter = entries.begin(); 365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter != entries.end(); ++iter) { 366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string path; 367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (*iter)->GetAsString(&path); 368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (path.empty()) 369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch continue; 370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == ManagedState::MANAGED_TYPE_FAVORITE && 371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch requested_service_updates.count(path) > 0) 372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch continue; // Update already requested 373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (requested_updates.find(path) == requested_updates.end()) 374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RequestProperties(type, path); 375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new_requested_updates.insert(path); 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch requested_updates.swap(new_requested_updates); 378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::UpdateObserved(ManagedState::ManagedType type, 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue& entries) { 382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(type == ManagedState::MANAGED_TYPE_NETWORK || 383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch type == ManagedState::MANAGED_TYPE_DEVICE); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShillPropertyObserverMap& observer_map = 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (type == ManagedState::MANAGED_TYPE_NETWORK) 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ? observed_networks_ : observed_devices_; 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShillPropertyObserverMap new_observed; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (base::ListValue::const_iterator iter1 = entries.begin(); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter1 != entries.end(); ++iter1) { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string path; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter1)->GetAsString(&path); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (path.empty()) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShillPropertyObserverMap::iterator iter2 = observer_map.find(path); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter2 != observer_map.end()) { 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_observed[path] = iter2->second; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create an observer for future updates. 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_observed[path] = new ShillPropertyObserver( 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type, path, base::Bind( 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &ShillPropertyHandler::PropertyChangedCallback, AsWeakPtr())); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_map.erase(path); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Limit the number of observed services. 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_observed.size() >= kMaxObserved) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete network service observers still in observer_map. 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ShillPropertyObserverMap::iterator iter = observer_map.begin(); 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != observer_map.end(); ++iter) { 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete iter->second; 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_map.swap(new_observed); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::UpdateAvailableTechnologies( 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue& technologies) { 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) available_technologies_.clear(); 41990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_EVENT("AvailableTechnologiesChanged", 420a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringPrintf("Size: %" PRIuS, technologies.GetSize())); 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (base::ListValue::const_iterator iter = technologies.begin(); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != technologies.end(); ++iter) { 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string technology; 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*iter)->GetAsString(&technology); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!technology.empty()); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) available_technologies_.insert(technology); 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::UpdateEnabledTechnologies( 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue& technologies) { 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enabled_technologies_.clear(); 43390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_EVENT("EnabledTechnologiesChanged", 434a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringPrintf("Size: %" PRIuS, technologies.GetSize())); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (base::ListValue::const_iterator iter = technologies.begin(); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != technologies.end(); ++iter) { 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string technology; 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*iter)->GetAsString(&technology); 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!technology.empty()); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enabled_technologies_.insert(technology); 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabling_technologies_.erase(technology); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::UpdateUninitializedTechnologies( 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue& technologies) { 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uninitialized_technologies_.clear(); 44890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_EVENT("UninitializedTechnologiesChanged", 449a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringPrintf("Size: %" PRIuS, technologies.GetSize())); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (base::ListValue::const_iterator iter = technologies.begin(); 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != technologies.end(); ++iter) { 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string technology; 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*iter)->GetAsString(&technology); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!technology.empty()); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uninitialized_technologies_.insert(technology); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShillPropertyHandler::EnableTechnologyFailed( 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& technology, 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const network_handler::ErrorCallback& error_callback, 4627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& dbus_error_name, 4637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& dbus_error_message) { 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabling_technologies_.erase(technology); 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_handler::ShillErrorCallbackFunction( 4667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "EnableTechnology Failed", 4677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch technology, error_callback, 4687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dbus_error_name, dbus_error_message); 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::GetPropertiesCallback( 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagedState::ManagedType type, 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMethodCallStatus call_status, 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& properties) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(2) << "GetPropertiesCallback: " << type << " : " << path; 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_updates_[type].erase(path); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (call_status != DBUS_METHOD_CALL_SUCCESS) { 47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The shill service no longer exists. This can happen when a network 48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // has been removed. 48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) NET_LOG_DEBUG("Failed to get properties", 482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::StringPrintf("%s: %d", path.c_str(), call_status)); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_->UpdateManagedStateProperties(type, path, properties); 486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Update Favorite properties for networks in the Services list. 487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == ManagedState::MANAGED_TYPE_NETWORK) { 4882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Only networks with a ProfilePath set are Favorites. 4892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch std::string profile_path; 4902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch properties.GetStringWithoutPathExpansion( 4912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch flimflam::kProfileProperty, &profile_path); 4922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!profile_path.empty()) { 4932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch listener_->UpdateManagedStateProperties( 4942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ManagedState::MANAGED_TYPE_FAVORITE, path, properties); 4952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 496eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 497eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Request IPConfig parameters for networks. 498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == ManagedState::MANAGED_TYPE_NETWORK && 499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch properties.HasKey(shill::kIPConfigProperty)) { 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string ip_config_path; 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (properties.GetString(shill::kIPConfigProperty, &ip_config_path)) { 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillIPConfigClient()->GetProperties( 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath(ip_config_path), 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&ShillPropertyHandler::GetIPConfigCallback, 505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), path)); 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify the listener only when all updates for that type have completed. 510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (pending_updates_[type].size() == 0) { 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_->ManagedStateListChanged(type); 512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Notify that Favorites have changed when notifying for Networks if there 513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // are no additional Favorite updates pending. 514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (type == ManagedState::MANAGED_TYPE_NETWORK && 515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch pending_updates_[ManagedState::MANAGED_TYPE_FAVORITE].size() == 0) { 516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch listener_->ManagedStateListChanged(ManagedState::MANAGED_TYPE_FAVORITE); 517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::PropertyChangedCallback( 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedState::ManagedType type, 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& path, 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& key, 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value& value) { 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type == ManagedState::MANAGED_TYPE_NETWORK) 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkServicePropertyChangedCallback(path, key, value); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (type == ManagedState::MANAGED_TYPE_DEVICE) 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkDevicePropertyChangedCallback(path, key, value); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::NetworkServicePropertyChangedCallback( 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) { 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key == shill::kIPConfigProperty) { 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Request the IPConfig for the network and update network properties 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when the request completes. 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string ip_config_path; 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value.GetAsString(&ip_config_path); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!ip_config_path.empty()); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillIPConfigClient()->GetProperties( 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath(ip_config_path), 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&ShillPropertyHandler::GetIPConfigCallback, 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), path)); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->UpdateNetworkServiceProperty(path, key, value); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::GetIPConfigCallback( 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& service_path, 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMethodCallStatus call_status, 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& properties) { 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (call_status != DBUS_METHOD_CALL_SUCCESS) { 558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NET_LOG_ERROR("Failed to get IP Config properties", 559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::StringPrintf("%s: %d", 560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch service_path.c_str(), call_status)); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch UpdateIPConfigProperty(service_path, properties, 5647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch flimflam::kAddressProperty); 5657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch UpdateIPConfigProperty(service_path, properties, 5667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch flimflam::kNameServersProperty); 5677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch UpdateIPConfigProperty(service_path, properties, 5687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch flimflam::kPrefixlenProperty); 5697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch UpdateIPConfigProperty(service_path, properties, 5707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch flimflam::kGatewayProperty); 5713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) UpdateIPConfigProperty(service_path, properties, 5723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) shill::kWebProxyAutoDiscoveryUrlProperty); 5737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ShillPropertyHandler::UpdateIPConfigProperty( 5767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string& service_path, 5777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::DictionaryValue& properties, 5787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const char* property) { 5797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Value* value; 5807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!properties.GetWithoutPathExpansion(property, &value)) { 5817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LOG(ERROR) << "Failed to get IPConfig property: " << property 5827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch << ", for: " << service_path; 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) listener_->UpdateNetworkServiceProperty( 5867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch service_path, NetworkState::IPConfigProperty(property), *value); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::NetworkDevicePropertyChangedCallback( 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& path, 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& key, 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value& value) { 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->UpdateDeviceProperty(path, key, value); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 598