summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/network_message_observer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/chromeos/network_message_observer.cc')
-rw-r--r--chrome/browser/chromeos/network_message_observer.cc107
1 files changed, 102 insertions, 5 deletions
diff --git a/chrome/browser/chromeos/network_message_observer.cc b/chrome/browser/chromeos/network_message_observer.cc
index 192ff28..c87a21b 100644
--- a/chrome/browser/chromeos/network_message_observer.cc
+++ b/chrome/browser/chromeos/network_message_observer.cc
@@ -5,28 +5,125 @@
#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)
- : notification_(profile, "network_connection.chromeos",
+ : 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) {
- // TODO(chocobo): Display open networks notification here.
-// notification_.Show(l10n_util::GetStringFUTF16(
-// IDS_NETWORK_CONNECTION_ERROR_MESSAGE,
-// ASCIIToUTF16(network.name())), true);
+ 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, true);
+ }
+
+ // Show login box if necessary.
+ if (view && initialized_)
+ CreateModalPopup(view);
}
} // namespace chromeos