|  | // Copyright 2012 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "content/browser/download/save_file.h" | 
|  |  | 
|  | #include "base/bind.h" | 
|  | #include "base/check.h" | 
|  | #include "base/notreached.h" | 
|  | #include "components/download/public/common/download_item.h" | 
|  | #include "components/download/public/common/download_task_runner.h" | 
|  | #include "third_party/abseil-cpp/absl/types/optional.h" | 
|  |  | 
|  | namespace content { | 
|  |  | 
|  | // TODO(asanka): SaveFile should use the target directory of the save package as | 
|  | //               the default download directory when initializing |file_|. | 
|  | //               Unfortunately, as it is, constructors of SaveFile don't always | 
|  | //               have access to the SavePackage at this point. | 
|  | SaveFile::SaveFile(std::unique_ptr<SaveFileCreateInfo> info, | 
|  | bool calculate_hash) | 
|  | : file_(download::DownloadItem::kInvalidId), info_(std::move(info)) { | 
|  | DCHECK(download::GetDownloadTaskRunner()->RunsTasksInCurrentSequence()); | 
|  |  | 
|  | DCHECK(info_); | 
|  | DCHECK(info_->path.empty()); | 
|  | } | 
|  |  | 
|  | SaveFile::~SaveFile() { | 
|  | DCHECK(download::GetDownloadTaskRunner()->RunsTasksInCurrentSequence()); | 
|  | } | 
|  |  | 
|  | download::DownloadInterruptReason SaveFile::Initialize() { | 
|  | int64_t bytes_wasted = 0; | 
|  | download::DownloadInterruptReason reason = file_.Initialize( | 
|  | /*full_path=*/base::FilePath(), /*default_directory=*/base::FilePath(), | 
|  | /*file=*/base::File(), /*bytes_so_far=*/0, /*hash_so_far=*/std::string(), | 
|  | /*hash_state=*/nullptr, /*is_sparse_file=*/false, | 
|  | /*bytes_wasted*/ &bytes_wasted); | 
|  | info_->path = FullPath(); | 
|  | return reason; | 
|  | } | 
|  |  | 
|  | download::DownloadInterruptReason SaveFile::AppendDataToFile(const char* data, | 
|  | size_t data_len) { | 
|  | return file_.AppendDataToFile(data, data_len); | 
|  | } | 
|  |  | 
|  | download::DownloadInterruptReason SaveFile::Rename( | 
|  | const base::FilePath& full_path) { | 
|  | return file_.Rename(full_path); | 
|  | } | 
|  |  | 
|  | void SaveFile::Detach() { | 
|  | file_.Detach(); | 
|  | } | 
|  |  | 
|  | void SaveFile::Cancel() { | 
|  | file_.Cancel(); | 
|  | } | 
|  |  | 
|  | void SaveFile::Finish() { | 
|  | file_.Finish(); | 
|  | } | 
|  |  | 
|  | void SaveFile::AnnotateWithSourceInformation( | 
|  | const std::string& client_guid, | 
|  | const GURL& source_url, | 
|  | const GURL& referrer_url, | 
|  | mojo::PendingRemote<quarantine::mojom::Quarantine> remote_quarantine, | 
|  | download::BaseFile::OnAnnotationDoneCallback on_annotation_done_callback) { | 
|  | file_.AnnotateWithSourceInformation(client_guid, source_url, referrer_url, | 
|  | std::move(remote_quarantine), | 
|  | std::move(on_annotation_done_callback)); | 
|  | } | 
|  |  | 
|  | base::FilePath SaveFile::FullPath() const { | 
|  | return file_.full_path(); | 
|  | } | 
|  |  | 
|  | bool SaveFile::InProgress() const { | 
|  | return file_.in_progress(); | 
|  | } | 
|  |  | 
|  | int64_t SaveFile::BytesSoFar() const { | 
|  | return file_.bytes_so_far(); | 
|  | } | 
|  |  | 
|  | std::string SaveFile::DebugString() const { | 
|  | return file_.DebugString(); | 
|  | } | 
|  |  | 
|  | }  // namespace content |