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