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