imageburner_ui.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/imageburner/imageburner_ui.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_path.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string16.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/imageburner/burn_controller.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chrome_url_data_manager.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chrome_web_ui_data_source.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/time_format.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_message_handler.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/browser_resources.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/text/bytes_formatting.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace imageburner { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPropertyDevicePath[] = "devicePath"; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPropertyFilePath[] = "filePath"; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPropertyLabel[] = "label"; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPropertyPath[] = "path"; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPropertyDeviceType[] = "type"; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Link displayed on imageburner ui. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMoreInfoLink[] = 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.chromium.org/chromium-os/chromiumos-design-docs/recovery-mode"; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeWebUIDataSource* CreateImageburnerUIHTMLSource() { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeWebUIDataSource* source = 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ChromeWebUIDataSource(chrome::kChromeUIImageBurnerHost); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("headerTitle", IDS_IMAGEBURN_HEADER_TITLE); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("headerDescription", 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_HEADER_DESCRIPTION); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("headerLink", IDS_IMAGEBURN_HEADER_LINK); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusDevicesNone", 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_NO_DEVICES_STATUS); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("warningDevicesNone", 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_NO_DEVICES_WARNING); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusDevicesMultiple", 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_MUL_DEVICES_STATUS); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusDeviceUSB", 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_USB_DEVICE_STATUS); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusDeviceSD", 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_SD_DEVICE_STATUS); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("warningDevices", 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_DEVICES_WARNING); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusNoConnection", 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_NO_CONNECTION_STATUS); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("warningNoConnection", 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_NO_CONNECTION_WARNING); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusNoSpace", 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_INSUFFICIENT_SPACE_STATUS); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("warningNoSpace", 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_INSUFFICIENT_SPACE_WARNING); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusDownloading", 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_DOWNLOADING_STATUS); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusUnzip", IDS_IMAGEBURN_UNZIP_STATUS); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusBurn", IDS_IMAGEBURN_BURN_STATUS); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusError", IDS_IMAGEBURN_ERROR_STATUS); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusSuccess", IDS_IMAGEBURN_SUCCESS_STATUS); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("warningSuccess", IDS_IMAGEBURN_SUCCESS_DESC); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("title", IDS_IMAGEBURN_PAGE_TITLE); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("confirmButton", IDS_IMAGEBURN_CONFIRM_BUTTON); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("cancelButton", IDS_IMAGEBURN_CANCEL_BUTTON); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("retryButton", IDS_IMAGEBURN_RETRY_BUTTON); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddString("moreInfoLink", ASCIIToUTF16(kMoreInfoLink)); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->set_json_path("strings.js"); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->add_resource_path("image_burner.js", IDR_IMAGEBURNER_JS); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->set_default_resource(IDR_IMAGEBURNER_HTML); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return source; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebUIHandler 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public content::WebUIMessageHandler, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public BurnController::Delegate { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit WebUIHandler(content::WebContents* contents) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : burn_controller_(BurnController::CreateBurnController(contents, this)){ 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WebUIHandler() { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebUIMessageHandler implementation. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RegisterMessages() OVERRIDE { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "getDevices", 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebUIHandler::HandleGetDevices, base::Unretained(this))); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "burnImage", 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebUIHandler::HandleBurnImage, base::Unretained(this))); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback( 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cancelBurnImage", 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebUIHandler::HandleCancelBurnImage, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->RegisterMessageCallback( 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "webuiInitialized", 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&WebUIHandler::HandleWebUIInitialized, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BurnController::Delegate override. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnSuccess() OVERRIDE { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("browserBridge.reportSuccess"); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BurnController::Delegate override. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnFail(int error_message_id) OVERRIDE { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringValue error_message(l10n_util::GetStringUTF16(error_message_id)); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("browserBridge.reportFail", error_message); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BurnController::Delegate override. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDeviceAdded(const disks::DiskMountManager::Disk& disk) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OVERRIDE { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue disk_value; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateDiskValue(disk, &disk_value); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("browserBridge.deviceAdded", disk_value); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BurnController::Delegate override. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDeviceRemoved(const disks::DiskMountManager::Disk& disk) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OVERRIDE { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringValue device_path_value(disk.device_path()); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("browserBridge.deviceRemoved", 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) device_path_value); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BurnController::Delegate override. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDeviceTooSmall(int64 device_size) OVERRIDE { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 size; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDataSizeText(device_size, &size); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringValue device_size_text(size); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("browserBridge.reportDeviceTooSmall", 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) device_size_text); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BurnController::Delegate override. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnProgress(ProgressType progress_type, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 amount_finished, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 amount_total) OVERRIDE { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 time_remaining_text = 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_IMAGEBURN_PROGRESS_TIME_UNKNOWN); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendProgressSignal(progress_type, amount_finished, amount_total, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_remaining_text); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BurnController::Delegate override. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnProgressWithRemainingTime( 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgressType progress_type, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 amount_finished, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 amount_total, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeDelta& time_remaining) OVERRIDE { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16 time_remaining_text = l10n_util::GetStringFUTF16( 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_DOWNLOAD_TIME_REMAINING, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeFormat::TimeRemaining(time_remaining)); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendProgressSignal(progress_type, amount_finished, amount_total, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_remaining_text); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BurnController::Delegate override. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnNetworkDetected() OVERRIDE { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("browserBridge.reportNetworkDetected"); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BurnController::Delegate override. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnNoNetwork() OVERRIDE { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("browserBridge.reportNoNetwork"); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateDiskValue(const disks::DiskMountManager::Disk& disk, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* disk_value) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 label = ASCIIToUTF16(disk.drive_label()); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::AdjustStringForLocaleDirection(&label); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_value->SetString(std::string(kPropertyLabel), label); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_value->SetString(std::string(kPropertyFilePath), disk.file_path()); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_value->SetString(std::string(kPropertyDevicePath), disk.device_path()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_value->SetString(std::string(kPropertyDeviceType), 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disks::DiskMountManager::DeviceTypeToString(disk.device_type())); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for the "getDevices" message. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleGetDevices(const ListValue* args) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<disks::DiskMountManager::Disk> disks 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) = burn_controller_->GetBurnableDevices(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue results_value; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i != disks.size(); ++i) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* disk_value = new DictionaryValue(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateDiskValue(disks[i], disk_value); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results_value.Append(disk_value); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("browserBridge.getDevicesCallback", 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results_value); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for the webuiInitialized message. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleWebUIInitialized(const ListValue* args) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) burn_controller_->Init(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for the "cancelBurnImage" message. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleCancelBurnImage(const ListValue* args) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) burn_controller_->CancelBurnImage(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for the "burnImage" message. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It may be called with NULL if there is a handler that has started burning, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and thus set the target paths. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleBurnImage(const ListValue* args) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath target_device_path; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtractTargetedDevicePath(*args, 0, &target_device_path); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath target_file_path; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtractTargetedDevicePath(*args, 1, &target_file_path); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) burn_controller_->StartBurnImage(target_device_path, target_file_path); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reports update to UI 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendProgressSignal(ProgressType progress_type, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 amount_finished, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 amount_total, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& time_remaining_text) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue progress; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int progress_message_id = 0; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (progress_type) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DOWNLOADING: 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetString("progressType", "download"); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress_message_id = IDS_IMAGEBURN_DOWNLOAD_PROGRESS_TEXT; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UNZIPPING: 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetString("progressType", "unzip"); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BURNING: 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetString("progressType", "burn"); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress_message_id = IDS_IMAGEBURN_BURN_PROGRESS_TEXT; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetInteger("amountFinished", amount_finished); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetInteger("amountTotal", amount_total); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (amount_total != 0) { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 progress_text; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProgressText(progress_message_id, amount_finished, amount_total, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &progress_text); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetString("progressText", progress_text); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetString("progressText", ""); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetString("timeLeftText", time_remaining_text); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("browserBridge.updateProgress", progress); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size_text should be previously created. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetDataSizeText(int64 size, string16* size_text) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *size_text = ui::FormatBytes(size); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::AdjustStringForLocaleDirection(size_text); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // progress_text should be previously created. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetProgressText(int message_id, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 amount_finished, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 amount_total, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16* progress_text) { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 finished; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDataSizeText(amount_finished, &finished); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 total; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDataSizeText(amount_total, &total); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *progress_text = l10n_util::GetStringFUTF16(message_id, finished, total); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // device_path has to be previously created. 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExtractTargetedDevicePath(const ListValue& list_value, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath* device_path) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Value* list_member; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list_value.Get(index, &list_member) && 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list_member->GetType() == Value::TYPE_STRING) { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StringValue* string_value = 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const StringValue*>(list_member); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string image_dest; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_value->GetAsString(&image_dest); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *device_path = FilePath(image_dest); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Unable to get path string"; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) device_path->clear(); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BurnController> burn_controller_; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebUIHandler); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace imageburner 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ImageBurnUI 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageBurnUI::ImageBurnUI(content::WebUI* web_ui) : WebUIController(web_ui) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::imageburner::WebUIHandler* handler = 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new chromeos::imageburner::WebUIHandler(web_ui->GetWebContents()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui->AddMessageHandler(handler); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeURLDataManager::AddDataSource(profile, 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::imageburner::CreateImageburnerUIHTMLSource()); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335