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