summaryrefslogtreecommitdiffstats
path: root/netwerk/base/nsAsyncStreamCopier.h
diff options
context:
space:
mode:
Diffstat (limited to 'netwerk/base/nsAsyncStreamCopier.h')
-rw-r--r--netwerk/base/nsAsyncStreamCopier.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/netwerk/base/nsAsyncStreamCopier.h b/netwerk/base/nsAsyncStreamCopier.h
new file mode 100644
index 000000000..7529a327a
--- /dev/null
+++ b/netwerk/base/nsAsyncStreamCopier.h
@@ -0,0 +1,83 @@
+/* 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/. */
+
+#ifndef nsAsyncStreamCopier_h__
+#define nsAsyncStreamCopier_h__
+
+#include "nsIAsyncStreamCopier.h"
+#include "nsIAsyncStreamCopier2.h"
+#include "mozilla/Mutex.h"
+#include "nsStreamUtils.h"
+#include "nsCOMPtr.h"
+
+class nsIRequestObserver;
+
+//-----------------------------------------------------------------------------
+
+class nsAsyncStreamCopier final : public nsIAsyncStreamCopier,
+ nsIAsyncStreamCopier2
+{
+public:
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIREQUEST
+ NS_DECL_NSIASYNCSTREAMCOPIER
+
+ // nsIAsyncStreamCopier2
+ // We declare it by hand instead of NS_DECL_NSIASYNCSTREAMCOPIER2
+ // as nsIAsyncStreamCopier2 duplicates methods of nsIAsyncStreamCopier
+ NS_IMETHOD Init(nsIInputStream *aSource,
+ nsIOutputStream *aSink,
+ nsIEventTarget *aTarget,
+ uint32_t aChunkSize,
+ bool aCloseSource,
+ bool aCloseSink) override;
+
+ nsAsyncStreamCopier();
+
+ //-------------------------------------------------------------------------
+ // these methods may be called on any thread
+
+ bool IsComplete(nsresult *status = nullptr);
+ void Complete(nsresult status);
+
+private:
+ virtual ~nsAsyncStreamCopier();
+
+ nsresult InitInternal(nsIInputStream *source,
+ nsIOutputStream *sink,
+ nsIEventTarget *target,
+ uint32_t chunkSize,
+ bool closeSource,
+ bool closeSink);
+
+ static void OnAsyncCopyComplete(void *, nsresult);
+
+ void AsyncCopyInternal();
+ nsresult ApplyBufferingPolicy();
+ nsIRequest* AsRequest();
+
+ nsCOMPtr<nsIInputStream> mSource;
+ nsCOMPtr<nsIOutputStream> mSink;
+
+ nsCOMPtr<nsIRequestObserver> mObserver;
+
+ nsCOMPtr<nsIEventTarget> mTarget;
+
+ nsCOMPtr<nsISupports> mCopierCtx;
+
+ mozilla::Mutex mLock;
+
+ nsAsyncCopyMode mMode;
+ uint32_t mChunkSize;
+ nsresult mStatus;
+ bool mIsPending;
+ bool mCloseSource;
+ bool mCloseSink;
+ bool mShouldSniffBuffering;
+
+ friend class ProceedWithAsyncCopy;
+ friend class AsyncApplyBufferingPolicyEvent;
+};
+
+#endif // !nsAsyncStreamCopier_h__