diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /dom/file/MutableBlobStreamListener.cpp | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/file/MutableBlobStreamListener.cpp')
-rw-r--r-- | dom/file/MutableBlobStreamListener.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/dom/file/MutableBlobStreamListener.cpp b/dom/file/MutableBlobStreamListener.cpp new file mode 100644 index 0000000000..f103c15fda --- /dev/null +++ b/dom/file/MutableBlobStreamListener.cpp @@ -0,0 +1,105 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* 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 "MutableBlobStreamListener.h" +#include "MutableBlobStorage.h" +#include "nsIInputStream.h" +#include "nsThreadUtils.h" + +namespace mozilla::dom { + +MutableBlobStreamListener::MutableBlobStreamListener( + MutableBlobStorage::MutableBlobStorageType aStorageType, + const nsACString& aContentType, MutableBlobStorageCallback* aCallback, + nsIEventTarget* aEventTarget) + : mCallback(aCallback), + mStorageType(aStorageType), + mContentType(aContentType), + mEventTarget(aEventTarget) { + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(aCallback); + + if (!mEventTarget) { + mEventTarget = GetMainThreadSerialEventTarget(); + } + + MOZ_ASSERT(mEventTarget); +} + +MutableBlobStreamListener::~MutableBlobStreamListener() { + MOZ_ASSERT(NS_IsMainThread()); +} + +NS_IMPL_ISUPPORTS(MutableBlobStreamListener, nsIStreamListener, + nsIThreadRetargetableStreamListener, nsIRequestObserver) + +NS_IMETHODIMP +MutableBlobStreamListener::OnStartRequest(nsIRequest* aRequest) { + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(!mStorage); + MOZ_ASSERT(mEventTarget); + + mStorage = new MutableBlobStorage(mStorageType, mEventTarget); + return NS_OK; +} + +NS_IMETHODIMP +MutableBlobStreamListener::OnStopRequest(nsIRequest* aRequest, + nsresult aStatus) { + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(mStorage); + + // Resetting mStorage to nullptr. + RefPtr<MutableBlobStorage> storage; + storage.swap(mStorage); + + // Let's propagate the error simulating a failure of the storage. + if (NS_FAILED(aStatus)) { + mCallback->BlobStoreCompleted(storage, nullptr, aStatus); + return NS_OK; + } + + storage->GetBlobImplWhenReady(mContentType, mCallback); + return NS_OK; +} + +NS_IMETHODIMP +MutableBlobStreamListener::OnDataAvailable(nsIRequest* aRequest, + nsIInputStream* aStream, + uint64_t aSourceOffset, + uint32_t aCount) { + // This method could be called on any thread. + MOZ_ASSERT(mStorage); + + uint32_t countRead; + return aStream->ReadSegments(WriteSegmentFun, this, aCount, &countRead); +} + +nsresult MutableBlobStreamListener::WriteSegmentFun( + nsIInputStream* aWriterStream, void* aClosure, const char* aFromSegment, + uint32_t aToOffset, uint32_t aCount, uint32_t* aWriteCount) { + // This method could be called on any thread. + + MutableBlobStreamListener* self = + static_cast<MutableBlobStreamListener*>(aClosure); + MOZ_ASSERT(self->mStorage); + + nsresult rv = self->mStorage->Append(aFromSegment, aCount); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + *aWriteCount = aCount; + return NS_OK; +} + +NS_IMETHODIMP +MutableBlobStreamListener::CheckListenerChain() { return NS_OK; } + +NS_IMETHODIMP +MutableBlobStreamListener::OnDataFinished(nsresult) { return NS_OK; } + +} // namespace mozilla::dom |