// InputStreamCallback NS_IMETHODIMP FileReader::OnInputStreamReady(nsIAsyncInputStream* aStream) { if (mReadyState != LOADING || aStream != mAsyncStream) { return NS_OK; } // We use this class to decrease the busy counter at the end of this method. // In theory we can do it immediatelly but, for debugging reasons, we want to // be 100% sure we have a feature when OnLoadEnd() is called. FileReaderDecreaseBusyCounter RAII(this); uint64_t aCount; nsresult rv = aStream->Available(&aCount); if (NS_SUCCEEDED(rv) && aCount) { rv = DoReadData(aCount); } if (NS_SUCCEEDED(rv)) { rv = DoAsyncWait(); } if (NS_FAILED(rv) || !aCount) { if (rv == NS_BASE_STREAM_CLOSED) { rv = NS_OK; } return OnLoadEnd(rv); } mTransferred += aCount; //Notify the timer is the appropriate timeframe has passed if (mTimerIsActive) { mProgressEventWasDelayed = true; } else { rv = DispatchProgressEvent(NS_LITERAL_STRING(PROGRESS_STR)); NS_ENSURE_SUCCESS(rv, rv); StartProgressEventTimer(); } return NS_OK; }
// InputStreamCallback NS_IMETHODIMP FileIOObject::OnInputStreamReady(nsIAsyncInputStream* aStream) { if (mReadyState != 1 || aStream != mAsyncStream) { return NS_OK; } uint64_t aCount; nsresult rv = aStream->Available(&aCount); if (NS_SUCCEEDED(rv) && aCount) { rv = DoReadData(aStream, aCount); } if (NS_SUCCEEDED(rv)) { rv = DoAsyncWait(aStream); } if (NS_FAILED(rv) || !aCount) { if (rv == NS_BASE_STREAM_CLOSED) { rv = NS_OK; } return OnLoadEnd(rv); } mTransferred += aCount; //Notify the timer is the appropriate timeframe has passed if (mTimerIsActive) { mProgressEventWasDelayed = true; } else { rv = DispatchProgressEvent(NS_LITERAL_STRING(PROGRESS_STR)); NS_ENSURE_SUCCESS(rv, rv); StartProgressEventTimer(); } return NS_OK; }
void FileReader::ReadFileContent(Blob& aBlob, const nsAString &aCharset, eDataFormat aDataFormat, ErrorResult& aRv) { //Implicit abort to clear any other activity going on ErrorResult error; Abort(error); error.SuppressException(); mError = nullptr; SetDOMStringToNull(mResult); mTransferred = 0; mTotal = 0; mReadyState = EMPTY; FreeFileData(); mBlob = &aBlob; mDataFormat = aDataFormat; CopyUTF16toUTF8(aCharset, mCharset); nsresult rv; nsCOMPtr<nsIStreamTransportService> sts = do_GetService(kStreamTransportServiceCID, &rv); if (NS_WARN_IF(NS_FAILED(rv))) { aRv.Throw(rv); return; } nsCOMPtr<nsIInputStream> stream; mBlob->GetInternalStream(getter_AddRefs(stream), aRv); if (NS_WARN_IF(aRv.Failed())) { return; } nsCOMPtr<nsITransport> transport; aRv = sts->CreateInputTransport(stream, /* aStartOffset */ 0, /* aReadLimit */ -1, /* aCloseWhenDone */ true, 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; } MOZ_ASSERT(!mAsyncStream); mAsyncStream = do_QueryInterface(wrapper); MOZ_ASSERT(mAsyncStream); mTotal = mBlob->GetSize(aRv); if (NS_WARN_IF(aRv.Failed())) { return; } aRv = DoAsyncWait(); if (NS_WARN_IF(aRv.Failed())) { return; } //FileReader should be in loading state here mReadyState = LOADING; DispatchProgressEvent(NS_LITERAL_STRING(LOADSTART_STR)); if (mDataFormat == FILE_AS_ARRAYBUFFER) { mFileData = js_pod_malloc<char>(mTotal); if (!mFileData) { NS_WARNING("Preallocation failed for ReadFileData"); aRv.Throw(NS_ERROR_OUT_OF_MEMORY); } } }
void FileReader::ReadFileContent(Blob& aBlob, const nsAString &aCharset, eDataFormat aDataFormat, ErrorResult& aRv) { if (IsCurrentThreadRunningWorker() && !mWeakWorkerRef) { // The worker is already shutting down. return; } if (mReadyState == LOADING) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); return; } mError = nullptr; SetDOMStringToNull(mResult); mResultArrayBuffer = nullptr; mAsyncStream = nullptr; mTransferred = 0; mTotal = 0; mReadyState = EMPTY; FreeFileData(); mBlob = &aBlob; mDataFormat = aDataFormat; CopyUTF16toUTF8(aCharset, mCharset); { nsCOMPtr<nsIInputStream> stream; mBlob->CreateInputStream(getter_AddRefs(stream), aRv); if (NS_WARN_IF(aRv.Failed())) { return; } aRv = NS_MakeAsyncNonBlockingInputStream(stream.forget(), getter_AddRefs(mAsyncStream)); if (NS_WARN_IF(aRv.Failed())) { return; } } MOZ_ASSERT(mAsyncStream); mTotal = mBlob->GetSize(aRv); if (NS_WARN_IF(aRv.Failed())) { return; } // Binary Format doesn't need a post-processing of the data. Everything is // written directly into mResult. if (mDataFormat != FILE_AS_BINARY) { if (mDataFormat == FILE_AS_ARRAYBUFFER) { mFileData = js_pod_malloc<char>(mTotal); } else { mFileData = (char *) malloc(mTotal); } if (!mFileData) { NS_WARNING("Preallocation failed for ReadFileData"); aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return; } } aRv = DoAsyncWait(); if (NS_WARN_IF(aRv.Failed())) { FreeFileData(); return; } //FileReader should be in loading state here mReadyState = LOADING; DispatchProgressEvent(NS_LITERAL_STRING(LOADSTART_STR)); }