diff options
Diffstat (limited to 'dom/quota/DecryptingInputStream.cpp')
-rw-r--r-- | dom/quota/DecryptingInputStream.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/dom/quota/DecryptingInputStream.cpp b/dom/quota/DecryptingInputStream.cpp new file mode 100644 index 0000000000..939b1e3ad7 --- /dev/null +++ b/dom/quota/DecryptingInputStream.cpp @@ -0,0 +1,98 @@ +/* -*- 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 "DecryptingInputStream.h" +#include "DecryptingInputStream_impl.h" + +#include "nsStreamUtils.h" + +namespace mozilla::dom::quota { + +NS_IMPL_ADDREF(DecryptingInputStreamBase); +NS_IMPL_RELEASE(DecryptingInputStreamBase); + +NS_INTERFACE_MAP_BEGIN(DecryptingInputStreamBase) + NS_INTERFACE_MAP_ENTRY(nsIInputStream) + NS_INTERFACE_MAP_ENTRY(nsISeekableStream) + NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsICloneableInputStream, + mBaseCloneableInputStream || !mBaseStream) + NS_INTERFACE_MAP_ENTRY_CONDITIONAL( + nsIIPCSerializableInputStream, + mBaseIPCSerializableInputStream || !mBaseStream) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIInputStream) +NS_INTERFACE_MAP_END + +DecryptingInputStreamBase::DecryptingInputStreamBase( + MovingNotNull<nsCOMPtr<nsIInputStream>> aBaseStream, size_t aBlockSize) { + Init(std::move(aBaseStream), aBlockSize); +} + +void DecryptingInputStreamBase::Init( + MovingNotNull<nsCOMPtr<nsIInputStream>> aBaseStream, size_t aBlockSize) { + mBlockSize.init(aBlockSize); + mBaseStream.init(std::move(aBaseStream)); + + const nsCOMPtr<nsISeekableStream> seekableStream = + do_QueryInterface(mBaseStream->get()); + MOZ_ASSERT(seekableStream && + SameCOMIdentity(mBaseStream->get(), seekableStream)); + mBaseSeekableStream.init(WrapNotNullUnchecked(seekableStream)); + + const nsCOMPtr<nsICloneableInputStream> cloneableInputStream = + do_QueryInterface(mBaseStream->get()); + if (cloneableInputStream && + SameCOMIdentity(mBaseStream->get(), cloneableInputStream)) { + mBaseCloneableInputStream.init(WrapNotNullUnchecked(cloneableInputStream)); + } + + const nsCOMPtr<nsIIPCSerializableInputStream> ipcSerializeInputStream = + do_QueryInterface(mBaseStream->get()); + if (ipcSerializeInputStream && + SameCOMIdentity(mBaseStream->get(), ipcSerializeInputStream)) { + mBaseIPCSerializableInputStream.init( + WrapNotNullUnchecked(ipcSerializeInputStream)); + } +} + +NS_IMETHODIMP DecryptingInputStreamBase::Read(char* aBuf, uint32_t aCount, + uint32_t* aBytesReadOut) { + return ReadSegments(NS_CopySegmentToBuffer, aBuf, aCount, aBytesReadOut); +} + +NS_IMETHODIMP DecryptingInputStreamBase::IsNonBlocking(bool* aNonBlockingOut) { + *aNonBlockingOut = false; + return NS_OK; +} + +NS_IMETHODIMP DecryptingInputStreamBase::SetEOF() { + // Cannot truncate a read-only stream. + + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP DecryptingInputStreamBase::GetCloneable(bool* aCloneable) { + *aCloneable = true; + return NS_OK; +} + +void DecryptingInputStreamBase::SerializedComplexity(uint32_t aMaxSize, + uint32_t* aSizeUsed, + uint32_t* aPipes, + uint32_t* aTransferables) { + (*mBaseIPCSerializableInputStream) + ->SerializedComplexity(aMaxSize, aSizeUsed, aPipes, aTransferables); +} + +size_t DecryptingInputStreamBase::PlainLength() const { + MOZ_ASSERT(mNextByte <= mPlainBytes); + return mPlainBytes - mNextByte; +} + +size_t DecryptingInputStreamBase::EncryptedBufferLength() const { + return *mBlockSize; +} + +} // namespace mozilla::dom::quota |