1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/download/internal/common/download_file_with_copy.h"
#include "base/files/file_util.h"
#include "base/functional/bind.h"
#include "base/task/sequenced_task_runner.h"
#include "components/download/database/download_db.h"
#include "components/download/database/download_db_conversions.h"
#include "components/download/database/download_db_entry.h"
#include "components/download/public/common/download_destination_observer.h"
#include "components/download/public/common/download_features.h"
#include "components/download/public/common/download_stats.h"
#include "components/download/public/common/download_utils.h"
#include "crypto/secure_hash.h"
namespace download {
namespace {
void OnRenameComplete(const base::FilePath& file_path,
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
DownloadFile::RenameCompletionCallback callback) {
task_runner->PostTask(
FROM_HERE, base::BindOnce(std::move(callback),
DOWNLOAD_INTERRUPT_REASON_NONE, file_path));
}
} // namespace
DownloadFileWithCopy::DownloadFileWithCopy(
const base::FilePath& file_path_to_copy,
base::WeakPtr<DownloadDestinationObserver> observer)
: file_path_to_copy_(file_path_to_copy),
main_task_runner_(base::SingleThreadTaskRunner::GetCurrentDefault()),
observer_(observer) {}
DownloadFileWithCopy::~DownloadFileWithCopy() = default;
void DownloadFileWithCopy::Initialize(
InitializeCallback initialize_callback,
CancelRequestCallback cancel_request_callback,
const DownloadItem::ReceivedSlices& received_slices) {
main_task_runner_->PostTask(
FROM_HERE, base::BindOnce(std::move(initialize_callback),
DOWNLOAD_INTERRUPT_REASON_NONE, 0));
}
void DownloadFileWithCopy::AddInputStream(std::unique_ptr<InputStream> stream,
int64_t offset) {}
void DownloadFileWithCopy::RenameAndUniquify(
const base::FilePath& full_path,
RenameCompletionCallback callback) {
base::File file(file_path_to_copy_,
base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ);
int64_t file_size = file.GetLength();
OnRenameComplete(full_path, main_task_runner_, std::move(callback));
main_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(&DownloadDestinationObserver::DestinationCompleted,
observer_, file_size, nullptr));
}
void DownloadFileWithCopy::RenameAndAnnotate(
const base::FilePath& full_path,
const std::string& client_guid,
const GURL& source_url,
const GURL& referrer_url,
const std::optional<url::Origin>& request_initiator,
mojo::PendingRemote<quarantine::mojom::Quarantine> remote_quarantine,
RenameCompletionCallback callback) {
if (full_path != file_path_to_copy_) {
base::CopyFile(file_path_to_copy_, full_path);
}
OnRenameComplete(full_path, main_task_runner_, std::move(callback));
}
void DownloadFileWithCopy::Detach() {}
void DownloadFileWithCopy::Cancel() {}
void DownloadFileWithCopy::SetPotentialFileLength(int64_t length) {}
const base::FilePath& DownloadFileWithCopy::FullPath() const {
return file_path_to_copy_;
}
bool DownloadFileWithCopy::InProgress() const {
return true;
}
void DownloadFileWithCopy::Pause() {}
void DownloadFileWithCopy::Resume() {}
#if BUILDFLAG(IS_ANDROID)
void DownloadFileWithCopy::PublishDownload(RenameCompletionCallback callback) {
// This shouldn't get called.
DCHECK(false);
}
#endif // BUILDFLAG(IS_ANDROID)
} // namespace download
|