shill_property_handler.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/shill_service_client.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/network/network_event_log.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/network/network_state.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_path.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Limit the number of services or devices we observe. Since they are listed in 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// priority order, it should be reasonable to ignore services past this. 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const size_t kMaxObserved = 100; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const base::ListValue* GetListValue(const std::string& key, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* vlist = NULL; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value.GetAsList(&vlist)) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Error parsing key as list: " << key; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return vlist; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Class to manage Shill service property changed observers. Observers are 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// added on construction and removed on destruction. Runs the handler when 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OnPropertyChanged is called. 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ShillPropertyObserver : public ShillPropertyChangedObserver { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void(ManagedState::ManagedType type, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& service, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value& value)> Handler; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShillPropertyObserver(ManagedState::ManagedType type, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& path, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Handler& handler) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : type_(type), 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) path_(path), 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) handler_(handler) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ == ManagedState::MANAGED_TYPE_NETWORK) { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()-> 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPropertyChangedObserver(dbus::ObjectPath(path_), this); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (type_ == ManagedState::MANAGED_TYPE_DEVICE) { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillDeviceClient()-> 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPropertyChangedObserver(dbus::ObjectPath(path_), this); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ShillPropertyObserver() { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ == ManagedState::MANAGED_TYPE_NETWORK) { 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()-> 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePropertyChangedObserver(dbus::ObjectPath(path_), this); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (type_ == ManagedState::MANAGED_TYPE_DEVICE) { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillDeviceClient()-> 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePropertyChangedObserver(dbus::ObjectPath(path_), this); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ShillPropertyChangedObserver overrides. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPropertyChanged(const std::string& key, 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value& value) OVERRIDE { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) handler_.Run(type_, path_, key, value); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedState::ManagedType type_; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string path_; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Handler handler_; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ShillPropertyObserver); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//------------------------------------------------------------------------------ 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ShillPropertyHandler 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShillPropertyHandler::ShillPropertyHandler(Listener* listener) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : listener_(listener), 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shill_manager_(DBusThreadManager::Get()->GetShillManagerClient()) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShillPropertyHandler::~ShillPropertyHandler() { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete network service observers. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteContainerPairSecondPointers( 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observed_networks_.begin(), observed_networks_.end()); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) STLDeleteContainerPairSecondPointers( 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observed_devices_.begin(), observed_devices_.end()); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(shill_manager_ == DBusThreadManager::Get()->GetShillManagerClient()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shill_manager_->RemovePropertyChangedObserver(this); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::Init() { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shill_manager_->GetProperties( 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ShillPropertyHandler::ManagerPropertiesCallback, 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr())); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shill_manager_->AddPropertyChangedObserver(this); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShillPropertyHandler::IsTechnologyAvailable( 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& technology) const { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return available_technologies_.count(technology) != 0; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShillPropertyHandler::IsTechnologyEnabled( 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& technology) const { 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return enabled_technologies_.count(technology) != 0; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShillPropertyHandler::IsTechnologyEnabling( 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& technology) const { 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return enabling_technologies_.count(technology) != 0; 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShillPropertyHandler::IsTechnologyUninitialized( 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& technology) const { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return uninitialized_technologies_.count(technology) != 0; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::SetTechnologyEnabled( 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& technology, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool enabled, 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const network_handler::ErrorCallback& error_callback) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enabled) { 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabling_technologies_.insert(technology); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shill_manager_->EnableTechnology( 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) technology, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&base::DoNothing), 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&ShillPropertyHandler::EnableTechnologyFailed, 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), technology, error_callback)); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Imediately clear locally from enabled and enabling lists. 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabled_technologies_.erase(technology); 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabling_technologies_.erase(technology); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shill_manager_->DisableTechnology( 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) technology, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&base::DoNothing), 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&network_handler::ShillErrorCallbackFunction, 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) technology, error_callback)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ShillPropertyHandler::SetCheckPortalList( 166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const std::string& check_portal_list) { 167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::StringValue value(check_portal_list); 168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) shill_manager_->SetProperty( 169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) flimflam::kCheckPortalListProperty, 170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) value, 171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Bind(&base::DoNothing), 172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Bind(&network_handler::ShillErrorCallbackFunction, 173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "", network_handler::ErrorCallback())); 174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::RequestScan() const { 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shill_manager_->RequestScan( 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&base::DoNothing), 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&network_handler::ShillErrorCallbackFunction, 18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "", network_handler::ErrorCallback())); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShillPropertyHandler::ConnectToBestServices() const { 18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_EVENT("ConnectToBestServices", ""); 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shill_manager_->ConnectToBestServices( 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&base::DoNothing), 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&network_handler::ShillErrorCallbackFunction, 18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "", network_handler::ErrorCallback())); 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::RequestProperties(ManagedState::ManagedType type, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path) { 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_updates_[type].find(path) != pending_updates_[type].end()) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; // Update already requested. 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_updates_[type].insert(path); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == ManagedState::MANAGED_TYPE_NETWORK) { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusThreadManager::Get()->GetShillServiceClient()->GetProperties( 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectPath(path), 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ShillPropertyHandler::GetPropertiesCallback, 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), type, path)); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (type == ManagedState::MANAGED_TYPE_DEVICE) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusThreadManager::Get()->GetShillDeviceClient()->GetProperties( 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectPath(path), 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&ShillPropertyHandler::GetPropertiesCallback, 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), type, path)); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::OnPropertyChanged(const std::string& key, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) { 21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (ManagerPropertyChanged(key, value)) { 21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::string detail = key; 21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) detail += " = " + network_event_log::ValueAsString(value); 21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_DEBUG("ManagerPropertyChanged", detail); 21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) listener_->NotifyManagerPropertyChanged(); 22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 221a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // If the service or device list changed and there are no pending 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // updates, signal the state list changed callback. 223a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if ((key == flimflam::kServicesProperty) && 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_updates_[ManagedState::MANAGED_TYPE_NETWORK].size() == 0) { 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->ManagedStateListChanged(ManagedState::MANAGED_TYPE_NETWORK); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key == flimflam::kDevicesProperty && 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_updates_[ManagedState::MANAGED_TYPE_DEVICE].size() == 0) { 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->ManagedStateListChanged(ManagedState::MANAGED_TYPE_DEVICE); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Private methods 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::ManagerPropertiesCallback( 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMethodCallStatus call_status, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& properties) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (call_status != DBUS_METHOD_CALL_SUCCESS) { 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_ERROR("ManagerPropertiesCallback", 24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::StringPrintf("Failed: %d", call_status)); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_EVENT("ManagerPropertiesCallback", "Success"); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool notify = false; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool update_service_list = false; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (base::DictionaryValue::Iterator iter(properties); 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !iter.IsAtEnd(); iter.Advance()) { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defer updating Services until all other properties have been updated. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter.key() == flimflam::kServicesProperty) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_service_list = true; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify |= ManagerPropertyChanged(iter.key(), iter.value()); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now update the service list which can safely assume other properties have 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // been initially set. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (update_service_list) { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value* value = NULL; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (properties.GetWithoutPathExpansion(flimflam::kServicesProperty, &value)) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify |= ManagerPropertyChanged(flimflam::kServicesProperty, *value); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (notify) 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) listener_->NotifyManagerPropertyChanged(); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there are no pending updates, signal the state list changed callbacks. 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_updates_[ManagedState::MANAGED_TYPE_NETWORK].size() == 0) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->ManagedStateListChanged(ManagedState::MANAGED_TYPE_NETWORK); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_updates_[ManagedState::MANAGED_TYPE_DEVICE].size() == 0) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->ManagedStateListChanged(ManagedState::MANAGED_TYPE_DEVICE); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ShillPropertyHandler::ManagerPropertyChanged(const std::string& key, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool notify_manager_changed = false; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key == flimflam::kServicesProperty) { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* vlist = GetListValue(key, value); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vlist) { 277a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) listener_->UpdateManagedList(ManagedState::MANAGED_TYPE_NETWORK, *vlist); 278a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // UpdateObserved used to use kServiceWatchListProperty for TYPE_NETWORK, 279a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // however that prevents us from receiving Strength updates from inactive 280a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // networks. The overhead for observing all services is not unreasonable 281a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // (and we limit the max number of observed services to kMaxObserved). 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateObserved(ManagedState::MANAGED_TYPE_NETWORK, *vlist); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (key == flimflam::kDevicesProperty) { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ListValue* vlist = GetListValue(key, value); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (vlist) { 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->UpdateManagedList(ManagedState::MANAGED_TYPE_DEVICE, *vlist); 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateObserved(ManagedState::MANAGED_TYPE_DEVICE, *vlist); 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (key == flimflam::kAvailableTechnologiesProperty) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* vlist = GetListValue(key, value); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (vlist) { 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateAvailableTechnologies(*vlist); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_manager_changed = true; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (key == flimflam::kEnabledTechnologiesProperty) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* vlist = GetListValue(key, value); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vlist) { 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateEnabledTechnologies(*vlist); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) notify_manager_changed = true; 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (key == shill::kUninitializedTechnologiesProperty) { 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* vlist = GetListValue(key, value); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (vlist) { 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateUninitializedTechnologies(*vlist); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notify_manager_changed = true; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else if (key == flimflam::kProfilesProperty) { 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) listener_->ProfileListChanged(); 310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (key == flimflam::kCheckPortalListProperty) { 311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string check_portal_list; 312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (value.GetAsString(&check_portal_list)) { 313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) listener_->CheckPortalListChanged(check_portal_list); 314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) notify_manager_changed = true; 315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notify_manager_changed; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::UpdateObserved(ManagedState::ManagedType type, 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue& entries) { 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShillPropertyObserverMap& observer_map = 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (type == ManagedState::MANAGED_TYPE_NETWORK) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ? observed_networks_ : observed_devices_; 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShillPropertyObserverMap new_observed; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (base::ListValue::const_iterator iter1 = entries.begin(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter1 != entries.end(); ++iter1) { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string path; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter1)->GetAsString(&path); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (path.empty()) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShillPropertyObserverMap::iterator iter2 = observer_map.find(path); 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter2 != observer_map.end()) { 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_observed[path] = iter2->second; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Request an update. 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestProperties(type, path); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create an observer for future updates. 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_observed[path] = new ShillPropertyObserver( 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type, path, base::Bind( 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &ShillPropertyHandler::PropertyChangedCallback, AsWeakPtr())); 34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_DEBUG("StartObserving", path); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_map.erase(path); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Limit the number of observed services. 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_observed.size() >= kMaxObserved) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete network service observers still in observer_map. 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (ShillPropertyObserverMap::iterator iter = observer_map.begin(); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != observer_map.end(); ++iter) { 35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_DEBUG("StopObserving", iter->first); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete iter->second; 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observer_map.swap(new_observed); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::UpdateAvailableTechnologies( 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue& technologies) { 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) available_technologies_.clear(); 36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_EVENT("AvailableTechnologiesChanged", 36290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::StringPrintf("Size: %"PRIuS, technologies.GetSize())); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (base::ListValue::const_iterator iter = technologies.begin(); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != technologies.end(); ++iter) { 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string technology; 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*iter)->GetAsString(&technology); 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!technology.empty()); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) available_technologies_.insert(technology); 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::UpdateEnabledTechnologies( 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue& technologies) { 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enabled_technologies_.clear(); 37590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_EVENT("EnabledTechnologiesChanged", 37690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::StringPrintf("Size: %"PRIuS, technologies.GetSize())); 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (base::ListValue::const_iterator iter = technologies.begin(); 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != technologies.end(); ++iter) { 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string technology; 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*iter)->GetAsString(&technology); 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!technology.empty()); 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enabled_technologies_.insert(technology); 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabling_technologies_.erase(technology); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::UpdateUninitializedTechnologies( 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue& technologies) { 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uninitialized_technologies_.clear(); 39090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NET_LOG_EVENT("UninitializedTechnologiesChanged", 39190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::StringPrintf("Size: %"PRIuS, technologies.GetSize())); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (base::ListValue::const_iterator iter = technologies.begin(); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != technologies.end(); ++iter) { 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string technology; 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*iter)->GetAsString(&technology); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!technology.empty()); 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uninitialized_technologies_.insert(technology); 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShillPropertyHandler::EnableTechnologyFailed( 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& technology, 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const network_handler::ErrorCallback& error_callback, 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& error_name, 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& error_message) { 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enabling_technologies_.erase(technology); 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) network_handler::ShillErrorCallbackFunction( 40890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) technology, error_callback, error_name, error_message); 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::GetPropertiesCallback( 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagedState::ManagedType type, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMethodCallStatus call_status, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& properties) { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(2) << "GetPropertiesCallback: " << type << " : " << path; 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_updates_[type].erase(path); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (call_status != DBUS_METHOD_CALL_SUCCESS) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Failed to get properties for: " << path 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ": " << call_status; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_->UpdateManagedStateProperties(type, path, properties); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (properties.HasKey(shill::kIPConfigProperty)) { 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Since this is the first time we received properties for this network, 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // also request its IPConfig parameters. 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string ip_config_path; 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (properties.GetString(shill::kIPConfigProperty, &ip_config_path)) { 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillIPConfigClient()->GetProperties( 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath(ip_config_path), 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&ShillPropertyHandler::GetIPConfigCallback, 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), path)); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify the listener only when all updates for that type have completed. 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pending_updates_[type].size() == 0) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_->ManagedStateListChanged(type); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::PropertyChangedCallback( 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedState::ManagedType type, 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& path, 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& key, 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value& value) { 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type == ManagedState::MANAGED_TYPE_NETWORK) 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkServicePropertyChangedCallback(path, key, value); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (type == ManagedState::MANAGED_TYPE_DEVICE) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkDevicePropertyChangedCallback(path, key, value); 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::NetworkServicePropertyChangedCallback( 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& path, 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& value) { 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key == shill::kIPConfigProperty) { 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Request the IPConfig for the network and update network properties 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when the request completes. 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string ip_config_path; 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value.GetAsString(&ip_config_path); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!ip_config_path.empty()); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DBusThreadManager::Get()->GetShillIPConfigClient()->GetProperties( 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dbus::ObjectPath(ip_config_path), 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&ShillPropertyHandler::GetIPConfigCallback, 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AsWeakPtr(), path)); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->UpdateNetworkServiceProperty(path, key, value); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShillPropertyHandler::GetIPConfigCallback( 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& service_path, 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DBusMethodCallStatus call_status, 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue& properties) { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (call_status != DBUS_METHOD_CALL_SUCCESS) { 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(ERROR) << "Failed to get IP Config properties for: " << service_path; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::Value* ip_address; 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!properties.GetWithoutPathExpansion(flimflam::kAddressProperty, 484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &ip_address)) { 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Failed to get IP Address property for: " << service_path; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) listener_->UpdateNetworkServiceProperty( 489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) service_path, 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkState::IPConfigProperty(flimflam::kAddressProperty), 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *ip_address); 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::Value* dns_servers = NULL; 494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!properties.GetWithoutPathExpansion( 495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) flimflam::kNameServersProperty, &dns_servers)) { 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(ERROR) << "Failed to get Name servers property for: " << service_path; 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) listener_->UpdateNetworkServiceProperty( 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) service_path, 501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NetworkState::IPConfigProperty(flimflam::kNameServersProperty), 502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *dns_servers); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShillPropertyHandler::NetworkDevicePropertyChangedCallback( 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& path, 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& key, 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Value& value) { 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) listener_->UpdateDeviceProperty(path, key, value); 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 514