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

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

Issue 442193002: Parse Drive API responses all at once in the blocking pool. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix the cause of the regression. Created 6 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « google_apis/drive/drive_api_requests.h ('k') | google_apis/drive/gdata_wapi_requests.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "google_apis/drive/drive_api_requests.h" 5 #include "google_apis/drive/drive_api_requests.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/json/json_writer.h" 9 #include "base/json/json_writer.h"
10 #include "base/location.h" 10 #include "base/location.h"
11 #include "base/sequenced_task_runner.h" 11 #include "base/sequenced_task_runner.h"
12 #include "base/task_runner_util.h" 12 #include "base/task_runner_util.h"
13 #include "base/values.h" 13 #include "base/values.h"
14 #include "google_apis/drive/drive_api_parser.h"
15 #include "google_apis/drive/request_sender.h" 14 #include "google_apis/drive/request_sender.h"
16 #include "google_apis/drive/request_util.h" 15 #include "google_apis/drive/request_util.h"
17 #include "google_apis/drive/time_util.h" 16 #include "google_apis/drive/time_util.h"
18 #include "net/base/url_util.h" 17 #include "net/base/url_util.h"
19 18
20 namespace google_apis { 19 namespace google_apis {
21 namespace { 20 namespace {
22 21
23 const char kContentTypeApplicationJson[] = "application/json"; 22 const char kContentTypeApplicationJson[] = "application/json";
24 const char kParentLinkKind[] = "drive#fileLink"; 23 const char kParentLinkKind[] = "drive#fileLink";
25 24
26 // Parses the JSON value to a resource typed |T| and runs |callback| on the UI
27 // thread once parsing is done.
28 template<typename T>
29 void ParseJsonAndRun(
30 const base::Callback<void(GDataErrorCode, scoped_ptr<T>)>& callback,
31 GDataErrorCode error,
32 scoped_ptr<base::Value> value) {
33 DCHECK(!callback.is_null());
34
35 scoped_ptr<T> resource;
36 if (value) {
37 resource = T::CreateFrom(*value);
38 if (!resource) {
39 // Failed to parse the JSON value, although the JSON value is available,
40 // so let the callback know the parsing error.
41 error = GDATA_PARSE_ERROR;
42 }
43 }
44
45 callback.Run(error, resource.Pass());
46 }
47
48 // Thin adapter of T::CreateFrom.
49 template<typename T>
50 scoped_ptr<T> ParseJsonOnBlockingPool(scoped_ptr<base::Value> value) {
51 return T::CreateFrom(*value);
52 }
53
54 // Runs |callback| with given |error| and |value|. If |value| is null,
55 // overwrites |error| to GDATA_PARSE_ERROR.
56 template<typename T>
57 void ParseJsonOnBlockingPoolAndRunAfterBlockingPoolTask(
58 const base::Callback<void(GDataErrorCode, scoped_ptr<T>)>& callback,
59 GDataErrorCode error, scoped_ptr<T> value) {
60 if (!value)
61 error = GDATA_PARSE_ERROR;
62 callback.Run(error, value.Pass());
63 }
64
65 // Parses the JSON value to a resource typed |T| and runs |callback| on
66 // blocking pool, and then run on the current thread.
67 // TODO(hidehiko): Move this and ParseJsonAndRun defined above into base with
68 // merging the tasks running on blocking pool into one.
69 template<typename T>
70 void ParseJsonOnBlockingPoolAndRun(
71 scoped_refptr<base::TaskRunner> blocking_task_runner,
72 const base::Callback<void(GDataErrorCode, scoped_ptr<T>)>& callback,
73 GDataErrorCode error,
74 scoped_ptr<base::Value> value) {
75 DCHECK(!callback.is_null());
76
77 if (!value) {
78 callback.Run(error, scoped_ptr<T>());
79 return;
80 }
81
82 base::PostTaskAndReplyWithResult(
83 blocking_task_runner,
84 FROM_HERE,
85 base::Bind(&ParseJsonOnBlockingPool<T>, base::Passed(&value)),
86 base::Bind(&ParseJsonOnBlockingPoolAndRunAfterBlockingPoolTask<T>,
87 callback, error));
88 }
89
90 // Parses the JSON value to FileResource instance and runs |callback| on the 25 // Parses the JSON value to FileResource instance and runs |callback| on the
91 // UI thread once parsing is done. 26 // UI thread once parsing is done.
92 // This is customized version of ParseJsonAndRun defined above to adapt the 27 // This is customized version of ParseJsonAndRun defined above to adapt the
93 // remaining response type. 28 // remaining response type.
94 void ParseFileResourceWithUploadRangeAndRun( 29 void ParseFileResourceWithUploadRangeAndRun(
95 const drive::UploadRangeCallback& callback, 30 const drive::UploadRangeCallback& callback,
96 const UploadRangeResponse& response, 31 const UploadRangeResponse& response,
97 scoped_ptr<base::Value> value) { 32 scoped_ptr<base::Value> value) {
98 DCHECK(!callback.is_null()); 33 DCHECK(!callback.is_null());
99 34
(...skipping 19 matching lines...) Expand all
119 scoped_ptr<base::DictionaryValue> parent(new base::DictionaryValue); 54 scoped_ptr<base::DictionaryValue> parent(new base::DictionaryValue);
120 parent->SetString("kind", kParentLinkKind); 55 parent->SetString("kind", kParentLinkKind);
121 parent->SetString("id", file_id); 56 parent->SetString("id", file_id);
122 return parent.Pass(); 57 return parent.Pass();
123 } 58 }
124 59
125 } // namespace 60 } // namespace
126 61
127 namespace drive { 62 namespace drive {
128 63
129 //============================ DriveApiDataRequest =========================== 64 //============================ DriveApiPartialFieldRequest ====================
130 65
131 DriveApiDataRequest::DriveApiDataRequest(RequestSender* sender, 66 DriveApiPartialFieldRequest::DriveApiPartialFieldRequest(
132 const GetDataCallback& callback) 67 RequestSender* sender) : UrlFetchRequestBase(sender) {
133 : GetDataRequest(sender, callback) {
134 } 68 }
135 69
136 DriveApiDataRequest::~DriveApiDataRequest() { 70 DriveApiPartialFieldRequest::~DriveApiPartialFieldRequest() {
137 } 71 }
138 72
139 GURL DriveApiDataRequest::GetURL() const { 73 GURL DriveApiPartialFieldRequest::GetURL() const {
140 GURL url = GetURLInternal(); 74 GURL url = GetURLInternal();
141 if (!fields_.empty()) 75 if (!fields_.empty())
142 url = net::AppendOrReplaceQueryParameter(url, "fields", fields_); 76 url = net::AppendOrReplaceQueryParameter(url, "fields", fields_);
143 return url; 77 return url;
144 } 78 }
145 79
146 //=============================== FilesGetRequest ============================= 80 //=============================== FilesGetRequest =============================
147 81
148 FilesGetRequest::FilesGetRequest( 82 FilesGetRequest::FilesGetRequest(
149 RequestSender* sender, 83 RequestSender* sender,
150 const DriveApiUrlGenerator& url_generator, 84 const DriveApiUrlGenerator& url_generator,
151 const FileResourceCallback& callback) 85 const FileResourceCallback& callback)
152 : DriveApiDataRequest( 86 : DriveApiDataRequest<FileResource>(sender, callback),
153 sender,
154 base::Bind(&ParseJsonAndRun<FileResource>, callback)),
155 url_generator_(url_generator) { 87 url_generator_(url_generator) {
156 DCHECK(!callback.is_null()); 88 DCHECK(!callback.is_null());
157 } 89 }
158 90
159 FilesGetRequest::~FilesGetRequest() {} 91 FilesGetRequest::~FilesGetRequest() {}
160 92
161 GURL FilesGetRequest::GetURLInternal() const { 93 GURL FilesGetRequest::GetURLInternal() const {
162 return url_generator_.GetFilesGetUrl(file_id_); 94 return url_generator_.GetFilesGetUrl(file_id_);
163 } 95 }
164 96
165 //============================ FilesAuthorizeRequest =========================== 97 //============================ FilesAuthorizeRequest ===========================
166 98
167 FilesAuthorizeRequest::FilesAuthorizeRequest( 99 FilesAuthorizeRequest::FilesAuthorizeRequest(
168 RequestSender* sender, 100 RequestSender* sender,
169 const DriveApiUrlGenerator& url_generator, 101 const DriveApiUrlGenerator& url_generator,
170 const FileResourceCallback& callback) 102 const FileResourceCallback& callback)
171 : DriveApiDataRequest( 103 : DriveApiDataRequest<FileResource>(sender, callback),
172 sender,
173 base::Bind(&ParseJsonAndRun<FileResource>, callback)),
174 url_generator_(url_generator) { 104 url_generator_(url_generator) {
175 DCHECK(!callback.is_null()); 105 DCHECK(!callback.is_null());
176 } 106 }
177 107
178 FilesAuthorizeRequest::~FilesAuthorizeRequest() {} 108 FilesAuthorizeRequest::~FilesAuthorizeRequest() {}
179 109
180 net::URLFetcher::RequestType FilesAuthorizeRequest::GetRequestType() const { 110 net::URLFetcher::RequestType FilesAuthorizeRequest::GetRequestType() const {
181 return net::URLFetcher::POST; 111 return net::URLFetcher::POST;
182 } 112 }
183 113
184 GURL FilesAuthorizeRequest::GetURLInternal() const { 114 GURL FilesAuthorizeRequest::GetURLInternal() const {
185 return url_generator_.GetFilesAuthorizeUrl(file_id_, app_id_); 115 return url_generator_.GetFilesAuthorizeUrl(file_id_, app_id_);
186 } 116 }
187 117
188 //============================ FilesInsertRequest ============================ 118 //============================ FilesInsertRequest ============================
189 119
190 FilesInsertRequest::FilesInsertRequest( 120 FilesInsertRequest::FilesInsertRequest(
191 RequestSender* sender, 121 RequestSender* sender,
192 const DriveApiUrlGenerator& url_generator, 122 const DriveApiUrlGenerator& url_generator,
193 const FileResourceCallback& callback) 123 const FileResourceCallback& callback)
194 : DriveApiDataRequest( 124 : DriveApiDataRequest<FileResource>(sender, callback),
195 sender,
196 base::Bind(&ParseJsonAndRun<FileResource>, callback)),
197 url_generator_(url_generator) { 125 url_generator_(url_generator) {
198 DCHECK(!callback.is_null()); 126 DCHECK(!callback.is_null());
199 } 127 }
200 128
201 FilesInsertRequest::~FilesInsertRequest() {} 129 FilesInsertRequest::~FilesInsertRequest() {}
202 130
203 net::URLFetcher::RequestType FilesInsertRequest::GetRequestType() const { 131 net::URLFetcher::RequestType FilesInsertRequest::GetRequestType() const {
204 return net::URLFetcher::POST; 132 return net::URLFetcher::POST;
205 } 133 }
206 134
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 GURL FilesInsertRequest::GetURLInternal() const { 171 GURL FilesInsertRequest::GetURLInternal() const {
244 return url_generator_.GetFilesInsertUrl(); 172 return url_generator_.GetFilesInsertUrl();
245 } 173 }
246 174
247 //============================== FilesPatchRequest ============================ 175 //============================== FilesPatchRequest ============================
248 176
249 FilesPatchRequest::FilesPatchRequest( 177 FilesPatchRequest::FilesPatchRequest(
250 RequestSender* sender, 178 RequestSender* sender,
251 const DriveApiUrlGenerator& url_generator, 179 const DriveApiUrlGenerator& url_generator,
252 const FileResourceCallback& callback) 180 const FileResourceCallback& callback)
253 : DriveApiDataRequest( 181 : DriveApiDataRequest<FileResource>(sender, callback),
254 sender,
255 base::Bind(&ParseJsonAndRun<FileResource>, callback)),
256 url_generator_(url_generator), 182 url_generator_(url_generator),
257 set_modified_date_(false), 183 set_modified_date_(false),
258 update_viewed_date_(true) { 184 update_viewed_date_(true) {
259 DCHECK(!callback.is_null()); 185 DCHECK(!callback.is_null());
260 } 186 }
261 187
262 FilesPatchRequest::~FilesPatchRequest() {} 188 FilesPatchRequest::~FilesPatchRequest() {}
263 189
264 net::URLFetcher::RequestType FilesPatchRequest::GetRequestType() const { 190 net::URLFetcher::RequestType FilesPatchRequest::GetRequestType() const {
265 return net::URLFetcher::PATCH; 191 return net::URLFetcher::PATCH;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 << *upload_content << "]"; 239 << *upload_content << "]";
314 return true; 240 return true;
315 } 241 }
316 242
317 //============================= FilesCopyRequest ============================== 243 //============================= FilesCopyRequest ==============================
318 244
319 FilesCopyRequest::FilesCopyRequest( 245 FilesCopyRequest::FilesCopyRequest(
320 RequestSender* sender, 246 RequestSender* sender,
321 const DriveApiUrlGenerator& url_generator, 247 const DriveApiUrlGenerator& url_generator,
322 const FileResourceCallback& callback) 248 const FileResourceCallback& callback)
323 : DriveApiDataRequest( 249 : DriveApiDataRequest<FileResource>(sender, callback),
324 sender,
325 base::Bind(&ParseJsonAndRun<FileResource>, callback)),
326 url_generator_(url_generator) { 250 url_generator_(url_generator) {
327 DCHECK(!callback.is_null()); 251 DCHECK(!callback.is_null());
328 } 252 }
329 253
330 FilesCopyRequest::~FilesCopyRequest() { 254 FilesCopyRequest::~FilesCopyRequest() {
331 } 255 }
332 256
333 net::URLFetcher::RequestType FilesCopyRequest::GetRequestType() const { 257 net::URLFetcher::RequestType FilesCopyRequest::GetRequestType() const {
334 return net::URLFetcher::POST; 258 return net::URLFetcher::POST;
335 } 259 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 << *upload_content << "]"; 292 << *upload_content << "]";
369 return true; 293 return true;
370 } 294 }
371 295
372 //============================= FilesListRequest ============================= 296 //============================= FilesListRequest =============================
373 297
374 FilesListRequest::FilesListRequest( 298 FilesListRequest::FilesListRequest(
375 RequestSender* sender, 299 RequestSender* sender,
376 const DriveApiUrlGenerator& url_generator, 300 const DriveApiUrlGenerator& url_generator,
377 const FileListCallback& callback) 301 const FileListCallback& callback)
378 : DriveApiDataRequest( 302 : DriveApiDataRequest<FileList>(sender, callback),
379 sender,
380 base::Bind(&ParseJsonOnBlockingPoolAndRun<FileList>,
381 make_scoped_refptr(sender->blocking_task_runner()),
382 callback)),
383 url_generator_(url_generator), 303 url_generator_(url_generator),
384 max_results_(100) { 304 max_results_(100) {
385 DCHECK(!callback.is_null()); 305 DCHECK(!callback.is_null());
386 } 306 }
387 307
388 FilesListRequest::~FilesListRequest() {} 308 FilesListRequest::~FilesListRequest() {}
389 309
390 GURL FilesListRequest::GetURLInternal() const { 310 GURL FilesListRequest::GetURLInternal() const {
391 return url_generator_.GetFilesListUrl(max_results_, page_token_, q_); 311 return url_generator_.GetFilesListUrl(max_results_, page_token_, q_);
392 } 312 }
393 313
394 //======================== FilesListNextPageRequest ========================= 314 //======================== FilesListNextPageRequest =========================
395 315
396 FilesListNextPageRequest::FilesListNextPageRequest( 316 FilesListNextPageRequest::FilesListNextPageRequest(
397 RequestSender* sender, 317 RequestSender* sender,
398 const FileListCallback& callback) 318 const FileListCallback& callback)
399 : DriveApiDataRequest( 319 : DriveApiDataRequest<FileList>(sender, callback) {
400 sender,
401 base::Bind(&ParseJsonOnBlockingPoolAndRun<FileList>,
402 make_scoped_refptr(sender->blocking_task_runner()),
403 callback)) {
404 DCHECK(!callback.is_null()); 320 DCHECK(!callback.is_null());
405 } 321 }
406 322
407 FilesListNextPageRequest::~FilesListNextPageRequest() { 323 FilesListNextPageRequest::~FilesListNextPageRequest() {
408 } 324 }
409 325
410 GURL FilesListNextPageRequest::GetURLInternal() const { 326 GURL FilesListNextPageRequest::GetURLInternal() const {
411 return next_link_; 327 return next_link_;
412 } 328 }
413 329
(...skipping 24 matching lines...) Expand all
438 headers.push_back(util::GenerateIfMatchHeader(etag_)); 354 headers.push_back(util::GenerateIfMatchHeader(etag_));
439 return headers; 355 return headers;
440 } 356 }
441 357
442 //============================ FilesTrashRequest ============================= 358 //============================ FilesTrashRequest =============================
443 359
444 FilesTrashRequest::FilesTrashRequest( 360 FilesTrashRequest::FilesTrashRequest(
445 RequestSender* sender, 361 RequestSender* sender,
446 const DriveApiUrlGenerator& url_generator, 362 const DriveApiUrlGenerator& url_generator,
447 const FileResourceCallback& callback) 363 const FileResourceCallback& callback)
448 : DriveApiDataRequest( 364 : DriveApiDataRequest<FileResource>(sender, callback),
449 sender,
450 base::Bind(&ParseJsonAndRun<FileResource>, callback)),
451 url_generator_(url_generator) { 365 url_generator_(url_generator) {
452 DCHECK(!callback.is_null()); 366 DCHECK(!callback.is_null());
453 } 367 }
454 368
455 FilesTrashRequest::~FilesTrashRequest() {} 369 FilesTrashRequest::~FilesTrashRequest() {}
456 370
457 net::URLFetcher::RequestType FilesTrashRequest::GetRequestType() const { 371 net::URLFetcher::RequestType FilesTrashRequest::GetRequestType() const {
458 return net::URLFetcher::POST; 372 return net::URLFetcher::POST;
459 } 373 }
460 374
461 GURL FilesTrashRequest::GetURLInternal() const { 375 GURL FilesTrashRequest::GetURLInternal() const {
462 return url_generator_.GetFilesTrashUrl(file_id_); 376 return url_generator_.GetFilesTrashUrl(file_id_);
463 } 377 }
464 378
465 //============================== AboutGetRequest ============================= 379 //============================== AboutGetRequest =============================
466 380
467 AboutGetRequest::AboutGetRequest( 381 AboutGetRequest::AboutGetRequest(
468 RequestSender* sender, 382 RequestSender* sender,
469 const DriveApiUrlGenerator& url_generator, 383 const DriveApiUrlGenerator& url_generator,
470 const AboutResourceCallback& callback) 384 const AboutResourceCallback& callback)
471 : DriveApiDataRequest( 385 : DriveApiDataRequest<AboutResource>(sender, callback),
472 sender,
473 base::Bind(&ParseJsonAndRun<AboutResource>, callback)),
474 url_generator_(url_generator) { 386 url_generator_(url_generator) {
475 DCHECK(!callback.is_null()); 387 DCHECK(!callback.is_null());
476 } 388 }
477 389
478 AboutGetRequest::~AboutGetRequest() {} 390 AboutGetRequest::~AboutGetRequest() {}
479 391
480 GURL AboutGetRequest::GetURLInternal() const { 392 GURL AboutGetRequest::GetURLInternal() const {
481 return url_generator_.GetAboutGetUrl(); 393 return url_generator_.GetAboutGetUrl();
482 } 394 }
483 395
484 //============================ ChangesListRequest =========================== 396 //============================ ChangesListRequest ===========================
485 397
486 ChangesListRequest::ChangesListRequest( 398 ChangesListRequest::ChangesListRequest(
487 RequestSender* sender, 399 RequestSender* sender,
488 const DriveApiUrlGenerator& url_generator, 400 const DriveApiUrlGenerator& url_generator,
489 const ChangeListCallback& callback) 401 const ChangeListCallback& callback)
490 : DriveApiDataRequest( 402 : DriveApiDataRequest<ChangeList>(sender, callback),
491 sender,
492 base::Bind(&ParseJsonOnBlockingPoolAndRun<ChangeList>,
493 make_scoped_refptr(sender->blocking_task_runner()),
494 callback)),
495 url_generator_(url_generator), 403 url_generator_(url_generator),
496 include_deleted_(true), 404 include_deleted_(true),
497 max_results_(100), 405 max_results_(100),
498 start_change_id_(0) { 406 start_change_id_(0) {
499 DCHECK(!callback.is_null()); 407 DCHECK(!callback.is_null());
500 } 408 }
501 409
502 ChangesListRequest::~ChangesListRequest() {} 410 ChangesListRequest::~ChangesListRequest() {}
503 411
504 GURL ChangesListRequest::GetURLInternal() const { 412 GURL ChangesListRequest::GetURLInternal() const {
505 return url_generator_.GetChangesListUrl( 413 return url_generator_.GetChangesListUrl(
506 include_deleted_, max_results_, page_token_, start_change_id_); 414 include_deleted_, max_results_, page_token_, start_change_id_);
507 } 415 }
508 416
509 //======================== ChangesListNextPageRequest ========================= 417 //======================== ChangesListNextPageRequest =========================
510 418
511 ChangesListNextPageRequest::ChangesListNextPageRequest( 419 ChangesListNextPageRequest::ChangesListNextPageRequest(
512 RequestSender* sender, 420 RequestSender* sender,
513 const ChangeListCallback& callback) 421 const ChangeListCallback& callback)
514 : DriveApiDataRequest( 422 : DriveApiDataRequest<ChangeList>(sender, callback) {
515 sender,
516 base::Bind(&ParseJsonOnBlockingPoolAndRun<ChangeList>,
517 make_scoped_refptr(sender->blocking_task_runner()),
518 callback)) {
519 DCHECK(!callback.is_null()); 423 DCHECK(!callback.is_null());
520 } 424 }
521 425
522 ChangesListNextPageRequest::~ChangesListNextPageRequest() { 426 ChangesListNextPageRequest::~ChangesListNextPageRequest() {
523 } 427 }
524 428
525 GURL ChangesListNextPageRequest::GetURLInternal() const { 429 GURL ChangesListNextPageRequest::GetURLInternal() const {
526 return next_link_; 430 return next_link_;
527 } 431 }
528 432
529 //============================== AppsListRequest =========================== 433 //============================== AppsListRequest ===========================
530 434
531 AppsListRequest::AppsListRequest( 435 AppsListRequest::AppsListRequest(
532 RequestSender* sender, 436 RequestSender* sender,
533 const DriveApiUrlGenerator& url_generator, 437 const DriveApiUrlGenerator& url_generator,
534 bool use_internal_endpoint, 438 bool use_internal_endpoint,
535 const AppListCallback& callback) 439 const AppListCallback& callback)
536 : DriveApiDataRequest( 440 : DriveApiDataRequest<AppList>(sender, callback),
537 sender,
538 base::Bind(&ParseJsonAndRun<AppList>, callback)),
539 url_generator_(url_generator), 441 url_generator_(url_generator),
540 use_internal_endpoint_(use_internal_endpoint) { 442 use_internal_endpoint_(use_internal_endpoint) {
541 DCHECK(!callback.is_null()); 443 DCHECK(!callback.is_null());
542 } 444 }
543 445
544 AppsListRequest::~AppsListRequest() {} 446 AppsListRequest::~AppsListRequest() {}
545 447
546 GURL AppsListRequest::GetURLInternal() const { 448 GURL AppsListRequest::GetURLInternal() const {
547 return url_generator_.GetAppsListUrl(use_internal_endpoint_); 449 return url_generator_.GetAppsListUrl(use_internal_endpoint_);
548 } 450 }
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 } 798 }
897 break; 799 break;
898 } 800 }
899 root.SetString("value", value_); 801 root.SetString("value", value_);
900 base::JSONWriter::Write(&root, upload_content); 802 base::JSONWriter::Write(&root, upload_content);
901 return true; 803 return true;
902 } 804 }
903 805
904 } // namespace drive 806 } // namespace drive
905 } // namespace google_apis 807 } // namespace google_apis
OLDNEW
« no previous file with comments | « google_apis/drive/drive_api_requests.h ('k') | google_apis/drive/gdata_wapi_requests.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698