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 CacheFileChunk__h__ michael@0: #define CacheFileChunk__h__ michael@0: michael@0: #include "CacheFileIOManager.h" michael@0: #include "CacheStorageService.h" michael@0: #include "CacheHashUtils.h" michael@0: #include "nsAutoPtr.h" michael@0: #include "mozilla/Mutex.h" michael@0: michael@0: namespace mozilla { michael@0: namespace net { michael@0: michael@0: #define kChunkSize (256 * 1024) michael@0: #define kEmptyChunkHash 0x1826 michael@0: michael@0: class CacheFileChunk; michael@0: class CacheFile; michael@0: class ValidityPair; michael@0: michael@0: michael@0: #define CACHEFILECHUNKLISTENER_IID \ michael@0: { /* baf16149-2ab5-499c-a9c2-5904eb95c288 */ \ michael@0: 0xbaf16149, \ michael@0: 0x2ab5, \ michael@0: 0x499c, \ michael@0: {0xa9, 0xc2, 0x59, 0x04, 0xeb, 0x95, 0xc2, 0x88} \ michael@0: } michael@0: michael@0: class CacheFileChunkListener : public nsISupports michael@0: { michael@0: public: michael@0: NS_DECLARE_STATIC_IID_ACCESSOR(CACHEFILECHUNKLISTENER_IID) michael@0: michael@0: NS_IMETHOD OnChunkRead(nsresult aResult, CacheFileChunk *aChunk) = 0; michael@0: NS_IMETHOD OnChunkWritten(nsresult aResult, CacheFileChunk *aChunk) = 0; michael@0: NS_IMETHOD OnChunkAvailable(nsresult aResult, uint32_t aChunkIdx, michael@0: CacheFileChunk *aChunk) = 0; michael@0: NS_IMETHOD OnChunkUpdated(CacheFileChunk *aChunk) = 0; michael@0: }; michael@0: michael@0: NS_DEFINE_STATIC_IID_ACCESSOR(CacheFileChunkListener, michael@0: CACHEFILECHUNKLISTENER_IID) michael@0: michael@0: michael@0: class ChunkListenerItem { michael@0: public: michael@0: ChunkListenerItem() { MOZ_COUNT_CTOR(ChunkListenerItem); } michael@0: ~ChunkListenerItem() { MOZ_COUNT_DTOR(ChunkListenerItem); } michael@0: michael@0: nsCOMPtr mTarget; michael@0: nsCOMPtr mCallback; michael@0: }; michael@0: michael@0: class ChunkListeners { michael@0: public: michael@0: ChunkListeners() { MOZ_COUNT_CTOR(ChunkListeners); } michael@0: ~ChunkListeners() { MOZ_COUNT_DTOR(ChunkListeners); } michael@0: michael@0: nsTArray mItems; michael@0: }; michael@0: michael@0: class CacheFileChunk : public CacheFileIOListener michael@0: , public CacheMemoryConsumer michael@0: { michael@0: public: michael@0: NS_DECL_THREADSAFE_ISUPPORTS michael@0: michael@0: CacheFileChunk(CacheFile *aFile, uint32_t aIndex); michael@0: michael@0: void InitNew(CacheFileChunkListener *aCallback); michael@0: nsresult Read(CacheFileHandle *aHandle, uint32_t aLen, michael@0: CacheHash::Hash16_t aHash, michael@0: CacheFileChunkListener *aCallback); michael@0: nsresult Write(CacheFileHandle *aHandle, CacheFileChunkListener *aCallback); michael@0: void WaitForUpdate(CacheFileChunkListener *aCallback); michael@0: nsresult CancelWait(CacheFileChunkListener *aCallback); michael@0: nsresult NotifyUpdateListeners(); michael@0: michael@0: uint32_t Index(); michael@0: CacheHash::Hash16_t Hash(); michael@0: uint32_t DataSize(); michael@0: void UpdateDataSize(uint32_t aOffset, uint32_t aLen, michael@0: bool aEOF); michael@0: michael@0: NS_IMETHOD OnFileOpened(CacheFileHandle *aHandle, nsresult aResult); michael@0: NS_IMETHOD OnDataWritten(CacheFileHandle *aHandle, const char *aBuf, michael@0: nsresult aResult); michael@0: NS_IMETHOD OnDataRead(CacheFileHandle *aHandle, char *aBuf, nsresult aResult); michael@0: NS_IMETHOD OnFileDoomed(CacheFileHandle *aHandle, nsresult aResult); michael@0: NS_IMETHOD OnEOFSet(CacheFileHandle *aHandle, nsresult aResult); michael@0: NS_IMETHOD OnFileRenamed(CacheFileHandle *aHandle, nsresult aResult); michael@0: michael@0: bool IsReady() const; michael@0: bool IsDirty() const; michael@0: michael@0: nsresult GetStatus(); michael@0: void SetError(nsresult aStatus); michael@0: michael@0: char * BufForWriting() const; michael@0: const char * BufForReading() const; michael@0: void EnsureBufSize(uint32_t aBufSize); michael@0: uint32_t MemorySize() const { return sizeof(CacheFileChunk) + mRWBufSize + mBufSize; } michael@0: michael@0: // Memory reporting michael@0: size_t SizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const; michael@0: size_t SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const; michael@0: michael@0: private: michael@0: friend class CacheFileInputStream; michael@0: friend class CacheFileOutputStream; michael@0: friend class CacheFile; michael@0: michael@0: virtual ~CacheFileChunk(); michael@0: michael@0: enum EState { michael@0: INITIAL = 0, michael@0: READING = 1, michael@0: WRITING = 2, michael@0: READY = 3, michael@0: ERROR = 4 michael@0: }; michael@0: michael@0: uint32_t mIndex; michael@0: EState mState; michael@0: nsresult mStatus; michael@0: bool mIsDirty; michael@0: bool mRemovingChunk; michael@0: uint32_t mDataSize; michael@0: michael@0: char *mBuf; michael@0: uint32_t mBufSize; michael@0: michael@0: char *mRWBuf; michael@0: uint32_t mRWBufSize; michael@0: CacheHash::Hash16_t mReadHash; michael@0: michael@0: nsRefPtr mFile; // is null if chunk is cached to michael@0: // prevent reference cycles michael@0: nsCOMPtr mListener; michael@0: nsTArray mUpdateListeners; michael@0: nsTArray mValidityMap; michael@0: }; michael@0: michael@0: michael@0: } // net michael@0: } // mozilla michael@0: michael@0: #endif