1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "fs/FileSystemAsyncCopy.h"
9 #include "fs/FileSystemConstants.h"
10 #include "mozilla/MozPromise.h"
11 #include "mozilla/dom/Promise.h"
12 #include "mozilla/dom/quota/QuotaCommon.h"
13 #include "mozilla/dom/quota/ResultExtensions.h"
15 namespace mozilla::dom::fs
{
17 nsresult
AsyncCopy(nsIInputStream
* aSource
, nsIOutputStream
* aSink
,
18 nsISerialEventTarget
* aIOTarget
, const nsAsyncCopyMode aMode
,
19 const bool aCloseSource
, const bool aCloseSink
,
20 std::function
<void(uint32_t)>&& aProgressCallback
,
21 MoveOnlyFunction
<void(nsresult
)>&& aCompleteCallback
) {
22 struct CallbackClosure
{
23 CallbackClosure(std::function
<void(uint32_t)>&& aProgressCallback
,
24 MoveOnlyFunction
<void(nsresult
)>&& aCompleteCallback
) {
25 mProgressCallbackWrapper
= MakeUnique
<std::function
<void(uint32_t)>>(
26 [progressCallback
= std::move(aProgressCallback
)](uint32_t count
) {
27 progressCallback(count
);
30 mCompleteCallbackWrapper
= MakeUnique
<MoveOnlyFunction
<void(nsresult
)>>(
32 std::move(aCompleteCallback
)](nsresult rv
) mutable {
33 auto callback
= std::move(completeCallback
);
38 UniquePtr
<std::function
<void(uint32_t)>> mProgressCallbackWrapper
;
39 UniquePtr
<MoveOnlyFunction
<void(nsresult
)>> mCompleteCallbackWrapper
;
42 auto* callbackClosure
= new CallbackClosure(std::move(aProgressCallback
),
43 std::move(aCompleteCallback
));
46 MOZ_TO_RESULT(NS_AsyncCopy(
47 aSource
, aSink
, aIOTarget
, aMode
, kStreamCopyBlockSize
,
48 [](void* aClosure
, nsresult aRv
) {
49 auto* callbackClosure
= static_cast<CallbackClosure
*>(aClosure
);
50 (*callbackClosure
->mCompleteCallbackWrapper
)(aRv
);
51 delete callbackClosure
;
53 callbackClosure
, aCloseSource
, aCloseSink
, /* aCopierCtx */ nullptr,
54 [](void* aClosure
, uint32_t aCount
) {
55 auto* callbackClosure
= static_cast<CallbackClosure
*>(aClosure
);
56 (*callbackClosure
->mProgressCallbackWrapper
)(aCount
);
58 [callbackClosure
](nsresult rv
) {
59 delete callbackClosure
;
66 } // namespace mozilla::dom::fs