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