1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef BASE_FILES_FILE_PROXY_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define BASE_FILES_FILE_PROXY_H_ 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/base_export.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/callback_forward.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/file.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/file_path.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/ref_counted.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/weak_ptr.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace tracked_objects { 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Location; 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace base { 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class TaskRunner; 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Time; 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This class provides asynchronous access to a File. All methods follow the 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// same rules of the equivalent File method, as they are implemented by bouncing 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// the operation to File using a TaskRunner. 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// This class performs automatic proxying to close the underlying file at 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// destruction. 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// The TaskRunner is in charge of any sequencing of the operations, but a single 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// operation can be proxied at a time, regardless of the use of a callback. 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// In other words, having a sequence like 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// proxy.Write(...); 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// proxy.Write(...); 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// means the second Write will always fail. 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BASE_EXPORT FileProxy : public SupportsWeakPtr<FileProxy> { 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This callback is used by methods that report only an error code. It is 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // valid to pass a null callback to some functions that takes a 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // StatusCallback, in which case the operation will complete silently. 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef Callback<void(File::Error)> StatusCallback; 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef Callback<void(File::Error, 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const FilePath&)> CreateTemporaryCallback; 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef Callback<void(File::Error, 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const File::Info&)> GetFileInfoCallback; 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef Callback<void(File::Error, 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const char* data, 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int bytes_read)> ReadCallback; 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef Callback<void(File::Error, 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int bytes_written)> WriteCallback; 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FileProxy(); 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit FileProxy(TaskRunner* task_runner); 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~FileProxy(); 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Creates or opens a file with the given flags. It is invalid to pass a null 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // callback. If File::FLAG_CREATE is set in |file_flags| it always tries to 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // create a new file at the given |file_path| and fails if the file already 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // exists. 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This returns false if task posting to |task_runner| has failed. 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool CreateOrOpen(const FilePath& file_path, 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uint32 file_flags, 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StatusCallback& callback); 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Creates a temporary file for writing. The path and an open file are 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // returned. It is invalid to pass a null callback. The additional file flags 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // will be added on top of the default file flags which are: 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // File::FLAG_CREATE_ALWAYS 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // File::FLAG_WRITE 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // File::FLAG_TEMPORARY. 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This returns false if task posting to |task_runner| has failed. 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool CreateTemporary(uint32 additional_file_flags, 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const CreateTemporaryCallback& callback); 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns true if the underlying |file_| is valid. 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool IsValid() const; 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns true if a new file was created (or an old one truncated to zero 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // length to simulate a new file), and false otherwise. 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool created() const { return file_.created(); } 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Claims ownership of |file|. It is an error to call this method when 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // IsValid() returns true. 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void SetFile(File file); 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) File TakeFile(); 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PlatformFile GetPlatformFile() const; 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Proxies File::Close. The callback can be null. 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This returns false if task posting to |task_runner| has failed. 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool Close(const StatusCallback& callback); 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Proxies File::GetInfo. The callback can't be null. 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This returns false if task posting to |task_runner| has failed. 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool GetInfo(const GetFileInfoCallback& callback); 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Proxies File::Read. The callback can't be null. 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This returns false if |bytes_to_read| is less than zero, or 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // if task posting to |task_runner| has failed. 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool Read(int64 offset, int bytes_to_read, const ReadCallback& callback); 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Proxies File::Write. The callback can be null. 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This returns false if |bytes_to_write| is less than or equal to zero, 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // if |buffer| is NULL, or if task posting to |task_runner| has failed. 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool Write(int64 offset, 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const char* buffer, 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int bytes_to_write, 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const WriteCallback& callback); 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Proxies File::SetTimes. The callback can be null. 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This returns false if task posting to |task_runner| has failed. 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool SetTimes(Time last_access_time, 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Time last_modified_time, 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StatusCallback& callback); 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Proxies File::SetLength. The callback can be null. 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This returns false if task posting to |task_runner| has failed. 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool SetLength(int64 length, const StatusCallback& callback); 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Proxies File::Flush. The callback can be null. 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This returns false if task posting to |task_runner| has failed. 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool Flush(const StatusCallback& callback); 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) friend class FileHelper; 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TaskRunner* task_runner() { return task_runner_.get(); } 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<TaskRunner> task_runner_; 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) File file_; 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FileProxy); 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace base 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // BASE_FILES_FILE_PROXY_H_ 143