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