Index: chrome/browser/chromeos/dom_ui/internet_options_handler.cc |
=================================================================== |
--- chrome/browser/chromeos/dom_ui/internet_options_handler.cc (revision 0) |
+++ chrome/browser/chromeos/dom_ui/internet_options_handler.cc (revision 0) |
@@ -0,0 +1,328 @@ |
+// 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/dom_ui/internet_options_handler.h" |
+ |
+#include <string> |
+#include <vector> |
+ |
+#include "app/l10n_util.h" |
+#include "app/resource_bundle.h" |
+#include "base/base64.h" |
+#include "base/basictypes.h" |
+#include "base/callback.h" |
+#include "base/values.h" |
+#include "chrome/browser/browser.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/status/network_menu_button.h" |
+#include "chrome/browser/tab_contents/tab_contents.h" |
+#include "chrome/browser/tab_contents/tab_contents_view.h" |
+#include "chrome/common/notification_service.h" |
+#include "gfx/codec/png_codec.h" |
+#include "grit/browser_resources.h" |
+#include "grit/chromium_strings.h" |
+#include "grit/generated_resources.h" |
+#include "grit/locale_settings.h" |
+#include "grit/theme_resources.h" |
+#include "third_party/skia/include/core/SkBitmap.h" |
+#include "views/window/window.h" |
+ |
+InternetOptionsHandler::InternetOptionsHandler() { |
+ chromeos::CrosLibrary::Get()->GetNetworkLibrary()->AddObserver(this); |
+} |
+ |
+InternetOptionsHandler::~InternetOptionsHandler() { |
+ chromeos::CrosLibrary::Get()->GetNetworkLibrary()->RemoveObserver(this); |
+} |
+ |
+void InternetOptionsHandler::GetLocalizedValues( |
+ DictionaryValue* localized_strings) { |
+ DCHECK(localized_strings); |
+ // Internet page - ChromeOS |
+ localized_strings->SetString(L"internetPage", |
+ l10n_util::GetString(IDS_OPTIONS_INTERNET_TAB_LABEL)); |
+ |
+ localized_strings->SetString(L"wired_title", |
+ l10n_util::GetString(IDS_OPTIONS_SETTINGS_SECTION_TITLE_WIRED_NETWORK)); |
+ localized_strings->SetString(L"wireless_title", |
+ l10n_util::GetString( |
+ IDS_OPTIONS_SETTINGS_SECTION_TITLE_WIRELESS_NETWORK)); |
+ localized_strings->SetString(L"remembered_title", |
+ l10n_util::GetString( |
+ IDS_OPTIONS_SETTINGS_SECTION_TITLE_REMEMBERED_NETWORK)); |
+ |
+ localized_strings->SetString(L"connect_button", |
+ l10n_util::GetString( |
+ IDS_OPTIONS_SETTINGS_CONNECT)); |
+ localized_strings->SetString(L"disconnect_button", |
+ l10n_util::GetString( |
+ IDS_OPTIONS_SETTINGS_DISCONNECT)); |
+ localized_strings->SetString(L"options_button", |
+ l10n_util::GetString( |
+ IDS_OPTIONS_SETTINGS_OPTIONS)); |
+ localized_strings->SetString(L"forget_button", |
+ l10n_util::GetString( |
+ IDS_OPTIONS_SETTINGS_FORGET)); |
+ |
+ localized_strings->Set(L"wiredList", GetWiredList()); |
+ localized_strings->Set(L"wirelessList", GetWirelessList()); |
+ localized_strings->Set(L"rememberedList", GetRememberedList()); |
+} |
+ |
+void InternetOptionsHandler::RegisterMessages() { |
+ // Setup handlers specific to this panel. |
+ DCHECK(dom_ui_); |
+ dom_ui_->RegisterMessageCallback("buttonClickCallback", |
+ NewCallback(this, &InternetOptionsHandler::ButtonClickCallback)); |
+} |
+ |
+void InternetOptionsHandler::NetworkChanged(chromeos::NetworkLibrary* cros) { |
+ if (dom_ui_) { |
+ DictionaryValue dictionary; |
+ dictionary.Set(L"wiredList", GetWiredList()); |
+ dictionary.Set(L"wirelessList", GetWirelessList()); |
+ dictionary.Set(L"rememberedList", GetRememberedList()); |
+ dom_ui_->CallJavascriptFunction(L"refreshNetworkData", dictionary); |
+ } |
+} |
+ |
+void InternetOptionsHandler::CreateModalPopup(views::WindowDelegate* view) { |
+ Browser* browser = NULL; |
+ TabContentsDelegate* delegate = dom_ui_->tab_contents()->delegate(); |
+ if (delegate) |
+ browser = delegate->GetBrowser(); |
+ DCHECK(browser); |
+ views::Window* window = views::Window::CreateChromeWindow( |
+ browser->window()->GetNativeHandle(), gfx::Rect(), view); |
+ window->SetIsAlwaysOnTop(true); |
+ window->Show(); |
+} |
+ |
+void InternetOptionsHandler::ButtonClickCallback(const Value* value) { |
+ if (!value || !value->IsType(Value::TYPE_LIST)) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ const ListValue* list_value = static_cast<const ListValue*>(value); |
+ std::string str_type; |
+ std::string service_path; |
+ std::string command; |
+ if (list_value->GetSize() != 3 || |
+ !list_value->GetString(0, &str_type) || |
+ !list_value->GetString(1, &service_path) || |
+ !list_value->GetString(2, &command)) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
+ int type = atoi(str_type.c_str()); |
+ chromeos::NetworkLibrary* cros = |
+ chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
+ if (type == chromeos::TYPE_ETHERNET) { |
+ CreateModalPopup(new chromeos::NetworkConfigView(cros->ethernet_network())); |
+ } else if (type == chromeos::TYPE_WIFI) { |
+ chromeos::WifiNetwork network; |
+ if (command == "forget") { |
+ cros->ForgetWirelessNetwork(service_path); |
+ } else if (cros->FindWifiNetworkByPath(service_path, &network)) { |
+ if (command == "connect") { |
+ // Connect to wifi here. Open password page if appropriate. |
+ if (network.encrypted()) { |
+ chromeos::NetworkConfigView* view = |
+ new chromeos::NetworkConfigView(network, true); |
+ CreateModalPopup(view); |
+ view->SetLoginTextfieldFocus(); |
+ } else { |
+ cros->ConnectToWifiNetwork( |
+ network, std::string(), std::string(), std::string()); |
+ } |
+ } else if (command == "disconnect") { |
+ cros->DisconnectFromWirelessNetwork(network); |
+ } else if (command == "options") { |
+ CreateModalPopup(new chromeos::NetworkConfigView(network, false)); |
+ } |
+ } |
+ } else if (type == chromeos::TYPE_CELLULAR) { |
+ chromeos::CellularNetwork network; |
+ if (command == "forget") { |
+ cros->ForgetWirelessNetwork(service_path); |
+ } else if (cros->FindCellularNetworkByPath(service_path, &network)) { |
+ if (command == "connect") { |
+ cros->ConnectToCellularNetwork(network); |
+ } else if (command == "disconnect") { |
+ cros->DisconnectFromWirelessNetwork(network); |
+ } else if (command == "options") { |
+ CreateModalPopup(new chromeos::NetworkConfigView(network)); |
+ } |
+ } |
+ } else { |
+ NOTREACHED(); |
+ } |
+} |
+ |
+// Helper function to convert an icon to a data: URL |
+// with the icon encoded as a PNG. |
+static std::string ConvertSkBitmapToDataURL(const SkBitmap& icon) { |
+ DCHECK(!icon.isNull()); |
+ |
+ // Get the icon data. |
+ std::vector<unsigned char> icon_data; |
+ gfx::PNGCodec::EncodeBGRASkBitmap(icon, false, &icon_data); |
+ |
+ // Base64-encode it (to make it a data URL). |
+ std::string icon_data_str(reinterpret_cast<char*>(&icon_data[0]), |
+ icon_data.size()); |
+ std::string icon_base64_encoded; |
+ base::Base64Encode(icon_data_str, &icon_base64_encoded); |
+ return std::string("data:image/png;base64," + icon_base64_encoded); |
+} |
+ |
+ListValue* InternetOptionsHandler::GetNetwork(const std::string& service_path, |
+ const SkBitmap& icon, const std::string& name, bool connecting, |
+ bool connected, int connection_type, bool remembered) { |
+ |
+ ListValue* network = new ListValue(); |
+ |
+ int s = IDS_STATUSBAR_NETWORK_DEVICE_DISCONNECTED; |
+ if (connecting) |
+ s = IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING; |
+ else if (connected) |
+ s = IDS_STATUSBAR_NETWORK_DEVICE_CONNECTED; |
+ std::wstring status = l10n_util::GetString(s); |
+ |
+ // service path |
+ network->Append(Value::CreateStringValue(service_path)); |
+ // name |
+ network->Append(Value::CreateStringValue(name)); |
+ // status |
+ network->Append(Value::CreateStringValue(l10n_util::GetString(s))); |
+ // type |
+ network->Append(Value::CreateIntegerValue(connection_type)); |
+ // connected |
+ network->Append(Value::CreateBooleanValue(connected)); |
+ // connecting |
+ network->Append(Value::CreateBooleanValue(connecting)); |
+ // icon data url |
+ network->Append(Value::CreateStringValue(ConvertSkBitmapToDataURL(icon))); |
+ // remembered |
+ network->Append(Value::CreateBooleanValue(remembered)); |
+ return network; |
+} |
+ |
+ListValue* InternetOptionsHandler::GetWiredList() { |
+ chromeos::NetworkLibrary* cros = |
+ chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
+ ListValue* list = new ListValue(); |
+ |
+ const chromeos::EthernetNetwork& ethernet_network = cros->ethernet_network(); |
+ SkBitmap icon = *rb.GetBitmapNamed(IDR_STATUSBAR_WIRED_BLACK); |
+ if (!ethernet_network.connecting() && |
+ !ethernet_network.connected()) { |
+ icon = chromeos::NetworkMenuButton::IconForDisplay(icon, |
+ *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_DISCONNECTED)); |
+ } |
+ list->Append(GetNetwork( |
+ ethernet_network.service_path(), |
+ icon, |
+ WideToASCII(l10n_util::GetString(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET)), |
+ ethernet_network.connecting(), |
+ ethernet_network.connected(), |
+ chromeos::TYPE_ETHERNET, |
+ false)); |
+ return list; |
+} |
+ |
+ListValue* InternetOptionsHandler::GetWirelessList() { |
+ chromeos::NetworkLibrary* cros = |
+ chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
+ ListValue* list = new ListValue(); |
+ |
+ const chromeos::WifiNetworkVector& wifi_networks = cros->wifi_networks(); |
+ for (chromeos::WifiNetworkVector::const_iterator it = |
+ wifi_networks.begin(); it != wifi_networks.end(); ++it) { |
+ SkBitmap icon = chromeos::NetworkMenuButton::IconForNetworkStrength( |
+ it->strength(), true); |
+ if (it->encrypted()) { |
+ icon = chromeos::NetworkMenuButton::IconForDisplay(icon, |
+ *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_SECURE)); |
+ } |
+ list->Append(GetNetwork( |
+ it->service_path(), |
+ icon, |
+ it->name(), |
+ it->connecting(), |
+ it->connected(), |
+ chromeos::TYPE_WIFI, |
+ false)); |
+ } |
+ |
+ const chromeos::CellularNetworkVector& cellular_networks = |
+ cros->cellular_networks(); |
+ for (chromeos::CellularNetworkVector::const_iterator it = |
+ cellular_networks.begin(); it != cellular_networks.end(); ++it) { |
+ SkBitmap icon = chromeos::NetworkMenuButton::IconForNetworkStrength( |
+ it->strength(), true); |
+ SkBitmap badge = *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_3G); |
+ icon = chromeos::NetworkMenuButton::IconForDisplay(icon, badge); |
+ list->Append(GetNetwork( |
+ it->service_path(), |
+ icon, |
+ it->name(), |
+ it->connecting(), |
+ it->connected(), |
+ chromeos::TYPE_CELLULAR, |
+ false)); |
+ } |
+ |
+ return list; |
+} |
+ |
+ListValue* InternetOptionsHandler::GetRememberedList() { |
+ chromeos::NetworkLibrary* cros = |
+ chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
+ ListValue* list = new ListValue(); |
+ |
+ const chromeos::WifiNetworkVector& wifi_networks = |
+ cros->remembered_wifi_networks(); |
+ for (chromeos::WifiNetworkVector::const_iterator it = |
+ wifi_networks.begin(); it != wifi_networks.end(); ++it) { |
+ SkBitmap icon = *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0); |
+ if (it->encrypted()) { |
+ icon = chromeos::NetworkMenuButton::IconForDisplay(icon, |
+ *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_SECURE)); |
+ } |
+ list->Append(GetNetwork( |
+ it->service_path(), |
+ icon, |
+ it->name(), |
+ it->connecting(), |
+ it->connected(), |
+ chromeos::TYPE_WIFI, |
+ true)); |
+ } |
+ |
+ const chromeos::CellularNetworkVector& cellular_networks = |
+ cros->remembered_cellular_networks(); |
+ for (chromeos::CellularNetworkVector::const_iterator it = |
+ cellular_networks.begin(); it != cellular_networks.end(); ++it) { |
+ SkBitmap icon = *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0); |
+ SkBitmap badge = *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_3G); |
+ icon = chromeos::NetworkMenuButton::IconForDisplay(icon, badge); |
+ list->Append(GetNetwork( |
+ it->service_path(), |
+ icon, |
+ it->name(), |
+ it->connecting(), |
+ it->connected(), |
+ chromeos::TYPE_CELLULAR, |
+ true)); |
+ } |
+ |
+ return list; |
+} |
Property changes on: chrome/browser/chromeos/dom_ui/internet_options_handler.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |