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

Side by Side Diff: chrome/browser/component_updater/component_updater_service.cc

Issue 105853002: Implement a background downloader using BITS in Windows Chrome. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed error codes. Created 7 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "chrome/browser/component_updater/component_updater_service.h" 5 #include "chrome/browser/component_updater/component_updater_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 enum StepDelayInterval { 256 enum StepDelayInterval {
257 kStepDelayShort = 0, 257 kStepDelayShort = 0,
258 kStepDelayMedium, 258 kStepDelayMedium,
259 kStepDelayLong, 259 kStepDelayLong,
260 }; 260 };
261 261
262 void OnParseUpdateResponseSucceeded( 262 void OnParseUpdateResponseSucceeded(
263 const component_updater::UpdateResponse::Results& results); 263 const component_updater::UpdateResponse::Results& results);
264 void OnParseUpdateResponseFailed(const std::string& error_message); 264 void OnParseUpdateResponseFailed(const std::string& error_message);
265 265
266 void DownloadComplete(scoped_ptr<CRXContext> crx_context, 266 void DownloadComplete(
267 int error, 267 scoped_ptr<CRXContext> crx_context,
268 const base::FilePath& response); 268 const component_updater::CrxDownloader::Result& download_result);
269 269
270 Status OnDemandUpdateInternal(CrxUpdateItem* item); 270 Status OnDemandUpdateInternal(CrxUpdateItem* item);
271 271
272 void ProcessPendingItems(); 272 void ProcessPendingItems();
273 273
274 CrxUpdateItem* FindReadyComponent(); 274 CrxUpdateItem* FindReadyComponent();
275 275
276 void UpdateComponent(CrxUpdateItem* workitem); 276 void UpdateComponent(CrxUpdateItem* workitem);
277 277
278 void AddItemToUpdateCheck(CrxUpdateItem* item, 278 void AddItemToUpdateCheck(CrxUpdateItem* item,
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 crx_context->installer = workitem->component.installer; 666 crx_context->installer = workitem->component.installer;
667 crx_context->fingerprint = workitem->next_fp; 667 crx_context->fingerprint = workitem->next_fp;
668 GURL package_url; 668 GURL package_url;
669 if (CanTryDiffUpdate(workitem, *config_)) { 669 if (CanTryDiffUpdate(workitem, *config_)) {
670 package_url = workitem->diff_crx_url; 670 package_url = workitem->diff_crx_url;
671 ChangeItemState(workitem, CrxUpdateItem::kDownloadingDiff); 671 ChangeItemState(workitem, CrxUpdateItem::kDownloadingDiff);
672 } else { 672 } else {
673 package_url = workitem->crx_url; 673 package_url = workitem->crx_url;
674 ChangeItemState(workitem, CrxUpdateItem::kDownloading); 674 ChangeItemState(workitem, CrxUpdateItem::kDownloading);
675 } 675 }
676
677 // On demand component updates are always downloaded in foreground.
678 const bool is_background_download = !workitem->on_demand &&
679 config_->UseBackgroundDownloader();
680
676 crx_downloader_.reset(component_updater::CrxDownloader::Create( 681 crx_downloader_.reset(component_updater::CrxDownloader::Create(
682 is_background_download,
677 config_->RequestContext(), 683 config_->RequestContext(),
678 blocking_task_runner_, 684 blocking_task_runner_,
679 base::Bind(&CrxUpdateService::DownloadComplete, 685 base::Bind(&CrxUpdateService::DownloadComplete,
680 base::Unretained(this), 686 base::Unretained(this),
681 base::Passed(&crx_context)))); 687 base::Passed(&crx_context))));
682 crx_downloader_->StartDownloadFromUrl(package_url); 688 crx_downloader_->StartDownloadFromUrl(package_url);
683 } 689 }
684 690
685 // Sets the state of the component to be checked for updates. After the 691 // Sets the state of the component to be checked for updates. After the
686 // function is called, the <app> element corresponding to the |item| parameter 692 // function is called, the <app> element corresponding to the |item| parameter
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
900 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 906 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
901 size_t count = ChangeItemStatus(CrxUpdateItem::kChecking, 907 size_t count = ChangeItemStatus(CrxUpdateItem::kChecking,
902 CrxUpdateItem::kNoUpdate); 908 CrxUpdateItem::kNoUpdate);
903 DCHECK_GT(count, 0ul); 909 DCHECK_GT(count, 0ul);
904 ScheduleNextRun(kStepDelayLong); 910 ScheduleNextRun(kStepDelayLong);
905 } 911 }
906 912
907 // Called when the CRX package has been downloaded to a temporary location. 913 // Called when the CRX package has been downloaded to a temporary location.
908 // Here we fire the notifications and schedule the component-specific installer 914 // Here we fire the notifications and schedule the component-specific installer
909 // to be called in the file thread. 915 // to be called in the file thread.
910 void CrxUpdateService::DownloadComplete(scoped_ptr<CRXContext> crx_context, 916 void CrxUpdateService::DownloadComplete(
911 int error, 917 scoped_ptr<CRXContext> crx_context,
912 const base::FilePath& temp_crx_path) { 918 const component_updater::CrxDownloader::Result& download_result) {
913 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 919 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
914 920
915 CrxUpdateItem* crx = FindUpdateItemById(crx_context->id); 921 CrxUpdateItem* crx = FindUpdateItemById(crx_context->id);
916 DCHECK(crx->status == CrxUpdateItem::kDownloadingDiff || 922 DCHECK(crx->status == CrxUpdateItem::kDownloadingDiff ||
917 crx->status == CrxUpdateItem::kDownloading); 923 crx->status == CrxUpdateItem::kDownloading);
918 924
919 if (error) { 925 if (download_result.error) {
920 if (crx->status == CrxUpdateItem::kDownloadingDiff) { 926 if (crx->status == CrxUpdateItem::kDownloadingDiff) {
921 crx->diff_error_category = kNetworkError; 927 crx->diff_error_category = kNetworkError;
922 crx->diff_error_code = error; 928 crx->diff_error_code = download_result.error;
923 crx->diff_update_failed = true; 929 crx->diff_update_failed = true;
924 size_t count = ChangeItemStatus(CrxUpdateItem::kDownloadingDiff, 930 size_t count = ChangeItemStatus(CrxUpdateItem::kDownloadingDiff,
925 CrxUpdateItem::kCanUpdate); 931 CrxUpdateItem::kCanUpdate);
926 DCHECK_EQ(count, 1ul); 932 DCHECK_EQ(count, 1ul);
927 crx_downloader_.reset(); 933 crx_downloader_.reset();
928 934
929 ScheduleNextRun(kStepDelayShort); 935 ScheduleNextRun(kStepDelayShort);
930 return; 936 return;
931 } 937 }
932 crx->error_category = kNetworkError; 938 crx->error_category = kNetworkError;
933 crx->error_code = error; 939 crx->error_code = download_result.error;
934 size_t count = ChangeItemStatus(CrxUpdateItem::kDownloading, 940 size_t count = ChangeItemStatus(CrxUpdateItem::kDownloading,
935 CrxUpdateItem::kNoUpdate); 941 CrxUpdateItem::kNoUpdate);
936 DCHECK_EQ(count, 1ul); 942 DCHECK_EQ(count, 1ul);
937 crx_downloader_.reset(); 943 crx_downloader_.reset();
938 944
939 // At this point, since both the differential and the full downloads failed, 945 // At this point, since both the differential and the full downloads failed,
940 // the update for this component has finished with an error. 946 // the update for this component has finished with an error.
941 ping_manager_->OnUpdateComplete(crx); 947 ping_manager_->OnUpdateComplete(crx);
942 948
943 // Move on to the next update, if there is one available. 949 // Move on to the next update, if there is one available.
(...skipping 10 matching lines...) Expand all
954 DCHECK_EQ(count, 1ul); 960 DCHECK_EQ(count, 1ul);
955 961
956 crx_downloader_.reset(); 962 crx_downloader_.reset();
957 963
958 // Why unretained? See comment at top of file. 964 // Why unretained? See comment at top of file.
959 blocking_task_runner_->PostDelayedTask( 965 blocking_task_runner_->PostDelayedTask(
960 FROM_HERE, 966 FROM_HERE,
961 base::Bind(&CrxUpdateService::Install, 967 base::Bind(&CrxUpdateService::Install,
962 base::Unretained(this), 968 base::Unretained(this),
963 base::Passed(&crx_context), 969 base::Passed(&crx_context),
964 temp_crx_path), 970 download_result.response),
965 base::TimeDelta::FromMilliseconds(config_->StepDelay())); 971 base::TimeDelta::FromMilliseconds(config_->StepDelay()));
966 } 972 }
967 } 973 }
968 974
969 // Install consists of digital signature verification, unpacking and then 975 // Install consists of digital signature verification, unpacking and then
970 // calling the component specific installer. All that is handled by the 976 // calling the component specific installer. All that is handled by the
971 // |unpacker|. If there is an error this function is in charge of deleting 977 // |unpacker|. If there is an error this function is in charge of deleting
972 // the files created. 978 // the files created.
973 void CrxUpdateService::Install(scoped_ptr<CRXContext> context, 979 void CrxUpdateService::Install(scoped_ptr<CRXContext> context,
974 const base::FilePath& crx_path) { 980 const base::FilePath& crx_path) {
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1116 } 1122 }
1117 1123
1118 // The component update factory. Using the component updater as a singleton 1124 // The component update factory. Using the component updater as a singleton
1119 // is the job of the browser process. 1125 // is the job of the browser process.
1120 ComponentUpdateService* ComponentUpdateServiceFactory( 1126 ComponentUpdateService* ComponentUpdateServiceFactory(
1121 ComponentUpdateService::Configurator* config) { 1127 ComponentUpdateService::Configurator* config) {
1122 DCHECK(config); 1128 DCHECK(config);
1123 return new CrxUpdateService(config); 1129 return new CrxUpdateService(config);
1124 } 1130 }
1125 1131
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698