Index: chrome/browser/download/download_item.cc |
diff --git a/chrome/browser/download/download_item.cc b/chrome/browser/download/download_item.cc |
index 787b8ad0a7165468337af6138e6c3de77339601d..4275e08548ab2adff611997813de962476eab1e8 100644 |
--- a/chrome/browser/download/download_item.cc |
+++ b/chrome/browser/download/download_item.cc |
@@ -48,6 +48,7 @@ DownloadItem::DownloadItem(DownloadManager* download_manager, |
original_mime_type_(info.original_mime_type), |
total_bytes_(info.total_bytes), |
received_bytes_(info.received_bytes), |
+ last_os_error_(0), |
start_tick_(base::TimeTicks()), |
state_(static_cast<DownloadState>(info.state)), |
start_time_(info.start_time), |
@@ -85,6 +86,7 @@ DownloadItem::DownloadItem(DownloadManager* download_manager, |
original_mime_type_(info.original_mime_type), |
total_bytes_(info.total_bytes), |
received_bytes_(0), |
+ last_os_error_(0), |
start_tick_(base::TimeTicks::Now()), |
state_(IN_PROGRESS), |
start_time_(info.start_time), |
@@ -101,7 +103,8 @@ DownloadItem::DownloadItem(DownloadManager* download_manager, |
is_otr_(is_otr), |
is_extension_install_(info.is_extension_install), |
name_finalized_(false), |
- is_temporary_(!info.save_info.file_path.empty()), |
+ is_temporary_(!info.save_info.file_path.empty() && |
+ !info.is_partial_download), |
need_final_rename_(false), |
opened_(false) { |
Init(true /* start progress timer */); |
@@ -121,6 +124,7 @@ DownloadItem::DownloadItem(DownloadManager* download_manager, |
original_mime_type_(std::string()), |
total_bytes_(0), |
received_bytes_(0), |
+ last_os_error_(0), |
start_tick_(base::TimeTicks::Now()), |
state_(IN_PROGRESS), |
start_time_(base::Time::Now()), |
@@ -186,9 +190,9 @@ void DownloadItem::OpenFilesBasedOnExtension(bool open) { |
} |
void DownloadItem::OpenDownload() { |
- if (state() == DownloadItem::IN_PROGRESS) { |
+ if (state() == IN_PROGRESS) { |
open_when_complete_ = !open_when_complete_; |
- } else if (state() == DownloadItem::COMPLETE) { |
+ } else if (state() == COMPLETE) { |
opened_ = true; |
FOR_EACH_OBSERVER(Observer, observers_, OnDownloadOpened(this)); |
if (is_extension_install()) { |
@@ -250,14 +254,18 @@ void DownloadItem::Update(int64 bytes_so_far) { |
NOTREACHED(); |
return; |
} |
+ // May get called once in the INTERRUPTED state. |
+ if (state_ == INTERRUPTED) |
+ return; |
UpdateSize(bytes_so_far); |
UpdateObservers(); |
} |
// Triggered by a user action. |
void DownloadItem::Cancel(bool update_history) { |
- if (state_ != IN_PROGRESS) { |
- // Small downloads might be complete before this method has a chance to run. |
+ if (!IsPartialDownload()) { |
+ // Small downloads might be complete or interrupted before this method has |
+ // a chance to run. |
return; |
} |
state_ = CANCELLED; |
@@ -303,6 +311,23 @@ void DownloadItem::Finished() { |
NotifyObserversDownloadFileCompleted(); |
} |
+void DownloadItem::Interrupted(int64 size, int os_error) { |
+ if (state_ != IN_PROGRESS) |
+ return; |
+ state_ = INTERRUPTED; |
+ last_os_error_ = os_error; |
+ UpdateSize(size); |
+ StopProgressTimer(); |
+} |
+ |
+void DownloadItem::Resumed(int new_request_id) { |
+ if (state_ != INTERRUPTED) |
+ return; |
+ state_ = IN_PROGRESS; |
+ request_id_ = new_request_id; |
+ StartProgressTimer(); |
+} |
+ |
void DownloadItem::Remove(bool delete_on_disk) { |
Cancel(true); |
state_ = REMOVING; |
@@ -348,9 +373,13 @@ void DownloadItem::Rename(const FilePath& full_path) { |
} |
void DownloadItem::TogglePause() { |
- DCHECK(state_ == IN_PROGRESS); |
- download_manager_->PauseDownload(id_, !is_paused_); |
- is_paused_ = !is_paused_; |
+ DCHECK(IsPartialDownload()); |
+ if (state_ == IN_PROGRESS) { |
+ download_manager_->PauseDownload(id_, !is_paused_); |
+ is_paused_ = !is_paused_; |
+ } else { |
+ download_manager_->RestartDownload(id_); |
+ } |
UpdateObservers(); |
} |
@@ -393,6 +422,14 @@ bool DownloadItem::MatchesQuery(const string16& query) const { |
return false; |
} |
+bool DownloadItem::IsPartialDownload() const { |
+ return (state_ == IN_PROGRESS) || (state_ == INTERRUPTED); |
+} |
+ |
+bool DownloadItem::IsInterruptedDownload() const { |
+ return (state_ == INTERRUPTED); |
+} |
+ |
FilePath DownloadItem::GetFileName() const { |
if (safety_state_ == DownloadItem::SAFE) |
return file_name_; |