/src/mozilla-central/netwerk/cache/nsDiskCacheDeviceSQL.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* vim:set ts=2 sw=2 sts=2 et cin: */ |
2 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
3 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
4 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
5 | | |
6 | | #ifndef nsOfflineCacheDevice_h__ |
7 | | #define nsOfflineCacheDevice_h__ |
8 | | |
9 | | #include "nsCacheDevice.h" |
10 | | #include "nsIApplicationCache.h" |
11 | | #include "nsIApplicationCacheService.h" |
12 | | #include "nsIObserver.h" |
13 | | #include "mozIStorageConnection.h" |
14 | | #include "mozIStorageFunction.h" |
15 | | #include "nsIFile.h" |
16 | | #include "nsAutoPtr.h" |
17 | | #include "nsCOMPtr.h" |
18 | | #include "nsCOMArray.h" |
19 | | #include "nsInterfaceHashtable.h" |
20 | | #include "nsClassHashtable.h" |
21 | | #include "nsWeakReference.h" |
22 | | #include "mozilla/Attributes.h" |
23 | | #include "mozilla/Mutex.h" |
24 | | |
25 | | class nsIURI; |
26 | | class nsOfflineCacheDevice; |
27 | | class mozIStorageService; |
28 | | class nsILoadContextInfo; |
29 | | namespace mozilla { class OriginAttributesPattern; } |
30 | | |
31 | | class nsApplicationCacheNamespace final : public nsIApplicationCacheNamespace |
32 | | { |
33 | | public: |
34 | | NS_DECL_ISUPPORTS |
35 | | NS_DECL_NSIAPPLICATIONCACHENAMESPACE |
36 | | |
37 | 0 | nsApplicationCacheNamespace() : mItemType(0) {} |
38 | | |
39 | | private: |
40 | 0 | ~nsApplicationCacheNamespace() = default; |
41 | | |
42 | | uint32_t mItemType; |
43 | | nsCString mNamespaceSpec; |
44 | | nsCString mData; |
45 | | }; |
46 | | |
47 | | class nsOfflineCacheEvictionFunction final : public mozIStorageFunction { |
48 | | public: |
49 | | NS_DECL_THREADSAFE_ISUPPORTS |
50 | | NS_DECL_MOZISTORAGEFUNCTION |
51 | | |
52 | | explicit nsOfflineCacheEvictionFunction(nsOfflineCacheDevice *device); |
53 | | |
54 | | void Init(); |
55 | | void Reset(); |
56 | | void Apply(); |
57 | | |
58 | | private: |
59 | | ~nsOfflineCacheEvictionFunction() = default; |
60 | | |
61 | | nsOfflineCacheDevice *mDevice; |
62 | | bool mTLSInited; |
63 | | }; |
64 | | |
65 | | class nsOfflineCacheDevice final : public nsCacheDevice |
66 | | , public nsISupports |
67 | | { |
68 | | public: |
69 | | nsOfflineCacheDevice(); |
70 | | |
71 | | NS_DECL_THREADSAFE_ISUPPORTS |
72 | | |
73 | | /** |
74 | | * nsCacheDevice methods |
75 | | */ |
76 | | |
77 | | virtual nsresult Init() override; |
78 | | nsresult InitWithSqlite(mozIStorageService * ss); |
79 | | virtual nsresult Shutdown() override; |
80 | | |
81 | | virtual const char * GetDeviceID(void) override; |
82 | | virtual nsCacheEntry * FindEntry(nsCString * key, bool *collision) override; |
83 | | virtual nsresult DeactivateEntry(nsCacheEntry * entry) override; |
84 | | virtual nsresult BindEntry(nsCacheEntry * entry) override; |
85 | | virtual void DoomEntry( nsCacheEntry * entry ) override; |
86 | | |
87 | | virtual nsresult OpenInputStreamForEntry(nsCacheEntry * entry, |
88 | | nsCacheAccessMode mode, |
89 | | uint32_t offset, |
90 | | nsIInputStream ** result) override; |
91 | | |
92 | | virtual nsresult OpenOutputStreamForEntry(nsCacheEntry * entry, |
93 | | nsCacheAccessMode mode, |
94 | | uint32_t offset, |
95 | | nsIOutputStream ** result) override; |
96 | | |
97 | | virtual nsresult GetFileForEntry(nsCacheEntry * entry, |
98 | | nsIFile ** result) override; |
99 | | |
100 | | virtual nsresult OnDataSizeChange(nsCacheEntry * entry, int32_t deltaSize) override; |
101 | | |
102 | | virtual nsresult Visit(nsICacheVisitor * visitor) override; |
103 | | |
104 | | virtual nsresult EvictEntries(const char * clientID) override; |
105 | | |
106 | | /* Entry ownership */ |
107 | | nsresult GetOwnerDomains(const char * clientID, |
108 | | uint32_t * count, |
109 | | char *** domains); |
110 | | nsresult GetOwnerURIs(const char * clientID, |
111 | | const nsACString & ownerDomain, |
112 | | uint32_t * count, |
113 | | char *** uris); |
114 | | nsresult SetOwnedKeys(const char * clientID, |
115 | | const nsACString & ownerDomain, |
116 | | const nsACString & ownerUrl, |
117 | | uint32_t count, |
118 | | const char ** keys); |
119 | | nsresult GetOwnedKeys(const char * clientID, |
120 | | const nsACString & ownerDomain, |
121 | | const nsACString & ownerUrl, |
122 | | uint32_t * count, |
123 | | char *** keys); |
124 | | nsresult AddOwnedKey(const char * clientID, |
125 | | const nsACString & ownerDomain, |
126 | | const nsACString & ownerURI, |
127 | | const nsACString & key); |
128 | | nsresult RemoveOwnedKey(const char * clientID, |
129 | | const nsACString & ownerDomain, |
130 | | const nsACString & ownerURI, |
131 | | const nsACString & key); |
132 | | nsresult KeyIsOwned(const char * clientID, |
133 | | const nsACString & ownerDomain, |
134 | | const nsACString & ownerURI, |
135 | | const nsACString & key, |
136 | | bool * isOwned); |
137 | | |
138 | | nsresult ClearKeysOwnedByDomain(const char *clientID, |
139 | | const nsACString &ownerDomain); |
140 | | nsresult EvictUnownedEntries(const char *clientID); |
141 | | |
142 | | static nsresult BuildApplicationCacheGroupID(nsIURI *aManifestURL, |
143 | | nsACString const &aOriginSuffix, |
144 | | nsACString &_result); |
145 | | |
146 | | nsresult ActivateCache(const nsACString& group, |
147 | | const nsACString& clientID); |
148 | | bool IsActiveCache(const nsACString& group, |
149 | | const nsACString& clientID); |
150 | | nsresult CreateApplicationCache(const nsACString &group, |
151 | | nsIApplicationCache **out); |
152 | | |
153 | | nsresult GetApplicationCache(const nsACString &clientID, |
154 | | nsIApplicationCache **out); |
155 | | nsresult GetApplicationCache_Unlocked(const nsACString &clientID, |
156 | | nsIApplicationCache **out); |
157 | | |
158 | | nsresult GetActiveCache(const nsACString &group, |
159 | | nsIApplicationCache **out); |
160 | | |
161 | | nsresult DeactivateGroup(const nsACString &group); |
162 | | |
163 | | nsresult ChooseApplicationCache(const nsACString &key, |
164 | | nsILoadContextInfo *loadContext, |
165 | | nsIApplicationCache **out); |
166 | | |
167 | | nsresult CacheOpportunistically(nsIApplicationCache* cache, |
168 | | const nsACString &key); |
169 | | |
170 | | nsresult Evict(nsILoadContextInfo *aInfo); |
171 | | nsresult Evict(mozilla::OriginAttributesPattern const &aPattern); |
172 | | |
173 | | nsresult GetGroups(uint32_t *count,char ***keys); |
174 | | |
175 | | nsresult GetGroupsTimeOrdered(uint32_t *count, |
176 | | char ***keys); |
177 | | |
178 | | bool IsLocked(const nsACString &key); |
179 | | void Lock(const nsACString &key); |
180 | | void Unlock(const nsACString &key); |
181 | | |
182 | | /** |
183 | | * Preference accessors |
184 | | */ |
185 | | |
186 | | void SetCacheParentDirectory(nsIFile * parentDir); |
187 | | void SetCapacity(uint32_t capacity); |
188 | 0 | void SetAutoShutdown() { mAutoShutdown = true; } |
189 | | bool AutoShutdown(nsIApplicationCache * aAppCache); |
190 | | |
191 | 0 | nsIFile * BaseDirectory() { return mBaseDirectory; } |
192 | 0 | nsIFile * CacheDirectory() { return mCacheDirectory; } |
193 | 0 | uint32_t CacheCapacity() { return mCacheCapacity; } |
194 | | uint32_t CacheSize(); |
195 | | uint32_t EntryCount(); |
196 | | |
197 | | private: |
198 | 0 | ~nsOfflineCacheDevice() = default; |
199 | | |
200 | | friend class nsApplicationCache; |
201 | | |
202 | | static bool GetStrictFileOriginPolicy(); |
203 | | |
204 | 0 | bool Initialized() { return mDB != nullptr; } |
205 | | |
206 | | nsresult InitActiveCaches(); |
207 | | nsresult UpdateEntry(nsCacheEntry *entry); |
208 | | nsresult UpdateEntrySize(nsCacheEntry *entry, uint32_t newSize); |
209 | | nsresult DeleteEntry(nsCacheEntry *entry, bool deleteData); |
210 | | nsresult DeleteData(nsCacheEntry *entry); |
211 | | nsresult EnableEvictionObserver(); |
212 | | nsresult DisableEvictionObserver(); |
213 | | |
214 | | bool CanUseCache(nsIURI *keyURI, const nsACString &clientID, nsILoadContextInfo *loadContext); |
215 | | |
216 | | nsresult MarkEntry(const nsCString &clientID, |
217 | | const nsACString &key, |
218 | | uint32_t typeBits); |
219 | | nsresult UnmarkEntry(const nsCString &clientID, |
220 | | const nsACString &key, |
221 | | uint32_t typeBits); |
222 | | |
223 | | nsresult CacheOpportunistically(const nsCString &clientID, |
224 | | const nsACString &key); |
225 | | nsresult GetTypes(const nsCString &clientID, |
226 | | const nsACString &key, |
227 | | uint32_t *typeBits); |
228 | | |
229 | | nsresult GetMatchingNamespace(const nsCString &clientID, |
230 | | const nsACString &key, |
231 | | nsIApplicationCacheNamespace **out); |
232 | | nsresult GatherEntries(const nsCString &clientID, |
233 | | uint32_t typeBits, |
234 | | uint32_t *count, |
235 | | char *** values); |
236 | | nsresult AddNamespace(const nsCString &clientID, |
237 | | nsIApplicationCacheNamespace *ns); |
238 | | |
239 | | nsresult GetUsage(const nsACString &clientID, |
240 | | uint32_t *usage); |
241 | | |
242 | | nsresult RunSimpleQuery(mozIStorageStatement *statment, |
243 | | uint32_t resultIndex, |
244 | | uint32_t * count, |
245 | | char *** values); |
246 | | |
247 | | nsCOMPtr<mozIStorageConnection> mDB; |
248 | | RefPtr<nsOfflineCacheEvictionFunction> mEvictionFunction; |
249 | | |
250 | | nsCOMPtr<mozIStorageStatement> mStatement_CacheSize; |
251 | | nsCOMPtr<mozIStorageStatement> mStatement_ApplicationCacheSize; |
252 | | nsCOMPtr<mozIStorageStatement> mStatement_EntryCount; |
253 | | nsCOMPtr<mozIStorageStatement> mStatement_UpdateEntry; |
254 | | nsCOMPtr<mozIStorageStatement> mStatement_UpdateEntrySize; |
255 | | nsCOMPtr<mozIStorageStatement> mStatement_DeleteEntry; |
256 | | nsCOMPtr<mozIStorageStatement> mStatement_FindEntry; |
257 | | nsCOMPtr<mozIStorageStatement> mStatement_BindEntry; |
258 | | nsCOMPtr<mozIStorageStatement> mStatement_ClearDomain; |
259 | | nsCOMPtr<mozIStorageStatement> mStatement_MarkEntry; |
260 | | nsCOMPtr<mozIStorageStatement> mStatement_UnmarkEntry; |
261 | | nsCOMPtr<mozIStorageStatement> mStatement_GetTypes; |
262 | | nsCOMPtr<mozIStorageStatement> mStatement_FindNamespaceEntry; |
263 | | nsCOMPtr<mozIStorageStatement> mStatement_InsertNamespaceEntry; |
264 | | nsCOMPtr<mozIStorageStatement> mStatement_CleanupUnmarked; |
265 | | nsCOMPtr<mozIStorageStatement> mStatement_GatherEntries; |
266 | | nsCOMPtr<mozIStorageStatement> mStatement_ActivateClient; |
267 | | nsCOMPtr<mozIStorageStatement> mStatement_DeactivateGroup; |
268 | | nsCOMPtr<mozIStorageStatement> mStatement_FindClient; |
269 | | nsCOMPtr<mozIStorageStatement> mStatement_FindClientByNamespace; |
270 | | nsCOMPtr<mozIStorageStatement> mStatement_EnumerateApps; |
271 | | nsCOMPtr<mozIStorageStatement> mStatement_EnumerateGroups; |
272 | | nsCOMPtr<mozIStorageStatement> mStatement_EnumerateGroupsTimeOrder; |
273 | | |
274 | | nsCOMPtr<nsIFile> mBaseDirectory; |
275 | | nsCOMPtr<nsIFile> mCacheDirectory; |
276 | | uint32_t mCacheCapacity; // in bytes |
277 | | int32_t mDeltaCounter; |
278 | | bool mAutoShutdown; |
279 | | |
280 | | mozilla::Mutex mLock; |
281 | | |
282 | | nsInterfaceHashtable<nsCStringHashKey, nsIWeakReference> mCaches; |
283 | | nsClassHashtable<nsCStringHashKey, nsCString> mActiveCachesByGroup; |
284 | | nsTHashtable<nsCStringHashKey> mActiveCaches; |
285 | | nsTHashtable<nsCStringHashKey> mLockedEntries; |
286 | | |
287 | | nsCOMPtr<nsIEventTarget> mInitEventTarget; |
288 | | }; |
289 | | |
290 | | #endif // nsOfflineCacheDevice_h__ |