files_list_request_runner.cc 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright 2015 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "google_apis/drive/files_list_request_runner.h"
  5. #include <utility>
  6. #include "base/bind.h"
  7. #include "base/metrics/histogram_functions.h"
  8. #include "base/metrics/histogram_macros.h"
  9. #include "google_apis/common/api_error_codes.h"
  10. #include "google_apis/common/request_sender.h"
  11. #include "google_apis/drive/drive_api_requests.h"
  12. namespace google_apis {
  13. FilesListRequestRunner::FilesListRequestRunner(
  14. RequestSender* request_sender,
  15. const google_apis::DriveApiUrlGenerator& url_generator)
  16. : request_sender_(request_sender), url_generator_(url_generator) {}
  17. FilesListRequestRunner::~FilesListRequestRunner() = default;
  18. CancelCallbackOnce FilesListRequestRunner::CreateAndStartWithSizeBackoff(
  19. int max_results,
  20. FilesListCorpora corpora,
  21. const std::string& team_drive_id,
  22. const std::string& q,
  23. const std::string& fields,
  24. FileListCallback callback) {
  25. base::OnceClosure* cancel_callback = new base::OnceClosure;
  26. std::unique_ptr<drive::FilesListRequest> request =
  27. std::make_unique<drive::FilesListRequest>(
  28. request_sender_, url_generator_,
  29. base::BindOnce(&FilesListRequestRunner::OnCompleted,
  30. weak_ptr_factory_.GetWeakPtr(), max_results, corpora,
  31. team_drive_id, q, fields, std::move(callback),
  32. base::Owned(cancel_callback)));
  33. request->set_max_results(max_results);
  34. request->set_q(q);
  35. request->set_fields(fields);
  36. *cancel_callback =
  37. request_sender_->StartRequestWithAuthRetry(std::move(request));
  38. // The cancellation callback is owned by the completion callback, so it must
  39. // not be used after |callback| is called.
  40. return base::BindOnce(&FilesListRequestRunner::OnCancel,
  41. weak_ptr_factory_.GetWeakPtr(),
  42. base::Unretained(cancel_callback));
  43. }
  44. void FilesListRequestRunner::OnCancel(CancelCallbackOnce* cancel_callback) {
  45. DCHECK(cancel_callback);
  46. DCHECK(!cancel_callback->is_null());
  47. std::move(*cancel_callback).Run();
  48. }
  49. void FilesListRequestRunner::OnCompleted(int max_results,
  50. FilesListCorpora corpora,
  51. const std::string& team_drive_id,
  52. const std::string& q,
  53. const std::string& fields,
  54. FileListCallback callback,
  55. CancelCallbackOnce* cancel_callback,
  56. ApiErrorCode error,
  57. std::unique_ptr<FileList> entry) {
  58. if (!request_completed_callback_for_testing_.is_null())
  59. std::move(request_completed_callback_for_testing_).Run();
  60. if (error == google_apis::DRIVE_RESPONSE_TOO_LARGE && max_results > 1) {
  61. CreateAndStartWithSizeBackoff(max_results / 2, corpora, team_drive_id, q,
  62. fields, std::move(callback));
  63. return;
  64. }
  65. std::move(callback).Run(error, std::move(entry));
  66. }
  67. void FilesListRequestRunner::SetRequestCompletedCallbackForTesting(
  68. base::OnceClosure callback) {
  69. request_completed_callback_for_testing_ = std::move(callback);
  70. }
  71. } // namespace google_apis