xref: /aosp_15_r20/external/cronet/net/disk_cache/disk_cache.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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 // Defines the public interface of the disk cache. For more details see
6*6777b538SAndroid Build Coastguard Worker // http://dev.chromium.org/developers/design-documents/network-stack/disk-cache
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #ifndef NET_DISK_CACHE_DISK_CACHE_H_
9*6777b538SAndroid Build Coastguard Worker #define NET_DISK_CACHE_DISK_CACHE_H_
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include <memory>
14*6777b538SAndroid Build Coastguard Worker #include <optional>
15*6777b538SAndroid Build Coastguard Worker #include <string>
16*6777b538SAndroid Build Coastguard Worker #include <vector>
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker #include "base/files/file.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_split.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/task/sequenced_task_runner.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
23*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
24*6777b538SAndroid Build Coastguard Worker #include "net/base/cache_type.h"
25*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h"
26*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
27*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
28*6777b538SAndroid Build Coastguard Worker #include "net/base/request_priority.h"
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker namespace base {
31*6777b538SAndroid Build Coastguard Worker class FilePath;
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker namespace android {
34*6777b538SAndroid Build Coastguard Worker class ApplicationStatusListener;
35*6777b538SAndroid Build Coastguard Worker }  // namespace android
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker }  // namespace base
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker namespace net {
40*6777b538SAndroid Build Coastguard Worker class IOBuffer;
41*6777b538SAndroid Build Coastguard Worker class NetLog;
42*6777b538SAndroid Build Coastguard Worker }
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker namespace disk_cache {
45*6777b538SAndroid Build Coastguard Worker 
46*6777b538SAndroid Build Coastguard Worker class Entry;
47*6777b538SAndroid Build Coastguard Worker class Backend;
48*6777b538SAndroid Build Coastguard Worker class EntryResult;
49*6777b538SAndroid Build Coastguard Worker class BackendFileOperationsFactory;
50*6777b538SAndroid Build Coastguard Worker struct RangeResult;
51*6777b538SAndroid Build Coastguard Worker using EntryResultCallback = base::OnceCallback<void(EntryResult)>;
52*6777b538SAndroid Build Coastguard Worker using RangeResultCallback = base::OnceCallback<void(const RangeResult&)>;
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker // How to handle resetting the back-end cache from the previous session.
55*6777b538SAndroid Build Coastguard Worker // See CreateCacheBackend() for its usage.
56*6777b538SAndroid Build Coastguard Worker enum class ResetHandling { kReset, kResetOnError, kNeverReset };
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker struct NET_EXPORT BackendResult {
59*6777b538SAndroid Build Coastguard Worker   BackendResult();
60*6777b538SAndroid Build Coastguard Worker   ~BackendResult();
61*6777b538SAndroid Build Coastguard Worker   BackendResult(BackendResult&&);
62*6777b538SAndroid Build Coastguard Worker   BackendResult& operator=(BackendResult&&);
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker   BackendResult(const BackendResult&) = delete;
65*6777b538SAndroid Build Coastguard Worker   BackendResult& operator=(const BackendResult&) = delete;
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker   // `error_in` should not be net::OK for MakeError().
68*6777b538SAndroid Build Coastguard Worker   static BackendResult MakeError(net::Error error_in);
69*6777b538SAndroid Build Coastguard Worker   // `backend_in` should not be nullptr for Make().
70*6777b538SAndroid Build Coastguard Worker   static BackendResult Make(std::unique_ptr<Backend> backend_in);
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker   net::Error net_error = net::ERR_FAILED;
73*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<Backend> backend;
74*6777b538SAndroid Build Coastguard Worker };
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker using BackendResultCallback = base::OnceCallback<void(BackendResult)>;
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker // Returns an instance of a Backend of the given `type`. `file_operations`
79*6777b538SAndroid Build Coastguard Worker // (nullable) is used to broker file operations in sandboxed environments.
80*6777b538SAndroid Build Coastguard Worker // Currently `file_operations` is only used for the simple backend.
81*6777b538SAndroid Build Coastguard Worker // `path` points to a folder where the cached data will be stored (if
82*6777b538SAndroid Build Coastguard Worker // appropriate). This cache instance must be the only object that will be
83*6777b538SAndroid Build Coastguard Worker // reading or writing files to that folder (if another one exists, and `type` is
84*6777b538SAndroid Build Coastguard Worker // not net::DISK_CACHE this operation will not complete until the previous
85*6777b538SAndroid Build Coastguard Worker // duplicate gets destroyed and finishes all I/O). The returned object should be
86*6777b538SAndroid Build Coastguard Worker // deleted when not needed anymore.
87*6777b538SAndroid Build Coastguard Worker //
88*6777b538SAndroid Build Coastguard Worker // If `reset_handling` is set to kResetOnError and there is a problem with the
89*6777b538SAndroid Build Coastguard Worker // cache initialization, the files will be deleted and a new set will be
90*6777b538SAndroid Build Coastguard Worker // created. If it's set to kReset, this will happen even if there isn't a
91*6777b538SAndroid Build Coastguard Worker // problem with cache initialization. Finally, if it's set to kNeverReset, the
92*6777b538SAndroid Build Coastguard Worker // cache creation will fail if there is a problem with cache initialization.
93*6777b538SAndroid Build Coastguard Worker //
94*6777b538SAndroid Build Coastguard Worker // `max_bytes` is the maximum size the cache can grow to. If zero is passed in
95*6777b538SAndroid Build Coastguard Worker // as `max_bytes`, the cache will determine the value to use.
96*6777b538SAndroid Build Coastguard Worker //
97*6777b538SAndroid Build Coastguard Worker // `net_error` in return value of the function is a net error code. If it is
98*6777b538SAndroid Build Coastguard Worker // ERR_IO_PENDING, the `callback` will be invoked when a backend is available or
99*6777b538SAndroid Build Coastguard Worker // a fatal error condition is reached.  `backend` in return value or parameter
100*6777b538SAndroid Build Coastguard Worker // to callback can be nullptr if a fatal error is found.
101*6777b538SAndroid Build Coastguard Worker NET_EXPORT BackendResult
102*6777b538SAndroid Build Coastguard Worker CreateCacheBackend(net::CacheType type,
103*6777b538SAndroid Build Coastguard Worker                    net::BackendType backend_type,
104*6777b538SAndroid Build Coastguard Worker                    scoped_refptr<BackendFileOperationsFactory> file_operations,
105*6777b538SAndroid Build Coastguard Worker                    const base::FilePath& path,
106*6777b538SAndroid Build Coastguard Worker                    int64_t max_bytes,
107*6777b538SAndroid Build Coastguard Worker                    ResetHandling reset_handling,
108*6777b538SAndroid Build Coastguard Worker                    net::NetLog* net_log,
109*6777b538SAndroid Build Coastguard Worker                    BackendResultCallback callback);
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker // Note: this is permitted to return nullptr when things are in process of
112*6777b538SAndroid Build Coastguard Worker // shutting down.
113*6777b538SAndroid Build Coastguard Worker using ApplicationStatusListenerGetter =
114*6777b538SAndroid Build Coastguard Worker     base::RepeatingCallback<base::android::ApplicationStatusListener*()>;
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
117*6777b538SAndroid Build Coastguard Worker // Similar to the function above, but takes an |app_status_listener_getter|
118*6777b538SAndroid Build Coastguard Worker // which is used to listen for when the Android application status changes, so
119*6777b538SAndroid Build Coastguard Worker // we can flush the cache to disk when the app goes to the background.
120*6777b538SAndroid Build Coastguard Worker NET_EXPORT BackendResult
121*6777b538SAndroid Build Coastguard Worker CreateCacheBackend(net::CacheType type,
122*6777b538SAndroid Build Coastguard Worker                    net::BackendType backend_type,
123*6777b538SAndroid Build Coastguard Worker                    scoped_refptr<BackendFileOperationsFactory> file_operations,
124*6777b538SAndroid Build Coastguard Worker                    const base::FilePath& path,
125*6777b538SAndroid Build Coastguard Worker                    int64_t max_bytes,
126*6777b538SAndroid Build Coastguard Worker                    ResetHandling reset_handling,
127*6777b538SAndroid Build Coastguard Worker                    net::NetLog* net_log,
128*6777b538SAndroid Build Coastguard Worker                    BackendResultCallback callback,
129*6777b538SAndroid Build Coastguard Worker                    ApplicationStatusListenerGetter app_status_listener_getter);
130*6777b538SAndroid Build Coastguard Worker #endif
131*6777b538SAndroid Build Coastguard Worker 
132*6777b538SAndroid Build Coastguard Worker // Variant of the above that calls |post_cleanup_callback| once all the I/O
133*6777b538SAndroid Build Coastguard Worker // that was in flight has completed post-destruction. |post_cleanup_callback|
134*6777b538SAndroid Build Coastguard Worker // will get invoked even if the creation fails. The invocation will always be
135*6777b538SAndroid Build Coastguard Worker // via the event loop, and never direct.
136*6777b538SAndroid Build Coastguard Worker //
137*6777b538SAndroid Build Coastguard Worker // This is currently unsupported for |type| == net::DISK_CACHE.
138*6777b538SAndroid Build Coastguard Worker //
139*6777b538SAndroid Build Coastguard Worker // Note that this will not wait for |post_cleanup_callback| of a previous
140*6777b538SAndroid Build Coastguard Worker // instance for |path| to run.
141*6777b538SAndroid Build Coastguard Worker NET_EXPORT BackendResult
142*6777b538SAndroid Build Coastguard Worker CreateCacheBackend(net::CacheType type,
143*6777b538SAndroid Build Coastguard Worker                    net::BackendType backend_type,
144*6777b538SAndroid Build Coastguard Worker                    scoped_refptr<BackendFileOperationsFactory> file_operations,
145*6777b538SAndroid Build Coastguard Worker                    const base::FilePath& path,
146*6777b538SAndroid Build Coastguard Worker                    int64_t max_bytes,
147*6777b538SAndroid Build Coastguard Worker                    ResetHandling reset_handling,
148*6777b538SAndroid Build Coastguard Worker                    net::NetLog* net_log,
149*6777b538SAndroid Build Coastguard Worker                    base::OnceClosure post_cleanup_callback,
150*6777b538SAndroid Build Coastguard Worker                    BackendResultCallback callback);
151*6777b538SAndroid Build Coastguard Worker 
152*6777b538SAndroid Build Coastguard Worker // This will flush any internal threads used by backends created w/o an
153*6777b538SAndroid Build Coastguard Worker // externally injected thread specified, so tests can be sure that all I/O
154*6777b538SAndroid Build Coastguard Worker // has finished before inspecting the world.
155*6777b538SAndroid Build Coastguard Worker NET_EXPORT void FlushCacheThreadForTesting();
156*6777b538SAndroid Build Coastguard Worker 
157*6777b538SAndroid Build Coastguard Worker // Async version of FlushCacheThreadForTesting. `callback` will be called on
158*6777b538SAndroid Build Coastguard Worker // the calling sequence.
159*6777b538SAndroid Build Coastguard Worker NET_EXPORT void FlushCacheThreadAsynchronouslyForTesting(
160*6777b538SAndroid Build Coastguard Worker     base::OnceClosure cllback);
161*6777b538SAndroid Build Coastguard Worker 
162*6777b538SAndroid Build Coastguard Worker // The root interface for a disk cache instance.
163*6777b538SAndroid Build Coastguard Worker class NET_EXPORT Backend {
164*6777b538SAndroid Build Coastguard Worker  public:
165*6777b538SAndroid Build Coastguard Worker   using CompletionOnceCallback = net::CompletionOnceCallback;
166*6777b538SAndroid Build Coastguard Worker   using Int64CompletionOnceCallback = net::Int64CompletionOnceCallback;
167*6777b538SAndroid Build Coastguard Worker   using EntryResultCallback = disk_cache::EntryResultCallback;
168*6777b538SAndroid Build Coastguard Worker   using EntryResult = disk_cache::EntryResult;
169*6777b538SAndroid Build Coastguard Worker 
170*6777b538SAndroid Build Coastguard Worker   class Iterator {
171*6777b538SAndroid Build Coastguard Worker    public:
172*6777b538SAndroid Build Coastguard Worker     virtual ~Iterator() = default;
173*6777b538SAndroid Build Coastguard Worker 
174*6777b538SAndroid Build Coastguard Worker     // OpenNextEntry returns a result with net_error() |net::OK| and provided
175*6777b538SAndroid Build Coastguard Worker     // entry if there is an entry to enumerate which it can return immediately.
176*6777b538SAndroid Build Coastguard Worker     // It returns a result with net_error() |net::ERR_FAILED| at the end of
177*6777b538SAndroid Build Coastguard Worker     // enumeration. If the function returns a result with net_error()
178*6777b538SAndroid Build Coastguard Worker     // |net::ERR_IO_PENDING|, then the final result will be passed to the
179*6777b538SAndroid Build Coastguard Worker     // provided |callback|, otherwise |callback| will not be called. If any
180*6777b538SAndroid Build Coastguard Worker     // entry in the cache is modified during iteration, the result of this
181*6777b538SAndroid Build Coastguard Worker     // function is thereafter undefined.
182*6777b538SAndroid Build Coastguard Worker     //
183*6777b538SAndroid Build Coastguard Worker     // Calling OpenNextEntry after the backend which created it is destroyed
184*6777b538SAndroid Build Coastguard Worker     // may fail with |net::ERR_FAILED|; however it should not crash.
185*6777b538SAndroid Build Coastguard Worker     //
186*6777b538SAndroid Build Coastguard Worker     // Some cache backends make stronger guarantees about mutation during
187*6777b538SAndroid Build Coastguard Worker     // iteration, see top comment in simple_backend_impl.h for details.
188*6777b538SAndroid Build Coastguard Worker     virtual EntryResult OpenNextEntry(EntryResultCallback callback) = 0;
189*6777b538SAndroid Build Coastguard Worker   };
190*6777b538SAndroid Build Coastguard Worker 
191*6777b538SAndroid Build Coastguard Worker   // If the backend is destroyed when there are operations in progress (any
192*6777b538SAndroid Build Coastguard Worker   // callback that has not been invoked yet), this method cancels said
193*6777b538SAndroid Build Coastguard Worker   // operations so the callbacks are not invoked, possibly leaving the work
194*6777b538SAndroid Build Coastguard Worker   // half way (for instance, dooming just a few entries). Note that pending IO
195*6777b538SAndroid Build Coastguard Worker   // for a given Entry (as opposed to the Backend) will still generate a
196*6777b538SAndroid Build Coastguard Worker   // callback.
197*6777b538SAndroid Build Coastguard Worker   // Warning: there is some inconsistency in details between different backends
198*6777b538SAndroid Build Coastguard Worker   // on what will succeed and what will fail.  In particular the blockfile
199*6777b538SAndroid Build Coastguard Worker   // backend will leak entries closed after backend deletion, while others
200*6777b538SAndroid Build Coastguard Worker   // handle it properly.
Backend(net::CacheType cache_type)201*6777b538SAndroid Build Coastguard Worker   explicit Backend(net::CacheType cache_type) : cache_type_(cache_type) {}
202*6777b538SAndroid Build Coastguard Worker   virtual ~Backend() = default;
203*6777b538SAndroid Build Coastguard Worker 
204*6777b538SAndroid Build Coastguard Worker   // Returns the type of this cache.
GetCacheType()205*6777b538SAndroid Build Coastguard Worker   net::CacheType GetCacheType() const { return cache_type_; }
206*6777b538SAndroid Build Coastguard Worker 
207*6777b538SAndroid Build Coastguard Worker   // Returns the number of entries in the cache.
208*6777b538SAndroid Build Coastguard Worker   virtual int32_t GetEntryCount() const = 0;
209*6777b538SAndroid Build Coastguard Worker 
210*6777b538SAndroid Build Coastguard Worker   // Atomically attempts to open an existing entry based on |key| or, if none
211*6777b538SAndroid Build Coastguard Worker   // already exists, to create a new entry. Returns an EntryResult object,
212*6777b538SAndroid Build Coastguard Worker   // which contains 1) network error code; 2) if the error code is OK,
213*6777b538SAndroid Build Coastguard Worker   // an owning pointer to either a preexisting or a newly created
214*6777b538SAndroid Build Coastguard Worker   // entry; 3) a bool indicating if the entry was opened or not. When the entry
215*6777b538SAndroid Build Coastguard Worker   // pointer is no longer needed, its Close() method should be called. If this
216*6777b538SAndroid Build Coastguard Worker   // method return value has net_error() == ERR_IO_PENDING, the
217*6777b538SAndroid Build Coastguard Worker   // |callback| will be invoked when the entry is available. The |priority| of
218*6777b538SAndroid Build Coastguard Worker   // the entry determines its priority in the background worker pools.
219*6777b538SAndroid Build Coastguard Worker   //
220*6777b538SAndroid Build Coastguard Worker   // This method should be the preferred way to obtain an entry over using
221*6777b538SAndroid Build Coastguard Worker   // OpenEntry() or CreateEntry() separately in order to simplify consumer
222*6777b538SAndroid Build Coastguard Worker   // logic.
223*6777b538SAndroid Build Coastguard Worker   virtual EntryResult OpenOrCreateEntry(const std::string& key,
224*6777b538SAndroid Build Coastguard Worker                                         net::RequestPriority priority,
225*6777b538SAndroid Build Coastguard Worker                                         EntryResultCallback callback) = 0;
226*6777b538SAndroid Build Coastguard Worker 
227*6777b538SAndroid Build Coastguard Worker   // Opens an existing entry, returning status code, and, if successful, an
228*6777b538SAndroid Build Coastguard Worker   // entry pointer packaged up into an EntryResult. If return value's
229*6777b538SAndroid Build Coastguard Worker   // net_error() is ERR_IO_PENDING, the |callback| will be invoked when the
230*6777b538SAndroid Build Coastguard Worker   // entry is available. The |priority| of the entry determines its priority in
231*6777b538SAndroid Build Coastguard Worker   // the background worker pools.
232*6777b538SAndroid Build Coastguard Worker   virtual EntryResult OpenEntry(const std::string& key,
233*6777b538SAndroid Build Coastguard Worker                                 net::RequestPriority priority,
234*6777b538SAndroid Build Coastguard Worker                                 EntryResultCallback) = 0;
235*6777b538SAndroid Build Coastguard Worker 
236*6777b538SAndroid Build Coastguard Worker   // Creates a new entry, returning status code, and, if successful, and
237*6777b538SAndroid Build Coastguard Worker   // an entry pointer packaged up into an EntryResult. If return value's
238*6777b538SAndroid Build Coastguard Worker   // net_error() is ERR_IO_PENDING, the |callback| will be invoked when the
239*6777b538SAndroid Build Coastguard Worker   // entry is available. The |priority| of the entry determines its priority in
240*6777b538SAndroid Build Coastguard Worker   // the background worker pools.
241*6777b538SAndroid Build Coastguard Worker   virtual EntryResult CreateEntry(const std::string& key,
242*6777b538SAndroid Build Coastguard Worker                                   net::RequestPriority priority,
243*6777b538SAndroid Build Coastguard Worker                                   EntryResultCallback callback) = 0;
244*6777b538SAndroid Build Coastguard Worker 
245*6777b538SAndroid Build Coastguard Worker   // Marks the entry, specified by the given key, for deletion. The return value
246*6777b538SAndroid Build Coastguard Worker   // is a net error code. If this method returns ERR_IO_PENDING, the |callback|
247*6777b538SAndroid Build Coastguard Worker   // will be invoked after the entry is doomed.
248*6777b538SAndroid Build Coastguard Worker   virtual net::Error DoomEntry(const std::string& key,
249*6777b538SAndroid Build Coastguard Worker                                net::RequestPriority priority,
250*6777b538SAndroid Build Coastguard Worker                                CompletionOnceCallback callback) = 0;
251*6777b538SAndroid Build Coastguard Worker 
252*6777b538SAndroid Build Coastguard Worker   // Marks all entries for deletion. The return value is a net error code. If
253*6777b538SAndroid Build Coastguard Worker   // this method returns ERR_IO_PENDING, the |callback| will be invoked when the
254*6777b538SAndroid Build Coastguard Worker   // operation completes.
255*6777b538SAndroid Build Coastguard Worker   virtual net::Error DoomAllEntries(CompletionOnceCallback callback) = 0;
256*6777b538SAndroid Build Coastguard Worker 
257*6777b538SAndroid Build Coastguard Worker   // Marks a range of entries for deletion. This supports unbounded deletes in
258*6777b538SAndroid Build Coastguard Worker   // either direction by using null Time values for either argument. The return
259*6777b538SAndroid Build Coastguard Worker   // value is a net error code. If this method returns ERR_IO_PENDING, the
260*6777b538SAndroid Build Coastguard Worker   // |callback| will be invoked when the operation completes.
261*6777b538SAndroid Build Coastguard Worker   // Entries with |initial_time| <= access time < |end_time| are deleted.
262*6777b538SAndroid Build Coastguard Worker   virtual net::Error DoomEntriesBetween(base::Time initial_time,
263*6777b538SAndroid Build Coastguard Worker                                         base::Time end_time,
264*6777b538SAndroid Build Coastguard Worker                                         CompletionOnceCallback callback) = 0;
265*6777b538SAndroid Build Coastguard Worker 
266*6777b538SAndroid Build Coastguard Worker   // Marks all entries accessed since |initial_time| for deletion. The return
267*6777b538SAndroid Build Coastguard Worker   // value is a net error code. If this method returns ERR_IO_PENDING, the
268*6777b538SAndroid Build Coastguard Worker   // |callback| will be invoked when the operation completes.
269*6777b538SAndroid Build Coastguard Worker   // Entries with |initial_time| <= access time are deleted.
270*6777b538SAndroid Build Coastguard Worker   virtual net::Error DoomEntriesSince(base::Time initial_time,
271*6777b538SAndroid Build Coastguard Worker                                       CompletionOnceCallback callback) = 0;
272*6777b538SAndroid Build Coastguard Worker 
273*6777b538SAndroid Build Coastguard Worker   // Calculate the total size of the cache. The return value is the size in
274*6777b538SAndroid Build Coastguard Worker   // bytes or a net error code. If this method returns ERR_IO_PENDING,
275*6777b538SAndroid Build Coastguard Worker   // the |callback| will be invoked when the operation completes.
276*6777b538SAndroid Build Coastguard Worker   virtual int64_t CalculateSizeOfAllEntries(
277*6777b538SAndroid Build Coastguard Worker       Int64CompletionOnceCallback callback) = 0;
278*6777b538SAndroid Build Coastguard Worker 
279*6777b538SAndroid Build Coastguard Worker   // Calculate the size of all cache entries accessed between |initial_time| and
280*6777b538SAndroid Build Coastguard Worker   // |end_time|.
281*6777b538SAndroid Build Coastguard Worker   // The return value is the size in bytes or a net error code. The default
282*6777b538SAndroid Build Coastguard Worker   // implementation returns ERR_NOT_IMPLEMENTED and should only be overwritten
283*6777b538SAndroid Build Coastguard Worker   // if there is an efficient way for the backend to determine the size for a
284*6777b538SAndroid Build Coastguard Worker   // subset of the cache without reading the whole cache from disk.
285*6777b538SAndroid Build Coastguard Worker   // If this method returns ERR_IO_PENDING, the |callback| will be invoked when
286*6777b538SAndroid Build Coastguard Worker   // the operation completes.
287*6777b538SAndroid Build Coastguard Worker   virtual int64_t CalculateSizeOfEntriesBetween(
288*6777b538SAndroid Build Coastguard Worker       base::Time initial_time,
289*6777b538SAndroid Build Coastguard Worker       base::Time end_time,
290*6777b538SAndroid Build Coastguard Worker       Int64CompletionOnceCallback callback);
291*6777b538SAndroid Build Coastguard Worker 
292*6777b538SAndroid Build Coastguard Worker   // Returns an iterator which will enumerate all entries of the cache in an
293*6777b538SAndroid Build Coastguard Worker   // undefined order.
294*6777b538SAndroid Build Coastguard Worker   virtual std::unique_ptr<Iterator> CreateIterator() = 0;
295*6777b538SAndroid Build Coastguard Worker 
296*6777b538SAndroid Build Coastguard Worker   // Return a list of cache statistics.
297*6777b538SAndroid Build Coastguard Worker   virtual void GetStats(base::StringPairs* stats) = 0;
298*6777b538SAndroid Build Coastguard Worker 
299*6777b538SAndroid Build Coastguard Worker   // Called whenever an external cache in the system reuses the resource
300*6777b538SAndroid Build Coastguard Worker   // referred to by |key|.
301*6777b538SAndroid Build Coastguard Worker   virtual void OnExternalCacheHit(const std::string& key) = 0;
302*6777b538SAndroid Build Coastguard Worker 
303*6777b538SAndroid Build Coastguard Worker   // Backends can optionally permit one to store, probabilistically, up to a
304*6777b538SAndroid Build Coastguard Worker   // byte associated with a key of an existing entry in memory.
305*6777b538SAndroid Build Coastguard Worker 
306*6777b538SAndroid Build Coastguard Worker   // GetEntryInMemoryData has the following behavior:
307*6777b538SAndroid Build Coastguard Worker   // - If the data is not available at this time for any reason, returns 0.
308*6777b538SAndroid Build Coastguard Worker   // - Otherwise, returns a value that was with very high probability
309*6777b538SAndroid Build Coastguard Worker   //   given to SetEntryInMemoryData(|key|) (and with a very low probability
310*6777b538SAndroid Build Coastguard Worker   //   to a different key that collides in the in-memory index).
311*6777b538SAndroid Build Coastguard Worker   //
312*6777b538SAndroid Build Coastguard Worker   // Due to the probability of collisions, including those that can be induced
313*6777b538SAndroid Build Coastguard Worker   // by hostile 3rd parties, this interface should not be used to make decisions
314*6777b538SAndroid Build Coastguard Worker   // that affect correctness (especially security).
315*6777b538SAndroid Build Coastguard Worker   virtual uint8_t GetEntryInMemoryData(const std::string& key);
316*6777b538SAndroid Build Coastguard Worker   virtual void SetEntryInMemoryData(const std::string& key, uint8_t data);
317*6777b538SAndroid Build Coastguard Worker 
318*6777b538SAndroid Build Coastguard Worker   // Returns the maximum length an individual stream can have.
319*6777b538SAndroid Build Coastguard Worker   virtual int64_t MaxFileSize() const = 0;
320*6777b538SAndroid Build Coastguard Worker 
321*6777b538SAndroid Build Coastguard Worker  private:
322*6777b538SAndroid Build Coastguard Worker   const net::CacheType cache_type_;
323*6777b538SAndroid Build Coastguard Worker };
324*6777b538SAndroid Build Coastguard Worker 
325*6777b538SAndroid Build Coastguard Worker // This interface represents an entry in the disk cache.
326*6777b538SAndroid Build Coastguard Worker class NET_EXPORT Entry {
327*6777b538SAndroid Build Coastguard Worker  public:
328*6777b538SAndroid Build Coastguard Worker   using CompletionOnceCallback = net::CompletionOnceCallback;
329*6777b538SAndroid Build Coastguard Worker   using IOBuffer = net::IOBuffer;
330*6777b538SAndroid Build Coastguard Worker   using RangeResultCallback = disk_cache::RangeResultCallback;
331*6777b538SAndroid Build Coastguard Worker   using RangeResult = disk_cache::RangeResult;
332*6777b538SAndroid Build Coastguard Worker 
333*6777b538SAndroid Build Coastguard Worker   // Marks this cache entry for deletion.
334*6777b538SAndroid Build Coastguard Worker   virtual void Doom() = 0;
335*6777b538SAndroid Build Coastguard Worker 
336*6777b538SAndroid Build Coastguard Worker   // Releases this entry. Calling this method does not cancel pending IO
337*6777b538SAndroid Build Coastguard Worker   // operations on this entry. Even after the last reference to this object has
338*6777b538SAndroid Build Coastguard Worker   // been released, pending completion callbacks may be invoked.
339*6777b538SAndroid Build Coastguard Worker   virtual void Close() = 0;
340*6777b538SAndroid Build Coastguard Worker 
341*6777b538SAndroid Build Coastguard Worker   // Returns the key associated with this cache entry.
342*6777b538SAndroid Build Coastguard Worker   virtual std::string GetKey() const = 0;
343*6777b538SAndroid Build Coastguard Worker 
344*6777b538SAndroid Build Coastguard Worker   // Returns the time when this cache entry was last used.
345*6777b538SAndroid Build Coastguard Worker   virtual base::Time GetLastUsed() const = 0;
346*6777b538SAndroid Build Coastguard Worker 
347*6777b538SAndroid Build Coastguard Worker   // Returns the time when this cache entry was last modified.
348*6777b538SAndroid Build Coastguard Worker   virtual base::Time GetLastModified() const = 0;
349*6777b538SAndroid Build Coastguard Worker 
350*6777b538SAndroid Build Coastguard Worker   // Returns the size of the cache data with the given index.
351*6777b538SAndroid Build Coastguard Worker   virtual int32_t GetDataSize(int index) const = 0;
352*6777b538SAndroid Build Coastguard Worker 
353*6777b538SAndroid Build Coastguard Worker   // Copies cached data into the given buffer of length |buf_len|. Returns the
354*6777b538SAndroid Build Coastguard Worker   // number of bytes read or a network error code. If this function returns
355*6777b538SAndroid Build Coastguard Worker   // ERR_IO_PENDING, the completion callback will be called on the current
356*6777b538SAndroid Build Coastguard Worker   // thread when the operation completes, and a reference to |buf| will be
357*6777b538SAndroid Build Coastguard Worker   // retained until the callback is called. Note that as long as the function
358*6777b538SAndroid Build Coastguard Worker   // does not complete immediately, the callback will always be invoked, even
359*6777b538SAndroid Build Coastguard Worker   // after Close has been called; in other words, the caller may close this
360*6777b538SAndroid Build Coastguard Worker   // entry without having to wait for all the callbacks, and still rely on the
361*6777b538SAndroid Build Coastguard Worker   // cleanup performed from the callback code.
362*6777b538SAndroid Build Coastguard Worker   virtual int ReadData(int index,
363*6777b538SAndroid Build Coastguard Worker                        int offset,
364*6777b538SAndroid Build Coastguard Worker                        IOBuffer* buf,
365*6777b538SAndroid Build Coastguard Worker                        int buf_len,
366*6777b538SAndroid Build Coastguard Worker                        CompletionOnceCallback callback) = 0;
367*6777b538SAndroid Build Coastguard Worker 
368*6777b538SAndroid Build Coastguard Worker   // Copies data from the given buffer of length |buf_len| into the cache.
369*6777b538SAndroid Build Coastguard Worker   // Returns the number of bytes written or a network error code. If this
370*6777b538SAndroid Build Coastguard Worker   // function returns ERR_IO_PENDING, the completion callback will be called
371*6777b538SAndroid Build Coastguard Worker   // on the current thread when the operation completes, and a reference to
372*6777b538SAndroid Build Coastguard Worker   // |buf| will be retained until the callback is called. Note that as long as
373*6777b538SAndroid Build Coastguard Worker   // the function does not complete immediately, the callback will always be
374*6777b538SAndroid Build Coastguard Worker   // invoked, even after Close has been called; in other words, the caller may
375*6777b538SAndroid Build Coastguard Worker   // close this entry without having to wait for all the callbacks, and still
376*6777b538SAndroid Build Coastguard Worker   // rely on the cleanup performed from the callback code.
377*6777b538SAndroid Build Coastguard Worker   // If truncate is true, this call will truncate the stored data at the end of
378*6777b538SAndroid Build Coastguard Worker   // what we are writing here.
379*6777b538SAndroid Build Coastguard Worker   virtual int WriteData(int index,
380*6777b538SAndroid Build Coastguard Worker                         int offset,
381*6777b538SAndroid Build Coastguard Worker                         IOBuffer* buf,
382*6777b538SAndroid Build Coastguard Worker                         int buf_len,
383*6777b538SAndroid Build Coastguard Worker                         CompletionOnceCallback callback,
384*6777b538SAndroid Build Coastguard Worker                         bool truncate) = 0;
385*6777b538SAndroid Build Coastguard Worker 
386*6777b538SAndroid Build Coastguard Worker   // Sparse entries support:
387*6777b538SAndroid Build Coastguard Worker   //
388*6777b538SAndroid Build Coastguard Worker   // A Backend implementation can support sparse entries, so the cache keeps
389*6777b538SAndroid Build Coastguard Worker   // track of which parts of the entry have been written before. The backend
390*6777b538SAndroid Build Coastguard Worker   // will never return data that was not written previously, so reading from
391*6777b538SAndroid Build Coastguard Worker   // such region will return 0 bytes read (or actually the number of bytes read
392*6777b538SAndroid Build Coastguard Worker   // before reaching that region).
393*6777b538SAndroid Build Coastguard Worker   //
394*6777b538SAndroid Build Coastguard Worker   // There are only two streams for sparse entries: a regular control stream
395*6777b538SAndroid Build Coastguard Worker   // (index 0) that must be accessed through the regular API (ReadData and
396*6777b538SAndroid Build Coastguard Worker   // WriteData), and one sparse stream that must me accessed through the sparse-
397*6777b538SAndroid Build Coastguard Worker   // aware API that follows. Calling a non-sparse aware method with an index
398*6777b538SAndroid Build Coastguard Worker   // argument other than 0 is a mistake that results in implementation specific
399*6777b538SAndroid Build Coastguard Worker   // behavior. Using a sparse-aware method with an entry that was not stored
400*6777b538SAndroid Build Coastguard Worker   // using the same API, or with a backend that doesn't support sparse entries
401*6777b538SAndroid Build Coastguard Worker   // will return ERR_CACHE_OPERATION_NOT_SUPPORTED.
402*6777b538SAndroid Build Coastguard Worker   //
403*6777b538SAndroid Build Coastguard Worker   // The storage granularity of the implementation should be at least 1 KB. In
404*6777b538SAndroid Build Coastguard Worker   // other words, storing less than 1 KB may result in an implementation
405*6777b538SAndroid Build Coastguard Worker   // dropping the data completely, and writing at offsets not aligned with 1 KB,
406*6777b538SAndroid Build Coastguard Worker   // or with lengths not a multiple of 1 KB may result in the first or last part
407*6777b538SAndroid Build Coastguard Worker   // of the data being discarded. However, two consecutive writes should not
408*6777b538SAndroid Build Coastguard Worker   // result in a hole in between the two parts as long as they are sequential
409*6777b538SAndroid Build Coastguard Worker   // (the second one starts where the first one ended), and there is no other
410*6777b538SAndroid Build Coastguard Worker   // write between them.
411*6777b538SAndroid Build Coastguard Worker   //
412*6777b538SAndroid Build Coastguard Worker   // The Backend implementation is free to evict any range from the cache at any
413*6777b538SAndroid Build Coastguard Worker   // moment, so in practice, the previously stated granularity of 1 KB is not
414*6777b538SAndroid Build Coastguard Worker   // as bad as it sounds.
415*6777b538SAndroid Build Coastguard Worker   //
416*6777b538SAndroid Build Coastguard Worker   // The sparse methods don't support multiple simultaneous IO operations to the
417*6777b538SAndroid Build Coastguard Worker   // same physical entry, so in practice a single object should be instantiated
418*6777b538SAndroid Build Coastguard Worker   // for a given key at any given time. Once an operation has been issued, the
419*6777b538SAndroid Build Coastguard Worker   // caller should wait until it completes before starting another one. This
420*6777b538SAndroid Build Coastguard Worker   // requirement includes the case when an entry is closed while some operation
421*6777b538SAndroid Build Coastguard Worker   // is in progress and another object is instantiated; any IO operation will
422*6777b538SAndroid Build Coastguard Worker   // fail while the previous operation is still in-flight. In order to deal with
423*6777b538SAndroid Build Coastguard Worker   // this requirement, the caller could either wait until the operation
424*6777b538SAndroid Build Coastguard Worker   // completes before closing the entry, or call CancelSparseIO() before closing
425*6777b538SAndroid Build Coastguard Worker   // the entry, and call ReadyForSparseIO() on the new entry and wait for the
426*6777b538SAndroid Build Coastguard Worker   // callback before issuing new operations.
427*6777b538SAndroid Build Coastguard Worker 
428*6777b538SAndroid Build Coastguard Worker   // Behaves like ReadData() except that this method is used to access sparse
429*6777b538SAndroid Build Coastguard Worker   // entries.
430*6777b538SAndroid Build Coastguard Worker   virtual int ReadSparseData(int64_t offset,
431*6777b538SAndroid Build Coastguard Worker                              IOBuffer* buf,
432*6777b538SAndroid Build Coastguard Worker                              int buf_len,
433*6777b538SAndroid Build Coastguard Worker                              CompletionOnceCallback callback) = 0;
434*6777b538SAndroid Build Coastguard Worker 
435*6777b538SAndroid Build Coastguard Worker   // Behaves like WriteData() except that this method is used to access sparse
436*6777b538SAndroid Build Coastguard Worker   // entries. |truncate| is not part of this interface because a sparse entry
437*6777b538SAndroid Build Coastguard Worker   // is not expected to be reused with new data. To delete the old data and
438*6777b538SAndroid Build Coastguard Worker   // start again, or to reduce the total size of the stream data (which implies
439*6777b538SAndroid Build Coastguard Worker   // that the content has changed), the whole entry should be doomed and
440*6777b538SAndroid Build Coastguard Worker   // re-created.
441*6777b538SAndroid Build Coastguard Worker   virtual int WriteSparseData(int64_t offset,
442*6777b538SAndroid Build Coastguard Worker                               IOBuffer* buf,
443*6777b538SAndroid Build Coastguard Worker                               int buf_len,
444*6777b538SAndroid Build Coastguard Worker                               CompletionOnceCallback callback) = 0;
445*6777b538SAndroid Build Coastguard Worker 
446*6777b538SAndroid Build Coastguard Worker   // Returns information about the currently stored portion of a sparse entry.
447*6777b538SAndroid Build Coastguard Worker   // |offset| and |len| describe a particular range that should be scanned to
448*6777b538SAndroid Build Coastguard Worker   // find out if it is stored or not. Please see the documentation of
449*6777b538SAndroid Build Coastguard Worker   // RangeResult for more details.
450*6777b538SAndroid Build Coastguard Worker   virtual RangeResult GetAvailableRange(int64_t offset,
451*6777b538SAndroid Build Coastguard Worker                                         int len,
452*6777b538SAndroid Build Coastguard Worker                                         RangeResultCallback callback) = 0;
453*6777b538SAndroid Build Coastguard Worker 
454*6777b538SAndroid Build Coastguard Worker   // Returns true if this entry could be a sparse entry or false otherwise. This
455*6777b538SAndroid Build Coastguard Worker   // is a quick test that may return true even if the entry is not really
456*6777b538SAndroid Build Coastguard Worker   // sparse. This method doesn't modify the state of this entry (it will not
457*6777b538SAndroid Build Coastguard Worker   // create sparse tracking data). GetAvailableRange or ReadSparseData can be
458*6777b538SAndroid Build Coastguard Worker   // used to perform a definitive test of whether an existing entry is sparse or
459*6777b538SAndroid Build Coastguard Worker   // not, but that method may modify the current state of the entry (making it
460*6777b538SAndroid Build Coastguard Worker   // sparse, for instance). The purpose of this method is to test an existing
461*6777b538SAndroid Build Coastguard Worker   // entry, but without generating actual IO to perform a thorough check.
462*6777b538SAndroid Build Coastguard Worker   virtual bool CouldBeSparse() const = 0;
463*6777b538SAndroid Build Coastguard Worker 
464*6777b538SAndroid Build Coastguard Worker   // Cancels any pending sparse IO operation (if any). The completion callback
465*6777b538SAndroid Build Coastguard Worker   // of the operation in question will still be called when the operation
466*6777b538SAndroid Build Coastguard Worker   // finishes, but the operation will finish sooner when this method is used.
467*6777b538SAndroid Build Coastguard Worker   virtual void CancelSparseIO() = 0;
468*6777b538SAndroid Build Coastguard Worker 
469*6777b538SAndroid Build Coastguard Worker   // Returns OK if this entry can be used immediately. If that is not the
470*6777b538SAndroid Build Coastguard Worker   // case, returns ERR_IO_PENDING and invokes the provided callback when this
471*6777b538SAndroid Build Coastguard Worker   // entry is ready to use. This method always returns OK for non-sparse
472*6777b538SAndroid Build Coastguard Worker   // entries, and returns ERR_IO_PENDING when a previous operation was cancelled
473*6777b538SAndroid Build Coastguard Worker   // (by calling CancelSparseIO), but the cache is still busy with it. If there
474*6777b538SAndroid Build Coastguard Worker   // is a pending operation that has not been cancelled, this method will return
475*6777b538SAndroid Build Coastguard Worker   // OK although another IO operation cannot be issued at this time; in this
476*6777b538SAndroid Build Coastguard Worker   // case the caller should just wait for the regular callback to be invoked
477*6777b538SAndroid Build Coastguard Worker   // instead of using this method to provide another callback.
478*6777b538SAndroid Build Coastguard Worker   //
479*6777b538SAndroid Build Coastguard Worker   // Note that CancelSparseIO may have been called on another instance of this
480*6777b538SAndroid Build Coastguard Worker   // object that refers to the same physical disk entry.
481*6777b538SAndroid Build Coastguard Worker   // Note: This method is deprecated.
482*6777b538SAndroid Build Coastguard Worker   virtual net::Error ReadyForSparseIO(CompletionOnceCallback callback) = 0;
483*6777b538SAndroid Build Coastguard Worker 
484*6777b538SAndroid Build Coastguard Worker   // Used in tests to set the last used time. Note that backend might have
485*6777b538SAndroid Build Coastguard Worker   // limited precision. Also note that this call may modify the last modified
486*6777b538SAndroid Build Coastguard Worker   // time.
487*6777b538SAndroid Build Coastguard Worker   virtual void SetLastUsedTimeForTest(base::Time time) = 0;
488*6777b538SAndroid Build Coastguard Worker 
489*6777b538SAndroid Build Coastguard Worker  protected:
490*6777b538SAndroid Build Coastguard Worker   virtual ~Entry() = default;
491*6777b538SAndroid Build Coastguard Worker };
492*6777b538SAndroid Build Coastguard Worker 
493*6777b538SAndroid Build Coastguard Worker struct EntryDeleter {
operatorEntryDeleter494*6777b538SAndroid Build Coastguard Worker   void operator()(Entry* entry) {
495*6777b538SAndroid Build Coastguard Worker     // Note that |entry| is ref-counted.
496*6777b538SAndroid Build Coastguard Worker     entry->Close();
497*6777b538SAndroid Build Coastguard Worker   }
498*6777b538SAndroid Build Coastguard Worker };
499*6777b538SAndroid Build Coastguard Worker 
500*6777b538SAndroid Build Coastguard Worker // Automatically closes an entry when it goes out of scope.
501*6777b538SAndroid Build Coastguard Worker // Warning: Be careful. Automatically closing may not be the desired behavior
502*6777b538SAndroid Build Coastguard Worker // when writing to an entry. You may wish to doom first (e.g., in case writing
503*6777b538SAndroid Build Coastguard Worker // hasn't yet completed but the browser is shutting down).
504*6777b538SAndroid Build Coastguard Worker typedef std::unique_ptr<Entry, EntryDeleter> ScopedEntryPtr;
505*6777b538SAndroid Build Coastguard Worker 
506*6777b538SAndroid Build Coastguard Worker // Represents the result of an entry open or create operation.
507*6777b538SAndroid Build Coastguard Worker // This is a move-only, owning type, which will close the entry it owns unless
508*6777b538SAndroid Build Coastguard Worker // it's released from it via ReleaseEntry (or it's moved away from).
509*6777b538SAndroid Build Coastguard Worker class NET_EXPORT EntryResult {
510*6777b538SAndroid Build Coastguard Worker  public:
511*6777b538SAndroid Build Coastguard Worker   EntryResult();
512*6777b538SAndroid Build Coastguard Worker   ~EntryResult();
513*6777b538SAndroid Build Coastguard Worker   EntryResult(EntryResult&&);
514*6777b538SAndroid Build Coastguard Worker   EntryResult& operator=(EntryResult&&);
515*6777b538SAndroid Build Coastguard Worker 
516*6777b538SAndroid Build Coastguard Worker   EntryResult(const EntryResult&) = delete;
517*6777b538SAndroid Build Coastguard Worker   EntryResult& operator=(const EntryResult&) = delete;
518*6777b538SAndroid Build Coastguard Worker 
519*6777b538SAndroid Build Coastguard Worker   // Creates an entry result representing successfully opened (pre-existing)
520*6777b538SAndroid Build Coastguard Worker   // cache entry. |new_entry| must be non-null.
521*6777b538SAndroid Build Coastguard Worker   static EntryResult MakeOpened(Entry* new_entry);
522*6777b538SAndroid Build Coastguard Worker 
523*6777b538SAndroid Build Coastguard Worker   // Creates an entry result representing successfully created (new)
524*6777b538SAndroid Build Coastguard Worker   // cache entry. |new_entry| must be non-null.
525*6777b538SAndroid Build Coastguard Worker   static EntryResult MakeCreated(Entry* new_entry);
526*6777b538SAndroid Build Coastguard Worker 
527*6777b538SAndroid Build Coastguard Worker   // Creates an entry result representing an error. Status must not be net::OK.
528*6777b538SAndroid Build Coastguard Worker   static EntryResult MakeError(net::Error status);
529*6777b538SAndroid Build Coastguard Worker 
530*6777b538SAndroid Build Coastguard Worker   // Relinquishes ownership of the entry, and returns a pointer to it.
531*6777b538SAndroid Build Coastguard Worker   // Will return nullptr if there is no such entry.
532*6777b538SAndroid Build Coastguard Worker   // WARNING: clears net_error() to ERR_FAILED, opened() to false.
533*6777b538SAndroid Build Coastguard Worker   Entry* ReleaseEntry();
534*6777b538SAndroid Build Coastguard Worker 
535*6777b538SAndroid Build Coastguard Worker   // ReleaseEntry() will return a non-null pointer if and only if this is
536*6777b538SAndroid Build Coastguard Worker   // net::OK before the call to it.
net_error()537*6777b538SAndroid Build Coastguard Worker   net::Error net_error() const { return net_error_; }
538*6777b538SAndroid Build Coastguard Worker 
539*6777b538SAndroid Build Coastguard Worker   // Returns true if an existing entry was opened rather than a new one created.
540*6777b538SAndroid Build Coastguard Worker   // Implies net_error() == net::OK and non-null entry.
opened()541*6777b538SAndroid Build Coastguard Worker   bool opened() const { return opened_; }
542*6777b538SAndroid Build Coastguard Worker 
543*6777b538SAndroid Build Coastguard Worker  private:
544*6777b538SAndroid Build Coastguard Worker   // Invariant to keep: |entry_| != nullptr iff |net_error_| == net::OK;
545*6777b538SAndroid Build Coastguard Worker   // |opened_| set only if entry is set.
546*6777b538SAndroid Build Coastguard Worker   net::Error net_error_ = net::ERR_FAILED;
547*6777b538SAndroid Build Coastguard Worker   bool opened_ = false;
548*6777b538SAndroid Build Coastguard Worker   ScopedEntryPtr entry_;
549*6777b538SAndroid Build Coastguard Worker };
550*6777b538SAndroid Build Coastguard Worker 
551*6777b538SAndroid Build Coastguard Worker // Represents a result of GetAvailableRange.
552*6777b538SAndroid Build Coastguard Worker struct NET_EXPORT RangeResult {
553*6777b538SAndroid Build Coastguard Worker   RangeResult() = default;
RangeResultRangeResult554*6777b538SAndroid Build Coastguard Worker   explicit RangeResult(net::Error error) : net_error(error) {}
555*6777b538SAndroid Build Coastguard Worker 
RangeResultRangeResult556*6777b538SAndroid Build Coastguard Worker   RangeResult(int64_t start, int available_len)
557*6777b538SAndroid Build Coastguard Worker       : net_error(net::OK), start(start), available_len(available_len) {}
558*6777b538SAndroid Build Coastguard Worker 
559*6777b538SAndroid Build Coastguard Worker   // This is net::OK if operation succeeded, and `start` and `available_len`
560*6777b538SAndroid Build Coastguard Worker   // were set appropriately (potentially with 0 for `available_len`).
561*6777b538SAndroid Build Coastguard Worker   //
562*6777b538SAndroid Build Coastguard Worker   // In return value of GetAvailableRange(), net::ERR_IO_PENDING means that the
563*6777b538SAndroid Build Coastguard Worker   // result will be provided asynchronously via the callback. This can not occur
564*6777b538SAndroid Build Coastguard Worker   // in the value passed to the callback itself.
565*6777b538SAndroid Build Coastguard Worker   //
566*6777b538SAndroid Build Coastguard Worker   // In case the operation failed, this will be the error code.
567*6777b538SAndroid Build Coastguard Worker   net::Error net_error = net::ERR_FAILED;
568*6777b538SAndroid Build Coastguard Worker 
569*6777b538SAndroid Build Coastguard Worker   // First byte within the range passed to GetAvailableRange that's available
570*6777b538SAndroid Build Coastguard Worker   // in the cache entry.
571*6777b538SAndroid Build Coastguard Worker   //
572*6777b538SAndroid Build Coastguard Worker   // Valid iff net_error is net::OK.
573*6777b538SAndroid Build Coastguard Worker   int64_t start = -1;
574*6777b538SAndroid Build Coastguard Worker 
575*6777b538SAndroid Build Coastguard Worker   // Number of consecutive bytes stored within the requested range starting from
576*6777b538SAndroid Build Coastguard Worker   // `start` that can be read at once. This may be zero.
577*6777b538SAndroid Build Coastguard Worker   //
578*6777b538SAndroid Build Coastguard Worker   // Valid iff net_error is net::OK.
579*6777b538SAndroid Build Coastguard Worker   int available_len = 0;
580*6777b538SAndroid Build Coastguard Worker };
581*6777b538SAndroid Build Coastguard Worker 
582*6777b538SAndroid Build Coastguard Worker // The maximum size of cache that can be created for type
583*6777b538SAndroid Build Coastguard Worker // GENERATED_WEBUI_BYTE_CODE_CACHE. There are only a handful of commonly
584*6777b538SAndroid Build Coastguard Worker // accessed WebUI pages, which can each cache 0.5 - 1.5 MB of code. There is no
585*6777b538SAndroid Build Coastguard Worker // point in having a very large WebUI code cache, even if lots of disk space is
586*6777b538SAndroid Build Coastguard Worker // available.
587*6777b538SAndroid Build Coastguard Worker constexpr int kMaxWebUICodeCacheSize = 5 * 1024 * 1024;
588*6777b538SAndroid Build Coastguard Worker 
589*6777b538SAndroid Build Coastguard Worker class UnboundBackendFileOperations;
590*6777b538SAndroid Build Coastguard Worker 
591*6777b538SAndroid Build Coastguard Worker // An interface to provide file operations so that the HTTP cache works on
592*6777b538SAndroid Build Coastguard Worker // a sandboxed process.
593*6777b538SAndroid Build Coastguard Worker // All the paths must be absolute paths.
594*6777b538SAndroid Build Coastguard Worker // A BackendFileOperations object is bound to a sequence.
595*6777b538SAndroid Build Coastguard Worker class BackendFileOperations {
596*6777b538SAndroid Build Coastguard Worker  public:
597*6777b538SAndroid Build Coastguard Worker   struct FileEnumerationEntry {
598*6777b538SAndroid Build Coastguard Worker     FileEnumerationEntry() = default;
FileEnumerationEntryFileEnumerationEntry599*6777b538SAndroid Build Coastguard Worker     FileEnumerationEntry(base::FilePath path,
600*6777b538SAndroid Build Coastguard Worker                          int64_t size,
601*6777b538SAndroid Build Coastguard Worker                          base::Time last_accessed,
602*6777b538SAndroid Build Coastguard Worker                          base::Time last_modified)
603*6777b538SAndroid Build Coastguard Worker         : path(std::move(path)),
604*6777b538SAndroid Build Coastguard Worker           size(size),
605*6777b538SAndroid Build Coastguard Worker           last_accessed(last_accessed),
606*6777b538SAndroid Build Coastguard Worker           last_modified(last_modified) {}
607*6777b538SAndroid Build Coastguard Worker 
608*6777b538SAndroid Build Coastguard Worker     base::FilePath path;
609*6777b538SAndroid Build Coastguard Worker     int64_t size = 0;
610*6777b538SAndroid Build Coastguard Worker     base::Time last_accessed;
611*6777b538SAndroid Build Coastguard Worker     base::Time last_modified;
612*6777b538SAndroid Build Coastguard Worker   };
613*6777b538SAndroid Build Coastguard Worker 
614*6777b538SAndroid Build Coastguard Worker   // An enum representing the mode for DeleteFile function.
615*6777b538SAndroid Build Coastguard Worker   enum class DeleteFileMode {
616*6777b538SAndroid Build Coastguard Worker     // The default mode, meaning base::DeleteFile.
617*6777b538SAndroid Build Coastguard Worker     kDefault,
618*6777b538SAndroid Build Coastguard Worker     // Ensure that new files for the same name can be created immediately after
619*6777b538SAndroid Build Coastguard Worker     // deletion. Note that this is the default behavior on POSIX. On Windows
620*6777b538SAndroid Build Coastguard Worker     // this assumes that all the file handles for the file to be deleted are
621*6777b538SAndroid Build Coastguard Worker     // opened with FLAG_WIN_SHARE_DELETE.
622*6777b538SAndroid Build Coastguard Worker     kEnsureImmediateAvailability,
623*6777b538SAndroid Build Coastguard Worker   };
624*6777b538SAndroid Build Coastguard Worker 
625*6777b538SAndroid Build Coastguard Worker   // An interface to enumerate files in a directory.
626*6777b538SAndroid Build Coastguard Worker   // Indirect descendants are not listed, and directories are not listed.
627*6777b538SAndroid Build Coastguard Worker   class FileEnumerator {
628*6777b538SAndroid Build Coastguard Worker    public:
629*6777b538SAndroid Build Coastguard Worker     virtual ~FileEnumerator() = default;
630*6777b538SAndroid Build Coastguard Worker 
631*6777b538SAndroid Build Coastguard Worker     // Returns the next file in the directory, if any. Returns nullopt if there
632*6777b538SAndroid Build Coastguard Worker     // are no further files (including the error case). The path of the
633*6777b538SAndroid Build Coastguard Worker     // returned entry should be a full path.
634*6777b538SAndroid Build Coastguard Worker     virtual std::optional<FileEnumerationEntry> Next() = 0;
635*6777b538SAndroid Build Coastguard Worker 
636*6777b538SAndroid Build Coastguard Worker     // Returns true if we've found an error during traversal.
637*6777b538SAndroid Build Coastguard Worker     virtual bool HasError() const = 0;
638*6777b538SAndroid Build Coastguard Worker   };
639*6777b538SAndroid Build Coastguard Worker 
640*6777b538SAndroid Build Coastguard Worker   virtual ~BackendFileOperations() = default;
641*6777b538SAndroid Build Coastguard Worker 
642*6777b538SAndroid Build Coastguard Worker   // Creates a directory with the given path and returns whether that succeeded.
643*6777b538SAndroid Build Coastguard Worker   virtual bool CreateDirectory(const base::FilePath& path) = 0;
644*6777b538SAndroid Build Coastguard Worker 
645*6777b538SAndroid Build Coastguard Worker   // Returns true if the given path exists on the local filesystem.
646*6777b538SAndroid Build Coastguard Worker   virtual bool PathExists(const base::FilePath& path) = 0;
647*6777b538SAndroid Build Coastguard Worker 
648*6777b538SAndroid Build Coastguard Worker   // Returns true if the given path exists on the local filesystem and it's a
649*6777b538SAndroid Build Coastguard Worker   // directory.
650*6777b538SAndroid Build Coastguard Worker   virtual bool DirectoryExists(const base::FilePath& path) = 0;
651*6777b538SAndroid Build Coastguard Worker 
652*6777b538SAndroid Build Coastguard Worker   // Opens a file with the given path and flags. Returns the opened file.
653*6777b538SAndroid Build Coastguard Worker   virtual base::File OpenFile(const base::FilePath& path, uint32_t flags) = 0;
654*6777b538SAndroid Build Coastguard Worker 
655*6777b538SAndroid Build Coastguard Worker   // Deletes a file with the given path and returns whether that succeeded.
656*6777b538SAndroid Build Coastguard Worker   virtual bool DeleteFile(const base::FilePath& path,
657*6777b538SAndroid Build Coastguard Worker                           DeleteFileMode mode = DeleteFileMode::kDefault) = 0;
658*6777b538SAndroid Build Coastguard Worker 
659*6777b538SAndroid Build Coastguard Worker   // Renames a file `from_path` to `to_path`. Returns the error information.
660*6777b538SAndroid Build Coastguard Worker   virtual bool ReplaceFile(const base::FilePath& from_path,
661*6777b538SAndroid Build Coastguard Worker                            const base::FilePath& to_path,
662*6777b538SAndroid Build Coastguard Worker                            base::File::Error* error) = 0;
663*6777b538SAndroid Build Coastguard Worker 
664*6777b538SAndroid Build Coastguard Worker   // Returns information about the given path.
665*6777b538SAndroid Build Coastguard Worker   virtual std::optional<base::File::Info> GetFileInfo(
666*6777b538SAndroid Build Coastguard Worker       const base::FilePath& path) = 0;
667*6777b538SAndroid Build Coastguard Worker 
668*6777b538SAndroid Build Coastguard Worker   // Creates an object that can be used to enumerate files in the specified
669*6777b538SAndroid Build Coastguard Worker   // directory.
670*6777b538SAndroid Build Coastguard Worker   virtual std::unique_ptr<FileEnumerator> EnumerateFiles(
671*6777b538SAndroid Build Coastguard Worker       const base::FilePath& path) = 0;
672*6777b538SAndroid Build Coastguard Worker 
673*6777b538SAndroid Build Coastguard Worker   // Deletes the given directory recursively, asynchronously. `callback` will
674*6777b538SAndroid Build Coastguard Worker   // called with whether the operation succeeded.
675*6777b538SAndroid Build Coastguard Worker   // This is done by:
676*6777b538SAndroid Build Coastguard Worker   //  1. Renaming the directory to another directory,
677*6777b538SAndroid Build Coastguard Worker   //  2. Calling `callback` with the result, and
678*6777b538SAndroid Build Coastguard Worker   //  3. Deleting the directory.
679*6777b538SAndroid Build Coastguard Worker   // This means the caller won't know the result of 3.
680*6777b538SAndroid Build Coastguard Worker   virtual void CleanupDirectory(const base::FilePath& path,
681*6777b538SAndroid Build Coastguard Worker                                 base::OnceCallback<void(bool)> callback) = 0;
682*6777b538SAndroid Build Coastguard Worker 
683*6777b538SAndroid Build Coastguard Worker   // Unbind this object from the sequence, and returns an
684*6777b538SAndroid Build Coastguard Worker   // UnboundBackendFileOperations which can be bound to any sequence. Once
685*6777b538SAndroid Build Coastguard Worker   // this method is called, no methods (except for the destructor) on this
686*6777b538SAndroid Build Coastguard Worker   // object must not be called.
687*6777b538SAndroid Build Coastguard Worker   virtual std::unique_ptr<UnboundBackendFileOperations> Unbind() = 0;
688*6777b538SAndroid Build Coastguard Worker };
689*6777b538SAndroid Build Coastguard Worker 
690*6777b538SAndroid Build Coastguard Worker // BackendFileOperations which is not yet bound to a sequence.
691*6777b538SAndroid Build Coastguard Worker class UnboundBackendFileOperations {
692*6777b538SAndroid Build Coastguard Worker  public:
693*6777b538SAndroid Build Coastguard Worker   virtual ~UnboundBackendFileOperations() = default;
694*6777b538SAndroid Build Coastguard Worker 
695*6777b538SAndroid Build Coastguard Worker   // This can be called at most once.
696*6777b538SAndroid Build Coastguard Worker   virtual std::unique_ptr<BackendFileOperations> Bind(
697*6777b538SAndroid Build Coastguard Worker       scoped_refptr<base::SequencedTaskRunner> task_runner) = 0;
698*6777b538SAndroid Build Coastguard Worker };
699*6777b538SAndroid Build Coastguard Worker 
700*6777b538SAndroid Build Coastguard Worker // A factory interface that creates BackendFileOperations.
701*6777b538SAndroid Build Coastguard Worker class BackendFileOperationsFactory
702*6777b538SAndroid Build Coastguard Worker     : public base::RefCounted<BackendFileOperationsFactory> {
703*6777b538SAndroid Build Coastguard Worker  public:
704*6777b538SAndroid Build Coastguard Worker   // Creates a BackendFileOperations which is bound to `task_runner`.
705*6777b538SAndroid Build Coastguard Worker   virtual std::unique_ptr<BackendFileOperations> Create(
706*6777b538SAndroid Build Coastguard Worker       scoped_refptr<base::SequencedTaskRunner> task_runner) = 0;
707*6777b538SAndroid Build Coastguard Worker 
708*6777b538SAndroid Build Coastguard Worker   // Creates an "unbound" BackendFileOperations.
709*6777b538SAndroid Build Coastguard Worker   virtual std::unique_ptr<UnboundBackendFileOperations> CreateUnbound() = 0;
710*6777b538SAndroid Build Coastguard Worker 
711*6777b538SAndroid Build Coastguard Worker  protected:
712*6777b538SAndroid Build Coastguard Worker   friend class base::RefCounted<BackendFileOperationsFactory>;
713*6777b538SAndroid Build Coastguard Worker   virtual ~BackendFileOperationsFactory() = default;
714*6777b538SAndroid Build Coastguard Worker };
715*6777b538SAndroid Build Coastguard Worker 
716*6777b538SAndroid Build Coastguard Worker // A trivial BackendFileOperations implementation which uses corresponding
717*6777b538SAndroid Build Coastguard Worker // base functions.
718*6777b538SAndroid Build Coastguard Worker class NET_EXPORT TrivialFileOperations final : public BackendFileOperations {
719*6777b538SAndroid Build Coastguard Worker  public:
720*6777b538SAndroid Build Coastguard Worker   TrivialFileOperations();
721*6777b538SAndroid Build Coastguard Worker   ~TrivialFileOperations() override;
722*6777b538SAndroid Build Coastguard Worker 
723*6777b538SAndroid Build Coastguard Worker   // BackendFileOperations implementation:
724*6777b538SAndroid Build Coastguard Worker   bool CreateDirectory(const base::FilePath& path) override;
725*6777b538SAndroid Build Coastguard Worker   bool PathExists(const base::FilePath& path) override;
726*6777b538SAndroid Build Coastguard Worker   bool DirectoryExists(const base::FilePath& path) override;
727*6777b538SAndroid Build Coastguard Worker   base::File OpenFile(const base::FilePath& path, uint32_t flags) override;
728*6777b538SAndroid Build Coastguard Worker   bool DeleteFile(const base::FilePath& path, DeleteFileMode mode) override;
729*6777b538SAndroid Build Coastguard Worker   bool ReplaceFile(const base::FilePath& from_path,
730*6777b538SAndroid Build Coastguard Worker                    const base::FilePath& to_path,
731*6777b538SAndroid Build Coastguard Worker                    base::File::Error* error) override;
732*6777b538SAndroid Build Coastguard Worker   std::optional<base::File::Info> GetFileInfo(
733*6777b538SAndroid Build Coastguard Worker       const base::FilePath& path) override;
734*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<FileEnumerator> EnumerateFiles(
735*6777b538SAndroid Build Coastguard Worker       const base::FilePath& path) override;
736*6777b538SAndroid Build Coastguard Worker   void CleanupDirectory(const base::FilePath& path,
737*6777b538SAndroid Build Coastguard Worker                         base::OnceCallback<void(bool)> callback) override;
738*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<UnboundBackendFileOperations> Unbind() override;
739*6777b538SAndroid Build Coastguard Worker 
740*6777b538SAndroid Build Coastguard Worker  private:
741*6777b538SAndroid Build Coastguard Worker   SEQUENCE_CHECKER(sequence_checker_);
742*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
743*6777b538SAndroid Build Coastguard Worker   bool bound_ = true;
744*6777b538SAndroid Build Coastguard Worker #endif
745*6777b538SAndroid Build Coastguard Worker };
746*6777b538SAndroid Build Coastguard Worker 
747*6777b538SAndroid Build Coastguard Worker class NET_EXPORT TrivialFileOperationsFactory
748*6777b538SAndroid Build Coastguard Worker     : public BackendFileOperationsFactory {
749*6777b538SAndroid Build Coastguard Worker  public:
750*6777b538SAndroid Build Coastguard Worker   TrivialFileOperationsFactory();
751*6777b538SAndroid Build Coastguard Worker 
752*6777b538SAndroid Build Coastguard Worker   // BackendFileOperationsFactory implementation:
753*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<BackendFileOperations> Create(
754*6777b538SAndroid Build Coastguard Worker       scoped_refptr<base::SequencedTaskRunner> task_runner) override;
755*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<UnboundBackendFileOperations> CreateUnbound() override;
756*6777b538SAndroid Build Coastguard Worker 
757*6777b538SAndroid Build Coastguard Worker  private:
758*6777b538SAndroid Build Coastguard Worker   ~TrivialFileOperationsFactory() override;
759*6777b538SAndroid Build Coastguard Worker 
760*6777b538SAndroid Build Coastguard Worker   SEQUENCE_CHECKER(sequence_checker_);
761*6777b538SAndroid Build Coastguard Worker };
762*6777b538SAndroid Build Coastguard Worker 
763*6777b538SAndroid Build Coastguard Worker }  // namespace disk_cache
764*6777b538SAndroid Build Coastguard Worker 
765*6777b538SAndroid Build Coastguard Worker #endif  // NET_DISK_CACHE_DISK_CACHE_H_
766