Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Side by Side Diff: chrome/browser/chromeos/network_message_observer.cc

Issue 4169001: Rewritten parts of NetworkLibrary to work around memory corruption that prev... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/network_message_observer.h" 5 #include "chrome/browser/chromeos/network_message_observer.h"
6 6
7 #include "app/l10n_util.h" 7 #include "app/l10n_util.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/stl_util-inl.h"
9 #include "base/string_number_conversions.h" 10 #include "base/string_number_conversions.h"
10 #include "base/utf_string_conversions.h" 11 #include "base/utf_string_conversions.h"
11 #include "chrome/browser/browser.h" 12 #include "chrome/browser/browser.h"
12 #include "chrome/browser/browser_list.h" 13 #include "chrome/browser/browser_list.h"
13 #include "chrome/browser/browser_window.h" 14 #include "chrome/browser/browser_window.h"
14 #include "chrome/browser/chromeos/cros/cros_library.h" 15 #include "chrome/browser/chromeos/cros/cros_library.h"
15 #include "chrome/browser/chromeos/cros/network_library.h" 16 #include "chrome/browser/chromeos/cros/network_library.h"
16 #include "chrome/browser/chromeos/notifications/balloon_view_host.h" 17 #include "chrome/browser/chromeos/notifications/balloon_view_host.h"
17 #include "chrome/browser/chromeos/options/network_config_view.h" 18 #include "chrome/browser/chromeos/options/network_config_view.h"
18 #include "chrome/browser/views/window.h" 19 #include "chrome/browser/views/window.h"
(...skipping 16 matching lines...) Expand all
35 IDR_NOTIFICATION_BARS_EMPTY, 36 IDR_NOTIFICATION_BARS_EMPTY,
36 l10n_util::GetStringUTF16(IDS_NETWORK_OUT_OF_DATA_TITLE)) { 37 l10n_util::GetStringUTF16(IDS_NETWORK_OUT_OF_DATA_TITLE)) {
37 NetworkChanged(CrosLibrary::Get()->GetNetworkLibrary()); 38 NetworkChanged(CrosLibrary::Get()->GetNetworkLibrary());
38 initialized_ = true; 39 initialized_ = true;
39 } 40 }
40 41
41 NetworkMessageObserver::~NetworkMessageObserver() { 42 NetworkMessageObserver::~NetworkMessageObserver() {
42 notification_connection_error_.Hide(); 43 notification_connection_error_.Hide();
43 notification_low_data_.Hide(); 44 notification_low_data_.Hide();
44 notification_no_data_.Hide(); 45 notification_no_data_.Hide();
46 STLDeleteValues(&cellular_networks_);
47 STLDeleteValues(&wifi_networks_);
45 } 48 }
46 49
47 void NetworkMessageObserver::CreateModalPopup(views::WindowDelegate* view) { 50 void NetworkMessageObserver::CreateModalPopup(views::WindowDelegate* view) {
48 Browser* browser = BrowserList::GetLastActive(); 51 Browser* browser = BrowserList::GetLastActive();
49 if (browser && browser->type() != Browser::TYPE_NORMAL) { 52 if (browser && browser->type() != Browser::TYPE_NORMAL) {
50 browser = BrowserList::FindBrowserWithType(browser->profile(), 53 browser = BrowserList::FindBrowserWithType(browser->profile(),
51 Browser::TYPE_NORMAL, 54 Browser::TYPE_NORMAL,
52 true); 55 true);
53 } 56 }
54 DCHECK(browser); 57 DCHECK(browser);
55 views::Window* window = browser::CreateViewsWindow( 58 views::Window* window = browser::CreateViewsWindow(
56 browser->window()->GetNativeHandle(), gfx::Rect(), view); 59 browser->window()->GetNativeHandle(), gfx::Rect(), view);
57 window->SetIsAlwaysOnTop(true); 60 window->SetIsAlwaysOnTop(true);
58 window->Show(); 61 window->Show();
59 } 62 }
60 63
61 void NetworkMessageObserver::MobileSetup(const ListValue* args) { 64 void NetworkMessageObserver::MobileSetup(const ListValue* args) {
62 BrowserList::GetLastActive()->OpenMobilePlanTabAndActivate(); 65 BrowserList::GetLastActive()->OpenMobilePlanTabAndActivate();
63 } 66 }
64 67
65 void NetworkMessageObserver::NetworkChanged(NetworkLibrary* obj) { 68 void NetworkMessageObserver::NetworkChanged(NetworkLibrary* obj) {
66 const WifiNetworkVector& wifi_networks = obj->wifi_networks(); 69 const WifiNetworkVector& wifi_networks = obj->wifi_networks();
67 const CellularNetworkVector& cellular_networks = obj->cellular_networks(); 70 const CellularNetworkVector& cellular_networks = obj->cellular_networks();
68 71
69 NetworkConfigView* view = NULL; 72 NetworkConfigView* view = NULL;
70 std::string new_failed_network; 73 std::string new_failed_network;
71 // Check to see if we have any newly failed wifi network. 74 // Check to see if we have any newly failed wifi network.
72 for (WifiNetworkVector::const_iterator it = wifi_networks.begin(); 75 for (WifiNetworkVector::const_iterator it = wifi_networks.begin();
73 it < wifi_networks.end(); it++) { 76 it < wifi_networks.end(); it++) {
74 const WifiNetwork& wifi = *it; 77 const WifiNetwork* wifi = *it;
75 if (wifi.failed()) { 78 if (wifi->failed()) {
76 ServicePathWifiMap::iterator iter = 79 ServicePathWifiMap::iterator iter =
77 wifi_networks_.find(wifi.service_path()); 80 wifi_networks_.find(wifi->service_path());
78 // If the network did not previously exist, then don't do anything. 81 // If the network did not previously exist, then don't do anything.
79 // For example, if the user travels to a location and finds a service 82 // For example, if the user travels to a location and finds a service
80 // that has previously failed, we don't want to show a notification. 83 // that has previously failed, we don't want to show a notification.
81 if (iter == wifi_networks_.end()) 84 if (iter == wifi_networks_.end())
82 continue; 85 continue;
83 86
84 const WifiNetwork& wifi_old = iter->second; 87 const WifiNetwork* wifi_old = iter->second;
85 // If this network was in a failed state previously, then it's not new. 88 // If this network was in a failed state previously, then it's not new.
86 if (wifi_old.failed()) 89 if (wifi_old->failed())
87 continue; 90 continue;
88 91
89 // Display login box again for bad_passphrase and bad_wepkey errors. 92 // Display login box again for bad_passphrase and bad_wepkey errors.
90 if (wifi.error() == ERROR_BAD_PASSPHRASE || 93 if (wifi->error() == ERROR_BAD_PASSPHRASE ||
91 wifi.error() == ERROR_BAD_WEPKEY) { 94 wifi->error() == ERROR_BAD_WEPKEY) {
92 // The NetworkConfigView will show the appropriate error message. 95 // The NetworkConfigView will show the appropriate error message.
93 view = new NetworkConfigView(wifi, true); 96 view = new NetworkConfigView(wifi, true);
94 // There should only be one wifi network that failed to connect. 97 // There should only be one wifi network that failed to connect.
95 // If for some reason, we have more than one failure, 98 // If for some reason, we have more than one failure,
96 // we only display the first one. So we break here. 99 // we only display the first one. So we break here.
97 break; 100 break;
98 } 101 }
99 102
100 // If network connection failed, display a notification. 103 // If network connection failed, display a notification.
101 // We only do this if we were trying to make a new connection. 104 // We only do this if we were trying to make a new connection.
102 // So if a previously connected network got disconnected for any reason, 105 // So if a previously connected network got disconnected for any reason,
103 // we don't display notification. 106 // we don't display notification.
104 if (wifi_old.connecting()) { 107 if (wifi_old->connecting()) {
105 new_failed_network = wifi.name(); 108 new_failed_network = wifi->name();
106 // Like above, there should only be one newly failed network. 109 // Like above, there should only be one newly failed network.
107 break; 110 break;
108 } 111 }
109 } 112 }
110 113
111 // If we find any network connecting, we hide the error notification. 114 // If we find any network connecting, we hide the error notification.
112 if (wifi.connecting()) { 115 if (wifi->connecting()) {
113 notification_connection_error_.Hide(); 116 notification_connection_error_.Hide();
114 } 117 }
115 } 118 }
116 119
117 // Refresh stored networks. 120 // Refresh stored networks.
121 STLDeleteValues(&wifi_networks_);
118 wifi_networks_.clear(); 122 wifi_networks_.clear();
119 for (WifiNetworkVector::const_iterator it = wifi_networks.begin(); 123 for (WifiNetworkVector::const_iterator it = wifi_networks.begin();
120 it < wifi_networks.end(); it++) { 124 it < wifi_networks.end(); it++) {
121 const WifiNetwork& wifi = *it; 125 const WifiNetwork* wifi = *it;
122 wifi_networks_[wifi.service_path()] = wifi; 126 wifi_networks_[wifi->service_path()] = new WifiNetwork(*wifi);
123 } 127 }
128
129 STLDeleteValues(&cellular_networks_);
124 cellular_networks_.clear(); 130 cellular_networks_.clear();
125 for (CellularNetworkVector::const_iterator it = cellular_networks.begin(); 131 for (CellularNetworkVector::const_iterator it = cellular_networks.begin();
126 it < cellular_networks.end(); it++) { 132 it < cellular_networks.end(); it++) {
127 const CellularNetwork& cellular = *it; 133 const CellularNetwork* cellular = *it;
128 cellular_networks_[cellular.service_path()] = cellular; 134 cellular_networks_[cellular->service_path()] =
135 new CellularNetwork(*cellular);
129 } 136 }
130 137
131 // Show connection error notification if necessary. 138 // Show connection error notification if necessary.
132 if (!new_failed_network.empty()) { 139 if (!new_failed_network.empty()) {
133 // Hide if already shown to force show it in case user has closed it. 140 // Hide if already shown to force show it in case user has closed it.
134 if (notification_connection_error_.visible()) 141 if (notification_connection_error_.visible())
135 notification_connection_error_.Hide(); 142 notification_connection_error_.Hide();
136 notification_connection_error_.Show(l10n_util::GetStringFUTF16( 143 notification_connection_error_.Show(l10n_util::GetStringFUTF16(
137 IDS_NETWORK_CONNECTION_ERROR_MESSAGE, 144 IDS_NETWORK_CONNECTION_ERROR_MESSAGE,
138 ASCIIToUTF16(new_failed_network)), false, false); 145 ASCIIToUTF16(new_failed_network)), false, false);
139 } 146 }
140 147
141 // Show login box if necessary. 148 // Show login box if necessary.
142 if (view && initialized_) 149 if (view && initialized_)
143 CreateModalPopup(view); 150 CreateModalPopup(view);
144 } 151 }
145 152
146 void NetworkMessageObserver::CellularDataPlanChanged(NetworkLibrary* obj) { 153 void NetworkMessageObserver::CellularDataPlanChanged(NetworkLibrary* obj) {
147 const CellularNetwork& cellular = obj->cellular_network(); 154 const CellularNetwork* cellular = obj->cellular_network();
155 if (!cellular)
156 return;
148 // Active plan is the first one in the list. Use empty one if none found. 157 // Active plan is the first one in the list. Use empty one if none found.
149 const CellularDataPlanList& plans = cellular.GetDataPlans(); 158 const CellularDataPlanList& plans = cellular->GetDataPlans();
150 CellularDataPlan plan = plans.empty() ? CellularDataPlan() : plans[0]; 159 CellularDataPlan plan = plans.empty() ? CellularDataPlan() : plans[0];
151 // If connected cellular network changed, or data plan is different, then 160 // If connected cellular network changed, or data plan is different, then
152 // it's a new network. Then hide all previous notifications. 161 // it's a new network. Then hide all previous notifications.
153 bool new_plan = false; 162 bool new_plan = false;
154 if (cellular.service_path() != cellular_service_path_) { 163 if (cellular->service_path() != cellular_service_path_) {
155 cellular_service_path_ = cellular.service_path(); 164 cellular_service_path_ = cellular->service_path();
156 new_plan = true; 165 new_plan = true;
157 } else if (plan.plan_name != cellular_data_plan_.plan_name || 166 } else if (plan.plan_name != cellular_data_plan_.plan_name ||
158 plan.plan_type != cellular_data_plan_.plan_type) { 167 plan.plan_type != cellular_data_plan_.plan_type) {
159 new_plan = true; 168 new_plan = true;
160 } 169 }
161 if (new_plan) { 170 if (new_plan) {
162 // New network, so hide the notifications and set the notifications title. 171 // New network, so hide the notifications and set the notifications title.
163 notification_low_data_.Hide(); 172 notification_low_data_.Hide();
164 notification_no_data_.Hide(); 173 notification_no_data_.Hide();
165 if (plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED) { 174 if (plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED) {
166 notification_no_data_.set_title( 175 notification_no_data_.set_title(
167 l10n_util::GetStringFUTF16(IDS_NETWORK_DATA_EXPIRED_TITLE, 176 l10n_util::GetStringFUTF16(IDS_NETWORK_DATA_EXPIRED_TITLE,
168 ASCIIToUTF16(plan.plan_name))); 177 ASCIIToUTF16(plan.plan_name)));
169 notification_low_data_.set_title( 178 notification_low_data_.set_title(
170 l10n_util::GetStringFUTF16(IDS_NETWORK_NEARING_EXPIRATION_TITLE, 179 l10n_util::GetStringFUTF16(IDS_NETWORK_NEARING_EXPIRATION_TITLE,
171 ASCIIToUTF16(plan.plan_name))); 180 ASCIIToUTF16(plan.plan_name)));
172 } else { 181 } else {
173 notification_no_data_.set_title( 182 notification_no_data_.set_title(
174 l10n_util::GetStringFUTF16(IDS_NETWORK_OUT_OF_DATA_TITLE, 183 l10n_util::GetStringFUTF16(IDS_NETWORK_OUT_OF_DATA_TITLE,
175 ASCIIToUTF16(plan.plan_name))); 184 ASCIIToUTF16(plan.plan_name)));
176 notification_low_data_.set_title( 185 notification_low_data_.set_title(
177 l10n_util::GetStringFUTF16(IDS_NETWORK_LOW_DATA_TITLE, 186 l10n_util::GetStringFUTF16(IDS_NETWORK_LOW_DATA_TITLE,
178 ASCIIToUTF16(plan.plan_name))); 187 ASCIIToUTF16(plan.plan_name)));
179 } 188 }
180 } 189 }
181 190
182 if (plan.plan_type != CELLULAR_DATA_PLAN_UNKNOWN) { 191 if (plan.plan_type != CELLULAR_DATA_PLAN_UNKNOWN) {
183 if (cellular.data_left() == CellularNetwork::DATA_NONE) { 192 if (cellular->data_left() == CellularNetwork::DATA_NONE) {
184 notification_low_data_.Hide(); 193 notification_low_data_.Hide();
185 int message = plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED ? 194 int message = plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED ?
186 IDS_NETWORK_MINUTES_REMAINING_MESSAGE : 195 IDS_NETWORK_MINUTES_REMAINING_MESSAGE :
187 IDS_NETWORK_DATA_REMAINING_MESSAGE; 196 IDS_NETWORK_DATA_REMAINING_MESSAGE;
188 notification_no_data_.Show(l10n_util::GetStringFUTF16( 197 notification_no_data_.Show(l10n_util::GetStringFUTF16(
189 message, ASCIIToUTF16("0")), 198 message, ASCIIToUTF16("0")),
190 l10n_util::GetStringUTF16(IDS_NETWORK_PURCHASE_MORE_MESSAGE), 199 l10n_util::GetStringUTF16(IDS_NETWORK_PURCHASE_MORE_MESSAGE),
191 NewCallback(this, &NetworkMessageObserver::MobileSetup), 200 NewCallback(this, &NetworkMessageObserver::MobileSetup),
192 false, false); 201 false, false);
193 } else if (cellular.data_left() == CellularNetwork::DATA_VERY_LOW) { 202 } else if (cellular->data_left() == CellularNetwork::DATA_VERY_LOW) {
194 notification_no_data_.Hide(); 203 notification_no_data_.Hide();
195 int message = plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED ? 204 int message = plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED ?
196 IDS_NETWORK_MINUTES_REMAINING_MESSAGE : 205 IDS_NETWORK_MINUTES_REMAINING_MESSAGE :
197 IDS_NETWORK_DATA_REMAINING_MESSAGE; 206 IDS_NETWORK_DATA_REMAINING_MESSAGE;
198 int64 remaining = plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED ? 207 int64 remaining = plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED ?
199 (plan.plan_end_time - plan.update_time) / 60 : 208 (plan.plan_end_time - plan.update_time) / 60 :
200 (plan.plan_data_bytes - plan.data_bytes_used) / (1024 * 1024); 209 (plan.plan_data_bytes - plan.data_bytes_used) / (1024 * 1024);
201 notification_low_data_.Show(l10n_util::GetStringFUTF16( 210 notification_low_data_.Show(l10n_util::GetStringFUTF16(
202 message, UTF8ToUTF16(base::Int64ToString(remaining))), 211 message, UTF8ToUTF16(base::Int64ToString(remaining))),
203 l10n_util::GetStringUTF16(IDS_NETWORK_PURCHASE_MORE_MESSAGE), 212 l10n_util::GetStringUTF16(IDS_NETWORK_PURCHASE_MORE_MESSAGE),
204 NewCallback(this, &NetworkMessageObserver::MobileSetup), 213 NewCallback(this, &NetworkMessageObserver::MobileSetup),
205 false, false); 214 false, false);
206 } else { 215 } else {
207 // Got data, so hide notifications. 216 // Got data, so hide notifications.
208 notification_low_data_.Hide(); 217 notification_low_data_.Hide();
209 notification_no_data_.Hide(); 218 notification_no_data_.Hide();
210 } 219 }
211 } 220 }
212 221
213 cellular_data_plan_ = plan; 222 cellular_data_plan_ = plan;
214 } 223 }
215 224
216 } // namespace chromeos 225 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/network_message_observer.h ('k') | chrome/browser/chromeos/options/cellular_config_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698