158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/extensions/api/image_writer_private/error_messages.h"
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/extensions/api/image_writer_private/operation.h"
768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chromeos/dbus/image_burner_client.h"
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace extensions {
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace image_writer {
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)using chromeos::ImageBurnerClient;
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)using content::BrowserThread;
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace {
1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void ClearImageBurner() {
200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI,
220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            FROM_HERE,
230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            base::Bind(&ClearImageBurner));
240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return;
250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  chromeos::DBusThreadManager::Get()->
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      GetImageBurnerClient()->
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ResetEventHandlers();
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void Operation::WriteStart() {
3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SetStage(image_writer_api::STAGE_WRITE);
3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::UI,
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                          FROM_HERE,
4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                          base::Bind(&Operation::StartWriteOnUIThread, this));
4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  AddCleanUpFunction(base::Bind(&ClearImageBurner));
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void Operation::StartWriteOnUIThread() {
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DVLOG(1) << "Starting burn.";
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ImageBurnerClient* burner =
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      chromeos::DBusThreadManager::Get()->GetImageBurnerClient();
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  burner->SetEventHandlers(
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      base::Bind(&Operation::OnBurnFinished, this),
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      base::Bind(&Operation::OnBurnProgress, this));
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  burner->BurnImage(image_path_.value(),
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                    storage_unit_id_,
5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                    base::Bind(&Operation::OnBurnError, this));
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void Operation::OnBurnFinished(const std::string& target_path,
6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                    bool success,
6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                    const std::string& error) {
6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DVLOG(1) << "Burn finished: " << success;
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (success) {
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    SetProgress(kProgressComplete);
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    Finish();
6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  } else {
7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    Error(error);
7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void Operation::OnBurnProgress(const std::string& target_path,
7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                    int64 num_bytes_burnt,
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                    int64 total_size) {
7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int progress = kProgressComplete * num_bytes_burnt / total_size;
7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SetProgress(progress);
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void Operation::OnBurnError() {
82f60fc993c7b081abf77ce2ffc7fcca1142c8cb01Torne (Richard Coles)  Error(error::kChromeOSImageBurnerError);
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace image_writer
8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace extensions
87