diff options
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/browser_main.cc | 10 | ||||
-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 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 |
4 files changed, 153 insertions, 1 deletions
diff --git a/chrome/browser/browser_main.cc b/chrome/browser/browser_main.cc index 7dcc31b..8d3bc37 100644 --- a/chrome/browser/browser_main.cc +++ b/chrome/browser/browser_main.cc @@ -142,6 +142,7 @@ #include "chrome/browser/chromeos/login/screen_locker.h" #include "chrome/browser/chromeos/login/user_manager.h" #include "chrome/browser/chromeos/metrics_cros_settings_provider.h" +#include "chrome/browser/chromeos/net/network_change_notifier_chromeos.h" #include "chrome/browser/chromeos/system_key_event_listener.h" #include "chrome/browser/chromeos/web_socket_proxy_controller.h" #include "chrome/browser/oom_priority_manager.h" @@ -529,8 +530,15 @@ void BrowserMainParts::MainMessageLoopStart() { // TODO(viettrungluu): should these really go before setting the thread name? system_monitor_.reset(new base::SystemMonitor); hi_res_timer_manager_.reset(new HighResolutionTimerManager); +#if defined(OS_CHROMEOS) + // TODO(zelidrag): We need to move cros library glue code outside of + // chrome/browser directory to avoid check_deps issues and then migrate + // NetworkChangeNotifierCros class to net/base where other OS implementations + // live. + network_change_notifier_.reset(new chromeos::NetworkChangeNotifierChromeos()); +#else network_change_notifier_.reset(net::NetworkChangeNotifier::Create()); - +#endif InitializeMainThread(); PostMainMessageLoopStart(); 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_ diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 46413fd..a46f6c9 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -620,6 +620,8 @@ 'browser/chromeos/name_value_pairs_parser.h', 'browser/chromeos/native_dialog_window.cc', 'browser/chromeos/native_dialog_window.h', + 'browser/chromeos/net/network_change_notifier_chromeos.cc', + 'browser/chromeos/net/network_change_notifier_chromeos.h', 'browser/chromeos/network_login_observer.cc', 'browser/chromeos/network_login_observer.h', 'browser/chromeos/network_message_observer.cc', |