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" | |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |