// Copyright (c) 2012 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_CHROMEOS_FILE_MANAGER_ZIP_FILE_CREATOR_H_ #define CHROME_BROWSER_CHROMEOS_FILE_MANAGER_ZIP_FILE_CREATOR_H_ #include "base/callback.h" #include "base/files/file.h" #include "base/files/file_path.h" #include "content/public/browser/utility_process_host_client.h" namespace file_manager { // ZipFileCreator creates a ZIP file from a specified list of files and // directories under a common parent directory. This is done in a sandboxed // subprocess to protect the browser process from handling arbitrary input data // from untrusted sources. // // The class is ref-counted and its ownership is passed around internal callback // objects and finally to UtilityProcessHost. After the job finishes, the host // releases the ref-pointer and then ZipFileCreator is automatically deleted. class ZipFileCreator : public content::UtilityProcessHostClient { public: typedef base::Callback ResultCallback; // Creates a zip file from the specified list of files and directories. ZipFileCreator(const ResultCallback& callback, const base::FilePath& src_dir, const std::vector& src_relative_paths, const base::FilePath& dest_file); // Starts creating the zip file. Must be called from the UI thread. // The result will be passed to |callback|. After the task is finished and // |callback| is run, ZipFileCreator instance is deleted. void Start(); private: friend class ProcessHostClient; virtual ~ZipFileCreator(); // Called after the file handle is opened on blocking pool. void OnOpenFileHandle(base::File file); // Starts the utility process that creates the zip file. void StartProcessOnIOThread(base::File dest_file); // UtilityProcessHostClient virtual bool OnMessageReceived(const IPC::Message& message) override; virtual void OnProcessCrashed(int exit_code) override; // IPC message handlers. void OnCreateZipFileSucceeded(); void OnCreateZipFileFailed(); void ReportDone(bool success); // The callback. ResultCallback callback_; // The source directory for input files. base::FilePath src_dir_; // The list of source files paths to be included in the zip file. // Entries are relative paths under directory |src_dir_|. std::vector src_relative_paths_; // The output zip file. base::FilePath dest_file_; }; } // namespace file_manager #endif // CHROME_BROWSER_CHROMEOS_FILE_MANAGER_ZIP_FILE_CREATOR_H_