Index: google_apis/drive/files_list_request_runner.cc |
diff --git a/google_apis/drive/files_list_request_runner.cc b/google_apis/drive/files_list_request_runner.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8bf50beb7f94512121c4bcd19a5acfec884dbae6 |
--- /dev/null |
+++ b/google_apis/drive/files_list_request_runner.cc |
@@ -0,0 +1,77 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "google_apis/drive/files_list_request_runner.h" |
+ |
+#include "base/bind.h" |
+#include "google_apis/drive/drive_api_error_codes.h" |
+#include "google_apis/drive/drive_api_requests.h" |
+#include "google_apis/drive/request_sender.h" |
+ |
+namespace google_apis { |
+ |
+FilesListRequestRunner::FilesListRequestRunner( |
+ RequestSender* request_sender, |
+ const google_apis::DriveApiUrlGenerator& url_generator) |
+ : request_sender_(request_sender), |
+ url_generator_(url_generator), |
+ weak_ptr_factory_(this) { |
+} |
+ |
+FilesListRequestRunner::~FilesListRequestRunner() { |
+} |
+ |
+CancelCallback FilesListRequestRunner::CreateAndStartWithSizeBackoff( |
+ int max_results, |
+ const std::string& q, |
+ const std::string& fields, |
+ const FileListCallback& callback) { |
+ base::Closure* const cancel_callback = new base::Closure; |
+ drive::FilesListRequest* const request = new drive::FilesListRequest( |
+ request_sender_, url_generator_, |
+ base::Bind(&FilesListRequestRunner::OnCompleted, |
+ weak_ptr_factory_.GetWeakPtr(), max_results, q, fields, |
+ callback, base::Owned(cancel_callback))); |
+ request->set_max_results(max_results); |
+ request->set_q(q); |
+ request->set_fields(fields); |
+ *cancel_callback = request_sender_->StartRequestWithAuthRetry(request); |
+ |
+ // The cancellation callback is owned by the completion callback, so it must |
+ // not be used after |callback| is called. |
+ return base::Bind(&FilesListRequestRunner::OnCancel, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ base::Unretained(cancel_callback)); |
+} |
+ |
+void FilesListRequestRunner::OnCancel(base::Closure* cancel_callback) { |
+ DCHECK(cancel_callback); |
+ DCHECK(!cancel_callback->is_null()); |
+ cancel_callback->Run(); |
+} |
+ |
+void FilesListRequestRunner::OnCompleted(int max_results, |
+ const std::string& q, |
+ const std::string& fields, |
+ const FileListCallback& callback, |
+ CancelCallback* cancel_callback, |
+ DriveApiErrorCode error, |
+ scoped_ptr<FileList> entry) { |
+ if (!request_completed_callback_for_testing_.is_null()) |
+ request_completed_callback_for_testing_.Run(); |
+ |
+ if (error == google_apis::DRIVE_RESPONSE_TOO_LARGE && max_results > 1) { |
+ CreateAndStartWithSizeBackoff(max_results / 2, q, fields, callback); |
+ return; |
+ } |
+ |
+ callback.Run(error, entry.Pass()); |
+} |
+ |
+void FilesListRequestRunner::SetRequestCompletedCallbackForTesting( |
+ const base::Closure& callback) { |
+ request_completed_callback_for_testing_ = callback; |
+} |
+ |
+} // namespace google_apis |