xref: /aosp_15_r20/external/cronet/base/files/file_proxy.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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