michael@0: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- michael@0: * michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef _nsDiskCacheDevice_h_ michael@0: #define _nsDiskCacheDevice_h_ michael@0: michael@0: #include "mozilla/MemoryReporting.h" michael@0: #include "nsCacheDevice.h" michael@0: #include "nsDiskCacheBinding.h" michael@0: #include "nsDiskCacheBlockFile.h" michael@0: #include "nsDiskCacheEntry.h" michael@0: michael@0: #include "nsIFile.h" michael@0: #include "nsIObserver.h" michael@0: #include "nsCOMArray.h" michael@0: michael@0: class nsDiskCacheMap; michael@0: michael@0: michael@0: class nsDiskCacheDevice : public nsCacheDevice { michael@0: public: michael@0: nsDiskCacheDevice(); michael@0: virtual ~nsDiskCacheDevice(); michael@0: michael@0: virtual nsresult Init(); michael@0: virtual nsresult Shutdown(); michael@0: michael@0: virtual const char * GetDeviceID(void); michael@0: virtual nsCacheEntry * FindEntry(nsCString * key, bool *collision); michael@0: virtual nsresult DeactivateEntry(nsCacheEntry * entry); michael@0: virtual nsresult BindEntry(nsCacheEntry * entry); michael@0: virtual void DoomEntry( nsCacheEntry * entry ); michael@0: michael@0: virtual nsresult OpenInputStreamForEntry(nsCacheEntry * entry, michael@0: nsCacheAccessMode mode, michael@0: uint32_t offset, michael@0: nsIInputStream ** result); michael@0: michael@0: virtual nsresult OpenOutputStreamForEntry(nsCacheEntry * entry, michael@0: nsCacheAccessMode mode, michael@0: uint32_t offset, michael@0: nsIOutputStream ** result); michael@0: michael@0: virtual nsresult GetFileForEntry(nsCacheEntry * entry, michael@0: nsIFile ** result); michael@0: michael@0: virtual nsresult OnDataSizeChange(nsCacheEntry * entry, int32_t deltaSize); michael@0: michael@0: virtual nsresult Visit(nsICacheVisitor * visitor); michael@0: michael@0: virtual nsresult EvictEntries(const char * clientID); michael@0: michael@0: bool EntryIsTooBig(int64_t entrySize); michael@0: michael@0: size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf); michael@0: michael@0: /** michael@0: * Preference accessors michael@0: */ michael@0: void SetCacheParentDirectory(nsIFile * parentDir); michael@0: void SetCapacity(uint32_t capacity); michael@0: void SetMaxEntrySize(int32_t maxSizeInKilobytes); michael@0: michael@0: /* private: */ michael@0: michael@0: void getCacheDirectory(nsIFile ** result); michael@0: uint32_t getCacheCapacity(); michael@0: uint32_t getCacheSize(); michael@0: uint32_t getEntryCount(); michael@0: michael@0: nsDiskCacheMap * CacheMap() { return &mCacheMap; } michael@0: michael@0: private: michael@0: friend class nsDiskCacheDeviceDeactivateEntryEvent; michael@0: friend class nsEvictDiskCacheEntriesEvent; michael@0: friend class nsDiskCacheMap; michael@0: /** michael@0: * Private methods michael@0: */ michael@0: michael@0: inline bool IsValidBinding(nsDiskCacheBinding *binding) michael@0: { michael@0: NS_ASSERTION(binding, " binding == nullptr"); michael@0: NS_ASSERTION(binding->mDeactivateEvent == nullptr, michael@0: " entry in process of deactivation"); michael@0: return (binding && !binding->mDeactivateEvent); michael@0: } michael@0: michael@0: bool Initialized() { return mInitialized; } michael@0: michael@0: nsresult Shutdown_Private(bool flush); michael@0: nsresult DeactivateEntry_Private(nsCacheEntry * entry, michael@0: nsDiskCacheBinding * binding); michael@0: michael@0: nsresult OpenDiskCache(); michael@0: nsresult ClearDiskCache(); michael@0: michael@0: nsresult EvictDiskCacheEntries(uint32_t targetCapacity); michael@0: michael@0: /** michael@0: * Member variables michael@0: */ michael@0: nsCOMPtr mCacheDirectory; michael@0: nsDiskCacheBindery mBindery; michael@0: uint32_t mCacheCapacity; // Unit is KiB's michael@0: int32_t mMaxEntrySize; // Unit is bytes internally michael@0: // XXX need soft/hard limits, currentTotal michael@0: nsDiskCacheMap mCacheMap; michael@0: bool mInitialized; michael@0: bool mClearingDiskCache; michael@0: }; michael@0: michael@0: #endif // _nsDiskCacheDevice_h_