nsresult FileReader::OnLoadEnd(nsresult aStatus) { // Cancel the progress event timer ClearProgressEventTimer(); // FileReader must be in DONE stage after an operation mReadyState = DONE; nsAutoString successEvent, termEvent; nsresult rv = DoOnLoadEnd(aStatus, successEvent, termEvent); NS_ENSURE_SUCCESS(rv, rv); // Set the status field as appropriate if (NS_FAILED(aStatus)) { DispatchError(aStatus, termEvent); return NS_OK; } // Dispatch event to signify end of a successful operation DispatchProgressEvent(successEvent); DispatchProgressEvent(termEvent); return NS_OK; }
void FileReader::Abort(ErrorResult& aRv) { if (mReadyState != LOADING) { // XXX The spec doesn't say this aRv.Throw(NS_ERROR_DOM_FILE_ABORT_ERR); return; } ClearProgressEventTimer(); mReadyState = DONE; // XXX The spec doesn't say this mError = new DOMError(GetOwner(), NS_LITERAL_STRING("AbortError")); // Revert status and result attributes SetDOMStringToNull(mResult); mResultArrayBuffer = nullptr; mAsyncStream = nullptr; mBlob = nullptr; //Clean up memory buffer FreeFileData(); // Dispatch the events DispatchProgressEvent(NS_LITERAL_STRING(ABORT_STR)); DispatchProgressEvent(NS_LITERAL_STRING(LOADEND_STR)); }
NS_IMETHODIMP FileIOObject::OnStopRequest(nsIRequest* aRequest, nsISupports* aContext, nsresult aStatus) { // If we're here as a result of a call from Abort(), // simply ignore the request. if (aRequest != mChannel) return NS_OK; // Cancel the progress event timer ClearProgressEventTimer(); // FileIOObject must be in DONE stage after an operation mReadyState = 2; nsString successEvent, termEvent; nsresult rv = DoOnStopRequest(aRequest, aContext, aStatus, successEvent, termEvent); NS_ENSURE_SUCCESS(rv, rv); // Set the status field as appropriate if (NS_FAILED(aStatus)) { DispatchError(aStatus, termEvent); return NS_OK; } // Dispatch event to signify end of a successful operation DispatchProgressEvent(successEvent); DispatchProgressEvent(termEvent); return NS_OK; }
void FileReader::Abort() { if (mReadyState == EMPTY || mReadyState == DONE) { return; } MOZ_ASSERT(mReadyState == LOADING); ClearProgressEventTimer(); mReadyState = DONE; // XXX The spec doesn't say this mError = DOMException::Create(NS_ERROR_DOM_ABORT_ERR); // Revert status and result attributes SetDOMStringToNull(mResult); mResultArrayBuffer = nullptr; mAsyncStream = nullptr; mBlob = nullptr; //Clean up memory buffer FreeFileData(); // Dispatch the events DispatchProgressEvent(NS_LITERAL_STRING(ABORT_STR)); DispatchProgressEvent(NS_LITERAL_STRING(LOADEND_STR)); }
void FileReader::FreeDataAndDispatchSuccess() { FreeFileData(); mResult.SetIsVoid(false); mAsyncStream = nullptr; mBlob = nullptr; // Dispatch event to signify end of a successful operation DispatchProgressEvent(NS_LITERAL_STRING(LOAD_STR)); DispatchProgressEvent(NS_LITERAL_STRING(LOADEND_STR)); }
void FileReader::FreeDataAndDispatchError() { MOZ_ASSERT(mError); FreeFileData(); mResult.SetIsVoid(true); mAsyncStream = nullptr; mBlob = nullptr; // Dispatch error event to signify load failure DispatchProgressEvent(NS_LITERAL_STRING(ERROR_STR)); DispatchProgressEvent(NS_LITERAL_STRING(LOADEND_STR)); }
NS_IMETHODIMP FileIOObject::OnDataAvailable(nsIRequest *aRequest, nsISupports *aContext, nsIInputStream *aInputStream, PRUint32 aOffset, PRUint32 aCount) { nsresult rv; rv = DoOnDataAvailable(aRequest, aContext, aInputStream, aOffset, aCount); NS_ENSURE_SUCCESS(rv, 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::DispatchError(nsresult rv, nsAString& finalEvent) { // Set the status attribute, and dispatch the error event switch (rv) { case NS_ERROR_FILE_NOT_FOUND: mError = new DOMError(GetOwner(), NS_LITERAL_STRING("NotFoundError")); break; case NS_ERROR_FILE_ACCESS_DENIED: mError = new DOMError(GetOwner(), NS_LITERAL_STRING("SecurityError")); break; default: mError = new DOMError(GetOwner(), NS_LITERAL_STRING("NotReadableError")); break; } // Dispatch error event to signify load failure DispatchProgressEvent(NS_LITERAL_STRING(ERROR_STR)); DispatchProgressEvent(finalEvent); }
void FileIOObject::Abort(ErrorResult& aRv) { if (mReadyState != 1) { // XXX The spec doesn't say this aRv.Throw(NS_ERROR_DOM_FILE_ABORT_ERR); return; } ClearProgressEventTimer(); mReadyState = 2; // There are DONE constants on multiple interfaces, // but they all have value 2. // XXX The spec doesn't say this mError = new DOMError(GetOwner(), NS_LITERAL_STRING("AbortError")); nsString finalEvent; DoAbort(finalEvent); // Dispatch the events DispatchProgressEvent(NS_LITERAL_STRING(ABORT_STR)); DispatchProgressEvent(finalEvent); }
// nsITimerCallback NS_IMETHODIMP FileReader::Notify(nsITimer* aTimer) { nsresult rv; mTimerIsActive = false; if (mProgressEventWasDelayed) { rv = DispatchProgressEvent(NS_LITERAL_STRING("progress")); NS_ENSURE_SUCCESS(rv, rv); StartProgressEventTimer(); } return NS_OK; }
NS_IMETHODIMP FileIOObject::Abort() { if (mReadyState != 1) { // XXX The spec doesn't say this return NS_ERROR_DOM_FILE_ABORT_ERR; } ClearProgressEventTimer(); mReadyState = 2; // There are DONE constants on multiple interfaces, // but they all have value 2. // XXX The spec doesn't say this mError = DOMError::CreateWithName(NS_LITERAL_STRING("AbortError")); nsString finalEvent; nsresult rv = DoAbort(finalEvent); // Dispatch the events DispatchProgressEvent(NS_LITERAL_STRING(ABORT_STR)); DispatchProgressEvent(finalEvent); return rv; }
// 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)); }