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