blob: 984b037c34a0937fe48f158858b088d6fa9e6da3 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_UNZIP_HELPER_H_
#define CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_UNZIP_HELPER_H_
#include "base/memory/ref_counted_memory.h"
#include "base/sequenced_task_runner.h"
#include "build/build_config.h"
namespace base {
class FilePath;
}
namespace zip {
class ZipReader;
}
namespace extensions {
namespace image_writer {
// A helper to provide Unzip operation.
// Currently ZipReader requires SingleThreadTaskRunner, this class is
// responsible for running ZipReader on a SingleThreadTaskRunner. Unzip
// should be called from sequences (|owner_task_runner_|) and all the
// callbacks of this class is called on that task runner.
// TODO(satorux/lazyboy): Make ZipReader Sequence friendly and remove
// SingleThreadTaskRunner from this class. https://crbug.com/752702.
class UnzipHelper : public base::RefCountedThreadSafe<UnzipHelper> {
public:
explicit UnzipHelper(
scoped_refptr<base::SequencedTaskRunner> owner_task_runner,
const base::Callback<void(const base::FilePath&)>& open_callback,
const base::Closure& complete_callback,
const base::Callback<void(const std::string&)>& failure_callback,
const base::Callback<void(int64_t, int64_t)>& progress_callback);
void Unzip(const base::FilePath& image_path,
const base::FilePath& temp_dir_path);
private:
friend class base::RefCountedThreadSafe<UnzipHelper>;
~UnzipHelper();
void UnzipImpl(const base::FilePath& image_path,
const base::FilePath& temp_dir);
void OnError(const std::string& error);
void OnOpenSuccess(const base::FilePath& image_path);
void OnComplete();
void OnProgress(int64_t total_bytes, int64_t curr_bytes);
scoped_refptr<base::SequencedTaskRunner> owner_task_runner_;
base::Callback<void(const base::FilePath&)> open_callback_;
base::Closure complete_callback_;
base::Callback<void(const std::string&)> failure_callback_;
base::Callback<void(int64_t, int64_t)> progress_callback_;
// Zip reader for unzip operations. The reason for using a pointer is that we
// don't want to include zip_reader.h here which can mangle definitions in
// jni.h when included in the same file. See crbug.com/554199.
std::unique_ptr<zip::ZipReader> zip_reader_;
DISALLOW_COPY_AND_ASSIGN(UnzipHelper);
};
} // namespace image_writer
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_UNZIP_HELPER_H_