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

Side by Side Diff: google_apis/drive/files_list_request_runner.cc

Issue 1218773003: Implement a DRIVE_REQUEST_TOO_LARGE backoff. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased. Created 5 years, 5 months 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
OLDNEW
(Empty)
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
5 #include "google_apis/drive/files_list_request_runner.h"
6
7 #include "base/bind.h"
8 #include "google_apis/drive/drive_api_error_codes.h"
9 #include "google_apis/drive/drive_api_requests.h"
10 #include "google_apis/drive/request_sender.h"
11
12 namespace google_apis {
13
14 FilesListRequestRunner::FilesListRequestRunner(
15 RequestSender* request_sender,
16 const google_apis::DriveApiUrlGenerator& url_generator)
17 : request_sender_(request_sender),
18 url_generator_(url_generator),
19 weak_ptr_factory_(this) {
20 }
21
22 FilesListRequestRunner::~FilesListRequestRunner() {
23 }
24
25 CancelCallback FilesListRequestRunner::CreateAndStartWithSizeBackoff(
26 int max_results,
27 const std::string& q,
28 const std::string& fields,
29 const FileListCallback& callback) {
30 base::Closure* const cancel_callback = new base::Closure;
31 drive::FilesListRequest* const request = new drive::FilesListRequest(
32 request_sender_, url_generator_,
33 base::Bind(&FilesListRequestRunner::OnCompleted,
34 weak_ptr_factory_.GetWeakPtr(), max_results, q, fields,
35 callback, base::Owned(cancel_callback)));
36 request->set_max_results(max_results);
37 request->set_q(q);
38 request->set_fields(fields);
39 *cancel_callback = request_sender_->StartRequestWithAuthRetry(request);
40
41 // The cancellation callback is owned by the completion callback, so it must
42 // not be used after |callback| is called.
43 return base::Bind(&FilesListRequestRunner::OnCancel,
44 weak_ptr_factory_.GetWeakPtr(),
45 base::Unretained(cancel_callback));
46 }
47
48 void FilesListRequestRunner::OnCancel(base::Closure* cancel_callback) {
49 DCHECK(cancel_callback);
50 DCHECK(!cancel_callback->is_null());
51 cancel_callback->Run();
52 }
53
54 void FilesListRequestRunner::OnCompleted(int max_results,
55 const std::string& q,
56 const std::string& fields,
57 const FileListCallback& callback,
58 CancelCallback* cancel_callback,
59 DriveApiErrorCode error,
60 scoped_ptr<FileList> entry) {
61 if (!request_completed_callback_for_testing_.is_null())
62 request_completed_callback_for_testing_.Run();
63
64 if (error == google_apis::DRIVE_RESPONSE_TOO_LARGE && max_results > 1) {
65 CreateAndStartWithSizeBackoff(max_results / 2, q, fields, callback);
66 return;
67 }
68
69 callback.Run(error, entry.Pass());
70 }
71
72 void FilesListRequestRunner::SetRequestCompletedCallbackForTesting(
73 const base::Closure& callback) {
74 request_completed_callback_for_testing_ = callback;
75 }
76
77 } // namespace google_apis
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698