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

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

Issue 449323002: Revert 288017 "Parse Drive API responses all at once in the bloc..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: 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
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"
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « trunk/src/google_apis/drive/drive_api_requests.h ('k') | trunk/src/google_apis/drive/gdata_wapi_requests.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698