1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/utility/image_writer/image_writer_handler.h" 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/file_path.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/extensions/chrome_utility_extensions_messages.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/utility/image_writer/error_messages.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/utility/utility_thread.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace image_writer { 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ImageWriterHandler::ImageWriterHandler() {} 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)ImageWriterHandler::~ImageWriterHandler() {} 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ImageWriterHandler::SendSucceeded() { 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new ChromeUtilityHostMsg_ImageWriter_Succeeded()); 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::UtilityThread::Get()->ReleaseProcessIfNeeded(); 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ImageWriterHandler::SendCancelled() { 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new ChromeUtilityHostMsg_ImageWriter_Cancelled()); 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::UtilityThread::Get()->ReleaseProcessIfNeeded(); 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ImageWriterHandler::SendFailed(const std::string& message) { 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new ChromeUtilityHostMsg_ImageWriter_Failed(message)); 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::UtilityThread::Get()->ReleaseProcessIfNeeded(); 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ImageWriterHandler::SendProgress(int64 progress) { 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Send(new ChromeUtilityHostMsg_ImageWriter_Progress(progress)); 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ImageWriterHandler::Send(IPC::Message* msg) { 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::UtilityThread::Get()->Send(msg); 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool ImageWriterHandler::OnMessageReceived(const IPC::Message& message) { 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool handled = true; 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(ImageWriterHandler, message) 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ImageWriter_Write, OnWriteStart) 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ImageWriter_Verify, OnVerifyStart) 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ImageWriter_Cancel, OnCancel) 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) IPC_END_MESSAGE_MAP() 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return handled; 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ImageWriterHandler::OnWriteStart(const base::FilePath& image, 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::FilePath& device) { 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!image_writer_.get() || image != image_writer_->GetImagePath() || 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device != image_writer_->GetDevicePath()) { 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) image_writer_.reset(new ImageWriter(this, image, device)); 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (image_writer_->IsRunning()) { 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendFailed(error::kOperationAlreadyInProgress); 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!image_writer_->IsValidDevice()) { 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendFailed(error::kInvalidDevice); 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) image_writer_->UnmountVolumes( 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&ImageWriter::Write, image_writer_->AsWeakPtr())); 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ImageWriterHandler::OnVerifyStart(const base::FilePath& image, 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::FilePath& device) { 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!image_writer_.get() || image != image_writer_->GetImagePath() || 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device != image_writer_->GetDevicePath()) { 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) image_writer_.reset(new ImageWriter(this, image, device)); 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (image_writer_->IsRunning()) { 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendFailed(error::kOperationAlreadyInProgress); 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!image_writer_->IsValidDevice()) { 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) SendFailed(error::kInvalidDevice); 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) image_writer_->Verify(); 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ImageWriterHandler::OnCancel() { 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (image_writer_.get()) { 94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) image_writer_->Cancel(); 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SendCancelled(); 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace image_writer 101