| Index: download_action.cc
|
| diff --git a/download_action.cc b/download_action.cc
|
| index c17d7e26f7af1a17c5b440477e7ae79788e0ff67..d06fb790c44596df512403af6849296a796ca80c 100644
|
| --- a/download_action.cc
|
| +++ b/download_action.cc
|
| @@ -25,6 +25,7 @@ DownloadAction::DownloadAction(PrefsInterface* prefs,
|
| : prefs_(prefs),
|
| writer_(NULL),
|
| http_fetcher_(http_fetcher),
|
| + code_(kActionCodeSuccess),
|
| delegate_(NULL),
|
| bytes_received_(0) {}
|
|
|
| @@ -101,10 +102,12 @@ void DownloadAction::TerminateProcessing() {
|
| LOG_IF(WARNING, writer_->Close() != 0) << "Error closing the writer.";
|
| writer_ = NULL;
|
| }
|
| - http_fetcher_->TerminateTransfer();
|
| if (delegate_) {
|
| delegate_->SetDownloadStatus(false); // Set to inactive.
|
| }
|
| + // Terminates the transfer. The action is terminated, if necessary, when the
|
| + // TransferTerminated callback is received.
|
| + http_fetcher_->TerminateTransfer();
|
| }
|
|
|
| void DownloadAction::SeekToOffset(off_t offset) {
|
| @@ -119,8 +122,11 @@ void DownloadAction::ReceivedBytes(HttpFetcher *fetcher,
|
| delegate_->BytesReceived(bytes_received_, install_plan_.size);
|
| if (writer_ && writer_->Write(bytes, length) < 0) {
|
| LOG(ERROR) << "Write error -- terminating processing.";
|
| + // Don't tell the action processor that the action is complete until we get
|
| + // the TransferTerminated callback. Otherwise, this and the HTTP fetcher
|
| + // objects may get destroyed before all callbacks are complete.
|
| + code_ = kActionCodeDownloadWriteError;
|
| TerminateProcessing();
|
| - processor_->ActionComplete(this, kActionCodeDownloadWriteError);
|
| return;
|
| }
|
| // DeltaPerformer checks the hashes for delta updates.
|
| @@ -194,4 +200,10 @@ void DownloadAction::TransferComplete(HttpFetcher *fetcher, bool successful) {
|
| processor_->ActionComplete(this, code);
|
| }
|
|
|
| +void DownloadAction::TransferTerminated(HttpFetcher *fetcher) {
|
| + if (code_ != kActionCodeSuccess) {
|
| + processor_->ActionComplete(this, code_);
|
| + }
|
| +}
|
| +
|
| }; // namespace {}
|
|
|