12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_FILE_MANAGER_ZIP_FILE_CREATOR_H_
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_FILE_MANAGER_ZIP_FILE_CREATOR_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/callback.h"
9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/files/file.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/utility_process_host_client.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace file_manager {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ZipFileCreator creates a ZIP file from a specified list of files and
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// directories under a common parent directory. This is done in a sandboxed
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// subprocess to protect the browser process from handling arbitrary input data
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// from untrusted sources.
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// The class is ref-counted and its ownership is passed around internal callback
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// objects and finally to UtilityProcessHost. After the job finishes, the host
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// releases the ref-pointer and then ZipFileCreator is automatically deleted.
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ZipFileCreator : public content::UtilityProcessHostClient {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  typedef base::Callback<void(bool)> ResultCallback;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a zip file from the specified list of files and directories.
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ZipFileCreator(const ResultCallback& callback,
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 const base::FilePath& src_dir,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 const std::vector<base::FilePath>& src_relative_paths,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 const base::FilePath& dest_file);
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Starts creating the zip file. Must be called from the UI thread.
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The result will be passed to |callback|. After the task is finished and
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // |callback| is run, ZipFileCreator instance is deleted.
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Start();
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ProcessHostClient;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ZipFileCreator();
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Called after the file handle is opened on blocking pool.
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OnOpenFileHandle(base::File file);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Starts the utility process that creates the zip file.
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void StartProcessOnIOThread(base::File dest_file);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // UtilityProcessHostClient
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnProcessCrashed(int exit_code) OVERRIDE;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // IPC message handlers.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnCreateZipFileSucceeded();
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnCreateZipFileFailed();
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ReportDone(bool success);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // The callback.
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ResultCallback callback_;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The source directory for input files.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath src_dir_;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The list of source files paths to be included in the zip file.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Entries are relative paths under directory |src_dir_|.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<base::FilePath> src_relative_paths_;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The output zip file.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_file_;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace file_manager
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_FILE_MANAGER_ZIP_FILE_CREATOR_H_
76