Bug 1353629 - PBlob refactoring - part 8 - FileReader should use nsIAsyncInputStream if available, r=smaug

Currently FileReader API uses a nsITransport. This is not needed if the
inputStream is a nsIAsyncInputStream already, and IPCBlobInputStream is always
a nsIAsyncInputStream.

Note that, we must create a bufferedStream in order to use ReadSegments in case
the remote inputStream, received by IPCBlobInputStream, is a FileInputStream.
This was not needed with nsITransport.
This commit is contained in:
Andrea Marchesini 2017-04-24 12:09:40 +02:00
Родитель d6659b61c0
Коммит 7bbba02e9a
2 изменённых файлов: 45 добавлений и 22 удалений

Просмотреть файл

@ -290,10 +290,20 @@ FileReader::DoReadData(uint64_t aCount)
mResult.GetMutableData(&buf, oldLen + aCount, fallible); mResult.GetMutableData(&buf, oldLen + aCount, fallible);
NS_ENSURE_TRUE(buf, NS_ERROR_OUT_OF_MEMORY); NS_ENSURE_TRUE(buf, NS_ERROR_OUT_OF_MEMORY);
nsresult rv;
// nsFileStreams do not implement ReadSegment. In case here we are dealing
// with a nsIAsyncInputStream, in content process, we need to wrap a
// nsIBufferedInputStream around it.
if (!mBufferedStream) {
rv = NS_NewBufferedInputStream(getter_AddRefs(mBufferedStream),
mAsyncStream, 8192);
NS_ENSURE_SUCCESS(rv, rv);
}
uint32_t bytesRead = 0; uint32_t bytesRead = 0;
nsresult rv = rv = mBufferedStream->ReadSegments(ReadFuncBinaryString, buf + oldLen,
mAsyncStream->ReadSegments(ReadFuncBinaryString, buf + oldLen, aCount, aCount, &bytesRead);
&bytesRead);
if (NS_WARN_IF(NS_FAILED(rv))) { if (NS_WARN_IF(NS_FAILED(rv))) {
return rv; return rv;
} }
@ -350,6 +360,7 @@ FileReader::ReadFileContent(Blob& aBlob,
mResultArrayBuffer = nullptr; mResultArrayBuffer = nullptr;
mAsyncStream = nullptr; mAsyncStream = nullptr;
mBufferedStream = nullptr;
mTransferred = 0; mTransferred = 0;
mTotal = 0; mTotal = 0;
@ -374,27 +385,30 @@ FileReader::ReadFileContent(Blob& aBlob,
return; return;
} }
nsCOMPtr<nsITransport> transport; mAsyncStream = do_QueryInterface(stream);
aRv = sts->CreateInputTransport(stream, if (!mAsyncStream) {
/* aStartOffset */ 0, nsCOMPtr<nsITransport> transport;
/* aReadLimit */ -1, aRv = sts->CreateInputTransport(stream,
/* aCloseWhenDone */ true, /* aStartOffset */ 0,
getter_AddRefs(transport)); /* aReadLimit */ -1,
if (NS_WARN_IF(aRv.Failed())) { /* aCloseWhenDone */ true,
return; getter_AddRefs(transport));
if (NS_WARN_IF(aRv.Failed())) {
return;
}
nsCOMPtr<nsIInputStream> wrapper;
aRv = transport->OpenInputStream(/* aFlags */ 0,
/* aSegmentSize */ 0,
/* aSegmentCount */ 0,
getter_AddRefs(wrapper));
if (NS_WARN_IF(aRv.Failed())) {
return;
}
mAsyncStream = do_QueryInterface(wrapper);
} }
nsCOMPtr<nsIInputStream> wrapper;
aRv = transport->OpenInputStream(/* aFlags */ 0,
/* aSegmentSize */ 0,
/* aSegmentCount */ 0,
getter_AddRefs(wrapper));
if (NS_WARN_IF(aRv.Failed())) {
return;
}
MOZ_ASSERT(!mAsyncStream);
mAsyncStream = do_QueryInterface(wrapper);
MOZ_ASSERT(mAsyncStream); MOZ_ASSERT(mAsyncStream);
mTotal = mBlob->GetSize(aRv); mTotal = mBlob->GetSize(aRv);
@ -529,6 +543,7 @@ FileReader::FreeDataAndDispatchSuccess()
FreeFileData(); FreeFileData();
mResult.SetIsVoid(false); mResult.SetIsVoid(false);
mAsyncStream = nullptr; mAsyncStream = nullptr;
mBufferedStream = nullptr;
mBlob = nullptr; mBlob = nullptr;
// Dispatch event to signify end of a successful operation // Dispatch event to signify end of a successful operation
@ -544,6 +559,7 @@ FileReader::FreeDataAndDispatchError()
FreeFileData(); FreeFileData();
mResult.SetIsVoid(true); mResult.SetIsVoid(true);
mAsyncStream = nullptr; mAsyncStream = nullptr;
mBufferedStream = nullptr;
mBlob = nullptr; mBlob = nullptr;
// Dispatch error event to signify load failure // Dispatch error event to signify load failure
@ -729,6 +745,7 @@ FileReader::Abort()
mResultArrayBuffer = nullptr; mResultArrayBuffer = nullptr;
mAsyncStream = nullptr; mAsyncStream = nullptr;
mBufferedStream = nullptr;
mBlob = nullptr; mBlob = nullptr;
//Clean up memory buffer //Clean up memory buffer
@ -782,6 +799,11 @@ FileReader::Shutdown()
mAsyncStream = nullptr; mAsyncStream = nullptr;
} }
if (mBufferedStream) {
mBufferedStream->Close();
mBufferedStream = nullptr;
}
FreeFileData(); FreeFileData();
mResultArrayBuffer = nullptr; mResultArrayBuffer = nullptr;

Просмотреть файл

@ -180,6 +180,7 @@ private:
bool mTimerIsActive; bool mTimerIsActive;
nsCOMPtr<nsIAsyncInputStream> mAsyncStream; nsCOMPtr<nsIAsyncInputStream> mAsyncStream;
nsCOMPtr<nsIInputStream> mBufferedStream;
RefPtr<DOMError> mError; RefPtr<DOMError> mError;