OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/chromeos/dom_ui/internet_options_handler.h" |
| 6 |
| 7 #include <string> |
| 8 #include <vector> |
| 9 |
| 10 #include "app/l10n_util.h" |
| 11 #include "app/resource_bundle.h" |
| 12 #include "base/base64.h" |
| 13 #include "base/basictypes.h" |
| 14 #include "base/callback.h" |
| 15 #include "base/values.h" |
| 16 #include "chrome/browser/browser.h" |
| 17 #include "chrome/browser/browser_list.h" |
| 18 #include "chrome/browser/browser_window.h" |
| 19 #include "chrome/browser/chromeos/cros/cros_library.h" |
| 20 #include "chrome/browser/chromeos/status/network_menu_button.h" |
| 21 #include "chrome/browser/tab_contents/tab_contents.h" |
| 22 #include "chrome/browser/tab_contents/tab_contents_view.h" |
| 23 #include "chrome/common/notification_service.h" |
| 24 #include "gfx/codec/png_codec.h" |
| 25 #include "grit/browser_resources.h" |
| 26 #include "grit/chromium_strings.h" |
| 27 #include "grit/generated_resources.h" |
| 28 #include "grit/locale_settings.h" |
| 29 #include "grit/theme_resources.h" |
| 30 #include "third_party/skia/include/core/SkBitmap.h" |
| 31 #include "views/window/window.h" |
| 32 |
| 33 InternetOptionsHandler::InternetOptionsHandler() { |
| 34 chromeos::CrosLibrary::Get()->GetNetworkLibrary()->AddObserver(this); |
| 35 } |
| 36 |
| 37 InternetOptionsHandler::~InternetOptionsHandler() { |
| 38 chromeos::CrosLibrary::Get()->GetNetworkLibrary()->RemoveObserver(this); |
| 39 } |
| 40 |
| 41 void InternetOptionsHandler::GetLocalizedValues( |
| 42 DictionaryValue* localized_strings) { |
| 43 DCHECK(localized_strings); |
| 44 // Internet page - ChromeOS |
| 45 localized_strings->SetString(L"internetPage", |
| 46 l10n_util::GetString(IDS_OPTIONS_INTERNET_TAB_LABEL)); |
| 47 |
| 48 localized_strings->SetString(L"wired_title", |
| 49 l10n_util::GetString(IDS_OPTIONS_SETTINGS_SECTION_TITLE_WIRED_NETWORK)); |
| 50 localized_strings->SetString(L"wireless_title", |
| 51 l10n_util::GetString( |
| 52 IDS_OPTIONS_SETTINGS_SECTION_TITLE_WIRELESS_NETWORK)); |
| 53 localized_strings->SetString(L"remembered_title", |
| 54 l10n_util::GetString( |
| 55 IDS_OPTIONS_SETTINGS_SECTION_TITLE_REMEMBERED_NETWORK)); |
| 56 |
| 57 localized_strings->SetString(L"connect_button", |
| 58 l10n_util::GetString( |
| 59 IDS_OPTIONS_SETTINGS_CONNECT)); |
| 60 localized_strings->SetString(L"disconnect_button", |
| 61 l10n_util::GetString( |
| 62 IDS_OPTIONS_SETTINGS_DISCONNECT)); |
| 63 localized_strings->SetString(L"options_button", |
| 64 l10n_util::GetString( |
| 65 IDS_OPTIONS_SETTINGS_OPTIONS)); |
| 66 localized_strings->SetString(L"forget_button", |
| 67 l10n_util::GetString( |
| 68 IDS_OPTIONS_SETTINGS_FORGET)); |
| 69 |
| 70 localized_strings->Set(L"wiredList", GetWiredList()); |
| 71 localized_strings->Set(L"wirelessList", GetWirelessList()); |
| 72 localized_strings->Set(L"rememberedList", GetRememberedList()); |
| 73 } |
| 74 |
| 75 void InternetOptionsHandler::RegisterMessages() { |
| 76 // Setup handlers specific to this panel. |
| 77 DCHECK(dom_ui_); |
| 78 dom_ui_->RegisterMessageCallback("buttonClickCallback", |
| 79 NewCallback(this, &InternetOptionsHandler::ButtonClickCallback)); |
| 80 } |
| 81 |
| 82 void InternetOptionsHandler::NetworkChanged(chromeos::NetworkLibrary* cros) { |
| 83 if (dom_ui_) { |
| 84 DictionaryValue dictionary; |
| 85 dictionary.Set(L"wiredList", GetWiredList()); |
| 86 dictionary.Set(L"wirelessList", GetWirelessList()); |
| 87 dictionary.Set(L"rememberedList", GetRememberedList()); |
| 88 dom_ui_->CallJavascriptFunction(L"refreshNetworkData", dictionary); |
| 89 } |
| 90 } |
| 91 |
| 92 void InternetOptionsHandler::CreateModalPopup(views::WindowDelegate* view) { |
| 93 Browser* browser = NULL; |
| 94 TabContentsDelegate* delegate = dom_ui_->tab_contents()->delegate(); |
| 95 if (delegate) |
| 96 browser = delegate->GetBrowser(); |
| 97 DCHECK(browser); |
| 98 views::Window* window = views::Window::CreateChromeWindow( |
| 99 browser->window()->GetNativeHandle(), gfx::Rect(), view); |
| 100 window->SetIsAlwaysOnTop(true); |
| 101 window->Show(); |
| 102 } |
| 103 |
| 104 void InternetOptionsHandler::ButtonClickCallback(const Value* value) { |
| 105 if (!value || !value->IsType(Value::TYPE_LIST)) { |
| 106 NOTREACHED(); |
| 107 return; |
| 108 } |
| 109 const ListValue* list_value = static_cast<const ListValue*>(value); |
| 110 std::string str_type; |
| 111 std::string service_path; |
| 112 std::string command; |
| 113 if (list_value->GetSize() != 3 || |
| 114 !list_value->GetString(0, &str_type) || |
| 115 !list_value->GetString(1, &service_path) || |
| 116 !list_value->GetString(2, &command)) { |
| 117 NOTREACHED(); |
| 118 return; |
| 119 } |
| 120 |
| 121 int type = atoi(str_type.c_str()); |
| 122 chromeos::NetworkLibrary* cros = |
| 123 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
| 124 if (type == chromeos::TYPE_ETHERNET) { |
| 125 CreateModalPopup(new chromeos::NetworkConfigView(cros->ethernet_network())); |
| 126 } else if (type == chromeos::TYPE_WIFI) { |
| 127 chromeos::WifiNetwork network; |
| 128 if (command == "forget") { |
| 129 cros->ForgetWirelessNetwork(service_path); |
| 130 } else if (cros->FindWifiNetworkByPath(service_path, &network)) { |
| 131 if (command == "connect") { |
| 132 // Connect to wifi here. Open password page if appropriate. |
| 133 if (network.encrypted()) { |
| 134 chromeos::NetworkConfigView* view = |
| 135 new chromeos::NetworkConfigView(network, true); |
| 136 CreateModalPopup(view); |
| 137 view->SetLoginTextfieldFocus(); |
| 138 } else { |
| 139 cros->ConnectToWifiNetwork( |
| 140 network, std::string(), std::string(), std::string()); |
| 141 } |
| 142 } else if (command == "disconnect") { |
| 143 cros->DisconnectFromWirelessNetwork(network); |
| 144 } else if (command == "options") { |
| 145 CreateModalPopup(new chromeos::NetworkConfigView(network, false)); |
| 146 } |
| 147 } |
| 148 } else if (type == chromeos::TYPE_CELLULAR) { |
| 149 chromeos::CellularNetwork network; |
| 150 if (command == "forget") { |
| 151 cros->ForgetWirelessNetwork(service_path); |
| 152 } else if (cros->FindCellularNetworkByPath(service_path, &network)) { |
| 153 if (command == "connect") { |
| 154 cros->ConnectToCellularNetwork(network); |
| 155 } else if (command == "disconnect") { |
| 156 cros->DisconnectFromWirelessNetwork(network); |
| 157 } else if (command == "options") { |
| 158 CreateModalPopup(new chromeos::NetworkConfigView(network)); |
| 159 } |
| 160 } |
| 161 } else { |
| 162 NOTREACHED(); |
| 163 } |
| 164 } |
| 165 |
| 166 // Helper function to convert an icon to a data: URL |
| 167 // with the icon encoded as a PNG. |
| 168 static std::string ConvertSkBitmapToDataURL(const SkBitmap& icon) { |
| 169 DCHECK(!icon.isNull()); |
| 170 |
| 171 // Get the icon data. |
| 172 std::vector<unsigned char> icon_data; |
| 173 gfx::PNGCodec::EncodeBGRASkBitmap(icon, false, &icon_data); |
| 174 |
| 175 // Base64-encode it (to make it a data URL). |
| 176 std::string icon_data_str(reinterpret_cast<char*>(&icon_data[0]), |
| 177 icon_data.size()); |
| 178 std::string icon_base64_encoded; |
| 179 base::Base64Encode(icon_data_str, &icon_base64_encoded); |
| 180 return std::string("data:image/png;base64," + icon_base64_encoded); |
| 181 } |
| 182 |
| 183 ListValue* InternetOptionsHandler::GetNetwork(const std::string& service_path, |
| 184 const SkBitmap& icon, const std::string& name, bool connecting, |
| 185 bool connected, int connection_type, bool remembered) { |
| 186 |
| 187 ListValue* network = new ListValue(); |
| 188 |
| 189 int s = IDS_STATUSBAR_NETWORK_DEVICE_DISCONNECTED; |
| 190 if (connecting) |
| 191 s = IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING; |
| 192 else if (connected) |
| 193 s = IDS_STATUSBAR_NETWORK_DEVICE_CONNECTED; |
| 194 std::wstring status = l10n_util::GetString(s); |
| 195 |
| 196 // service path |
| 197 network->Append(Value::CreateStringValue(service_path)); |
| 198 // name |
| 199 network->Append(Value::CreateStringValue(name)); |
| 200 // status |
| 201 network->Append(Value::CreateStringValue(l10n_util::GetString(s))); |
| 202 // type |
| 203 network->Append(Value::CreateIntegerValue(connection_type)); |
| 204 // connected |
| 205 network->Append(Value::CreateBooleanValue(connected)); |
| 206 // connecting |
| 207 network->Append(Value::CreateBooleanValue(connecting)); |
| 208 // icon data url |
| 209 network->Append(Value::CreateStringValue(ConvertSkBitmapToDataURL(icon))); |
| 210 // remembered |
| 211 network->Append(Value::CreateBooleanValue(remembered)); |
| 212 return network; |
| 213 } |
| 214 |
| 215 ListValue* InternetOptionsHandler::GetWiredList() { |
| 216 chromeos::NetworkLibrary* cros = |
| 217 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
| 218 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| 219 ListValue* list = new ListValue(); |
| 220 |
| 221 const chromeos::EthernetNetwork& ethernet_network = cros->ethernet_network(); |
| 222 SkBitmap icon = *rb.GetBitmapNamed(IDR_STATUSBAR_WIRED_BLACK); |
| 223 if (!ethernet_network.connecting() && |
| 224 !ethernet_network.connected()) { |
| 225 icon = chromeos::NetworkMenuButton::IconForDisplay(icon, |
| 226 *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_DISCONNECTED)); |
| 227 } |
| 228 list->Append(GetNetwork( |
| 229 ethernet_network.service_path(), |
| 230 icon, |
| 231 WideToASCII(l10n_util::GetString(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET)), |
| 232 ethernet_network.connecting(), |
| 233 ethernet_network.connected(), |
| 234 chromeos::TYPE_ETHERNET, |
| 235 false)); |
| 236 return list; |
| 237 } |
| 238 |
| 239 ListValue* InternetOptionsHandler::GetWirelessList() { |
| 240 chromeos::NetworkLibrary* cros = |
| 241 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
| 242 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| 243 ListValue* list = new ListValue(); |
| 244 |
| 245 const chromeos::WifiNetworkVector& wifi_networks = cros->wifi_networks(); |
| 246 for (chromeos::WifiNetworkVector::const_iterator it = |
| 247 wifi_networks.begin(); it != wifi_networks.end(); ++it) { |
| 248 SkBitmap icon = chromeos::NetworkMenuButton::IconForNetworkStrength( |
| 249 it->strength(), true); |
| 250 if (it->encrypted()) { |
| 251 icon = chromeos::NetworkMenuButton::IconForDisplay(icon, |
| 252 *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_SECURE)); |
| 253 } |
| 254 list->Append(GetNetwork( |
| 255 it->service_path(), |
| 256 icon, |
| 257 it->name(), |
| 258 it->connecting(), |
| 259 it->connected(), |
| 260 chromeos::TYPE_WIFI, |
| 261 false)); |
| 262 } |
| 263 |
| 264 const chromeos::CellularNetworkVector& cellular_networks = |
| 265 cros->cellular_networks(); |
| 266 for (chromeos::CellularNetworkVector::const_iterator it = |
| 267 cellular_networks.begin(); it != cellular_networks.end(); ++it) { |
| 268 SkBitmap icon = chromeos::NetworkMenuButton::IconForNetworkStrength( |
| 269 it->strength(), true); |
| 270 SkBitmap badge = *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_3G); |
| 271 icon = chromeos::NetworkMenuButton::IconForDisplay(icon, badge); |
| 272 list->Append(GetNetwork( |
| 273 it->service_path(), |
| 274 icon, |
| 275 it->name(), |
| 276 it->connecting(), |
| 277 it->connected(), |
| 278 chromeos::TYPE_CELLULAR, |
| 279 false)); |
| 280 } |
| 281 |
| 282 return list; |
| 283 } |
| 284 |
| 285 ListValue* InternetOptionsHandler::GetRememberedList() { |
| 286 chromeos::NetworkLibrary* cros = |
| 287 chromeos::CrosLibrary::Get()->GetNetworkLibrary(); |
| 288 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| 289 ListValue* list = new ListValue(); |
| 290 |
| 291 const chromeos::WifiNetworkVector& wifi_networks = |
| 292 cros->remembered_wifi_networks(); |
| 293 for (chromeos::WifiNetworkVector::const_iterator it = |
| 294 wifi_networks.begin(); it != wifi_networks.end(); ++it) { |
| 295 SkBitmap icon = *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0); |
| 296 if (it->encrypted()) { |
| 297 icon = chromeos::NetworkMenuButton::IconForDisplay(icon, |
| 298 *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_SECURE)); |
| 299 } |
| 300 list->Append(GetNetwork( |
| 301 it->service_path(), |
| 302 icon, |
| 303 it->name(), |
| 304 it->connecting(), |
| 305 it->connected(), |
| 306 chromeos::TYPE_WIFI, |
| 307 true)); |
| 308 } |
| 309 |
| 310 const chromeos::CellularNetworkVector& cellular_networks = |
| 311 cros->remembered_cellular_networks(); |
| 312 for (chromeos::CellularNetworkVector::const_iterator it = |
| 313 cellular_networks.begin(); it != cellular_networks.end(); ++it) { |
| 314 SkBitmap icon = *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0); |
| 315 SkBitmap badge = *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_3G); |
| 316 icon = chromeos::NetworkMenuButton::IconForDisplay(icon, badge); |
| 317 list->Append(GetNetwork( |
| 318 it->service_path(), |
| 319 icon, |
| 320 it->name(), |
| 321 it->connecting(), |
| 322 it->connected(), |
| 323 chromeos::TYPE_CELLULAR, |
| 324 true)); |
| 325 } |
| 326 |
| 327 return list; |
| 328 } |
OLD | NEW |