From a89fc608f7161628208e45ccb283fb23c2bc3c96 Mon Sep 17 00:00:00 2001 From: "gauravsh@chromium.org" <gauravsh@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> Date: Tue, 11 Dec 2012 01:54:59 +0000 Subject: Rename NetworkChangeNotifierChromeos to NetworkChangeNotifierNetworkLibrary We are eventually deprecating this version of the network change notifier for Chrome OS in favor of a version that will use the new network state handler. This lets us avoid file and class name conflicts with the new version. BUG=chromium:162040 TEST=none Review URL: https://chromiumcodereview.appspot.com/11488011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@172226 0039d316-1c4b-4281-b951-d872f2087c98 --- .../chromeos/chrome_browser_main_chromeos.cc | 2 +- .../net/cros_network_change_notifier_factory.cc | 9 +- .../net/cros_network_change_notifier_factory.h | 4 +- .../net/network_change_notifier_chromeos.cc | 350 -------------------- .../net/network_change_notifier_chromeos.h | 109 ------- .../net/network_change_notifier_network_library.cc | 352 +++++++++++++++++++++ .../net/network_change_notifier_network_library.h | 109 +++++++ chrome/chrome_browser_chromeos.gypi | 4 +- 8 files changed, 471 insertions(+), 468 deletions(-) delete mode 100644 chrome/browser/chromeos/net/network_change_notifier_chromeos.cc delete mode 100644 chrome/browser/chromeos/net/network_change_notifier_chromeos.h create mode 100644 chrome/browser/chromeos/net/network_change_notifier_network_library.cc create mode 100644 chrome/browser/chromeos/net/network_change_notifier_network_library.h (limited to 'chrome') diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index 6df5bd3..2a0ac03 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc @@ -45,7 +45,7 @@ #include "chrome/browser/chromeos/memory/low_memory_observer.h" #include "chrome/browser/chromeos/memory/oom_priority_manager.h" #include "chrome/browser/chromeos/net/cros_network_change_notifier_factory.h" -#include "chrome/browser/chromeos/net/network_change_notifier_chromeos.h" +#include "chrome/browser/chromeos/net/network_change_notifier_network_library.h" #include "chrome/browser/chromeos/net/network_portal_detector.h" #include "chrome/browser/chromeos/power/brightness_observer.h" #include "chrome/browser/chromeos/power/output_observer.h" diff --git a/chrome/browser/chromeos/net/cros_network_change_notifier_factory.cc b/chrome/browser/chromeos/net/cros_network_change_notifier_factory.cc index 2f210da..6941f45 100644 --- a/chrome/browser/chromeos/net/cros_network_change_notifier_factory.cc +++ b/chrome/browser/chromeos/net/cros_network_change_notifier_factory.cc @@ -3,24 +3,25 @@ // found in the LICENSE file. #include "chrome/browser/chromeos/net/cros_network_change_notifier_factory.h" -#include "chrome/browser/chromeos/net/network_change_notifier_chromeos.h" +#include "chrome/browser/chromeos/net/network_change_notifier_network_library.h" namespace chromeos { namespace { -NetworkChangeNotifierChromeos* g_network_change_notifier = NULL; +NetworkChangeNotifierNetworkLibrary* g_network_change_notifier = NULL; } // namespace net::NetworkChangeNotifier* CrosNetworkChangeNotifierFactory::CreateInstance() { DCHECK(!g_network_change_notifier); - g_network_change_notifier = new NetworkChangeNotifierChromeos(); + g_network_change_notifier = new NetworkChangeNotifierNetworkLibrary(); return g_network_change_notifier; } // static -NetworkChangeNotifierChromeos* CrosNetworkChangeNotifierFactory::GetInstance() { +NetworkChangeNotifierNetworkLibrary* +CrosNetworkChangeNotifierFactory::GetInstance() { return g_network_change_notifier; } diff --git a/chrome/browser/chromeos/net/cros_network_change_notifier_factory.h b/chrome/browser/chromeos/net/cros_network_change_notifier_factory.h index 440fc2a..b51d46f5 100644 --- a/chrome/browser/chromeos/net/cros_network_change_notifier_factory.h +++ b/chrome/browser/chromeos/net/cros_network_change_notifier_factory.h @@ -10,7 +10,7 @@ namespace chromeos { -class NetworkChangeNotifierChromeos; +class NetworkChangeNotifierNetworkLibrary; // CrosNetworkChangeNotifierFactory creates ChromeOS-specific specialization of // NetworkChangeNotifier. @@ -24,7 +24,7 @@ class CrosNetworkChangeNotifierFactory // Gets the instance of the NetworkChangeNotifier for Chrome OS. // This is used for setting up the notifier at startup. - static NetworkChangeNotifierChromeos* GetInstance(); + static NetworkChangeNotifierNetworkLibrary* GetInstance(); }; } // namespace net diff --git a/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc b/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc deleted file mode 100644 index 4cc06a4..0000000 --- a/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc +++ /dev/null @@ -1,350 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/chromeos/net/network_change_notifier_chromeos.h" - -#include <vector> - -#include "base/bind.h" -#include "chrome/browser/chromeos/cros/cros_library.h" -#include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/root_power_manager_client.h" -#include "content/public/browser/browser_thread.h" -#include "net/dns/dns_config_service_posix.h" - -using content::BrowserThread; - -namespace { - -// Delay for online change notification reporting. -const int kOnlineNotificationDelayMS = 500; -const int kInitialNotificationCheckDelayMS = 1000; - -bool IsOnline(chromeos::ConnectionState state) { - return state == chromeos::STATE_ONLINE || - state == chromeos::STATE_PORTAL; -} - -} - -namespace chromeos { - -class NetworkChangeNotifierChromeos::DnsConfigServiceChromeos - : public net::internal::DnsConfigServicePosix { - public: - DnsConfigServiceChromeos() {} - - virtual ~DnsConfigServiceChromeos() {} - - // net::DnsConfigServicePosix: - virtual bool StartWatching() OVERRIDE { - // Notifications from NetworkLibrary are sent to - // NetworkChangeNotifierChromeos. - return true; - } - - void OnNetworkChange() { - InvalidateConfig(); - InvalidateHosts(); - ReadNow(); - } -}; - -NetworkChangeNotifierChromeos::NetworkChangeNotifierChromeos() - : NetworkChangeNotifier(NetworkChangeCalculatorParamsChromeos()), - has_active_network_(false), - connection_state_(chromeos::STATE_UNKNOWN), - connection_type_(CONNECTION_NONE), - ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { - BrowserThread::PostDelayedTask( - BrowserThread::UI, FROM_HERE, - base::Bind( - &NetworkChangeNotifierChromeos::UpdateInitialState, this), - base::TimeDelta::FromMilliseconds(kInitialNotificationCheckDelayMS)); -} - -NetworkChangeNotifierChromeos::~NetworkChangeNotifierChromeos() { -} - -void NetworkChangeNotifierChromeos::Init() { - chromeos::NetworkLibrary* network_library = - chromeos::CrosLibrary::Get()->GetNetworkLibrary(); - network_library->AddNetworkManagerObserver(this); - - DBusThreadManager::Get()->GetRootPowerManagerClient()->AddObserver(this); - - dns_config_service_.reset(new DnsConfigServiceChromeos()); - dns_config_service_->WatchConfig( - base::Bind(NetworkChangeNotifier::SetDnsConfig)); - - UpdateNetworkState(network_library); -} - -void NetworkChangeNotifierChromeos::Shutdown() { - weak_factory_.InvalidateWeakPtrs(); - - dns_config_service_.reset(); - - if (!chromeos::CrosLibrary::Get()) - return; - - chromeos::NetworkLibrary* lib = - chromeos::CrosLibrary::Get()->GetNetworkLibrary(); - lib->RemoveNetworkManagerObserver(this); - lib->RemoveObserverForAllNetworks(this); - - DBusThreadManager::Get()->GetRootPowerManagerClient()->RemoveObserver(this); -} - -void NetworkChangeNotifierChromeos::OnResume( - const base::TimeDelta& sleep_duration) { - // Force invalidation of various net resources on system resume. - BrowserThread::PostTask( - BrowserThread::IO, FROM_HERE, - base::Bind( - &NetworkChangeNotifier::NotifyObserversOfIPAddressChange)); -} - - -void NetworkChangeNotifierChromeos::OnNetworkManagerChanged( - chromeos::NetworkLibrary* cros) { - UpdateNetworkState(cros); -} - -net::NetworkChangeNotifier::ConnectionType -NetworkChangeNotifierChromeos::GetCurrentConnectionType() const { - return connection_type_; -} - -void NetworkChangeNotifierChromeos::OnNetworkChanged( - chromeos::NetworkLibrary* cros, - const chromeos::Network* network) { - CHECK(network); - - // Active network changed? - if (network->service_path() != service_path_) - UpdateNetworkState(cros); - else - UpdateConnectivityState(network); -} - -void NetworkChangeNotifierChromeos::UpdateNetworkState( - chromeos::NetworkLibrary* lib) { - const chromeos::Network* network = lib->active_network(); - if (network) { - lib->GetIPConfigs( - network->device_path(), - chromeos::NetworkLibrary::FORMAT_COLON_SEPARATED_HEX, - base::Bind(&NetworkChangeNotifierChromeos::UpdateNetworkStateCallback, - weak_factory_.GetWeakPtr(), - lib)); - } else { - // If we don't have a network, then we can't fetch ipconfigs, but we still - // need to process state updates when we lose a network (i.e. when - // has_active_network_ is still set, but we don't have one anymore). - NetworkIPConfigVector empty_ipconfigs; - UpdateNetworkStateCallback(lib, empty_ipconfigs, ""); - } -} - -void NetworkChangeNotifierChromeos::UpdateNetworkStateCallback( - chromeos::NetworkLibrary* lib, - const NetworkIPConfigVector& ipconfigs, - const std::string& hardware_address) { - const chromeos::Network* network = lib->active_network(); - - if (network) { - VLOG(1) << "UpdateNetworkStateCallback: " << network->name() - << ", type= " << network->type() - << ", device= " << network->device_path() - << ", state= " << network->state(); - } - - // Find the DNS servers currently in use. This code assumes that the order of - // the |ipconfigs| is stable. - std::vector<std::string> ipconfig_name_servers; - for (chromeos::NetworkIPConfigVector::const_iterator it = ipconfigs.begin(); - it != ipconfigs.end(); ++it) { - const chromeos::NetworkIPConfig& ipconfig = *it; - if (!ipconfig.name_servers.empty()) - ipconfig_name_servers.push_back(ipconfig.name_servers); - } - - // Did we loose the active network? - bool lost_active_network = !network && has_active_network_; - - // Did we have a change on the current active network? - bool changed_active_network = network && ( - !has_active_network_ || - network->service_path() != service_path_ || - ipconfig_name_servers != name_servers_ || - network->ip_address() != ip_address_); - - // If just the current active network's state changed, update it if necessary. - if (!lost_active_network && !changed_active_network && - network && network->state() != connection_state_) { - UpdateConnectivityState(network); - } - - if (lost_active_network || changed_active_network) { - if (has_active_network_) - lib->RemoveObserverForAllNetworks(this); - if (!network) { - has_active_network_ = false; - service_path_.clear(); - ip_address_.clear(); - name_servers_.clear(); - } else { - has_active_network_ = true; - service_path_ = network->service_path(); - ip_address_ = network->ip_address(); - name_servers_.swap(ipconfig_name_servers); - } - dns_config_service_->OnNetworkChange(); - UpdateConnectivityState(network); - // If there is an active network, add observer to track its changes. - if (network) - lib->AddNetworkObserver(network->service_path(), this); - - BrowserThread::PostTask( - BrowserThread::IO, FROM_HERE, - base::Bind( - &NetworkChangeNotifier::NotifyObserversOfIPAddressChange)); - } -} - -void NetworkChangeNotifierChromeos::UpdateConnectivityState( - const chromeos::Network* network) { - if (network) { - VLOG(1) << "UpdateConnectivityState: " << network->name() - << ", type= " << network->type() - << ", device= " << network->device_path() - << ", state= " << network->state() - << ", connect= " << connection_state_ - << ", type= " << connection_type_; - } - - // We don't care about all transitions of ConnectionState. OnlineStateChange - // notification should trigger if ConnectionType is changed. - chromeos::ConnectionState new_connection_state = - network ? network->connection_state() : chromeos::STATE_UNKNOWN; - - ConnectionType prev_connection_type = connection_type_; - ConnectionType new_connection_type = GetNetworkConnectionType(network); - - bool is_online = (new_connection_state == chromeos::STATE_ONLINE); - bool was_online = (connection_state_ == chromeos::STATE_ONLINE); - bool is_portal = (new_connection_state == chromeos::STATE_PORTAL); - bool was_portal = (connection_state_ == chromeos::STATE_PORTAL); - VLOG(2) << " UpdateConnectivityState2: " - << "new_cs = " << new_connection_state - << ", is_online = " << is_online - << ", was_online = " << was_online - << ", is_portal = " << is_portal - << ", was_portal = " << was_portal; - connection_state_ = new_connection_state; - connection_type_ = new_connection_type; - if (new_connection_type != prev_connection_type) { - VLOG(1) << "UpdateConnectivityState3: " - << "prev_connection_type = " << prev_connection_type - << ", new_connection_type = " << new_connection_type; - ReportConnectionChange(); - } - VLOG(2) << " UpdateConnectivityState4: " - << "new_cs = " << new_connection_state - << ", end_cs_ = " << connection_state_ - << "prev_type = " << prev_connection_type - << ", new_type_ = " << new_connection_type; -} - -void NetworkChangeNotifierChromeos::ReportConnectionChange() { - if (weak_factory_.HasWeakPtrs()) { - // If we have a pending task, cancel it. - DVLOG(1) << "ReportConnectionChange: has pending task"; - weak_factory_.InvalidateWeakPtrs(); - DVLOG(1) << "ReportConnectionChange: canceled pending task"; - } - // Posting task with delay allows us to cancel it when connection type is - // changed frequently. This should help us avoid transient edge reporting - // while switching between connection types (e.g. ethernet->wifi). - BrowserThread::PostDelayedTask( - BrowserThread::UI, FROM_HERE, - base::Bind( - &NetworkChangeNotifierChromeos::ReportConnectionChangeOnUIThread, - weak_factory_.GetWeakPtr()), - base::TimeDelta::FromMilliseconds(kOnlineNotificationDelayMS)); -} - -void NetworkChangeNotifierChromeos::ReportConnectionChangeOnUIThread() { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - - BrowserThread::PostTask( - BrowserThread::IO, FROM_HERE, - base::Bind( - &NetworkChangeNotifierChromeos:: - NotifyObserversOfConnectionTypeChange)); -} - -// static -void NetworkChangeNotifierChromeos::UpdateInitialState( - NetworkChangeNotifierChromeos* self) { - chromeos::NetworkLibrary* net = - chromeos::CrosLibrary::Get()->GetNetworkLibrary(); - self->UpdateNetworkState(net); -} - -// static -net::NetworkChangeNotifier::ConnectionType -NetworkChangeNotifierChromeos::GetNetworkConnectionType( - const chromeos::Network* network) { - if (!network || !IsOnline(network->connection_state())) - return net::NetworkChangeNotifier::CONNECTION_NONE; - - switch (network->type()) { - case chromeos::TYPE_ETHERNET: - return CONNECTION_ETHERNET; - case chromeos::TYPE_WIFI: - return CONNECTION_WIFI; - case chromeos::TYPE_WIMAX: - return CONNECTION_4G; - case chromeos::TYPE_CELLULAR: - switch (static_cast<const chromeos::CellularNetwork*>( - network)->network_technology()) { - case chromeos::NETWORK_TECHNOLOGY_UNKNOWN: - case chromeos::NETWORK_TECHNOLOGY_1XRTT: - case chromeos::NETWORK_TECHNOLOGY_GPRS: - case chromeos::NETWORK_TECHNOLOGY_EDGE: - return CONNECTION_2G; - case chromeos::NETWORK_TECHNOLOGY_GSM: - case chromeos::NETWORK_TECHNOLOGY_UMTS: - case chromeos::NETWORK_TECHNOLOGY_EVDO: - case chromeos::NETWORK_TECHNOLOGY_HSPA: - return CONNECTION_3G; - case chromeos::NETWORK_TECHNOLOGY_HSPA_PLUS: - case chromeos::NETWORK_TECHNOLOGY_LTE: - case chromeos::NETWORK_TECHNOLOGY_LTE_ADVANCED: - return CONNECTION_4G; - } - case chromeos::TYPE_BLUETOOTH: - case chromeos::TYPE_VPN: - case chromeos::TYPE_UNKNOWN: - break; - } - return net::NetworkChangeNotifier::CONNECTION_UNKNOWN; -} - -// static -net::NetworkChangeNotifier::NetworkChangeCalculatorParams -NetworkChangeNotifierChromeos::NetworkChangeCalculatorParamsChromeos() { - NetworkChangeCalculatorParams params; - // Delay values arrived at by simple experimentation and adjusted so as to - // produce a single signal when switching between network connections. - params.ip_address_offline_delay_ = base::TimeDelta::FromMilliseconds(4000); - params.ip_address_online_delay_ = base::TimeDelta::FromMilliseconds(1000); - params.connection_type_offline_delay_ = base::TimeDelta::FromMilliseconds(0); - params.connection_type_online_delay_ = base::TimeDelta::FromMilliseconds(0); - return params; -} - -} // namespace chromeos diff --git a/chrome/browser/chromeos/net/network_change_notifier_chromeos.h b/chrome/browser/chromeos/net/network_change_notifier_chromeos.h deleted file mode 100644 index 4a9ccf0..0000000 --- a/chrome/browser/chromeos/net/network_change_notifier_chromeos.h +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_CHROMEOS_NET_NETWORK_CHANGE_NOTIFIER_CHROMEOS_H_ -#define CHROME_BROWSER_CHROMEOS_NET_NETWORK_CHANGE_NOTIFIER_CHROMEOS_H_ - -#include <vector> - -#include "base/basictypes.h" -#include "base/compiler_specific.h" -#include "base/memory/weak_ptr.h" -#include "chrome/browser/chromeos/cros/network_library.h" -#include "chromeos/dbus/root_power_manager_observer.h" -#include "net/base/network_change_notifier.h" - -namespace chromeos { - -class OnlineStatusReportThreadTask; - -class NetworkChangeNotifierChromeos - : public net::NetworkChangeNotifier, - public chromeos::RootPowerManagerObserver, - public chromeos::NetworkLibrary::NetworkObserver, - public chromeos::NetworkLibrary::NetworkManagerObserver { - public: - NetworkChangeNotifierChromeos(); - virtual ~NetworkChangeNotifierChromeos(); - - // Initializes the network change notifier. Starts to observe changes - // from the power manager and the network manager. - void Init(); - - // Shutdowns the network change notifier. Stops observing changes from - // the power manager and the network manager. - void Shutdown(); - - private: - friend class OnlineStatusReportThreadTask; - - class DnsConfigServiceChromeos; - - // RootPowerManagerObserver overrides: - virtual void OnResume(const base::TimeDelta& sleep_duration) OVERRIDE; - - // NetworkChangeNotifier overrides: - virtual net::NetworkChangeNotifier::ConnectionType - GetCurrentConnectionType() const OVERRIDE; - - // NetworkManagerObserver overrides: - virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* obj) OVERRIDE; - - // NetworkObserver overrides: - virtual void OnNetworkChanged(chromeos::NetworkLibrary* cros, - const chromeos::Network* network) OVERRIDE; - - // Initiate online status change reporting. - void ReportConnectionChange(); - void ReportConnectionChangeOnUIThread(); - // Callback from online_notification_task_ when online state notification - // is actually scheduled. - void OnOnlineStateNotificationFired(); - - // Initiates an update of data members that keep the track the network stack - // state. - void UpdateNetworkState(chromeos::NetworkLibrary* cros); - // Called when a network state update has completed. Updates data members that - // keep the track the network stack state. - void UpdateNetworkStateCallback(chromeos::NetworkLibrary* cros, - const NetworkIPConfigVector& ip_configs, - const std::string& hardware_address); - // Updates network connectivity state. - void UpdateConnectivityState(const chromeos::Network* network); - - // Updates the initial state. Lets us trigger initial eval of the - // connectivity status without waiting for an event from the connection - // manager. - static void UpdateInitialState(NetworkChangeNotifierChromeos* self); - - // Gets connection type for given |network|. - static net::NetworkChangeNotifier::ConnectionType GetNetworkConnectionType( - const chromeos::Network* network); - - // Get parameters for calculating new combined signal. - static NetworkChangeCalculatorParams NetworkChangeCalculatorParamsChromeos(); - - // True if we previously had an active network around. - bool has_active_network_; - // Current active network's connection state. - chromeos::ConnectionState connection_state_; - // Current active network's connection type. - net::NetworkChangeNotifier::ConnectionType connection_type_; - // Current active network's service path. - std::string service_path_; - // Current active network's IP address. - std::string ip_address_; - // Current active network's name servers. - std::vector<std::string> name_servers_; - - scoped_ptr<DnsConfigServiceChromeos> dns_config_service_; - - base::WeakPtrFactory<NetworkChangeNotifierChromeos> weak_factory_; - - DISALLOW_COPY_AND_ASSIGN(NetworkChangeNotifierChromeos); -}; - -} // namespace chromeos - -#endif // CHROME_BROWSER_CHROMEOS_NET_NETWORK_CHANGE_NOTIFIER_CHROMEOS_H_ diff --git a/chrome/browser/chromeos/net/network_change_notifier_network_library.cc b/chrome/browser/chromeos/net/network_change_notifier_network_library.cc new file mode 100644 index 0000000..e6480be --- /dev/null +++ b/chrome/browser/chromeos/net/network_change_notifier_network_library.cc @@ -0,0 +1,352 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/net/network_change_notifier_network_library.h" + +#include <vector> + +#include "base/bind.h" +#include "chrome/browser/chromeos/cros/cros_library.h" +#include "chromeos/dbus/dbus_thread_manager.h" +#include "chromeos/dbus/root_power_manager_client.h" +#include "content/public/browser/browser_thread.h" +#include "net/dns/dns_config_service_posix.h" + +using content::BrowserThread; + +namespace { + +// Delay for online change notification reporting. +const int kOnlineNotificationDelayMS = 500; +const int kInitialNotificationCheckDelayMS = 1000; + +bool IsOnline(chromeos::ConnectionState state) { + return state == chromeos::STATE_ONLINE || + state == chromeos::STATE_PORTAL; +} + +} + +namespace chromeos { + +class NetworkChangeNotifierNetworkLibrary::DnsConfigServiceChromeos + : public net::internal::DnsConfigServicePosix { + public: + DnsConfigServiceChromeos() {} + + virtual ~DnsConfigServiceChromeos() {} + + // net::DnsConfigServicePosix: + virtual bool StartWatching() OVERRIDE { + // Notifications from NetworkLibrary are sent to + // NetworkChangeNotifierNetworkLibrary. + return true; + } + + void OnNetworkChange() { + InvalidateConfig(); + InvalidateHosts(); + ReadNow(); + } +}; + +NetworkChangeNotifierNetworkLibrary::NetworkChangeNotifierNetworkLibrary() + : NetworkChangeNotifier(NetworkChangeCalculatorParamsChromeos()), + has_active_network_(false), + connection_state_(chromeos::STATE_UNKNOWN), + connection_type_(CONNECTION_NONE), + ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { + BrowserThread::PostDelayedTask( + BrowserThread::UI, FROM_HERE, + base::Bind( + &NetworkChangeNotifierNetworkLibrary::UpdateInitialState, this), + base::TimeDelta::FromMilliseconds(kInitialNotificationCheckDelayMS)); +} + +NetworkChangeNotifierNetworkLibrary::~NetworkChangeNotifierNetworkLibrary() { +} + +void NetworkChangeNotifierNetworkLibrary::Init() { + chromeos::NetworkLibrary* network_library = + chromeos::CrosLibrary::Get()->GetNetworkLibrary(); + network_library->AddNetworkManagerObserver(this); + + DBusThreadManager::Get()->GetRootPowerManagerClient()->AddObserver(this); + + dns_config_service_.reset(new DnsConfigServiceChromeos()); + dns_config_service_->WatchConfig( + base::Bind(NetworkChangeNotifier::SetDnsConfig)); + + UpdateNetworkState(network_library); +} + +void NetworkChangeNotifierNetworkLibrary::Shutdown() { + weak_factory_.InvalidateWeakPtrs(); + + dns_config_service_.reset(); + + if (!chromeos::CrosLibrary::Get()) + return; + + chromeos::NetworkLibrary* lib = + chromeos::CrosLibrary::Get()->GetNetworkLibrary(); + lib->RemoveNetworkManagerObserver(this); + lib->RemoveObserverForAllNetworks(this); + + DBusThreadManager::Get()->GetRootPowerManagerClient()->RemoveObserver(this); +} + +void NetworkChangeNotifierNetworkLibrary::OnResume( + const base::TimeDelta& sleep_duration) { + // Force invalidation of various net resources on system resume. + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::Bind( + &NetworkChangeNotifier::NotifyObserversOfIPAddressChange)); +} + + +void NetworkChangeNotifierNetworkLibrary::OnNetworkManagerChanged( + chromeos::NetworkLibrary* cros) { + UpdateNetworkState(cros); +} + +net::NetworkChangeNotifier::ConnectionType +NetworkChangeNotifierNetworkLibrary::GetCurrentConnectionType() const { + return connection_type_; +} + +void NetworkChangeNotifierNetworkLibrary::OnNetworkChanged( + chromeos::NetworkLibrary* cros, + const chromeos::Network* network) { + CHECK(network); + + // Active network changed? + if (network->service_path() != service_path_) + UpdateNetworkState(cros); + else + UpdateConnectivityState(network); +} + +void NetworkChangeNotifierNetworkLibrary::UpdateNetworkState( + chromeos::NetworkLibrary* lib) { + const chromeos::Network* network = lib->active_network(); + if (network) { + lib->GetIPConfigs( + network->device_path(), + chromeos::NetworkLibrary::FORMAT_COLON_SEPARATED_HEX, + base::Bind( + &NetworkChangeNotifierNetworkLibrary::UpdateNetworkStateCallback, + weak_factory_.GetWeakPtr(), + lib)); + } else { + // If we don't have a network, then we can't fetch ipconfigs, but we still + // need to process state updates when we lose a network (i.e. when + // has_active_network_ is still set, but we don't have one anymore). + NetworkIPConfigVector empty_ipconfigs; + UpdateNetworkStateCallback(lib, empty_ipconfigs, ""); + } +} + +void NetworkChangeNotifierNetworkLibrary::UpdateNetworkStateCallback( + chromeos::NetworkLibrary* lib, + const NetworkIPConfigVector& ipconfigs, + const std::string& hardware_address) { + const chromeos::Network* network = lib->active_network(); + + if (network) { + VLOG(1) << "UpdateNetworkStateCallback: " << network->name() + << ", type= " << network->type() + << ", device= " << network->device_path() + << ", state= " << network->state(); + } + + // Find the DNS servers currently in use. This code assumes that the order of + // the |ipconfigs| is stable. + std::vector<std::string> ipconfig_name_servers; + for (chromeos::NetworkIPConfigVector::const_iterator it = ipconfigs.begin(); + it != ipconfigs.end(); ++it) { + const chromeos::NetworkIPConfig& ipconfig = *it; + if (!ipconfig.name_servers.empty()) + ipconfig_name_servers.push_back(ipconfig.name_servers); + } + + // Did we loose the active network? + bool lost_active_network = !network && has_active_network_; + + // Did we have a change on the current active network? + bool changed_active_network = network && ( + !has_active_network_ || + network->service_path() != service_path_ || + ipconfig_name_servers != name_servers_ || + network->ip_address() != ip_address_); + + // If just the current active network's state changed, update it if necessary. + if (!lost_active_network && !changed_active_network && + network && network->state() != connection_state_) { + UpdateConnectivityState(network); + } + + if (lost_active_network || changed_active_network) { + if (has_active_network_) + lib->RemoveObserverForAllNetworks(this); + if (!network) { + has_active_network_ = false; + service_path_.clear(); + ip_address_.clear(); + name_servers_.clear(); + } else { + has_active_network_ = true; + service_path_ = network->service_path(); + ip_address_ = network->ip_address(); + name_servers_.swap(ipconfig_name_servers); + } + dns_config_service_->OnNetworkChange(); + UpdateConnectivityState(network); + // If there is an active network, add observer to track its changes. + if (network) + lib->AddNetworkObserver(network->service_path(), this); + + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::Bind( + &NetworkChangeNotifier::NotifyObserversOfIPAddressChange)); + } +} + +void NetworkChangeNotifierNetworkLibrary::UpdateConnectivityState( + const chromeos::Network* network) { + if (network) { + VLOG(1) << "UpdateConnectivityState: " << network->name() + << ", type= " << network->type() + << ", device= " << network->device_path() + << ", state= " << network->state() + << ", connect= " << connection_state_ + << ", type= " << connection_type_; + } + + // We don't care about all transitions of ConnectionState. OnlineStateChange + // notification should trigger if ConnectionType is changed. + chromeos::ConnectionState new_connection_state = + network ? network->connection_state() : chromeos::STATE_UNKNOWN; + + ConnectionType prev_connection_type = connection_type_; + ConnectionType new_connection_type = GetNetworkConnectionType(network); + + bool is_online = (new_connection_state == chromeos::STATE_ONLINE); + bool was_online = (connection_state_ == chromeos::STATE_ONLINE); + bool is_portal = (new_connection_state == chromeos::STATE_PORTAL); + bool was_portal = (connection_state_ == chromeos::STATE_PORTAL); + VLOG(2) << " UpdateConnectivityState2: " + << "new_cs = " << new_connection_state + << ", is_online = " << is_online + << ", was_online = " << was_online + << ", is_portal = " << is_portal + << ", was_portal = " << was_portal; + connection_state_ = new_connection_state; + connection_type_ = new_connection_type; + if (new_connection_type != prev_connection_type) { + VLOG(1) << "UpdateConnectivityState3: " + << "prev_connection_type = " << prev_connection_type + << ", new_connection_type = " << new_connection_type; + ReportConnectionChange(); + } + VLOG(2) << " UpdateConnectivityState4: " + << "new_cs = " << new_connection_state + << ", end_cs_ = " << connection_state_ + << "prev_type = " << prev_connection_type + << ", new_type_ = " << new_connection_type; +} + +void NetworkChangeNotifierNetworkLibrary::ReportConnectionChange() { + if (weak_factory_.HasWeakPtrs()) { + // If we have a pending task, cancel it. + DVLOG(1) << "ReportConnectionChange: has pending task"; + weak_factory_.InvalidateWeakPtrs(); + DVLOG(1) << "ReportConnectionChange: canceled pending task"; + } + // Posting task with delay allows us to cancel it when connection type is + // changed frequently. This should help us avoid transient edge reporting + // while switching between connection types (e.g. ethernet->wifi). + base::Closure task = base::Bind( + &NetworkChangeNotifierNetworkLibrary::ReportConnectionChangeOnUIThread, + weak_factory_.GetWeakPtr()); + + BrowserThread::PostDelayedTask( + BrowserThread::UI, FROM_HERE, task, + base::TimeDelta::FromMilliseconds(kOnlineNotificationDelayMS)); +} + +void NetworkChangeNotifierNetworkLibrary::ReportConnectionChangeOnUIThread() { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::Bind( + &NetworkChangeNotifierNetworkLibrary:: + NotifyObserversOfConnectionTypeChange)); +} + +// static +void NetworkChangeNotifierNetworkLibrary::UpdateInitialState( + NetworkChangeNotifierNetworkLibrary* self) { + chromeos::NetworkLibrary* net = + chromeos::CrosLibrary::Get()->GetNetworkLibrary(); + self->UpdateNetworkState(net); +} + +// static +net::NetworkChangeNotifier::ConnectionType +NetworkChangeNotifierNetworkLibrary::GetNetworkConnectionType( + const chromeos::Network* network) { + if (!network || !IsOnline(network->connection_state())) + return net::NetworkChangeNotifier::CONNECTION_NONE; + + switch (network->type()) { + case chromeos::TYPE_ETHERNET: + return CONNECTION_ETHERNET; + case chromeos::TYPE_WIFI: + return CONNECTION_WIFI; + case chromeos::TYPE_WIMAX: + return CONNECTION_4G; + case chromeos::TYPE_CELLULAR: + switch (static_cast<const chromeos::CellularNetwork*>( + network)->network_technology()) { + case chromeos::NETWORK_TECHNOLOGY_UNKNOWN: + case chromeos::NETWORK_TECHNOLOGY_1XRTT: + case chromeos::NETWORK_TECHNOLOGY_GPRS: + case chromeos::NETWORK_TECHNOLOGY_EDGE: + return CONNECTION_2G; + case chromeos::NETWORK_TECHNOLOGY_GSM: + case chromeos::NETWORK_TECHNOLOGY_UMTS: + case chromeos::NETWORK_TECHNOLOGY_EVDO: + case chromeos::NETWORK_TECHNOLOGY_HSPA: + return CONNECTION_3G; + case chromeos::NETWORK_TECHNOLOGY_HSPA_PLUS: + case chromeos::NETWORK_TECHNOLOGY_LTE: + case chromeos::NETWORK_TECHNOLOGY_LTE_ADVANCED: + return CONNECTION_4G; + } + case chromeos::TYPE_BLUETOOTH: + case chromeos::TYPE_VPN: + case chromeos::TYPE_UNKNOWN: + break; + } + return net::NetworkChangeNotifier::CONNECTION_UNKNOWN; +} + +// static +net::NetworkChangeNotifier::NetworkChangeCalculatorParams +NetworkChangeNotifierNetworkLibrary::NetworkChangeCalculatorParamsChromeos() { + NetworkChangeCalculatorParams params; + // Delay values arrived at by simple experimentation and adjusted so as to + // produce a single signal when switching between network connections. + params.ip_address_offline_delay_ = base::TimeDelta::FromMilliseconds(4000); + params.ip_address_online_delay_ = base::TimeDelta::FromMilliseconds(1000); + params.connection_type_offline_delay_ = base::TimeDelta::FromMilliseconds(0); + params.connection_type_online_delay_ = base::TimeDelta::FromMilliseconds(0); + return params; +} + +} // namespace chromeos diff --git a/chrome/browser/chromeos/net/network_change_notifier_network_library.h b/chrome/browser/chromeos/net/network_change_notifier_network_library.h new file mode 100644 index 0000000..16d8aa4 --- /dev/null +++ b/chrome/browser/chromeos/net/network_change_notifier_network_library.h @@ -0,0 +1,109 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_NET_NETWORK_CHANGE_NOTIFIER_NETWORK_LIBRARY_H_ +#define CHROME_BROWSER_CHROMEOS_NET_NETWORK_CHANGE_NOTIFIER_NETWORK_LIBRARY_H_ + +#include <vector> + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "base/memory/weak_ptr.h" +#include "chrome/browser/chromeos/cros/network_library.h" +#include "chromeos/dbus/root_power_manager_observer.h" +#include "net/base/network_change_notifier.h" + +namespace chromeos { + +class OnlineStatusReportThreadTask; + +class NetworkChangeNotifierNetworkLibrary + : public net::NetworkChangeNotifier, + public chromeos::RootPowerManagerObserver, + public chromeos::NetworkLibrary::NetworkObserver, + public chromeos::NetworkLibrary::NetworkManagerObserver { + public: + NetworkChangeNotifierNetworkLibrary(); + virtual ~NetworkChangeNotifierNetworkLibrary(); + + // Initializes the network change notifier. Starts to observe changes + // from the power manager and the network manager. + void Init(); + + // Shutdowns the network change notifier. Stops observing changes from + // the power manager and the network manager. + void Shutdown(); + + private: + friend class OnlineStatusReportThreadTask; + + class DnsConfigServiceChromeos; + + // RootPowerManagerObserver overrides: + virtual void OnResume(const base::TimeDelta& sleep_duration) OVERRIDE; + + // NetworkChangeNotifier overrides: + virtual net::NetworkChangeNotifier::ConnectionType + GetCurrentConnectionType() const OVERRIDE; + + // NetworkManagerObserver overrides: + virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* obj) OVERRIDE; + + // NetworkObserver overrides: + virtual void OnNetworkChanged(chromeos::NetworkLibrary* cros, + const chromeos::Network* network) OVERRIDE; + + // Initiate online status change reporting. + void ReportConnectionChange(); + void ReportConnectionChangeOnUIThread(); + // Callback from online_notification_task_ when online state notification + // is actually scheduled. + void OnOnlineStateNotificationFired(); + + // Initiates an update of data members that keep the track the network stack + // state. + void UpdateNetworkState(chromeos::NetworkLibrary* cros); + // Called when a network state update has completed. Updates data members that + // keep the track the network stack state. + void UpdateNetworkStateCallback(chromeos::NetworkLibrary* cros, + const NetworkIPConfigVector& ip_configs, + const std::string& hardware_address); + // Updates network connectivity state. + void UpdateConnectivityState(const chromeos::Network* network); + + // Updates the initial state. Lets us trigger initial eval of the + // connectivity status without waiting for an event from the connection + // manager. + static void UpdateInitialState(NetworkChangeNotifierNetworkLibrary* self); + + // Gets connection type for given |network|. + static net::NetworkChangeNotifier::ConnectionType GetNetworkConnectionType( + const chromeos::Network* network); + + // Get parameters for calculating new combined signal. + static NetworkChangeCalculatorParams NetworkChangeCalculatorParamsChromeos(); + + // True if we previously had an active network around. + bool has_active_network_; + // Current active network's connection state. + chromeos::ConnectionState connection_state_; + // Current active network's connection type. + net::NetworkChangeNotifier::ConnectionType connection_type_; + // Current active network's service path. + std::string service_path_; + // Current active network's IP address. + std::string ip_address_; + // Current active network's name servers. + std::vector<std::string> name_servers_; + + scoped_ptr<DnsConfigServiceChromeos> dns_config_service_; + + base::WeakPtrFactory<NetworkChangeNotifierNetworkLibrary> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(NetworkChangeNotifierNetworkLibrary); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_NET_NETWORK_CHANGE_NOTIFIER_NETWORK_LIBRARY_H_ diff --git a/chrome/chrome_browser_chromeos.gypi b/chrome/chrome_browser_chromeos.gypi index f9a0f92..2e8ffb4 100644 --- a/chrome/chrome_browser_chromeos.gypi +++ b/chrome/chrome_browser_chromeos.gypi @@ -503,8 +503,8 @@ 'browser/chromeos/mobile_config.h', 'browser/chromeos/net/cros_network_change_notifier_factory.cc', 'browser/chromeos/net/cros_network_change_notifier_factory.h', - 'browser/chromeos/net/network_change_notifier_chromeos.cc', - 'browser/chromeos/net/network_change_notifier_chromeos.h', + 'browser/chromeos/net/network_change_notifier_network_library.cc', + 'browser/chromeos/net/network_change_notifier_network_library.h', 'browser/chromeos/net/network_portal_detector.cc', 'browser/chromeos/net/network_portal_detector.h', 'browser/chromeos/network_login_observer.cc', -- cgit v1.1