1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
// Copyright (c) 2010 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/network_message_observer.h"
#include "app/l10n_util.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/browser_list.h"
#include "chrome/browser/browser_window.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
#include "chrome/browser/chromeos/cros/network_library.h"
#include "chrome/browser/chromeos/options/network_config_view.h"
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
#include "views/window/dialog_delegate.h"
#include "views/window/window.h"
namespace chromeos {
NetworkMessageObserver::NetworkMessageObserver(Profile* profile)
: initialized_(false),
notification_(profile, "network_connection.chromeos",
IDR_NOTIFICATION_NETWORK_FAILED,
l10n_util::GetStringUTF16(IDS_NETWORK_CONNECTION_ERROR_TITLE)) {
NetworkChanged(CrosLibrary::Get()->GetNetworkLibrary());
initialized_ = true;
}
NetworkMessageObserver::~NetworkMessageObserver() {
notification_.Hide();
}
void NetworkMessageObserver::CreateModalPopup(views::WindowDelegate* view) {
Browser* browser = BrowserList::GetLastActive();
if (browser && browser->type() != Browser::TYPE_NORMAL) {
browser = BrowserList::FindBrowserWithType(browser->profile(),
Browser::TYPE_NORMAL,
true);
}
DCHECK(browser);
views::Window* window = views::Window::CreateChromeWindow(
browser->window()->GetNativeHandle(), gfx::Rect(), view);
window->SetIsAlwaysOnTop(true);
window->Show();
}
void NetworkMessageObserver::NetworkChanged(NetworkLibrary* obj) {
const WifiNetworkVector& wifi_networks = obj->wifi_networks();
const CellularNetworkVector& cellular_networks = obj->cellular_networks();
NetworkConfigView* view = NULL;
std::string new_failed_network;
// Check to see if we have any newly failed wifi network.
for (WifiNetworkVector::const_iterator it = wifi_networks.begin();
it < wifi_networks.end(); it++) {
const WifiNetwork& wifi = *it;
if (wifi.failed()) {
ServicePathWifiMap::iterator iter =
wifi_networks_.find(wifi.service_path());
// If the network did not previously exist, then don't do anything.
// For example, if the user travels to a location and finds a service
// that has previously failed, we don't want to show a notification.
if (iter == wifi_networks_.end())
continue;
const WifiNetwork& wifi_old = iter->second;
// If this network was in a failed state previously, then it's not new.
if (wifi_old.failed())
continue;
// Display login box again for bad_passphrase and bad_wepkey errors.
if (wifi.error() == ERROR_BAD_PASSPHRASE ||
wifi.error() == ERROR_BAD_WEPKEY) {
// The NetworkConfigView will show the appropriate error message.
view = new NetworkConfigView(wifi, true);
// There should only be one wifi network that failed to connect.
// If for some reason, we have more than one failure,
// we only display the first one. So we break here.
break;
}
// If network connection failed, display a notification.
// We only do this if we were trying to make a new connection.
// So if a previously connected network got disconnected for any reason,
// we don't display notification.
if (wifi_old.connecting()) {
new_failed_network = wifi.name();
// Like above, there should only be one newly failed network.
break;
}
}
// If we find any network connecting, we hide any notifications.
if (wifi.connecting()) {
notification_.Hide();
}
}
// Refresh stored networks.
wifi_networks_.clear();
for (WifiNetworkVector::const_iterator it = wifi_networks.begin();
it < wifi_networks.end(); it++) {
const WifiNetwork& wifi = *it;
wifi_networks_[wifi.service_path()] = wifi;
}
cellular_networks_.clear();
for (CellularNetworkVector::const_iterator it = cellular_networks.begin();
it < cellular_networks.end(); it++) {
const CellularNetwork& cellular = *it;
cellular_networks_[cellular.service_path()] = cellular;
}
// Show notification if necessary.
if (!new_failed_network.empty()) {
// Hide if already shown to force show it in case user has closed it.
if (notification_.visible())
notification_.Hide();
notification_.Show(l10n_util::GetStringFUTF16(
IDS_NETWORK_CONNECTION_ERROR_MESSAGE,
ASCIIToUTF16(new_failed_network)), false);
}
// Show login box if necessary.
if (view && initialized_)
CreateModalPopup(view);
}
} // namespace chromeos
|