Index: update_attempter.cc |
diff --git a/update_attempter.cc b/update_attempter.cc |
index 2db91a6cf9f52aaa7d708a50f6c90e87aa062f3a..f408d82ed982779b806f5639a0426c8bc6b4aac7 100644 |
--- a/update_attempter.cc |
+++ b/update_attempter.cc |
@@ -10,8 +10,8 @@ |
#endif // _POSIX_C_SOURCE |
#include <time.h> |
-#include <tr1/memory> |
#include <string> |
+#include <tr1/memory> |
#include <vector> |
#include <glib.h> |
@@ -21,6 +21,7 @@ |
#include "update_engine/download_action.h" |
#include "update_engine/filesystem_copier_action.h" |
#include "update_engine/libcurl_http_fetcher.h" |
+#include "update_engine/multi_http_fetcher.h" |
#include "update_engine/omaha_request_action.h" |
#include "update_engine/omaha_request_params.h" |
#include "update_engine/omaha_response_handler_action.h" |
@@ -31,6 +32,7 @@ |
using base::TimeDelta; |
using base::TimeTicks; |
+using std::make_pair; |
using std::tr1::shared_ptr; |
using std::string; |
using std::vector; |
@@ -153,7 +155,7 @@ void UpdateAttempter::Update(const std::string& app_version, |
OmahaEvent::kTypeUpdateDownloadStarted), |
new LibcurlHttpFetcher)); |
shared_ptr<DownloadAction> download_action( |
- new DownloadAction(prefs_, new LibcurlHttpFetcher)); |
+ new DownloadAction(prefs_, new MultiHttpFetcher<LibcurlHttpFetcher>)); |
shared_ptr<OmahaRequestAction> download_finished_action( |
new OmahaRequestAction(prefs_, |
omaha_request_params_, |
@@ -174,6 +176,7 @@ void UpdateAttempter::Update(const std::string& app_version, |
download_action->set_delegate(this); |
response_handler_action_ = response_handler_action; |
+ download_action_ = download_action; |
actions_.push_back(shared_ptr<AbstractAction>(update_check_action)); |
actions_.push_back(shared_ptr<AbstractAction>(response_handler_action)); |
@@ -254,9 +257,10 @@ void UpdateAttempter::ProcessingDone(const ActionProcessor* processor, |
} |
if (code == kActionCodeSuccess) { |
- SetStatusAndNotify(UPDATE_STATUS_UPDATED_NEED_REBOOT); |
utils::WriteFile(kUpdateCompletedMarker, "", 0); |
prefs_->SetInt64(kPrefsDeltaUpdateFailures, 0); |
+ DeltaPerformer::ResetUpdateProgress(prefs_, false); |
+ SetStatusAndNotify(UPDATE_STATUS_UPDATED_NEED_REBOOT); |
// Report the time it took to update the system. |
int64_t update_time = time(NULL) - last_checked_time_; |
@@ -327,20 +331,18 @@ void UpdateAttempter::ActionCompleted(ActionProcessor* processor, |
} |
// Find out which action completed. |
if (type == OmahaResponseHandlerAction::StaticType()) { |
- // Note that the status will be updated to DOWNLOADING when some |
- // bytes get actually downloaded from the server and the |
- // BytesReceived callback is invoked. This avoids notifying the |
- // user that a download has started in cases when the server and |
- // the client are unable to initiate the download. |
- OmahaResponseHandlerAction* omaha_response_handler_action = |
- dynamic_cast<OmahaResponseHandlerAction*>(action); |
- CHECK(omaha_response_handler_action); |
- const InstallPlan& plan = omaha_response_handler_action->install_plan(); |
+ // Note that the status will be updated to DOWNLOADING when some bytes get |
+ // actually downloaded from the server and the BytesReceived callback is |
+ // invoked. This avoids notifying the user that a download has started in |
+ // cases when the server and the client are unable to initiate the download. |
+ CHECK(action == response_handler_action_.get()); |
+ const InstallPlan& plan = response_handler_action_->install_plan(); |
last_checked_time_ = time(NULL); |
// TODO(adlr): put version in InstallPlan |
new_version_ = "0.0.0.0"; |
new_size_ = plan.size; |
is_full_update_ = plan.is_full_update; |
+ SetupDownload(); |
SetupPriorityManagement(); |
} else if (type == DownloadAction::StaticType()) { |
SetStatusAndNotify(UPDATE_STATUS_FINALIZING); |
@@ -517,6 +519,11 @@ void UpdateAttempter::DisableDeltaUpdateIfNeeded() { |
void UpdateAttempter::MarkDeltaUpdateFailure() { |
CHECK(!is_full_update_); |
+ // If a delta update fails after the downloading phase, don't try to resume it |
+ // the next time. |
+ if (status_ > UPDATE_STATUS_DOWNLOADING) { |
+ DeltaPerformer::ResetUpdateProgress(prefs_, false); |
+ } |
int64_t delta_failures; |
if (!prefs_->GetInt64(kPrefsDeltaUpdateFailures, &delta_failures) || |
delta_failures < 0) { |
@@ -525,4 +532,22 @@ void UpdateAttempter::MarkDeltaUpdateFailure() { |
prefs_->SetInt64(kPrefsDeltaUpdateFailures, ++delta_failures); |
} |
+void UpdateAttempter::SetupDownload() { |
+ MultiHttpFetcher<LibcurlHttpFetcher>* fetcher = |
+ dynamic_cast<MultiHttpFetcher<LibcurlHttpFetcher>*>( |
+ download_action_->http_fetcher()); |
+ MultiHttpFetcher<LibcurlHttpFetcher>::RangesVect ranges; |
+ if (response_handler_action_->install_plan().is_resume) { |
+ int64_t manifest_metadata_size = 0; |
+ prefs_->GetInt64(kPrefsManifestMetadataSize, &manifest_metadata_size); |
+ int64_t next_data_offset = 0; |
+ prefs_->GetInt64(kPrefsUpdateStateNextDataOffset, &next_data_offset); |
+ ranges.push_back(make_pair(0, manifest_metadata_size)); |
+ ranges.push_back(make_pair(manifest_metadata_size + next_data_offset, -1)); |
+ } else { |
+ ranges.push_back(make_pair(0, -1)); |
+ } |
+ fetcher->set_ranges(ranges); |
+} |
+ |
} // namespace chromeos_update_engine |