nsresult nsJARInputThunk::Init() { nsresult rv; if (ENTRY_IS_DIRECTORY(mJarEntry)) { // A directory stream also needs the Spec of the FullJarURI // because is included in the stream data itself. NS_ENSURE_STATE(!mJarDirSpec.IsEmpty()); rv = mJarReader->GetInputStreamWithSpec(mJarDirSpec, mJarEntry, getter_AddRefs(mJarStream)); } else { rv = mJarReader->GetInputStream(mJarEntry, getter_AddRefs(mJarStream)); } if (NS_FAILED(rv)) { // convert to the proper result if the entry wasn't found // so that error pages work if (rv == NS_ERROR_FILE_TARGET_DOES_NOT_EXIST) rv = NS_ERROR_FILE_NOT_FOUND; return rv; } // ask the JarStream for the content length uint64_t avail; rv = mJarStream->Available((uint64_t *) &avail); if (NS_FAILED(rv)) return rv; mContentLength = avail < INT64_MAX ? (int64_t) avail : -1; return NS_OK; }
nsresult FileMediaResource::Open(nsIStreamListener** aStreamListener) { NS_ASSERTION(NS_IsMainThread(), "Only call on main thread"); if (aStreamListener) { *aStreamListener = nullptr; } nsresult rv = NS_OK; if (aStreamListener) { // The channel is already open. We need a synchronous stream that // implements nsISeekableStream, so we have to find the underlying // file and reopen it nsCOMPtr<nsIFileChannel> fc(do_QueryInterface(mChannel)); if (!fc) return NS_ERROR_UNEXPECTED; nsCOMPtr<nsIFile> file; rv = fc->GetFile(getter_AddRefs(file)); NS_ENSURE_SUCCESS(rv, rv); rv = NS_NewLocalFileInputStream(getter_AddRefs(mInput), file); } else { // Ensure that we never load a local file from some page on a // web server. nsHTMLMediaElement* element = mDecoder->GetMediaElement(); NS_ENSURE_TRUE(element, NS_ERROR_FAILURE); rv = nsContentUtils::GetSecurityManager()-> CheckLoadURIWithPrincipal(element->NodePrincipal(), mURI, nsIScriptSecurityManager::STANDARD); NS_ENSURE_SUCCESS(rv, rv); rv = mChannel->Open(getter_AddRefs(mInput)); } NS_ENSURE_SUCCESS(rv, rv); mSeekable = do_QueryInterface(mInput); if (!mSeekable) { // XXX The file may just be a .url or similar // shortcut that points to a Web site. We need to fix this by // doing an async open and waiting until we locate the real resource, // then using that (if it's still a file!). return NS_ERROR_FAILURE; } // Get the file size and inform the decoder. Only files up to 4GB are // supported here. PRUint32 size; rv = mInput->Available(&size); if (NS_SUCCEEDED(rv)) { mSize = size; } nsCOMPtr<nsIRunnable> event = new LoadedEvent(mDecoder); NS_DispatchToMainThread(event, NS_DISPATCH_NORMAL); return NS_OK; }
NS_IMETHODIMP nsJARInputThunk::Available(PRUint32 *avail) { nsresult rv = EnsureJarStream(); if (NS_FAILED(rv)) return rv; return mJarStream->Available(avail); }
NS_IMETHODIMP nsInputStreamTee::Available(uint64_t* aAvail) { if (NS_WARN_IF(!mSource)) { return NS_ERROR_NOT_INITIALIZED; } return mSource->Available(aAvail); }
NS_IMETHODIMP nsGopherContentStream::Available(PRUint32 *result) { if (mSocketInput) return mSocketInput->Available(result); return nsBaseContentStream::Available(result); }
nsresult nsJARInputThunk::EnsureJarStream() { if (mJarStream) return NS_OK; nsresult rv; if (mJarCache) rv = mJarCache->GetZip(mJarFile, getter_AddRefs(mJarReader)); else { // create an uncached jar reader mJarReader = do_CreateInstance(kZipReaderCID, &rv); if (NS_FAILED(rv)) return rv; rv = mJarReader->Open(mJarFile); } if (NS_FAILED(rv)) return rv; if (ENTRY_IS_DIRECTORY(mJarEntry)) { // A directory stream also needs the Spec of the FullJarURI // because is included in the stream data itself. NS_ENSURE_STATE(!mJarDirSpec.IsEmpty()); rv = mJarReader->GetInputStreamWithSpec(mJarDirSpec, mJarEntry.get(), getter_AddRefs(mJarStream)); } else { rv = mJarReader->GetInputStream(mJarEntry.get(), getter_AddRefs(mJarStream)); } if (NS_FAILED(rv)) { // convert to the proper result if the entry wasn't found // so that error pages work if (rv == NS_ERROR_FILE_TARGET_DOES_NOT_EXIST) rv = NS_ERROR_FILE_NOT_FOUND; return rv; } // ask the JarStream for the content length // XXX want a 64-bit value from nsIInputStream::Available() PRUint32 contentLength; rv = mJarStream->Available(&contentLength); if (NS_FAILED(rv)) return rv; mContentLength = contentLength; return NS_OK; }
void FileMediaResource::EnsureSizeInitialized() { mLock.AssertCurrentThreadOwns(); NS_ASSERTION(mInput, "Must have file input stream"); if (mSizeInitialized) { return; } mSizeInitialized = true; // Get the file size and inform the decoder. uint64_t size; nsresult res = mInput->Available(&size); if (NS_SUCCEEDED(res) && size <= INT64_MAX) { mSize = (int64_t)size; mCallback->NotifyDataEnded(NS_OK); } }
void FileMediaResource::EnsureSizeInitialized() { mLock.AssertCurrentThreadOwns(); NS_ASSERTION(mInput, "Must have file input stream"); if (mSizeInitialized) { return; } mSizeInitialized = true; // Get the file size and inform the decoder. uint64_t size; nsresult res = mInput->Available(&size); if (NS_SUCCEEDED(res) && size <= PR_INT64_MAX) { mSize = (int64_t)size; nsCOMPtr<nsIRunnable> event = new LoadedEvent(mDecoder); NS_DispatchToMainThread(event, NS_DISPATCH_NORMAL); } }
// set up the internal streams void nsMIMEInputStream::InitStreams() { NS_ASSERTION(!mStartedReading, "Don't call initStreams twice without rewinding"); mStartedReading = true; // We'll use the content-length stream to add the final \r\n if (mAddContentLength) { uint64_t cl = 0; if (mData) { mData->Available(&cl); } mContentLength.AssignLiteral("Content-Length: "); mContentLength.AppendInt(cl); mContentLength.AppendLiteral("\r\n\r\n"); } else { mContentLength.AssignLiteral("\r\n"); } mCLStream->ShareData(mContentLength.get(), -1); mHeaderStream->ShareData(mHeaders.get(), -1); }
NS_IMETHODIMP nsJARInputThunk::Available(uint64_t *avail) { return mJarStream->Available(avail); }
#endif /* HAVE_PR_MEMMAP */ } else { nsCOMPtr<nsIIOService> ioService = do_GetIOService(&rv); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIChannel> scriptChannel; rv = ioService->NewChannelFromURI(aURI, getter_AddRefs(scriptChannel)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIInputStream> scriptStream; rv = scriptChannel->Open(getter_AddRefs(scriptStream)); NS_ENSURE_SUCCESS(rv, rv); PRUint32 len, bytesRead; rv = scriptStream->Available(&len); NS_ENSURE_SUCCESS(rv, rv); if (!len) return NS_ERROR_FAILURE; /* malloc an internal buf the size of the file */ nsAutoArrayPtr<char> buf(new char[len + 1]); if (!buf) return NS_ERROR_OUT_OF_MEMORY; /* read the file in one swoop */ rv = scriptStream->Read(buf, len, &bytesRead); if (bytesRead != len) return NS_BASE_STREAM_OSERROR; buf[len] = '\0';
NS_IMETHODIMP nsMIMEInputStream::Available(uint64_t *_retval) { INITSTREAMS; return mStream->Available(_retval); }
NS_IMETHOD Available(uint64_t* aLength) override { return mStream->Available(aLength); }