diff -r 000000000000 -r 6474c204b198 netwerk/cache/nsDiskCacheDeviceSQL.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/netwerk/cache/nsDiskCacheDeviceSQL.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,287 @@ +/* vim:set ts=2 sw=2 sts=2 et cin: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef nsOfflineCacheDevice_h__ +#define nsOfflineCacheDevice_h__ + +#include "nsCacheDevice.h" +#include "nsIApplicationCache.h" +#include "nsIApplicationCacheService.h" +#include "nsIObserver.h" +#include "mozIStorageConnection.h" +#include "mozIStorageFunction.h" +#include "nsIFile.h" +#include "nsAutoPtr.h" +#include "nsCOMPtr.h" +#include "nsCOMArray.h" +#include "nsInterfaceHashtable.h" +#include "nsClassHashtable.h" +#include "nsWeakReference.h" +#include "mozilla/Attributes.h" +#include "mozilla/Mutex.h" + +class nsIURI; +class nsOfflineCacheDevice; +class mozIStorageService; + +class nsApplicationCacheNamespace MOZ_FINAL : public nsIApplicationCacheNamespace +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSIAPPLICATIONCACHENAMESPACE + + nsApplicationCacheNamespace() : mItemType(0) {} + +private: + uint32_t mItemType; + nsCString mNamespaceSpec; + nsCString mData; +}; + +class nsOfflineCacheEvictionFunction MOZ_FINAL : public mozIStorageFunction { +public: + NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_MOZISTORAGEFUNCTION + + nsOfflineCacheEvictionFunction(nsOfflineCacheDevice *device) + : mDevice(device) + {} + + void Reset() { mItems.Clear(); } + void Apply(); + +private: + nsOfflineCacheDevice *mDevice; + nsCOMArray mItems; + +}; + +class nsOfflineCacheDevice : public nsCacheDevice + , public nsISupports +{ +public: + nsOfflineCacheDevice(); + + NS_DECL_THREADSAFE_ISUPPORTS + + /** + * nsCacheDevice methods + */ + + virtual nsresult Init(); + nsresult InitWithSqlite(mozIStorageService * ss); + virtual nsresult Shutdown(); + + virtual const char * GetDeviceID(void); + virtual nsCacheEntry * FindEntry(nsCString * key, bool *collision); + virtual nsresult DeactivateEntry(nsCacheEntry * entry); + virtual nsresult BindEntry(nsCacheEntry * entry); + virtual void DoomEntry( nsCacheEntry * entry ); + + virtual nsresult OpenInputStreamForEntry(nsCacheEntry * entry, + nsCacheAccessMode mode, + uint32_t offset, + nsIInputStream ** result); + + virtual nsresult OpenOutputStreamForEntry(nsCacheEntry * entry, + nsCacheAccessMode mode, + uint32_t offset, + nsIOutputStream ** result); + + virtual nsresult GetFileForEntry(nsCacheEntry * entry, + nsIFile ** result); + + virtual nsresult OnDataSizeChange(nsCacheEntry * entry, int32_t deltaSize); + + virtual nsresult Visit(nsICacheVisitor * visitor); + + virtual nsresult EvictEntries(const char * clientID); + + /* Entry ownership */ + nsresult GetOwnerDomains(const char * clientID, + uint32_t * count, + char *** domains); + nsresult GetOwnerURIs(const char * clientID, + const nsACString & ownerDomain, + uint32_t * count, + char *** uris); + nsresult SetOwnedKeys(const char * clientID, + const nsACString & ownerDomain, + const nsACString & ownerUrl, + uint32_t count, + const char ** keys); + nsresult GetOwnedKeys(const char * clientID, + const nsACString & ownerDomain, + const nsACString & ownerUrl, + uint32_t * count, + char *** keys); + nsresult AddOwnedKey(const char * clientID, + const nsACString & ownerDomain, + const nsACString & ownerURI, + const nsACString & key); + nsresult RemoveOwnedKey(const char * clientID, + const nsACString & ownerDomain, + const nsACString & ownerURI, + const nsACString & key); + nsresult KeyIsOwned(const char * clientID, + const nsACString & ownerDomain, + const nsACString & ownerURI, + const nsACString & key, + bool * isOwned); + + nsresult ClearKeysOwnedByDomain(const char *clientID, + const nsACString &ownerDomain); + nsresult EvictUnownedEntries(const char *clientID); + + static nsresult BuildApplicationCacheGroupID(nsIURI *aManifestURL, + uint32_t appId, bool isInBrowserElement, + nsACString &_result); + + nsresult ActivateCache(const nsCSubstring &group, + const nsCSubstring &clientID); + bool IsActiveCache(const nsCSubstring &group, + const nsCSubstring &clientID); + nsresult CreateApplicationCache(const nsACString &group, + nsIApplicationCache **out); + + nsresult GetApplicationCache(const nsACString &clientID, + nsIApplicationCache **out); + nsresult GetApplicationCache_Unlocked(const nsACString &clientID, + nsIApplicationCache **out); + + nsresult GetActiveCache(const nsACString &group, + nsIApplicationCache **out); + + nsresult DeactivateGroup(const nsACString &group); + + nsresult ChooseApplicationCache(const nsACString &key, + nsILoadContextInfo *loadContext, + nsIApplicationCache **out); + + nsresult CacheOpportunistically(nsIApplicationCache* cache, + const nsACString &key); + + nsresult DiscardByAppId(int32_t appID, bool isInBrowser); + + nsresult GetGroups(uint32_t *count,char ***keys); + + nsresult GetGroupsTimeOrdered(uint32_t *count, + char ***keys); + + bool IsLocked(const nsACString &key); + void Lock(const nsACString &key); + void Unlock(const nsACString &key); + + /** + * Preference accessors + */ + + void SetCacheParentDirectory(nsIFile * parentDir); + void SetCapacity(uint32_t capacity); + void SetAutoShutdown() { mAutoShutdown = true; } + bool AutoShutdown(nsIApplicationCache * aAppCache); + + nsIFile * BaseDirectory() { return mBaseDirectory; } + nsIFile * CacheDirectory() { return mCacheDirectory; } + uint32_t CacheCapacity() { return mCacheCapacity; } + uint32_t CacheSize(); + uint32_t EntryCount(); + +private: + friend class nsApplicationCache; + + static PLDHashOperator ShutdownApplicationCache(const nsACString &key, + nsIWeakReference *weakRef, + void *ctx); + + static bool GetStrictFileOriginPolicy(); + + bool Initialized() { return mDB != nullptr; } + + nsresult InitActiveCaches(); + nsresult UpdateEntry(nsCacheEntry *entry); + nsresult UpdateEntrySize(nsCacheEntry *entry, uint32_t newSize); + nsresult DeleteEntry(nsCacheEntry *entry, bool deleteData); + nsresult DeleteData(nsCacheEntry *entry); + nsresult EnableEvictionObserver(); + nsresult DisableEvictionObserver(); + + bool CanUseCache(nsIURI *keyURI, const nsACString &clientID, nsILoadContextInfo *loadContext); + + nsresult MarkEntry(const nsCString &clientID, + const nsACString &key, + uint32_t typeBits); + nsresult UnmarkEntry(const nsCString &clientID, + const nsACString &key, + uint32_t typeBits); + + nsresult CacheOpportunistically(const nsCString &clientID, + const nsACString &key); + nsresult GetTypes(const nsCString &clientID, + const nsACString &key, + uint32_t *typeBits); + + nsresult GetMatchingNamespace(const nsCString &clientID, + const nsACString &key, + nsIApplicationCacheNamespace **out); + nsresult GatherEntries(const nsCString &clientID, + uint32_t typeBits, + uint32_t *count, + char *** values); + nsresult AddNamespace(const nsCString &clientID, + nsIApplicationCacheNamespace *ns); + + nsresult GetUsage(const nsACString &clientID, + uint32_t *usage); + + nsresult RunSimpleQuery(mozIStorageStatement *statment, + uint32_t resultIndex, + uint32_t * count, + char *** values); + + nsCOMPtr mDB; + nsRefPtr mEvictionFunction; + + nsCOMPtr mStatement_CacheSize; + nsCOMPtr mStatement_ApplicationCacheSize; + nsCOMPtr mStatement_EntryCount; + nsCOMPtr mStatement_UpdateEntry; + nsCOMPtr mStatement_UpdateEntrySize; + nsCOMPtr mStatement_DeleteEntry; + nsCOMPtr mStatement_FindEntry; + nsCOMPtr mStatement_BindEntry; + nsCOMPtr mStatement_ClearDomain; + nsCOMPtr mStatement_MarkEntry; + nsCOMPtr mStatement_UnmarkEntry; + nsCOMPtr mStatement_GetTypes; + nsCOMPtr mStatement_FindNamespaceEntry; + nsCOMPtr mStatement_InsertNamespaceEntry; + nsCOMPtr mStatement_CleanupUnmarked; + nsCOMPtr mStatement_GatherEntries; + nsCOMPtr mStatement_ActivateClient; + nsCOMPtr mStatement_DeactivateGroup; + nsCOMPtr mStatement_FindClient; + nsCOMPtr mStatement_FindClientByNamespace; + nsCOMPtr mStatement_EnumerateApps; + nsCOMPtr mStatement_EnumerateGroups; + nsCOMPtr mStatement_EnumerateGroupsTimeOrder; + + nsCOMPtr mBaseDirectory; + nsCOMPtr mCacheDirectory; + uint32_t mCacheCapacity; // in bytes + int32_t mDeltaCounter; + bool mAutoShutdown; + + mozilla::Mutex mLock; + + nsInterfaceHashtable mCaches; + nsClassHashtable mActiveCachesByGroup; + nsTHashtable mActiveCaches; + nsTHashtable mLockedEntries; + + nsCOMPtr mInitThread; +}; + +#endif // nsOfflineCacheDevice_h__