diff options
Diffstat (limited to 'chrome/browser/chromeos/network_message_observer.cc')
| -rw-r--r-- | chrome/browser/chromeos/network_message_observer.cc | 65 |
1 files changed, 41 insertions, 24 deletions
diff --git a/chrome/browser/chromeos/network_message_observer.cc b/chrome/browser/chromeos/network_message_observer.cc index 438f433..8a09207 100644 --- a/chrome/browser/chromeos/network_message_observer.cc +++ b/chrome/browser/chromeos/network_message_observer.cc @@ -6,6 +6,7 @@ #include "app/l10n_util.h" #include "base/callback.h" +#include "base/stl_util-inl.h" #include "base/string_number_conversions.h" #include "base/utf_string_conversions.h" #include "chrome/browser/browser.h" @@ -34,14 +35,22 @@ NetworkMessageObserver::NetworkMessageObserver(Profile* profile) notification_no_data_(profile, "network_no_data.chromeos", IDR_NOTIFICATION_BARS_EMPTY, l10n_util::GetStringUTF16(IDS_NETWORK_OUT_OF_DATA_TITLE)) { - NetworkChanged(CrosLibrary::Get()->GetNetworkLibrary()); + NetworkLibrary* netlib = CrosLibrary::Get()->GetNetworkLibrary(); + OnNetworkManagerChanged(netlib); + // Note that this gets added as a NetworkManagerObserver and a + // CellularDataPlanObserver in browser_init.cc initialized_ = true; } NetworkMessageObserver::~NetworkMessageObserver() { + NetworkLibrary* netlib = CrosLibrary::Get()->GetNetworkLibrary(); + netlib->RemoveNetworkManagerObserver(this); + netlib->RemoveCellularDataPlanObserver(this); notification_connection_error_.Hide(); notification_low_data_.Hide(); notification_no_data_.Hide(); + STLDeleteValues(&cellular_networks_); + STLDeleteValues(&wifi_networks_); } void NetworkMessageObserver::CreateModalPopup(views::WindowDelegate* view) { @@ -62,7 +71,7 @@ void NetworkMessageObserver::MobileSetup(const ListValue* args) { BrowserList::GetLastActive()->OpenMobilePlanTabAndActivate(); } -void NetworkMessageObserver::NetworkChanged(NetworkLibrary* obj) { +void NetworkMessageObserver::OnNetworkManagerChanged(NetworkLibrary* obj) { const WifiNetworkVector& wifi_networks = obj->wifi_networks(); const CellularNetworkVector& cellular_networks = obj->cellular_networks(); @@ -71,24 +80,24 @@ void NetworkMessageObserver::NetworkChanged(NetworkLibrary* obj) { // 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()) { + const WifiNetwork* wifi = *it; + if (wifi->failed()) { ServicePathWifiMap::iterator iter = - wifi_networks_.find(wifi.service_path()); + 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; + const WifiNetwork* wifi_old = iter->second; // If this network was in a failed state previously, then it's not new. - if (wifi_old.failed()) + 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) { + 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. @@ -101,31 +110,35 @@ void NetworkMessageObserver::NetworkChanged(NetworkLibrary* obj) { // 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(); + 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 the error notification. - if (wifi.connecting()) { + if (wifi->connecting()) { notification_connection_error_.Hide(); } } // Refresh stored networks. + STLDeleteValues(&wifi_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; + const WifiNetwork* wifi = *it; + wifi_networks_[wifi->service_path()] = new WifiNetwork(*wifi); } + + STLDeleteValues(&cellular_networks_); 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; + const CellularNetwork* cellular = *it; + cellular_networks_[cellular->service_path()] = + new CellularNetwork(*cellular); } // Show connection error notification if necessary. @@ -143,16 +156,18 @@ void NetworkMessageObserver::NetworkChanged(NetworkLibrary* obj) { CreateModalPopup(view); } -void NetworkMessageObserver::CellularDataPlanChanged(NetworkLibrary* obj) { - const CellularNetwork& cellular = obj->cellular_network(); +void NetworkMessageObserver::OnCellularDataPlanChanged(NetworkLibrary* obj) { + const CellularNetwork* cellular = obj->cellular_network(); + if (!cellular) + return; // Active plan is the first one in the list. Use empty one if none found. - const CellularDataPlanList& plans = cellular.GetDataPlans(); + const CellularDataPlanVector& plans = cellular->GetDataPlans(); CellularDataPlan plan = plans.empty() ? CellularDataPlan() : plans[0]; // If connected cellular network changed, or data plan is different, then // it's a new network. Then hide all previous notifications. bool new_plan = false; - if (cellular.service_path() != cellular_service_path_) { - cellular_service_path_ = cellular.service_path(); + if (cellular->service_path() != cellular_service_path_) { + cellular_service_path_ = cellular->service_path(); new_plan = true; } else if (plan.plan_name != cellular_data_plan_.plan_name || plan.plan_type != cellular_data_plan_.plan_type) { @@ -180,7 +195,7 @@ void NetworkMessageObserver::CellularDataPlanChanged(NetworkLibrary* obj) { } if (plan.plan_type != CELLULAR_DATA_PLAN_UNKNOWN) { - if (cellular.data_left() == CellularNetwork::DATA_NONE) { + if (cellular->data_left() == CellularNetwork::DATA_NONE) { notification_low_data_.Hide(); int message = plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED ? IDS_NETWORK_MINUTES_REMAINING_MESSAGE : @@ -190,13 +205,15 @@ void NetworkMessageObserver::CellularDataPlanChanged(NetworkLibrary* obj) { l10n_util::GetStringUTF16(IDS_NETWORK_PURCHASE_MORE_MESSAGE), NewCallback(this, &NetworkMessageObserver::MobileSetup), false, false); - } else if (cellular.data_left() == CellularNetwork::DATA_VERY_LOW) { + } else if (cellular->data_left() == CellularNetwork::DATA_VERY_LOW) { notification_no_data_.Hide(); int message = plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED ? IDS_NETWORK_MINUTES_REMAINING_MESSAGE : IDS_NETWORK_DATA_REMAINING_MESSAGE; + int64 remaining_minutes = + base::TimeDelta(plan.plan_end_time - plan.update_time).InMinutes(); int64 remaining = plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED ? - (plan.plan_end_time - plan.update_time) / 60 : + remaining_minutes : (plan.plan_data_bytes - plan.data_bytes_used) / (1024 * 1024); notification_low_data_.Show(l10n_util::GetStringFUTF16( message, UTF8ToUTF16(base::Int64ToString(remaining))), |
