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
11 namespace chromeos {
12
NetworkChangeNotifierChromeos()13 NetworkChangeNotifierChromeos::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
~NetworkChangeNotifierChromeos()23 NetworkChangeNotifierChromeos::~NetworkChangeNotifierChromeos() {
24 chromeos::NetworkLibrary* lib =
25 chromeos::CrosLibrary::Get()->GetNetworkLibrary();
26 lib->RemoveNetworkManagerObserver(this);
27 lib->RemoveObserverForAllNetworks(this);
28 }
29
OnNetworkManagerChanged(chromeos::NetworkLibrary * cros)30 void NetworkChangeNotifierChromeos::OnNetworkManagerChanged(
31 chromeos::NetworkLibrary* cros) {
32 UpdateNetworkState(cros);
33 }
34
IsCurrentlyOffline() const35 bool NetworkChangeNotifierChromeos::IsCurrentlyOffline() const {
36 return connectivity_state_ != chromeos::CONN_STATE_UNRESTRICTED;
37 }
38
UpdateNetworkState(chromeos::NetworkLibrary * lib)39 void 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
OnNetworkChanged(chromeos::NetworkLibrary * cros,const chromeos::Network * network)67 void 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