Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/download/download_manager_impl.h" | 5 #include "content/browser/download/download_manager_impl.h" |
| 6 | 6 |
| 7 #include <iterator> | 7 #include <iterator> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 349 delegate_->Shutdown(); | 349 delegate_->Shutdown(); |
| 350 delegate_ = NULL; | 350 delegate_ = NULL; |
| 351 } | 351 } |
| 352 | 352 |
| 353 void DownloadManagerImpl::StartDownload( | 353 void DownloadManagerImpl::StartDownload( |
| 354 scoped_ptr<DownloadCreateInfo> info, | 354 scoped_ptr<DownloadCreateInfo> info, |
| 355 scoped_ptr<ByteStreamReader> stream, | 355 scoped_ptr<ByteStreamReader> stream, |
| 356 const DownloadUrlParameters::OnStartedCallback& on_started) { | 356 const DownloadUrlParameters::OnStartedCallback& on_started) { |
| 357 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 357 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 358 DCHECK(info); | 358 DCHECK(info); |
| 359 // |stream| is only non-nil if the download request was successful. | |
| 360 DCHECK(info->interrupt_reason != DOWNLOAD_INTERRUPT_REASON_NONE || | |
| 361 stream.get()); | |
| 359 uint32 download_id = info->download_id; | 362 uint32 download_id = info->download_id; |
| 360 const bool new_download = (download_id == content::DownloadItem::kInvalidId); | 363 const bool new_download = (download_id == content::DownloadItem::kInvalidId); |
| 361 base::Callback<void(uint32)> got_id(base::Bind( | 364 base::Callback<void(uint32)> got_id(base::Bind( |
| 362 &DownloadManagerImpl::StartDownloadWithId, | 365 &DownloadManagerImpl::StartDownloadWithId, |
| 363 weak_factory_.GetWeakPtr(), | 366 weak_factory_.GetWeakPtr(), |
| 364 base::Passed(info.Pass()), | 367 base::Passed(info.Pass()), |
| 365 base::Passed(stream.Pass()), | 368 base::Passed(stream.Pass()), |
| 366 on_started, | 369 on_started, |
| 367 new_download)); | 370 new_download)); |
| 368 if (new_download) { | 371 if (new_download) { |
| 369 GetNextId(got_id); | 372 GetNextId(got_id); |
| 370 } else { | 373 } else { |
| 371 got_id.Run(download_id); | 374 got_id.Run(download_id); |
| 372 } | 375 } |
| 373 } | 376 } |
| 374 | 377 |
| 375 void DownloadManagerImpl::StartDownloadWithId( | 378 void DownloadManagerImpl::StartDownloadWithId( |
| 376 scoped_ptr<DownloadCreateInfo> info, | 379 scoped_ptr<DownloadCreateInfo> info, |
| 377 scoped_ptr<ByteStreamReader> stream, | 380 scoped_ptr<ByteStreamReader> byte_stream, |
| 378 const DownloadUrlParameters::OnStartedCallback& on_started, | 381 const DownloadUrlParameters::OnStartedCallback& on_started, |
| 379 bool new_download, | 382 bool new_download, |
| 380 uint32 id) { | 383 uint32 id) { |
| 381 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 384 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 382 DCHECK_NE(content::DownloadItem::kInvalidId, id); | 385 DCHECK_NE(content::DownloadItem::kInvalidId, id); |
| 383 DownloadItemImpl* download = NULL; | 386 DownloadItemImpl* download = NULL; |
| 384 if (new_download) { | 387 if (new_download) { |
| 385 download = CreateActiveItem(id, *info); | 388 download = CreateActiveItem(id, *info); |
| 386 } else { | 389 } else { |
| 387 DownloadMap::iterator item_iterator = downloads_.find(id); | 390 DownloadMap::iterator item_iterator = downloads_.find(id); |
| 388 // Trying to resume an interrupted download. | 391 // Trying to resume an interrupted download. |
| 389 if (item_iterator == downloads_.end() || | 392 if (item_iterator == downloads_.end() || |
| 390 (item_iterator->second->GetState() == DownloadItem::CANCELLED)) { | 393 (item_iterator->second->GetState() == DownloadItem::CANCELLED)) { |
| 391 // If the download is no longer known to the DownloadManager, then it was | 394 // If the download is no longer known to the DownloadManager, then it was |
| 392 // removed after it was resumed. Ignore. If the download is cancelled | 395 // removed after it was resumed. Ignore. If the download is cancelled |
| 393 // while resuming, then also ignore the request. | 396 // while resuming, then also ignore the request. |
| 394 info->request_handle.CancelRequest(); | 397 info->request_handle.CancelRequest(); |
| 395 if (!on_started.is_null()) | 398 if (!on_started.is_null()) |
| 396 on_started.Run(NULL, DOWNLOAD_INTERRUPT_REASON_USER_CANCELED); | 399 on_started.Run(NULL, DOWNLOAD_INTERRUPT_REASON_USER_CANCELED); |
| 397 return; | 400 return; |
| 398 } | 401 } |
| 399 download = item_iterator->second; | 402 download = item_iterator->second; |
| 400 DCHECK_EQ(DownloadItem::INTERRUPTED, download->GetState()); | 403 DCHECK_EQ(DownloadItem::INTERRUPTED, download->GetState()); |
| 401 download->MergeOriginInfoOnResume(*info); | |
| 402 } | 404 } |
| 403 | 405 |
| 404 base::FilePath default_download_directory; | 406 base::FilePath default_download_directory; |
| 405 if (delegate_) { | 407 if (delegate_) { |
| 406 base::FilePath website_save_directory; // Unused | 408 base::FilePath website_save_directory; // Unused |
| 407 bool skip_dir_check = false; // Unused | 409 bool skip_dir_check = false; // Unused |
| 408 delegate_->GetSaveDir(GetBrowserContext(), &website_save_directory, | 410 delegate_->GetSaveDir(GetBrowserContext(), &website_save_directory, |
| 409 &default_download_directory, &skip_dir_check); | 411 &default_download_directory, &skip_dir_check); |
| 410 } | 412 } |
| 411 | 413 |
| 412 // Create the download file and start the download. | 414 scoped_ptr<DownloadFile> download_file; |
| 413 scoped_ptr<DownloadFile> download_file( | |
| 414 file_factory_->CreateFile( | |
| 415 info->save_info.Pass(), default_download_directory, | |
| 416 info->url(), info->referrer_url, | |
| 417 delegate_ && delegate_->GenerateFileHash(), | |
| 418 stream.Pass(), download->GetBoundNetLog(), | |
| 419 download->DestinationObserverAsWeakPtr())); | |
| 420 | 415 |
| 421 // Attach the client ID identifying the app to the AV system. | 416 if (info->interrupt_reason == DOWNLOAD_INTERRUPT_REASON_NONE) { |
| 422 if (download_file.get() && delegate_) { | 417 DCHECK(byte_stream.get()); |
| 423 download_file->SetClientGuid( | 418 // Create the download file and start the download. |
| 424 delegate_->ApplicationClientIdForFileScanning()); | 419 download_file.reset( |
| 420 file_factory_->CreateFile(*info->save_info, | |
| 421 default_download_directory, | |
| 422 info->url(), | |
| 423 info->referrer_url, | |
| 424 delegate_ && delegate_->GenerateFileHash(), | |
| 425 info->save_info->file_stream.Pass(), | |
|
Randy Smith (Not in Mondays)
2014/03/18 21:07:28
Just curious: Why make this an explicit argument?
asanka
2014/03/19 20:37:06
The ownership of FileStream is being passed into t
| |
| 426 byte_stream.Pass(), | |
| 427 download->GetBoundNetLog(), | |
| 428 download->DestinationObserverAsWeakPtr())); | |
| 429 | |
| 430 // Attach the client ID identifying the app to the AV system. | |
| 431 if (download_file.get() && delegate_) { | |
| 432 download_file->SetClientGuid( | |
| 433 delegate_->ApplicationClientIdForFileScanning()); | |
| 434 } | |
| 425 } | 435 } |
| 426 | 436 |
| 437 // OnDownloadCreated notification needs to be issued before Start() is called | |
| 438 // so that observers can choose to observe the initial state transition that | |
| 439 // happens during DownloadItem::Start(). Active DownloadItems are created in | |
| 440 // an IN_PROGRESS state. If the download is already interrupted, then Start() | |
| 441 // will transition the download to INTERRUPTED. This is currently the only | |
| 442 // distinction between a download created in response to an interrupted | |
| 443 // request, and an interrupted download being recreated from history. | |
|
Randy Smith (Not in Mondays)
2014/03/18 21:07:28
How are you dealing with the issue in the deleted
Randy Smith (Not in Mondays)
2014/03/18 21:07:28
As an alternative to the above comment, we could j
Randy Smith (Not in Mondays)
2014/03/18 21:07:28
The above thoughts bring up a side issue: When we'
asanka
2014/03/19 20:37:06
I've been mulling a STARTING state as mentioned el
asanka
2014/03/19 20:37:06
Yeah. The consumer is supposed to see an OnDownloa
| |
| 444 if (new_download) | |
| 445 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated(this, download)); | |
| 446 | |
| 427 scoped_ptr<DownloadRequestHandleInterface> req_handle( | 447 scoped_ptr<DownloadRequestHandleInterface> req_handle( |
| 428 new DownloadRequestHandle(info->request_handle)); | 448 new DownloadRequestHandle(info->request_handle)); |
| 429 download->Start(download_file.Pass(), req_handle.Pass()); | 449 download->Start(download_file.Pass(), req_handle.Pass(), *info); |
| 430 | |
| 431 // For interrupted downloads, Start() will transition the state to | |
| 432 // IN_PROGRESS and consumers will be notified via OnDownloadUpdated(). | |
| 433 // For new downloads, we notify here, rather than earlier, so that | |
| 434 // the download_file is bound to download and all the usual | |
| 435 // setters (e.g. Cancel) work. | |
| 436 if (new_download) | |
| 437 FOR_EACH_OBSERVER(Observer, observers_, OnDownloadCreated(this, download)); | |
| 438 | 450 |
| 439 if (!on_started.is_null()) | 451 if (!on_started.is_null()) |
| 440 on_started.Run(download, DOWNLOAD_INTERRUPT_REASON_NONE); | 452 on_started.Run(download, info->interrupt_reason); |
|
Randy Smith (Not in Mondays)
2014/03/18 21:07:28
nit: This violates the contract on started_cb desc
asanka
2014/03/19 20:37:06
Done.
| |
| 441 } | 453 } |
| 442 | 454 |
| 443 void DownloadManagerImpl::CheckForHistoryFilesRemoval() { | 455 void DownloadManagerImpl::CheckForHistoryFilesRemoval() { |
| 444 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 456 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 445 for (DownloadMap::iterator it = downloads_.begin(); | 457 for (DownloadMap::iterator it = downloads_.begin(); |
| 446 it != downloads_.end(); ++it) { | 458 it != downloads_.end(); ++it) { |
| 447 DownloadItemImpl* item = it->second; | 459 DownloadItemImpl* item = it->second; |
| 448 CheckForFileRemoval(item); | 460 CheckForFileRemoval(item); |
| 449 } | 461 } |
| 450 } | 462 } |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 708 if (delegate_) | 720 if (delegate_) |
| 709 delegate_->OpenDownload(download); | 721 delegate_->OpenDownload(download); |
| 710 } | 722 } |
| 711 | 723 |
| 712 void DownloadManagerImpl::ShowDownloadInShell(DownloadItemImpl* download) { | 724 void DownloadManagerImpl::ShowDownloadInShell(DownloadItemImpl* download) { |
| 713 if (delegate_) | 725 if (delegate_) |
| 714 delegate_->ShowDownloadInShell(download); | 726 delegate_->ShowDownloadInShell(download); |
| 715 } | 727 } |
| 716 | 728 |
| 717 } // namespace content | 729 } // namespace content |
| OLD | NEW |