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" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/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/url_constants.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.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" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/browser_resources.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 22bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "ui/base/l10n/time_format.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/text/bytes_formatting.h" 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.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 kPropertyDeviceType[] = "type"; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Link displayed on imageburner ui. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMoreInfoLink[] = 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.chromium.org/chromium-os/chromiumos-design-docs/recovery-mode"; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)content::WebUIDataSource* CreateImageburnerUIHTMLSource() { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIDataSource* source = 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIDataSource::Create(chrome::kChromeUIImageBurnerHost); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("headerTitle", IDS_IMAGEBURN_HEADER_TITLE); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("headerDescription", 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_HEADER_DESCRIPTION); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("headerLink", IDS_IMAGEBURN_HEADER_LINK); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusDevicesNone", 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_NO_DEVICES_STATUS); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("warningDevicesNone", 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_NO_DEVICES_WARNING); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusDevicesMultiple", 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_MUL_DEVICES_STATUS); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusDeviceUSB", 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_USB_DEVICE_STATUS); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusDeviceSD", 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_SD_DEVICE_STATUS); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("warningDevices", 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_DEVICES_WARNING); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusNoConnection", 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_NO_CONNECTION_STATUS); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("warningNoConnection", 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_NO_CONNECTION_WARNING); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusNoSpace", 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_INSUFFICIENT_SPACE_STATUS); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("warningNoSpace", 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_INSUFFICIENT_SPACE_WARNING); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusDownloading", 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_DOWNLOADING_STATUS); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusUnzip", IDS_IMAGEBURN_UNZIP_STATUS); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusBurn", IDS_IMAGEBURN_BURN_STATUS); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusError", IDS_IMAGEBURN_ERROR_STATUS); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("statusSuccess", IDS_IMAGEBURN_SUCCESS_STATUS); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("warningSuccess", IDS_IMAGEBURN_SUCCESS_DESC); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("title", IDS_IMAGEBURN_PAGE_TITLE); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("confirmButton", IDS_IMAGEBURN_CONFIRM_BUTTON); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("cancelButton", IDS_IMAGEBURN_CANCEL_BUTTON); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source->AddLocalizedString("retryButton", IDS_IMAGEBURN_RETRY_BUTTON); 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source->AddString("moreInfoLink", base::ASCIIToUTF16(kMoreInfoLink)); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci source->SetUseJsonJSFormatV2(); 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) 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : 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 { 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::StringValue error_message( 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 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 { 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::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 { 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::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 { 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 size; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDataSizeText(device_size, &size); 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::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 { 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::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 { 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 time_remaining_text = l10n_util::GetStringFUTF16( 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_IMAGEBURN_DOWNLOAD_TIME_REMAINING, 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::TimeFormat::Simple(ui::TimeFormat::FORMAT_REMAINING, 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::TimeFormat::LENGTH_SHORT, time_remaining)); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendProgressSignal(progress_type, amount_finished, amount_total, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_remaining_text); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BurnController::Delegate override. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnNetworkDetected() OVERRIDE { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("browserBridge.reportNetworkDetected"); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // BurnController::Delegate override. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnNoNetwork() OVERRIDE { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("browserBridge.reportNoNetwork"); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateDiskValue(const disks::DiskMountManager::Disk& disk, 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* disk_value) { 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 label = base::ASCIIToUTF16(disk.drive_label()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::AdjustStringForLocaleDirection(&label); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_value->SetString(std::string(kPropertyLabel), label); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_value->SetString(std::string(kPropertyFilePath), disk.file_path()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_value->SetString(std::string(kPropertyDevicePath), disk.device_path()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disk_value->SetString(std::string(kPropertyDeviceType), 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disks::DiskMountManager::DeviceTypeToString(disk.device_type())); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for the "getDevices" message. 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleGetDevices(const base::ListValue* args) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<disks::DiskMountManager::Disk> disks 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) = burn_controller_->GetBurnableDevices(); 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue results_value; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i != disks.size(); ++i) { 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* disk_value = new base::DictionaryValue(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateDiskValue(disks[i], disk_value); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results_value.Append(disk_value); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("browserBridge.getDevicesCallback", 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) results_value); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for the webuiInitialized message. 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleWebUIInitialized(const base::ListValue* args) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) burn_controller_->Init(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for the "cancelBurnImage" message. 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleCancelBurnImage(const base::ListValue* args) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) burn_controller_->CancelBurnImage(); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback for the "burnImage" message. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It may be called with NULL if there is a handler that has started burning, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and thus set the target paths. 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void HandleBurnImage(const base::ListValue* args) { 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath target_device_path; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtractTargetedDevicePath(*args, 0, &target_device_path); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath target_file_path; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtractTargetedDevicePath(*args, 1, &target_file_path); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) burn_controller_->StartBurnImage(target_device_path, target_file_path); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reports update to UI 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendProgressSignal(ProgressType progress_type, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 amount_finished, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 amount_total, 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& time_remaining_text) { 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue progress; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int progress_message_id = 0; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (progress_type) { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DOWNLOADING: 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetString("progressType", "download"); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress_message_id = IDS_IMAGEBURN_DOWNLOAD_PROGRESS_TEXT; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case UNZIPPING: 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetString("progressType", "unzip"); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case BURNING: 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetString("progressType", "burn"); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress_message_id = IDS_IMAGEBURN_BURN_PROGRESS_TEXT; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetInteger("amountFinished", amount_finished); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetInteger("amountTotal", amount_total); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (amount_total != 0) { 263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 progress_text; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProgressText(progress_message_id, amount_finished, amount_total, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &progress_text); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetString("progressText", progress_text); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetString("progressText", ""); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) progress.SetString("timeLeftText", time_remaining_text); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui()->CallJavascriptFunction("browserBridge.updateProgress", progress); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size_text should be previously created. 276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void GetDataSizeText(int64 size, base::string16* size_text) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *size_text = ui::FormatBytes(size); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::AdjustStringForLocaleDirection(size_text); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // progress_text should be previously created. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetProgressText(int message_id, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 amount_finished, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 amount_total, 285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16* progress_text) { 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 finished; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDataSizeText(amount_finished, &finished); 288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 total; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDataSizeText(amount_total, &total); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *progress_text = l10n_util::GetStringFUTF16(message_id, finished, total); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // device_path has to be previously created. 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ExtractTargetedDevicePath(const base::ListValue& list_value, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* device_path) { 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Value* list_member; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string image_dest; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list_value.Get(index, &list_member) && 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) list_member->GetType() == base::Value::TYPE_STRING && 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list_member->GetAsString(&image_dest)) { 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *device_path = base::FilePath(image_dest); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Unable to get path string"; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) device_path->clear(); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<BurnController> burn_controller_; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebUIHandler); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace imageburner 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ImageBurnUI 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ImageBurnUI::ImageBurnUI(content::WebUI* web_ui) : WebUIController(web_ui) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::imageburner::WebUIHandler* handler = 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new chromeos::imageburner::WebUIHandler(web_ui->GetWebContents()); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_ui->AddMessageHandler(handler); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui); 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIDataSource::Add( 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile, chromeos::imageburner::CreateImageburnerUIHTMLSource()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 334