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