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

Side by Side Diff: chrome/browser/google_apis/drive_api_requests.cc

Issue 96413002: Move c/b/google_apis to google_apis/drive. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 7 years 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/google_apis/drive_api_requests.h"
6
7 #include "base/bind.h"
8 #include "base/callback.h"
9 #include "base/json/json_writer.h"
10 #include "base/location.h"
11 #include "base/sequenced_task_runner.h"
12 #include "base/task_runner_util.h"
13 #include "base/values.h"
14 #include "chrome/browser/google_apis/drive_api_parser.h"
15 #include "chrome/browser/google_apis/request_sender.h"
16 #include "chrome/browser/google_apis/request_util.h"
17 #include "chrome/browser/google_apis/time_util.h"
18 #include "net/base/url_util.h"
19
20 namespace google_apis {
21 namespace {
22
23 const char kContentTypeApplicationJson[] = "application/json";
24 const char kParentLinkKind[] = "drive#fileLink";
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
90 // Parses the JSON value to FileResource instance and runs |callback| on the
91 // UI thread once parsing is done.
92 // This is customized version of ParseJsonAndRun defined above to adapt the
93 // remaining response type.
94 void ParseFileResourceWithUploadRangeAndRun(
95 const drive::UploadRangeCallback& callback,
96 const UploadRangeResponse& response,
97 scoped_ptr<base::Value> value) {
98 DCHECK(!callback.is_null());
99
100 scoped_ptr<FileResource> file_resource;
101 if (value) {
102 file_resource = FileResource::CreateFrom(*value);
103 if (!file_resource) {
104 callback.Run(
105 UploadRangeResponse(GDATA_PARSE_ERROR,
106 response.start_position_received,
107 response.end_position_received),
108 scoped_ptr<FileResource>());
109 return;
110 }
111 }
112
113 callback.Run(response, file_resource.Pass());
114 }
115
116 } // namespace
117
118 namespace drive {
119
120 //============================ DriveApiDataRequest ===========================
121
122 DriveApiDataRequest::DriveApiDataRequest(RequestSender* sender,
123 const GetDataCallback& callback)
124 : GetDataRequest(sender, callback) {
125 }
126
127 DriveApiDataRequest::~DriveApiDataRequest() {
128 }
129
130 GURL DriveApiDataRequest::GetURL() const {
131 GURL url = GetURLInternal();
132 if (!fields_.empty())
133 url = net::AppendOrReplaceQueryParameter(url, "fields", fields_);
134 return url;
135 }
136
137 //=============================== FilesGetRequest =============================
138
139 FilesGetRequest::FilesGetRequest(
140 RequestSender* sender,
141 const DriveApiUrlGenerator& url_generator,
142 const FileResourceCallback& callback)
143 : DriveApiDataRequest(
144 sender,
145 base::Bind(&ParseJsonAndRun<FileResource>, callback)),
146 url_generator_(url_generator) {
147 DCHECK(!callback.is_null());
148 }
149
150 FilesGetRequest::~FilesGetRequest() {}
151
152 GURL FilesGetRequest::GetURLInternal() const {
153 return url_generator_.GetFilesGetUrl(file_id_);
154 }
155
156 //============================ FilesInsertRequest ============================
157
158 FilesInsertRequest::FilesInsertRequest(
159 RequestSender* sender,
160 const DriveApiUrlGenerator& url_generator,
161 const FileResourceCallback& callback)
162 : DriveApiDataRequest(
163 sender,
164 base::Bind(&ParseJsonAndRun<FileResource>, callback)),
165 url_generator_(url_generator) {
166 DCHECK(!callback.is_null());
167 }
168
169 FilesInsertRequest::~FilesInsertRequest() {}
170
171 net::URLFetcher::RequestType FilesInsertRequest::GetRequestType() const {
172 return net::URLFetcher::POST;
173 }
174
175 bool FilesInsertRequest::GetContentData(std::string* upload_content_type,
176 std::string* upload_content) {
177 *upload_content_type = kContentTypeApplicationJson;
178
179 base::DictionaryValue root;
180
181 if (!mime_type_.empty())
182 root.SetString("mimeType", mime_type_);
183
184 if (!parents_.empty()) {
185 base::ListValue* parents_value = new base::ListValue;
186 for (size_t i = 0; i < parents_.size(); ++i) {
187 base::DictionaryValue* parent = new base::DictionaryValue;
188 parent->SetString("id", parents_[i]);
189 parents_value->Append(parent);
190 }
191 root.Set("parents", parents_value);
192 }
193
194 if (!title_.empty())
195 root.SetString("title", title_);
196
197 base::JSONWriter::Write(&root, upload_content);
198 DVLOG(1) << "FilesInsert data: " << *upload_content_type << ", ["
199 << *upload_content << "]";
200 return true;
201 }
202
203 GURL FilesInsertRequest::GetURLInternal() const {
204 return url_generator_.GetFilesInsertUrl();
205 }
206
207 //============================== FilesPatchRequest ============================
208
209 FilesPatchRequest::FilesPatchRequest(
210 RequestSender* sender,
211 const DriveApiUrlGenerator& url_generator,
212 const FileResourceCallback& callback)
213 : DriveApiDataRequest(
214 sender,
215 base::Bind(&ParseJsonAndRun<FileResource>, callback)),
216 url_generator_(url_generator),
217 set_modified_date_(false),
218 update_viewed_date_(true) {
219 DCHECK(!callback.is_null());
220 }
221
222 FilesPatchRequest::~FilesPatchRequest() {}
223
224 net::URLFetcher::RequestType FilesPatchRequest::GetRequestType() const {
225 return net::URLFetcher::PATCH;
226 }
227
228 std::vector<std::string> FilesPatchRequest::GetExtraRequestHeaders() const {
229 std::vector<std::string> headers;
230 headers.push_back(util::kIfMatchAllHeader);
231 return headers;
232 }
233
234 GURL FilesPatchRequest::GetURLInternal() const {
235 return url_generator_.GetFilesPatchUrl(
236 file_id_, set_modified_date_, update_viewed_date_);
237 }
238
239 bool FilesPatchRequest::GetContentData(std::string* upload_content_type,
240 std::string* upload_content) {
241 if (title_.empty() &&
242 modified_date_.is_null() &&
243 last_viewed_by_me_date_.is_null() &&
244 parents_.empty())
245 return false;
246
247 *upload_content_type = kContentTypeApplicationJson;
248
249 base::DictionaryValue root;
250 if (!title_.empty())
251 root.SetString("title", title_);
252
253 if (!modified_date_.is_null())
254 root.SetString("modifiedDate", util::FormatTimeAsString(modified_date_));
255
256 if (!last_viewed_by_me_date_.is_null()) {
257 root.SetString("lastViewedByMeDate",
258 util::FormatTimeAsString(last_viewed_by_me_date_));
259 }
260
261 if (!parents_.empty()) {
262 base::ListValue* parents_value = new base::ListValue;
263 for (size_t i = 0; i < parents_.size(); ++i) {
264 base::DictionaryValue* parent = new base::DictionaryValue;
265 parent->SetString("id", parents_[i]);
266 parents_value->Append(parent);
267 }
268 root.Set("parents", parents_value);
269 }
270
271 base::JSONWriter::Write(&root, upload_content);
272 DVLOG(1) << "FilesPatch data: " << *upload_content_type << ", ["
273 << *upload_content << "]";
274 return true;
275 }
276
277 //============================= FilesCopyRequest ==============================
278
279 FilesCopyRequest::FilesCopyRequest(
280 RequestSender* sender,
281 const DriveApiUrlGenerator& url_generator,
282 const FileResourceCallback& callback)
283 : DriveApiDataRequest(
284 sender,
285 base::Bind(&ParseJsonAndRun<FileResource>, callback)),
286 url_generator_(url_generator) {
287 DCHECK(!callback.is_null());
288 }
289
290 FilesCopyRequest::~FilesCopyRequest() {
291 }
292
293 net::URLFetcher::RequestType FilesCopyRequest::GetRequestType() const {
294 return net::URLFetcher::POST;
295 }
296
297 GURL FilesCopyRequest::GetURLInternal() const {
298 return url_generator_.GetFilesCopyUrl(file_id_);
299 }
300
301 bool FilesCopyRequest::GetContentData(std::string* upload_content_type,
302 std::string* upload_content) {
303 if (parents_.empty() && title_.empty())
304 return false;
305
306 *upload_content_type = kContentTypeApplicationJson;
307
308 base::DictionaryValue root;
309
310 if (!modified_date_.is_null())
311 root.SetString("modifiedDate", util::FormatTimeAsString(modified_date_));
312
313 if (!parents_.empty()) {
314 base::ListValue* parents_value = new base::ListValue;
315 for (size_t i = 0; i < parents_.size(); ++i) {
316 base::DictionaryValue* parent = new base::DictionaryValue;
317 parent->SetString("id", parents_[i]);
318 parents_value->Append(parent);
319 }
320 root.Set("parents", parents_value);
321 }
322
323 if (!title_.empty())
324 root.SetString("title", title_);
325
326 base::JSONWriter::Write(&root, upload_content);
327 DVLOG(1) << "FilesCopy data: " << *upload_content_type << ", ["
328 << *upload_content << "]";
329 return true;
330 }
331
332 //============================= FilesListRequest =============================
333
334 FilesListRequest::FilesListRequest(
335 RequestSender* sender,
336 const DriveApiUrlGenerator& url_generator,
337 const FileListCallback& callback)
338 : DriveApiDataRequest(
339 sender,
340 base::Bind(&ParseJsonOnBlockingPoolAndRun<FileList>,
341 make_scoped_refptr(sender->blocking_task_runner()),
342 callback)),
343 url_generator_(url_generator),
344 max_results_(100) {
345 DCHECK(!callback.is_null());
346 }
347
348 FilesListRequest::~FilesListRequest() {}
349
350 GURL FilesListRequest::GetURLInternal() const {
351 return url_generator_.GetFilesListUrl(max_results_, page_token_, q_);
352 }
353
354 //======================== FilesListNextPageRequest =========================
355
356 FilesListNextPageRequest::FilesListNextPageRequest(
357 RequestSender* sender,
358 const FileListCallback& callback)
359 : DriveApiDataRequest(
360 sender,
361 base::Bind(&ParseJsonOnBlockingPoolAndRun<FileList>,
362 make_scoped_refptr(sender->blocking_task_runner()),
363 callback)) {
364 DCHECK(!callback.is_null());
365 }
366
367 FilesListNextPageRequest::~FilesListNextPageRequest() {
368 }
369
370 GURL FilesListNextPageRequest::GetURLInternal() const {
371 return next_link_;
372 }
373
374 //============================ FilesTrashRequest =============================
375
376 FilesTrashRequest::FilesTrashRequest(
377 RequestSender* sender,
378 const DriveApiUrlGenerator& url_generator,
379 const FileResourceCallback& callback)
380 : DriveApiDataRequest(
381 sender,
382 base::Bind(&ParseJsonAndRun<FileResource>, callback)),
383 url_generator_(url_generator) {
384 DCHECK(!callback.is_null());
385 }
386
387 FilesTrashRequest::~FilesTrashRequest() {}
388
389 net::URLFetcher::RequestType FilesTrashRequest::GetRequestType() const {
390 return net::URLFetcher::POST;
391 }
392
393 GURL FilesTrashRequest::GetURLInternal() const {
394 return url_generator_.GetFilesTrashUrl(file_id_);
395 }
396
397 //============================== AboutGetRequest =============================
398
399 AboutGetRequest::AboutGetRequest(
400 RequestSender* sender,
401 const DriveApiUrlGenerator& url_generator,
402 const AboutResourceCallback& callback)
403 : DriveApiDataRequest(
404 sender,
405 base::Bind(&ParseJsonAndRun<AboutResource>, callback)),
406 url_generator_(url_generator) {
407 DCHECK(!callback.is_null());
408 }
409
410 AboutGetRequest::~AboutGetRequest() {}
411
412 GURL AboutGetRequest::GetURLInternal() const {
413 return url_generator_.GetAboutGetUrl();
414 }
415
416 //============================ ChangesListRequest ===========================
417
418 ChangesListRequest::ChangesListRequest(
419 RequestSender* sender,
420 const DriveApiUrlGenerator& url_generator,
421 const ChangeListCallback& callback)
422 : DriveApiDataRequest(
423 sender,
424 base::Bind(&ParseJsonOnBlockingPoolAndRun<ChangeList>,
425 make_scoped_refptr(sender->blocking_task_runner()),
426 callback)),
427 url_generator_(url_generator),
428 include_deleted_(true),
429 max_results_(100),
430 start_change_id_(0) {
431 DCHECK(!callback.is_null());
432 }
433
434 ChangesListRequest::~ChangesListRequest() {}
435
436 GURL ChangesListRequest::GetURLInternal() const {
437 return url_generator_.GetChangesListUrl(
438 include_deleted_, max_results_, page_token_, start_change_id_);
439 }
440
441 //======================== ChangesListNextPageRequest =========================
442
443 ChangesListNextPageRequest::ChangesListNextPageRequest(
444 RequestSender* sender,
445 const ChangeListCallback& callback)
446 : DriveApiDataRequest(
447 sender,
448 base::Bind(&ParseJsonOnBlockingPoolAndRun<ChangeList>,
449 make_scoped_refptr(sender->blocking_task_runner()),
450 callback)) {
451 DCHECK(!callback.is_null());
452 }
453
454 ChangesListNextPageRequest::~ChangesListNextPageRequest() {
455 }
456
457 GURL ChangesListNextPageRequest::GetURLInternal() const {
458 return next_link_;
459 }
460
461 //============================== AppsListRequest ===========================
462
463 AppsListRequest::AppsListRequest(
464 RequestSender* sender,
465 const DriveApiUrlGenerator& url_generator,
466 const AppListCallback& callback)
467 : DriveApiDataRequest(
468 sender,
469 base::Bind(&ParseJsonAndRun<AppList>, callback)),
470 url_generator_(url_generator) {
471 DCHECK(!callback.is_null());
472 }
473
474 AppsListRequest::~AppsListRequest() {}
475
476 GURL AppsListRequest::GetURLInternal() const {
477 return url_generator_.GetAppsListUrl();
478 }
479
480 //========================== ChildrenInsertRequest ============================
481
482 ChildrenInsertRequest::ChildrenInsertRequest(
483 RequestSender* sender,
484 const DriveApiUrlGenerator& url_generator,
485 const EntryActionCallback& callback)
486 : EntryActionRequest(sender, callback),
487 url_generator_(url_generator) {
488 DCHECK(!callback.is_null());
489 }
490
491 ChildrenInsertRequest::~ChildrenInsertRequest() {}
492
493 net::URLFetcher::RequestType ChildrenInsertRequest::GetRequestType() const {
494 return net::URLFetcher::POST;
495 }
496
497 GURL ChildrenInsertRequest::GetURL() const {
498 return url_generator_.GetChildrenInsertUrl(folder_id_);
499 }
500
501 bool ChildrenInsertRequest::GetContentData(std::string* upload_content_type,
502 std::string* upload_content) {
503 *upload_content_type = kContentTypeApplicationJson;
504
505 base::DictionaryValue root;
506 root.SetString("id", id_);
507
508 base::JSONWriter::Write(&root, upload_content);
509 DVLOG(1) << "InsertResource data: " << *upload_content_type << ", ["
510 << *upload_content << "]";
511 return true;
512 }
513
514 //========================== ChildrenDeleteRequest ============================
515
516 ChildrenDeleteRequest::ChildrenDeleteRequest(
517 RequestSender* sender,
518 const DriveApiUrlGenerator& url_generator,
519 const EntryActionCallback& callback)
520 : EntryActionRequest(sender, callback),
521 url_generator_(url_generator) {
522 DCHECK(!callback.is_null());
523 }
524
525 ChildrenDeleteRequest::~ChildrenDeleteRequest() {}
526
527 net::URLFetcher::RequestType ChildrenDeleteRequest::GetRequestType() const {
528 return net::URLFetcher::DELETE_REQUEST;
529 }
530
531 GURL ChildrenDeleteRequest::GetURL() const {
532 return url_generator_.GetChildrenDeleteUrl(child_id_, folder_id_);
533 }
534
535 //======================= InitiateUploadNewFileRequest =======================
536
537 InitiateUploadNewFileRequest::InitiateUploadNewFileRequest(
538 RequestSender* sender,
539 const DriveApiUrlGenerator& url_generator,
540 const std::string& content_type,
541 int64 content_length,
542 const std::string& parent_resource_id,
543 const std::string& title,
544 const InitiateUploadCallback& callback)
545 : InitiateUploadRequestBase(sender,
546 callback,
547 content_type,
548 content_length),
549 url_generator_(url_generator),
550 parent_resource_id_(parent_resource_id),
551 title_(title) {
552 }
553
554 InitiateUploadNewFileRequest::~InitiateUploadNewFileRequest() {}
555
556 GURL InitiateUploadNewFileRequest::GetURL() const {
557 return url_generator_.GetInitiateUploadNewFileUrl();
558 }
559
560 net::URLFetcher::RequestType
561 InitiateUploadNewFileRequest::GetRequestType() const {
562 return net::URLFetcher::POST;
563 }
564
565 bool InitiateUploadNewFileRequest::GetContentData(
566 std::string* upload_content_type,
567 std::string* upload_content) {
568 *upload_content_type = kContentTypeApplicationJson;
569
570 base::DictionaryValue root;
571 root.SetString("title", title_);
572
573 // Fill parent link.
574 {
575 scoped_ptr<base::DictionaryValue> parent(new base::DictionaryValue);
576 parent->SetString("kind", kParentLinkKind);
577 parent->SetString("id", parent_resource_id_);
578
579 scoped_ptr<base::ListValue> parents(new base::ListValue);
580 parents->Append(parent.release());
581
582 root.Set("parents", parents.release());
583 }
584
585 base::JSONWriter::Write(&root, upload_content);
586
587 DVLOG(1) << "InitiateUploadNewFile data: " << *upload_content_type << ", ["
588 << *upload_content << "]";
589 return true;
590 }
591
592 //===================== InitiateUploadExistingFileRequest ====================
593
594 InitiateUploadExistingFileRequest::InitiateUploadExistingFileRequest(
595 RequestSender* sender,
596 const DriveApiUrlGenerator& url_generator,
597 const std::string& content_type,
598 int64 content_length,
599 const std::string& resource_id,
600 const std::string& etag,
601 const InitiateUploadCallback& callback)
602 : InitiateUploadRequestBase(sender,
603 callback,
604 content_type,
605 content_length),
606 url_generator_(url_generator),
607 resource_id_(resource_id),
608 etag_(etag) {
609 }
610
611 InitiateUploadExistingFileRequest::~InitiateUploadExistingFileRequest() {}
612
613 GURL InitiateUploadExistingFileRequest::GetURL() const {
614 return url_generator_.GetInitiateUploadExistingFileUrl(resource_id_);
615 }
616
617 net::URLFetcher::RequestType
618 InitiateUploadExistingFileRequest::GetRequestType() const {
619 return net::URLFetcher::PUT;
620 }
621
622 std::vector<std::string>
623 InitiateUploadExistingFileRequest::GetExtraRequestHeaders() const {
624 std::vector<std::string> headers(
625 InitiateUploadRequestBase::GetExtraRequestHeaders());
626 headers.push_back(util::GenerateIfMatchHeader(etag_));
627 return headers;
628 }
629
630 //============================ ResumeUploadRequest ===========================
631
632 ResumeUploadRequest::ResumeUploadRequest(
633 RequestSender* sender,
634 const GURL& upload_location,
635 int64 start_position,
636 int64 end_position,
637 int64 content_length,
638 const std::string& content_type,
639 const base::FilePath& local_file_path,
640 const UploadRangeCallback& callback,
641 const ProgressCallback& progress_callback)
642 : ResumeUploadRequestBase(sender,
643 upload_location,
644 start_position,
645 end_position,
646 content_length,
647 content_type,
648 local_file_path),
649 callback_(callback),
650 progress_callback_(progress_callback) {
651 DCHECK(!callback_.is_null());
652 }
653
654 ResumeUploadRequest::~ResumeUploadRequest() {}
655
656 void ResumeUploadRequest::OnRangeRequestComplete(
657 const UploadRangeResponse& response,
658 scoped_ptr<base::Value> value) {
659 DCHECK(CalledOnValidThread());
660 ParseFileResourceWithUploadRangeAndRun(callback_, response, value.Pass());
661 }
662
663 void ResumeUploadRequest::OnURLFetchUploadProgress(
664 const net::URLFetcher* source, int64 current, int64 total) {
665 if (!progress_callback_.is_null())
666 progress_callback_.Run(current, total);
667 }
668
669 //========================== GetUploadStatusRequest ==========================
670
671 GetUploadStatusRequest::GetUploadStatusRequest(
672 RequestSender* sender,
673 const GURL& upload_url,
674 int64 content_length,
675 const UploadRangeCallback& callback)
676 : GetUploadStatusRequestBase(sender,
677 upload_url,
678 content_length),
679 callback_(callback) {
680 DCHECK(!callback.is_null());
681 }
682
683 GetUploadStatusRequest::~GetUploadStatusRequest() {}
684
685 void GetUploadStatusRequest::OnRangeRequestComplete(
686 const UploadRangeResponse& response,
687 scoped_ptr<base::Value> value) {
688 DCHECK(CalledOnValidThread());
689 ParseFileResourceWithUploadRangeAndRun(callback_, response, value.Pass());
690 }
691
692 //========================== DownloadFileRequest ==========================
693
694 DownloadFileRequest::DownloadFileRequest(
695 RequestSender* sender,
696 const DriveApiUrlGenerator& url_generator,
697 const std::string& resource_id,
698 const base::FilePath& output_file_path,
699 const DownloadActionCallback& download_action_callback,
700 const GetContentCallback& get_content_callback,
701 const ProgressCallback& progress_callback)
702 : DownloadFileRequestBase(
703 sender,
704 download_action_callback,
705 get_content_callback,
706 progress_callback,
707 url_generator.GenerateDownloadFileUrl(resource_id),
708 output_file_path) {
709 }
710
711 DownloadFileRequest::~DownloadFileRequest() {
712 }
713
714 } // namespace drive
715 } // namespace google_apis
OLDNEW
« no previous file with comments | « chrome/browser/google_apis/drive_api_requests.h ('k') | chrome/browser/google_apis/drive_api_requests_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698