summaryrefslogtreecommitdiffstats
path: root/dom/quota/DecryptingInputStream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/quota/DecryptingInputStream.cpp')
-rw-r--r--dom/quota/DecryptingInputStream.cpp98
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