| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import "ios/web/download/download_native_task_impl.h" |
| |
| #import "base/functional/bind.h" |
| #import "base/functional/callback.h" |
| #import "base/notreached.h" |
| #import "base/strings/sys_string_conversions.h" |
| #import "base/task/sequenced_task_runner.h" |
| #import "ios/web/download/download_native_task_bridge.h" |
| |
| namespace web { |
| |
| DownloadNativeTaskImpl::DownloadNativeTaskImpl( |
| WebState* web_state, |
| const GURL& original_url, |
| NSString* http_method, |
| const std::string& content_disposition, |
| int64_t total_bytes, |
| const std::string& mime_type, |
| NSString* identifier, |
| const scoped_refptr<base::SequencedTaskRunner>& task_runner, |
| DownloadNativeTaskBridge* download) |
| : DownloadTaskImpl(web_state, |
| original_url, |
| http_method, |
| content_disposition, |
| total_bytes, |
| mime_type, |
| identifier, |
| task_runner), |
| download_bridge_(download) { |
| DCHECK(download_bridge_); |
| } |
| |
| DownloadNativeTaskImpl::~DownloadNativeTaskImpl() { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| CancelInternal(); |
| } |
| |
| void DownloadNativeTaskImpl::StartInternal(const base::FilePath& path) { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| DCHECK(!path.empty()); |
| DCHECK(download_bridge_); |
| |
| NativeDownloadTaskProgressCallback progress_callback = base::BindRepeating( |
| &DownloadNativeTaskImpl::OnDownloadProgress, weak_factory_.GetWeakPtr()); |
| |
| NativeDownloadTaskResponseCallback response_callback = base::BindOnce( |
| &DownloadNativeTaskImpl::OnResponseReceived, weak_factory_.GetWeakPtr()); |
| |
| NativeDownloadTaskCompleteCallback complete_callback = base::BindOnce( |
| &DownloadNativeTaskImpl::OnDownloadFinished, weak_factory_.GetWeakPtr()); |
| |
| [download_bridge_ startDownload:path |
| progressCallback:std::move(progress_callback) |
| responseCallback:std::move(response_callback) |
| completeCallback:std::move(complete_callback)]; |
| } |
| |
| void DownloadNativeTaskImpl::CancelInternal() { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| weak_factory_.InvalidateWeakPtrs(); |
| [download_bridge_ cancel]; |
| download_bridge_ = nil; |
| } |
| |
| std::string DownloadNativeTaskImpl::GetSuggestedName() const { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| return base::SysNSStringToUTF8(download_bridge_.suggestedFilename); |
| } |
| |
| void DownloadNativeTaskImpl::OnDownloadProgress(int64_t bytes_received, |
| int64_t total_bytes, |
| double fraction_complete) { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| total_bytes_ = total_bytes; |
| received_bytes_ = bytes_received; |
| percent_complete_ = static_cast<int>(fraction_complete * 100); |
| OnDownloadUpdated(); |
| } |
| |
| void DownloadNativeTaskImpl::OnResponseReceived(int http_error_code, |
| NSString* mime_type) { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| http_code_ = http_error_code; |
| if (mime_type.length) { |
| mime_type_ = base::SysNSStringToUTF8(mime_type); |
| } |
| } |
| |
| } // namespace web |