OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/update_client/background_downloader_win.h" | 5 #include "components/update_client/background_downloader_win.h" |
6 | 6 |
7 #include <atlbase.h> | 7 #include <atlbase.h> |
8 #include <atlcom.h> | 8 #include <atlcom.h> |
9 #include <objbase.h> | 9 #include <objbase.h> |
10 #include <stddef.h> | 10 #include <stddef.h> |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 bool is_valid = HIWORD(error) == 0x8019 && | 162 bool is_valid = HIWORD(error) == 0x8019 && |
163 LOWORD(error) >= kHttpStatusFirst && | 163 LOWORD(error) >= kHttpStatusFirst && |
164 LOWORD(error) <= kHttpStatusLast; | 164 LOWORD(error) <= kHttpStatusLast; |
165 return is_valid ? LOWORD(error) : 0; | 165 return is_valid ? LOWORD(error) : 0; |
166 } | 166 } |
167 | 167 |
168 // Returns the files in a BITS job. | 168 // Returns the files in a BITS job. |
169 HRESULT GetFilesInJob(IBackgroundCopyJob* job, | 169 HRESULT GetFilesInJob(IBackgroundCopyJob* job, |
170 std::vector<ScopedComPtr<IBackgroundCopyFile>>* files) { | 170 std::vector<ScopedComPtr<IBackgroundCopyFile>>* files) { |
171 ScopedComPtr<IEnumBackgroundCopyFiles> enum_files; | 171 ScopedComPtr<IEnumBackgroundCopyFiles> enum_files; |
172 HRESULT hr = job->EnumFiles(enum_files.Receive()); | 172 HRESULT hr = job->EnumFiles(enum_files.GetAddressOf()); |
173 if (FAILED(hr)) | 173 if (FAILED(hr)) |
174 return hr; | 174 return hr; |
175 | 175 |
176 ULONG num_files = 0; | 176 ULONG num_files = 0; |
177 hr = enum_files->GetCount(&num_files); | 177 hr = enum_files->GetCount(&num_files); |
178 if (FAILED(hr)) | 178 if (FAILED(hr)) |
179 return hr; | 179 return hr; |
180 | 180 |
181 for (ULONG i = 0; i != num_files; ++i) { | 181 for (ULONG i = 0; i != num_files; ++i) { |
182 ScopedComPtr<IBackgroundCopyFile> file; | 182 ScopedComPtr<IBackgroundCopyFile> file; |
183 if (enum_files->Next(1, file.Receive(), NULL) == S_OK && file.Get()) | 183 if (enum_files->Next(1, file.GetAddressOf(), NULL) == S_OK && file.Get()) |
184 files->push_back(file); | 184 files->push_back(file); |
185 } | 185 } |
186 | 186 |
187 return S_OK; | 187 return S_OK; |
188 } | 188 } |
189 | 189 |
190 // Returns the file name, the url, and some per-file progress information. | 190 // Returns the file name, the url, and some per-file progress information. |
191 // The function out parameters can be NULL if that data is not requested. | 191 // The function out parameters can be NULL if that data is not requested. |
192 HRESULT GetJobFileProperties(IBackgroundCopyFile* file, | 192 HRESULT GetJobFileProperties(IBackgroundCopyFile* file, |
193 base::string16* local_name, | 193 base::string16* local_name, |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 ScopedCoMem<base::char16> description; | 258 ScopedCoMem<base::char16> description; |
259 return job->GetDescription(&description); | 259 return job->GetDescription(&description); |
260 } | 260 } |
261 | 261 |
262 // Returns the job error code in |error_code| if the job is in the transient | 262 // Returns the job error code in |error_code| if the job is in the transient |
263 // or the final error state. Otherwise, the job error is not available and | 263 // or the final error state. Otherwise, the job error is not available and |
264 // the function fails. | 264 // the function fails. |
265 HRESULT GetJobError(IBackgroundCopyJob* job, HRESULT* error_code_out) { | 265 HRESULT GetJobError(IBackgroundCopyJob* job, HRESULT* error_code_out) { |
266 *error_code_out = S_OK; | 266 *error_code_out = S_OK; |
267 ScopedComPtr<IBackgroundCopyError> copy_error; | 267 ScopedComPtr<IBackgroundCopyError> copy_error; |
268 HRESULT hr = job->GetError(copy_error.Receive()); | 268 HRESULT hr = job->GetError(copy_error.GetAddressOf()); |
269 if (FAILED(hr)) | 269 if (FAILED(hr)) |
270 return hr; | 270 return hr; |
271 | 271 |
272 BG_ERROR_CONTEXT error_context = BG_ERROR_CONTEXT_NONE; | 272 BG_ERROR_CONTEXT error_context = BG_ERROR_CONTEXT_NONE; |
273 HRESULT error_code = S_OK; | 273 HRESULT error_code = S_OK; |
274 hr = copy_error->GetError(&error_context, &error_code); | 274 hr = copy_error->GetError(&error_context, &error_code); |
275 if (FAILED(hr)) | 275 if (FAILED(hr)) |
276 return hr; | 276 return hr; |
277 | 277 |
278 *error_code_out = FAILED(error_code) ? error_code : E_FAIL; | 278 *error_code_out = FAILED(error_code) ? error_code : E_FAIL; |
279 return S_OK; | 279 return S_OK; |
280 } | 280 } |
281 | 281 |
282 // Finds the component updater jobs matching the given predicate. | 282 // Finds the component updater jobs matching the given predicate. |
283 // Returns S_OK if the function has found at least one job, returns S_FALSE if | 283 // Returns S_OK if the function has found at least one job, returns S_FALSE if |
284 // no job was found, and it returns an error otherwise. | 284 // no job was found, and it returns an error otherwise. |
285 template <class Predicate> | 285 template <class Predicate> |
286 HRESULT FindBitsJobIf(Predicate pred, | 286 HRESULT FindBitsJobIf(Predicate pred, |
287 IBackgroundCopyManager* bits_manager, | 287 IBackgroundCopyManager* bits_manager, |
288 std::vector<ScopedComPtr<IBackgroundCopyJob>>* jobs) { | 288 std::vector<ScopedComPtr<IBackgroundCopyJob>>* jobs) { |
289 ScopedComPtr<IEnumBackgroundCopyJobs> enum_jobs; | 289 ScopedComPtr<IEnumBackgroundCopyJobs> enum_jobs; |
290 HRESULT hr = bits_manager->EnumJobs(0, enum_jobs.Receive()); | 290 HRESULT hr = bits_manager->EnumJobs(0, enum_jobs.GetAddressOf()); |
291 if (FAILED(hr)) | 291 if (FAILED(hr)) |
292 return hr; | 292 return hr; |
293 | 293 |
294 ULONG job_count = 0; | 294 ULONG job_count = 0; |
295 hr = enum_jobs->GetCount(&job_count); | 295 hr = enum_jobs->GetCount(&job_count); |
296 if (FAILED(hr)) | 296 if (FAILED(hr)) |
297 return hr; | 297 return hr; |
298 | 298 |
299 // Iterate over jobs, run the predicate, and select the job only if | 299 // Iterate over jobs, run the predicate, and select the job only if |
300 // the job description matches the component updater jobs. | 300 // the job description matches the component updater jobs. |
301 for (ULONG i = 0; i != job_count; ++i) { | 301 for (ULONG i = 0; i != job_count; ++i) { |
302 ScopedComPtr<IBackgroundCopyJob> current_job; | 302 ScopedComPtr<IBackgroundCopyJob> current_job; |
303 if (enum_jobs->Next(1, current_job.Receive(), NULL) == S_OK && | 303 if (enum_jobs->Next(1, current_job.GetAddressOf(), NULL) == S_OK && |
304 pred(current_job.Get())) { | 304 pred(current_job.Get())) { |
305 base::string16 job_description; | 305 base::string16 job_description; |
306 hr = GetJobDescription(current_job.Get(), &job_description); | 306 hr = GetJobDescription(current_job.Get(), &job_description); |
307 if (job_description.compare(kJobDescription) == 0) | 307 if (job_description.compare(kJobDescription) == 0) |
308 jobs->push_back(current_job); | 308 jobs->push_back(current_job); |
309 } | 309 } |
310 } | 310 } |
311 | 311 |
312 return jobs->empty() ? S_FALSE : S_OK; | 312 return jobs->empty() ? S_FALSE : S_OK; |
313 } | 313 } |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 } | 477 } |
478 | 478 |
479 // Creates or opens an existing bits job, and handles the marshalling of | 479 // Creates or opens an existing bits job, and handles the marshalling of |
480 // the interfaces in GIT. | 480 // the interfaces in GIT. |
481 HRESULT BackgroundDownloader::BeginDownloadHelper(const GURL& url) { | 481 HRESULT BackgroundDownloader::BeginDownloadHelper(const GURL& url) { |
482 ScopedComPtr<IGlobalInterfaceTable> git; | 482 ScopedComPtr<IGlobalInterfaceTable> git; |
483 HRESULT hr = GetGit(&git); | 483 HRESULT hr = GetGit(&git); |
484 if (FAILED(hr)) | 484 if (FAILED(hr)) |
485 return hr; | 485 return hr; |
486 | 486 |
487 hr = CreateBitsManager(bits_manager_.Receive()); | 487 hr = CreateBitsManager(bits_manager_.GetAddressOf()); |
488 if (FAILED(hr)) | 488 if (FAILED(hr)) |
489 return hr; | 489 return hr; |
490 | 490 |
491 hr = RegisterInterfaceInGit(git, bits_manager_, &git_cookie_bits_manager_); | 491 hr = RegisterInterfaceInGit(git, bits_manager_, &git_cookie_bits_manager_); |
492 if (FAILED(hr)) | 492 if (FAILED(hr)) |
493 return hr; | 493 return hr; |
494 | 494 |
495 hr = QueueBitsJob(url, job_.Receive()); | 495 hr = QueueBitsJob(url, job_.GetAddressOf()); |
496 if (FAILED(hr)) | 496 if (FAILED(hr)) |
497 return hr; | 497 return hr; |
498 | 498 |
499 hr = RegisterInterfaceInGit(git, job_, &git_cookie_job_); | 499 hr = RegisterInterfaceInGit(git, job_, &git_cookie_job_); |
500 if (FAILED(hr)) | 500 if (FAILED(hr)) |
501 return hr; | 501 return hr; |
502 | 502 |
503 return S_OK; | 503 return S_OK; |
504 } | 504 } |
505 | 505 |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
710 return false; | 710 return false; |
711 } | 711 } |
712 | 712 |
713 // Creates or opens a job for the given url and queues it up. Tries to | 713 // Creates or opens a job for the given url and queues it up. Tries to |
714 // install a job observer but continues on if an observer can't be set up. | 714 // install a job observer but continues on if an observer can't be set up. |
715 HRESULT BackgroundDownloader::QueueBitsJob(const GURL& url, | 715 HRESULT BackgroundDownloader::QueueBitsJob(const GURL& url, |
716 IBackgroundCopyJob** job) { | 716 IBackgroundCopyJob** job) { |
717 DCHECK(task_runner()->RunsTasksOnCurrentThread()); | 717 DCHECK(task_runner()->RunsTasksOnCurrentThread()); |
718 | 718 |
719 ScopedComPtr<IBackgroundCopyJob> p; | 719 ScopedComPtr<IBackgroundCopyJob> p; |
720 HRESULT hr = CreateOrOpenJob(url, p.Receive()); | 720 HRESULT hr = CreateOrOpenJob(url, p.GetAddressOf()); |
721 if (FAILED(hr)) | 721 if (FAILED(hr)) |
722 return hr; | 722 return hr; |
723 | 723 |
724 if (hr == S_OK) { | 724 if (hr == S_OK) { |
725 // This is a new job and it needs initialization. | 725 // This is a new job and it needs initialization. |
726 hr = InitializeNewJob(p, url); | 726 hr = InitializeNewJob(p, url); |
727 if (FAILED(hr)) | 727 if (FAILED(hr)) |
728 return hr; | 728 return hr; |
729 } | 729 } |
730 | 730 |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
877 | 877 |
878 for (auto cookie : cookies) { | 878 for (auto cookie : cookies) { |
879 // TODO(sorin): check the result of the call, see crbug.com/644857. | 879 // TODO(sorin): check the result of the call, see crbug.com/644857. |
880 git->RevokeInterfaceFromGlobal(cookie); | 880 git->RevokeInterfaceFromGlobal(cookie); |
881 } | 881 } |
882 | 882 |
883 return S_OK; | 883 return S_OK; |
884 } | 884 } |
885 | 885 |
886 } // namespace update_client | 886 } // namespace update_client |
OLD | NEW |