1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// found in the LICENSE file. 4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#ifndef CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_GET_FILE_FOR_SAVING_OPERATION_H_ 6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_GET_FILE_FOR_SAVING_OPERATION_H_ 7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/basictypes.h" 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/memory/ref_counted.h" 10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/memory/scoped_ptr.h" 11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/memory/weak_ptr.h" 12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/chromeos/drive/file_errors.h" 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/chromeos/drive/file_system_interface.h" 14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace base { 16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass FilePath; 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ScopedClosureRunner; 18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass SequencedTaskRunner; 19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace base 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace drive { 22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace internal { 23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass FileCache; 24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass FileWriteWatcher; 25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass ResourceMetadata; 26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace internal 27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class EventLogger; 29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass JobScheduler; 30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass ResourceEntry; 31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace file_system { 33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass CreateFileOperation; 35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass DownloadOperation; 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class OperationDelegate; 37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Implements GetFileForSaving() operation that prepares a local cache for 39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// a Drive file whose next modification is monitored and notified to the 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// OperationDelegate. 41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// TODO(kinaba): crbug.com/269424: we might want to monitor all the changes 42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// to the cache directory, not just the one immediately after the save dialog. 43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass GetFileForSavingOperation { 44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public: 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetFileForSavingOperation(EventLogger* logger, 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::SequencedTaskRunner* blocking_task_runner, 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OperationDelegate* delegate, 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch JobScheduler* scheduler, 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch internal::ResourceMetadata* metadata, 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch internal::FileCache* cache, 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::FilePath& temporary_file_directory); 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ~GetFileForSavingOperation(); 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Makes sure that |file_path| in the file system is available in the local 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // cache, and marks it as dirty. The next modification to the cache file is 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // watched and is automatically notified to the delegate. If the entry is not 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // present in the file system, it is created. 58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void GetFileForSaving(const base::FilePath& file_path, 59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GetFileCallback& callback); 60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch internal::FileWriteWatcher* file_write_watcher_for_testing() { 62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return file_write_watcher_.get(); 63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch private: 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void GetFileForSavingAfterCreate(const base::FilePath& file_path, 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const GetFileCallback& callback, 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FileError error); 69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void GetFileForSavingAfterDownload(const GetFileCallback& callback, 70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FileError error, 71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::FilePath& cache_path, 72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<ResourceEntry> entry); 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void GetFileForSavingAfterOpenForWrite( 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GetFileCallback& callback, 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& cache_path, 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<ResourceEntry> entry, 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::ScopedClosureRunner>* file_closer, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FileError error); 79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void GetFileForSavingAfterWatch(const GetFileCallback& callback, 80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::FilePath& cache_path, 81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<ResourceEntry> entry, 82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool success); 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Called when the cache file for |local_id| is written. 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnWriteEvent(const std::string& local_id, 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::ScopedClosureRunner> file_closer); 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EventLogger* logger_; 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<CreateFileOperation> create_file_operation_; 89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<DownloadOperation> download_operation_; 90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<internal::FileWriteWatcher> file_write_watcher_; 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OperationDelegate* delegate_; 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) internal::ResourceMetadata* metadata_; 94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch internal::FileCache* cache_; 95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Note: This should remain the last member so it'll be destroyed and 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // invalidate the weak pointers before any other members are destroyed. 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::WeakPtrFactory<GetFileForSavingOperation> weak_ptr_factory_; 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DISALLOW_COPY_AND_ASSIGN(GetFileForSavingOperation); 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}; 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace file_system 103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace drive 104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif // CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_GET_FILE_FOR_SAVING_OPERATION_H_ 106