/* 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/. */
if (mInReadSegments) {
LOG(
("CacheFileInputStream::ReadSegments() - Cannot be called while the " "stream is in ReadSegments!")); return NS_ERROR_UNEXPECTED;
}
if (mClosed) {
LOG(
("CacheFileInputStream::ReadSegments() - Stream is closed. [this=%p, " "status=0x%08" PRIx32 "]", this, static_cast<uint32_t>(mStatus)));
if (NS_FAILED(mStatus)) { return mStatus;
}
return NS_OK;
}
if (aCount == 0) { return NS_OK;
}
EnsureCorrectChunk(false);
while (true) { if (NS_FAILED(mStatus)) return mStatus;
if (!mChunk) { if (mListeningForChunk == -1) { return NS_OK;
} return NS_BASE_STREAM_WOULD_BLOCK;
}
if (mClosed) { // We notify listener and null out mCallback immediately after closing // the stream. If we're in ReadSegments we postpone notification until we // step out from ReadSegments. So if the stream is already closed the // following assertion must be true.
MOZ_ASSERT(!mCallback || mInReadSegments); return;
}
if (mInReadSegments) {
LOG(
("CacheFileInputStream::AsyncWait() - Cannot be called while the stream" " is in ReadSegments!"));
MOZ_ASSERT(false, "Unexpected call. If it's a valid usage implement it. " "Otherwise fix the caller."); return NS_ERROR_UNEXPECTED;
}
if (mInReadSegments) {
LOG(
("CacheFileInputStream::Seek() - Cannot be called while the stream is " "in ReadSegments!")); return NS_ERROR_UNEXPECTED;
}
if (mClosed) {
LOG(("CacheFileInputStream::Seek() - Stream is closed. [this=%p]", this)); return NS_BASE_STREAM_CLOSED;
}
int64_t newPos = offset; switch (whence) { case NS_SEEK_SET: if (mAlternativeData) {
newPos += mFile->mAltDataOffset;
} break; case NS_SEEK_CUR:
newPos += mPos; break; case NS_SEEK_END: if (mAlternativeData) {
newPos += mFile->mDataSize;
} else {
newPos += mFile->mAltDataOffset;
} break; default:
NS_ERROR("invalid whence"); return NS_ERROR_INVALID_ARG;
}
mPos = newPos;
EnsureCorrectChunk(false);
// CacheFileChunkListener
nsresult CacheFileInputStream::OnChunkRead(nsresult aResult,
CacheFileChunk* aChunk) {
MOZ_CRASH("CacheFileInputStream::OnChunkRead should not be called!"); return NS_ERROR_UNEXPECTED;
}
nsresult CacheFileInputStream::OnChunkWritten(nsresult aResult,
CacheFileChunk* aChunk) {
MOZ_CRASH("CacheFileInputStream::OnChunkWritten should not be called!"); return NS_ERROR_UNEXPECTED;
}
if (mListeningForChunk != static_cast<int64_t>(aChunkIdx)) { // This is not a chunk that we're waiting for
LOG(
("CacheFileInputStream::OnChunkAvailable() - Notification is for a " "different chunk. [this=%p, listeningForChunk=%" PRId64 "]", this, mListeningForChunk));
if (NS_SUCCEEDED(aResult)) {
mChunk = aChunk;
} elseif (aResult != NS_ERROR_NOT_AVAILABLE) { // Close the stream with error. The consumer will receive this error later // in Read(), Available() etc. We need to handle NS_ERROR_NOT_AVAILABLE // differently since it is returned when the requested chunk is not // available and there is no writer that could create it, i.e. it means that // we've reached the end of the file.
CloseWithStatusLocked(aResult);
if (mInReadSegments) { // We must have correct chunk
MOZ_ASSERT(mChunk);
MOZ_ASSERT(mChunk->Index() == chunkIdx); return;
}
if (mChunk) { if (mChunk->Index() == chunkIdx) { // we have a correct chunk
LOG(
("CacheFileInputStream::EnsureCorrectChunk() - Have correct chunk " "[this=%p, idx=%d]", this, chunkIdx));
return;
}
ReleaseChunk();
}
MOZ_ASSERT(!mWaitingForUpdate);
if (aReleaseOnly) return;
if (mListeningForChunk == static_cast<int64_t>(chunkIdx)) { // We're already waiting for this chunk
LOG(
("CacheFileInputStream::EnsureCorrectChunk() - Already listening for " "chunk %" PRId64 " [this=%p]",
mListeningForChunk, this));
return;
}
rv = mFile->GetChunkLocked(chunkIdx, CacheFile::READER, this,
getter_AddRefs(mChunk)); if (NS_FAILED(rv)) {
LOG(
("CacheFileInputStream::EnsureCorrectChunk() - GetChunkLocked failed. " "[this=%p, idx=%d, rv=0x%08" PRIx32 "]", this, chunkIdx, static_cast<uint32_t>(rv))); if (rv != NS_ERROR_NOT_AVAILABLE) { // Close the stream with error. The consumer will receive this error later // in Read(), Available() etc. We need to handle NS_ERROR_NOT_AVAILABLE // differently since it is returned when the requested chunk is not // available and there is no writer that could create it, i.e. it means // that we've reached the end of the file.
CloseWithStatusLocked(rv);
if (!mCallbackTarget) {
mCallbackTarget = CacheFileIOManager::IOTarget(); if (!mCallbackTarget) {
LOG(
("CacheFileInputStream::NotifyListener() - Cannot get Cache I/O " "thread! Using main thread for callback."));
mCallbackTarget = GetMainThreadSerialEventTarget();
}
}
if (mClosed || NS_FAILED(mStatus)) {
NotifyListener(); return;
}
if (!mChunk) { if (mListeningForChunk == -1) { // EOF, should we notify even if mCallbackFlags == WAIT_CLOSURE_ONLY ??
NotifyListener();
} return;
}
MOZ_ASSERT(mPos / kChunkSize == mChunk->Index());
if (mWaitingForUpdate) return;
CacheFileChunkReadHandle hnd = mChunk->GetReadHandle();
int64_t canRead = CanRead(&hnd); if (NS_FAILED(mStatus)) { // CanRead() called CloseWithStatusLocked() which called // MaybeNotifyListener() so the listener was already notified. Stop here.
MOZ_ASSERT(!mCallback); return;
}
if (canRead > 0) { if (!(mCallbackFlags & WAIT_CLOSURE_ONLY)) NotifyListener();
} elseif (canRead == 0) { if (!mFile->OutputStreamExists(mAlternativeData)) { // EOF
NotifyListener();
} else {
mChunk->WaitForUpdate(this);
mWaitingForUpdate = true;
}
} else { // Output have set EOF before mPos?
MOZ_ASSERT(false, "SetEOF is currenty not implemented?!");
NotifyListener();
}
}
// Memory reporting
size_t CacheFileInputStream::SizeOfIncludingThis(
mozilla::MallocSizeOf mallocSizeOf) const { // Everything the stream keeps a reference to is already reported somewhere // else. mFile reports itself. mChunk reported as part of CacheFile. mCallback // is usually CacheFile or a class that is reported elsewhere. return mallocSizeOf(this);
}
} // namespace mozilla::net
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.