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) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/file_util.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/file_enumerator.h" 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/threading/worker_pool.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/api/image_writer_private/error_messages.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/api/image_writer_private/operation.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/api/image_writer_private/operation_manager.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace extensions { 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace image_writer { 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using content::BrowserThread; 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Operation::Write(const base::Closure& continuation) { 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (IsCancelled()) { 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetStage(image_writer_api::STAGE_WRITE); 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) StartUtilityClient(); 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 file_size; 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!base::GetFileSize(image_path_, &file_size)) { 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Error(error::kImageReadError); 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::PostTask( 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::IO, 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind( 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &ImageWriterUtilityClient::Write, 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) image_writer_client_, 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&Operation::WriteImageProgress, this, file_size), 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&Operation::CompleteAndContinue, this, continuation), 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&Operation::Error, this), 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) image_path_, 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) device_path_)); 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Operation::VerifyWrite(const base::Closure& continuation) { 47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_CURRENTLY_ON(BrowserThread::FILE); 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (IsCancelled()) { 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SetStage(image_writer_api::STAGE_VERIFYWRITE); 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) StartUtilityClient(); 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int64 file_size; 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!base::GetFileSize(image_path_, &file_size)) { 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Error(error::kImageReadError); 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::PostTask( 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) BrowserThread::IO, 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind( 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &ImageWriterUtilityClient::Verify, 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) image_writer_client_, 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&Operation::WriteImageProgress, this, file_size), 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&Operation::CompleteAndContinue, this, continuation), 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&Operation::Error, this), 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) image_path_, 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) device_path_)); 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace image_writer 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace extensions 77