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 --- ipc/glue/RandomAccessStreamUtils.cpp | 88 ++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 ipc/glue/RandomAccessStreamUtils.cpp (limited to 'ipc/glue/RandomAccessStreamUtils.cpp') diff --git a/ipc/glue/RandomAccessStreamUtils.cpp b/ipc/glue/RandomAccessStreamUtils.cpp new file mode 100644 index 0000000000..d5e66daae6 --- /dev/null +++ b/ipc/glue/RandomAccessStreamUtils.cpp @@ -0,0 +1,88 @@ +/* -*- 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 "RandomAccessStreamUtils.h" + +#include "mozilla/NotNull.h" +#include "mozilla/Result.h" +#include "mozilla/ResultVariant.h" +#include "mozilla/dom/quota/FileStreams.h" +#include "mozilla/ipc/RandomAccessStreamParams.h" +#include "nsFileStreams.h" +#include "nsIInterfaceRequestor.h" +#include "nsIRandomAccessStream.h" + +namespace mozilla::ipc { + +RandomAccessStreamParams SerializeRandomAccessStream( + MovingNotNull> aStream, + nsIInterfaceRequestor* aCallbacks) { + NotNull> stream = std::move(aStream); + + RandomAccessStreamParams streamParams = stream->Serialize(aCallbacks); + + MOZ_ASSERT(streamParams.type() != RandomAccessStreamParams::T__None); + + return streamParams; +} + +Maybe SerializeRandomAccessStream( + nsCOMPtr aStream, + nsIInterfaceRequestor* aCallbacks) { + if (!aStream) { + return Nothing(); + } + + return Some(SerializeRandomAccessStream( + WrapMovingNotNullUnchecked(std::move(aStream)), aCallbacks)); +} + +Result>, bool> +DeserializeRandomAccessStream(RandomAccessStreamParams& aStreamParams) { + nsCOMPtr stream; + + switch (aStreamParams.type()) { + case RandomAccessStreamParams::TFileRandomAccessStreamParams: + nsFileRandomAccessStream::Create(NS_GET_IID(nsIFileRandomAccessStream), + getter_AddRefs(stream)); + break; + + case RandomAccessStreamParams::TLimitingFileRandomAccessStreamParams: + stream = new dom::quota::FileRandomAccessStream(); + break; + + default: + MOZ_ASSERT_UNREACHABLE("Unknown params!"); + return Err(false); + } + + MOZ_ASSERT(stream); + + if (!stream->Deserialize(aStreamParams)) { + MOZ_ASSERT_UNREACHABLE("Deserialize failed!"); + return Err(false); + } + + return WrapMovingNotNullUnchecked(std::move(stream)); +} + +Result, bool> DeserializeRandomAccessStream( + Maybe& aStreamParams) { + if (aStreamParams.isNothing()) { + return nsCOMPtr(); + } + + auto res = DeserializeRandomAccessStream(aStreamParams.ref()); + if (res.isErr()) { + return res.propagateErr(); + } + + MovingNotNull> stream = res.unwrap(); + + return std::move(stream).unwrapBasePtr(); +} + +} // namespace mozilla::ipc -- cgit v1.2.3