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