• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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