From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- netwerk/base/nsStreamLoader.cpp | 137 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 netwerk/base/nsStreamLoader.cpp (limited to 'netwerk/base/nsStreamLoader.cpp') diff --git a/netwerk/base/nsStreamLoader.cpp b/netwerk/base/nsStreamLoader.cpp new file mode 100644 index 0000000000..bd3ff25de9 --- /dev/null +++ b/netwerk/base/nsStreamLoader.cpp @@ -0,0 +1,137 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* 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/. */ + +#include "nsStreamLoader.h" +#include "nsIInputStream.h" +#include "nsIChannel.h" +#include "nsError.h" +#include "mozilla/ProfilerLabels.h" + +#include + +namespace mozilla { +namespace net { + +nsStreamLoader::nsStreamLoader() : mData() {} + +NS_IMETHODIMP +nsStreamLoader::Init(nsIStreamLoaderObserver* aStreamObserver, + nsIRequestObserver* aRequestObserver) { + NS_ENSURE_ARG_POINTER(aStreamObserver); + mObserver = aStreamObserver; + mRequestObserver = aRequestObserver; + return NS_OK; +} + +nsresult nsStreamLoader::Create(REFNSIID aIID, void** aResult) { + RefPtr it = new nsStreamLoader(); + return it->QueryInterface(aIID, aResult); +} + +NS_IMPL_ISUPPORTS(nsStreamLoader, nsIStreamLoader, nsIRequestObserver, + nsIStreamListener, nsIThreadRetargetableStreamListener) + +NS_IMETHODIMP +nsStreamLoader::GetNumBytesRead(uint32_t* aNumBytes) { + *aNumBytes = mBytesRead; + return NS_OK; +} + +NS_IMETHODIMP +nsStreamLoader::GetRequest(nsIRequest** aRequest) { + nsCOMPtr req = mRequest; + req.forget(aRequest); + return NS_OK; +} + +NS_IMETHODIMP +nsStreamLoader::OnStartRequest(nsIRequest* request) { + nsCOMPtr chan(do_QueryInterface(request)); + if (chan) { + int64_t contentLength = -1; + chan->GetContentLength(&contentLength); + if (contentLength >= 0) { + // On 64bit platforms size of uint64_t coincides with the size of size_t, + // so we want to compare with the minimum from size_t and int64_t. + if (static_cast(contentLength) > + std::min(std::numeric_limits::max(), + static_cast(std::numeric_limits::max()))) { + // Too big to fit into size_t, so let's bail. + return NS_ERROR_OUT_OF_MEMORY; + } + // preallocate buffer + if (!mData.initCapacity(contentLength)) { + return NS_ERROR_OUT_OF_MEMORY; + } + } + } + if (mRequestObserver) { + mRequestObserver->OnStartRequest(request); + } + return NS_OK; +} + +NS_IMETHODIMP +nsStreamLoader::OnStopRequest(nsIRequest* request, nsresult aStatus) { + AUTO_PROFILER_LABEL("nsStreamLoader::OnStopRequest", NETWORK); + + if (mObserver) { + // provide nsIStreamLoader::request during call to OnStreamComplete + mRequest = request; + size_t length = mData.length(); + uint8_t* elems = mData.extractOrCopyRawBuffer(); + nsresult rv = + mObserver->OnStreamComplete(this, mContext, aStatus, length, elems); + if (rv != NS_SUCCESS_ADOPTED_DATA) { + // The observer didn't take ownership of the extracted data buffer, so + // put it back into mData. + mData.replaceRawBuffer(elems, length); + } + // done.. cleanup + ReleaseData(); + mRequest = nullptr; + mObserver = nullptr; + } + + if (mRequestObserver) { + mRequestObserver->OnStopRequest(request, aStatus); + mRequestObserver = nullptr; + } + + return NS_OK; +} + +nsresult nsStreamLoader::WriteSegmentFun(nsIInputStream* inStr, void* closure, + const char* fromSegment, + uint32_t toOffset, uint32_t count, + uint32_t* writeCount) { + nsStreamLoader* self = (nsStreamLoader*)closure; + + if (!self->mData.append(fromSegment, count)) { + self->mData.clearAndFree(); + return NS_ERROR_OUT_OF_MEMORY; + } + + *writeCount = count; + return NS_OK; +} + +NS_IMETHODIMP +nsStreamLoader::OnDataAvailable(nsIRequest* request, nsIInputStream* inStr, + uint64_t sourceOffset, uint32_t count) { + uint32_t countRead; + nsresult rv = inStr->ReadSegments(WriteSegmentFun, this, count, &countRead); + NS_ENSURE_SUCCESS(rv, rv); + mBytesRead += countRead; + return NS_OK; +} + +void nsStreamLoader::ReleaseData() { mData.clearAndFree(); } + +NS_IMETHODIMP +nsStreamLoader::CheckListenerChain() { return NS_OK; } + +} // namespace net +} // namespace mozilla -- cgit v1.2.3