/* -*- 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