/* 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 CacheFileInputStream__h__ #define CacheFileInputStream__h__ #include "nsIAsyncInputStream.h" #include "nsISeekableStream.h" #include "nsCOMPtr.h" #include "nsAutoPtr.h" #include "CacheFileChunk.h" namespace mozilla { namespace net { class CacheFile; class CacheFileInputStream : public nsIAsyncInputStream , public nsISeekableStream , public CacheFileChunkListener { NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIINPUTSTREAM NS_DECL_NSIASYNCINPUTSTREAM NS_DECL_NSISEEKABLESTREAM public: explicit CacheFileInputStream(CacheFile *aFile); NS_IMETHOD OnChunkRead(nsresult aResult, CacheFileChunk *aChunk) override; NS_IMETHOD OnChunkWritten(nsresult aResult, CacheFileChunk *aChunk) override; NS_IMETHOD OnChunkAvailable(nsresult aResult, uint32_t aChunkIdx, CacheFileChunk *aChunk) override; NS_IMETHOD OnChunkUpdated(CacheFileChunk *aChunk) override; // Memory reporting size_t SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const; uint32_t GetPosition() const { return mPos; }; private: virtual ~CacheFileInputStream(); nsresult CloseWithStatusLocked(nsresult aStatus); void ReleaseChunk(); void EnsureCorrectChunk(bool aReleaseOnly); // CanRead returns negative value when output stream truncates the data before // the input stream's mPos. void CanRead(int64_t *aCanRead, const char **aBuf); void NotifyListener(); void MaybeNotifyListener(); RefPtr mFile; RefPtr mChunk; int64_t mPos; bool mClosed; nsresult mStatus; bool mWaitingForUpdate; int64_t mListeningForChunk; nsCOMPtr mCallback; uint32_t mCallbackFlags; nsCOMPtr mCallbackTarget; }; } // namespace net } // namespace mozilla #endif