diff options
author | zelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-18 17:34:42 +0000 |
---|---|---|
committer | zelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-18 17:34:42 +0000 |
commit | 7a020b793e052c064b0a31596a57c9fcce24e138 (patch) | |
tree | 7e23ef2668a68d0bac6417c459cba58f663b4f46 /chrome/browser/chromeos/net | |
parent | e0bf967257cbc3334f6709b56ae24ee0e1ebc5f9 (diff) | |
download | chromium_src-7a020b793e052c064b0a31596a57c9fcce24e138.zip chromium_src-7a020b793e052c064b0a31596a57c9fcce24e138.tar.gz chromium_src-7a020b793e052c064b0a31596a57c9fcce24e138.tar.bz2 |
Added ChromeOS-specific NetworkChangeNotifier specialization that is wired directly to flimflam.
This implementation will help us detect more networking issues than the regular Linux version
that was based on netlink. In addition to service/ip changes, we can now raise network change
notification for connectivity changes (i.e. captive portal state changes).
BUG=chromium-os:15327
TEST=make sure SPDY and Proxy settings are properly invalidated once we resume ChromeOS session
Review URL: http://codereview.chromium.org/7029019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85779 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chromeos/net')
-rw-r--r-- | chrome/browser/chromeos/net/network_change_notifier_chromeos.cc | 88 | ||||
-rw-r--r-- | chrome/browser/chromeos/net/network_change_notifier_chromeos.h | 54 |
2 files changed, 142 insertions, 0 deletions
diff --git a/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc b/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc new file mode 100644 index 0000000..e099cf4 --- /dev/null +++ b/chrome/browser/chromeos/net/network_change_notifier_chromeos.cc @@ -0,0 +1,88 @@ +// Copyright (c) 2011 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 "base/task.h" +#include "chrome/browser/chromeos/cros/cros_library.h" +#include "content/browser/browser_thread.h" + +namespace chromeos { + +NetworkChangeNotifierChromeos::NetworkChangeNotifierChromeos() + : has_active_network_(false), + connectivity_state_(chromeos::CONN_STATE_UNKNOWN), + ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { + + chromeos::NetworkLibrary* lib = + chromeos::CrosLibrary::Get()->GetNetworkLibrary(); + lib->AddNetworkManagerObserver(this); +} + +NetworkChangeNotifierChromeos::~NetworkChangeNotifierChromeos() { + chromeos::NetworkLibrary* lib = + chromeos::CrosLibrary::Get()->GetNetworkLibrary(); + lib->RemoveNetworkManagerObserver(this); + lib->RemoveObserverForAllNetworks(this); +} + +void NetworkChangeNotifierChromeos::OnNetworkManagerChanged( + chromeos::NetworkLibrary* cros) { + UpdateNetworkState(cros); +} + +bool NetworkChangeNotifierChromeos::IsCurrentlyOffline() const { + return connectivity_state_ != chromeos::CONN_STATE_UNRESTRICTED; +} + +void NetworkChangeNotifierChromeos::UpdateNetworkState( + chromeos::NetworkLibrary* lib) { + const chromeos::Network* network = lib->active_network(); + + // Check if active network was added, removed or changed. + if ((!network && has_active_network_) || + (network && (!has_active_network_ || + network->service_path() != service_path_ || + network->ip_address() != ip_address_))) { + if (has_active_network_) + lib->RemoveObserverForAllNetworks(this); + if (!network) { + has_active_network_ = false; + service_path_.clear(); + ip_address_.clear(); + } else { + has_active_network_ = true; + service_path_ = network->service_path(); + lib->AddNetworkObserver(network->service_path(), this); + ip_address_ = network->ip_address(); + } + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + NewRunnableFunction( + &NetworkChangeNotifierChromeos::NotifyObserversOfIPAddressChange)); + } +} + +void NetworkChangeNotifierChromeos::OnNetworkChanged( + chromeos::NetworkLibrary* cros, + const chromeos::Network* network) { + if (!network) { + NOTREACHED(); + return; + } + // Active network changed? + if (network->service_path() != service_path_) { + UpdateNetworkState(cros); + return; + } + if (network->connectivity_state() != connectivity_state_) { + connectivity_state_ = network->connectivity_state(); + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + method_factory_.NewRunnableMethod( + &NetworkChangeNotifierChromeos::NotifyObserversOfOnlineStateChange)); + } +} + +} // namespace net diff --git a/chrome/browser/chromeos/net/network_change_notifier_chromeos.h b/chrome/browser/chromeos/net/network_change_notifier_chromeos.h new file mode 100644 index 0000000..850f9e6 --- /dev/null +++ b/chrome/browser/chromeos/net/network_change_notifier_chromeos.h @@ -0,0 +1,54 @@ +// Copyright (c) 2011 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_ +#pragma once + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "chrome/browser/chromeos/cros/network_library.h" +#include "net/base/network_change_notifier.h" + +namespace chromeos { + +class NetworkChangeNotifierChromeos + : public net::NetworkChangeNotifier, + public chromeos::NetworkLibrary::NetworkManagerObserver, + public chromeos::NetworkLibrary::NetworkObserver { + public: + NetworkChangeNotifierChromeos(); + virtual ~NetworkChangeNotifierChromeos(); + + private: + // NetworkChangeNotifier overrides. + virtual bool IsCurrentlyOffline() const OVERRIDE; + + // NetworkManagerObserver overrides: + virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* obj) OVERRIDE; + + // NetworkObserver overrides: + virtual void OnNetworkChanged(chromeos::NetworkLibrary* cros, + const chromeos::Network* network) OVERRIDE; + + // Updates data members that keep the track the network stack state. + void UpdateNetworkState(chromeos::NetworkLibrary* cros); + + // True if we previously had an active network around. + bool has_active_network_; + // Current active network's connectivity state. + chromeos::ConnectivityState connectivity_state_; + // Current active network's service path. + std::string service_path_; + // Current active network's IP address. + std::string ip_address_; + + ScopedRunnableMethodFactory<NetworkChangeNotifierChromeos> method_factory_; + + DISALLOW_COPY_AND_ASSIGN(NetworkChangeNotifierChromeos); +}; + +} // namespace net + +#endif // CHROME_BROWSER_CHROMEOS_NET_NETWORK_CHANGE_NOTIFIER_CHROMEOS_H_ |