OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef WEBKIT_BROWSER_APPCACHE_APPCACHE_DISK_CACHE_H_ | |
6 #define WEBKIT_BROWSER_APPCACHE_APPCACHE_DISK_CACHE_H_ | |
7 | |
8 #include <set> | |
9 #include <vector> | |
10 | |
11 #include "base/memory/scoped_ptr.h" | |
12 #include "net/disk_cache/disk_cache.h" | |
13 #include "webkit/browser/appcache/appcache_response.h" | |
14 #include "webkit/browser/webkit_storage_browser_export.h" | |
15 | |
16 namespace appcache { | |
17 | |
18 // An implementation of AppCacheDiskCacheInterface that | |
19 // uses net::DiskCache as the backing store. | |
20 class WEBKIT_STORAGE_BROWSER_EXPORT AppCacheDiskCache | |
21 : public AppCacheDiskCacheInterface { | |
22 public: | |
23 AppCacheDiskCache(); | |
24 virtual ~AppCacheDiskCache(); | |
25 | |
26 // Initializes the object to use disk backed storage. | |
27 int InitWithDiskBackend(const base::FilePath& disk_cache_directory, | |
28 int disk_cache_size, bool force, | |
29 base::MessageLoopProxy* cache_thread, | |
30 const net::CompletionCallback& callback); | |
31 | |
32 // Initializes the object to use memory only storage. | |
33 // This is used for Chrome's incognito browsing. | |
34 int InitWithMemBackend(int disk_cache_size, | |
35 const net::CompletionCallback& callback); | |
36 | |
37 void Disable(); | |
38 bool is_disabled() const { return is_disabled_; } | |
39 | |
40 virtual int CreateEntry(int64 key, Entry** entry, | |
41 const net::CompletionCallback& callback) OVERRIDE; | |
42 virtual int OpenEntry(int64 key, Entry** entry, | |
43 const net::CompletionCallback& callback) OVERRIDE; | |
44 virtual int DoomEntry(int64 key, | |
45 const net::CompletionCallback& callback) OVERRIDE; | |
46 | |
47 private: | |
48 class CreateBackendCallbackShim; | |
49 class EntryImpl; | |
50 | |
51 // PendingCalls allow CreateEntry, OpenEntry, and DoomEntry to be called | |
52 // immediately after construction, without waiting for the | |
53 // underlying disk_cache::Backend to be fully constructed. Early | |
54 // calls are queued up and serviced once the disk_cache::Backend is | |
55 // really ready to go. | |
56 enum PendingCallType { | |
57 CREATE, | |
58 OPEN, | |
59 DOOM | |
60 }; | |
61 struct PendingCall { | |
62 PendingCallType call_type; | |
63 int64 key; | |
64 Entry** entry; | |
65 net::CompletionCallback callback; | |
66 | |
67 PendingCall(); | |
68 | |
69 PendingCall(PendingCallType call_type, int64 key, | |
70 Entry** entry, const net::CompletionCallback& callback); | |
71 | |
72 ~PendingCall(); | |
73 }; | |
74 typedef std::vector<PendingCall> PendingCalls; | |
75 | |
76 class ActiveCall; | |
77 typedef std::set<ActiveCall*> ActiveCalls; | |
78 typedef std::set<EntryImpl*> OpenEntries; | |
79 | |
80 bool is_initializing() const { | |
81 return create_backend_callback_.get() != NULL; | |
82 } | |
83 disk_cache::Backend* disk_cache() { return disk_cache_.get(); } | |
84 int Init(net::CacheType cache_type, const base::FilePath& directory, | |
85 int cache_size, bool force, base::MessageLoopProxy* cache_thread, | |
86 const net::CompletionCallback& callback); | |
87 void OnCreateBackendComplete(int rv); | |
88 void AddActiveCall(ActiveCall* call) { active_calls_.insert(call); } | |
89 void RemoveActiveCall(ActiveCall* call) { active_calls_.erase(call); } | |
90 void AddOpenEntry(EntryImpl* entry) { open_entries_.insert(entry); } | |
91 void RemoveOpenEntry(EntryImpl* entry) { open_entries_.erase(entry); } | |
92 | |
93 bool is_disabled_; | |
94 net::CompletionCallback init_callback_; | |
95 scoped_refptr<CreateBackendCallbackShim> create_backend_callback_; | |
96 PendingCalls pending_calls_; | |
97 ActiveCalls active_calls_; | |
98 OpenEntries open_entries_; | |
99 scoped_ptr<disk_cache::Backend> disk_cache_; | |
100 }; | |
101 | |
102 } // namespace appcache | |
103 | |
104 #endif // WEBKIT_BROWSER_APPCACHE_APPCACHE_DISK_CACHE_H_ | |
OLD | NEW |