Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4723)

Unified Diff: chrome/browser/download/download_item.cc

Issue 3127008: Preliminary work on resuming downloads whose connections have expired.
Patch Set: Waiting to send download automation error message until after other downloads are canceled. Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_;

Powered by Google App Engine
This is Rietveld 408576698