Backed out 8 changesets (bug 1873776) for causing vendor failures. CLOSED TREE
[gecko.git] / dom / fs / child / FileSystemAsyncCopy.cpp
blob782d67b5cd7bbf1e4b1cf2a32410db62205be9c3
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);
28 });
30 mCompleteCallbackWrapper = MakeUnique<MoveOnlyFunction<void(nsresult)>>(
31 [completeCallback =
32 std::move(aCompleteCallback)](nsresult rv) mutable {
33 auto callback = std::move(completeCallback);
34 callback(rv);
35 });
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));
45 QM_TRY(
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);
57 })),
58 [callbackClosure](nsresult rv) {
59 delete callbackClosure;
60 return rv;
61 });
63 return NS_OK;
66 } // namespace mozilla::dom::fs