1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/net/network_change_notifier_chromeos.h" 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/task.h" 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/cros_library.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/browser_thread.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace chromeos { 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenNetworkChangeNotifierChromeos::NetworkChangeNotifierChromeos() 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : has_active_network_(false), 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen connectivity_state_(chromeos::CONN_STATE_UNKNOWN), 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::NetworkLibrary* lib = 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::CrosLibrary::Get()->GetNetworkLibrary(); 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen lib->AddNetworkManagerObserver(this); 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenNetworkChangeNotifierChromeos::~NetworkChangeNotifierChromeos() { 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::NetworkLibrary* lib = 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::CrosLibrary::Get()->GetNetworkLibrary(); 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen lib->RemoveNetworkManagerObserver(this); 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen lib->RemoveObserverForAllNetworks(this); 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid NetworkChangeNotifierChromeos::OnNetworkManagerChanged( 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::NetworkLibrary* cros) { 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UpdateNetworkState(cros); 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool NetworkChangeNotifierChromeos::IsCurrentlyOffline() const { 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return connectivity_state_ != chromeos::CONN_STATE_UNRESTRICTED; 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid NetworkChangeNotifierChromeos::UpdateNetworkState( 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::NetworkLibrary* lib) { 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const chromeos::Network* network = lib->active_network(); 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Check if active network was added, removed or changed. 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if ((!network && has_active_network_) || 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen (network && (!has_active_network_ || 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen network->service_path() != service_path_ || 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen network->ip_address() != ip_address_))) { 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (has_active_network_) 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen lib->RemoveObserverForAllNetworks(this); 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!network) { 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen has_active_network_ = false; 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service_path_.clear(); 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ip_address_.clear(); 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen has_active_network_ = true; 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen service_path_ = network->service_path(); 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen lib->AddNetworkObserver(network->service_path(), this); 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ip_address_ = network->ip_address(); 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::PostTask( 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::IO, FROM_HERE, 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewRunnableFunction( 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &NetworkChangeNotifierChromeos::NotifyObserversOfIPAddressChange)); 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid NetworkChangeNotifierChromeos::OnNetworkChanged( 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::NetworkLibrary* cros, 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const chromeos::Network* network) { 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!network) { 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Active network changed? 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (network->service_path() != service_path_) { 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UpdateNetworkState(cros); 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (network->connectivity_state() != connectivity_state_) { 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen connectivity_state_ = network->connectivity_state(); 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::PostTask( 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserThread::IO, FROM_HERE, 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen method_factory_.NewRunnableMethod( 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &NetworkChangeNotifierChromeos::NotifyObserversOfOnlineStateChange)); 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace net 89