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.
5 #ifndef GOOGLE_APIS_DRIVE_DRIVE_API_REQUESTS_H_
6 #define GOOGLE_APIS_DRIVE_DRIVE_API_REQUESTS_H_
11 #include "base/callback_forward.h"
12 #include "base/location.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/sequenced_task_runner.h"
15 #include "base/task_runner_util.h"
16 #include "base/time/time.h"
17 #include "base/values.h"
18 #include "google_apis/drive/base_requests.h"
19 #include "google_apis/drive/drive_api_parser.h"
20 #include "google_apis/drive/drive_api_url_generator.h"
21 #include "google_apis/drive/drive_common_callbacks.h"
23 namespace google_apis
{
25 // Callback used for requests that the server returns FileList data
26 // formatted into JSON value.
27 typedef base::Callback
<void(DriveApiErrorCode error
,
28 scoped_ptr
<FileList
> entry
)> FileListCallback
;
30 // Callback used for requests that the server returns ChangeList data
31 // formatted into JSON value.
32 typedef base::Callback
<void(DriveApiErrorCode error
,
33 scoped_ptr
<ChangeList
> entry
)> ChangeListCallback
;
37 // Represents a property for a file or a directory.
38 // https://developers.google.com/drive/v2/reference/properties
44 // Visibility of the property. Either limited to the same client, or to any.
45 enum Visibility
{ VISIBILITY_PRIVATE
, VISIBILITY_PUBLIC
};
47 // Whether the property is public or private.
48 Visibility
visibility() const { return visibility_
; }
50 // Name of the property.
51 const std::string
& key() const { return key_
; }
53 // Value of the property.
54 const std::string
& value() const { return value_
; }
56 void set_visibility(Visibility visibility
) { visibility_
= visibility
; }
57 void set_key(const std::string
& key
) { key_
= key
; }
58 void set_value(const std::string
& value
) { value_
= value
; }
61 Visibility visibility_
;
66 // List of properties for a single file or a directory.
67 typedef std::vector
<Property
> Properties
;
69 // Child response embedded in multipart parent response.
70 struct MultipartHttpResponse
{
71 MultipartHttpResponse();
72 ~MultipartHttpResponse();
73 DriveApiErrorCode code
;
77 // Splits multipart |response| into |parts|. Each part must be HTTP sub-response
78 // of drive batch request. |content_type| is a value of Content-Type response
79 // header. Returns true on succcess.
80 bool ParseMultipartResponse(const std::string
& content_type
,
81 const std::string
& response
,
82 std::vector
<MultipartHttpResponse
>* parts
);
84 //============================ DriveApiPartialFieldRequest ====================
86 // This is base class of the Drive API related requests. All Drive API requests
87 // support partial request (to improve the performance). The function can be
88 // shared among the Drive API requests.
89 // See also https://developers.google.com/drive/performance
90 class DriveApiPartialFieldRequest
: public UrlFetchRequestBase
{
92 explicit DriveApiPartialFieldRequest(RequestSender
* sender
);
93 ~DriveApiPartialFieldRequest() override
;
95 // Optional parameter.
96 const std::string
& fields() const { return fields_
; }
97 void set_fields(const std::string
& fields
) { fields_
= fields
; }
100 // UrlFetchRequestBase overrides.
101 GURL
GetURL() const override
;
103 // Derived classes should override GetURLInternal instead of GetURL()
105 virtual GURL
GetURLInternal() const = 0;
110 DISALLOW_COPY_AND_ASSIGN(DriveApiPartialFieldRequest
);
113 //============================ DriveApiDataRequest ===========================
115 // The base class of Drive API related requests that receive a JSON response
116 // representing |DataType|.
117 template<class DataType
>
118 class DriveApiDataRequest
: public DriveApiPartialFieldRequest
{
120 typedef base::Callback
<void(DriveApiErrorCode error
,
121 scoped_ptr
<DataType
> data
)> Callback
;
123 // |callback| is called when the request finishes either by success or by
124 // failure. On success, a JSON Value object is passed. It must not be null.
125 DriveApiDataRequest(RequestSender
* sender
, const Callback
& callback
)
126 : DriveApiPartialFieldRequest(sender
),
128 weak_ptr_factory_(this) {
129 DCHECK(!callback_
.is_null());
131 ~DriveApiDataRequest() override
{}
134 // UrlFetchRequestBase overrides.
135 void ProcessURLFetchResults(const net::URLFetcher
* source
) override
{
136 DriveApiErrorCode error
= GetErrorCode();
140 base::PostTaskAndReplyWithResult(
141 blocking_task_runner(),
143 base::Bind(&DriveApiDataRequest::Parse
, response_writer()->data()),
144 base::Bind(&DriveApiDataRequest::OnDataParsed
,
145 weak_ptr_factory_
.GetWeakPtr(), error
));
148 RunCallbackOnPrematureFailure(error
);
149 OnProcessURLFetchResultsComplete();
154 void RunCallbackOnPrematureFailure(DriveApiErrorCode error
) override
{
155 callback_
.Run(error
, scoped_ptr
<DataType
>());
159 // Parses the |json| string by using DataType::CreateFrom.
160 static scoped_ptr
<DataType
> Parse(const std::string
& json
) {
161 scoped_ptr
<base::Value
> value
= ParseJson(json
);
162 return value
? DataType::CreateFrom(*value
) : scoped_ptr
<DataType
>();
165 // Receives the parsed result and invokes the callback.
166 void OnDataParsed(DriveApiErrorCode error
, scoped_ptr
<DataType
> value
) {
168 error
= DRIVE_PARSE_ERROR
;
169 callback_
.Run(error
, value
.Pass());
170 OnProcessURLFetchResultsComplete();
173 const Callback callback_
;
175 // Note: This should remain the last member so it'll be destroyed and
176 // invalidate its weak pointers before any other members are destroyed.
177 base::WeakPtrFactory
<DriveApiDataRequest
> weak_ptr_factory_
;
179 DISALLOW_COPY_AND_ASSIGN(DriveApiDataRequest
);
182 //=============================== FilesGetRequest =============================
184 // This class performs the request for fetching a file.
185 // This request is mapped to
186 // https://developers.google.com/drive/v2/reference/files/get
187 class FilesGetRequest
: public DriveApiDataRequest
<FileResource
> {
189 FilesGetRequest(RequestSender
* sender
,
190 const DriveApiUrlGenerator
& url_generator
,
191 bool use_internal_endpoint
,
192 const FileResourceCallback
& callback
);
193 ~FilesGetRequest() override
;
195 // Required parameter.
196 const std::string
& file_id() const { return file_id_
; }
197 void set_file_id(const std::string
& file_id
) { file_id_
= file_id
; }
199 // Optional parameter.
200 const GURL
& embed_origin() const { return embed_origin_
; }
201 void set_embed_origin(const GURL
& embed_origin
) {
202 embed_origin_
= embed_origin
;
206 // Overridden from DriveApiDataRequest.
207 GURL
GetURLInternal() const override
;
210 const DriveApiUrlGenerator url_generator_
;
211 const bool use_internal_endpoint_
;
212 std::string file_id_
;
215 DISALLOW_COPY_AND_ASSIGN(FilesGetRequest
);
218 //============================ FilesAuthorizeRequest ===========================
220 // This class performs request for authorizing an app to access a file.
221 // This request is mapped to /drive/v2internal/file/authorize internal endpoint.
222 class FilesAuthorizeRequest
: public DriveApiDataRequest
<FileResource
> {
224 FilesAuthorizeRequest(RequestSender
* sender
,
225 const DriveApiUrlGenerator
& url_generator
,
226 const FileResourceCallback
& callback
);
227 ~FilesAuthorizeRequest() override
;
229 // Required parameter.
230 const std::string
& file_id() const { return file_id_
; }
231 void set_file_id(const std::string
& file_id
) { file_id_
= file_id
; }
232 const std::string
& app_id() const { return app_id_
; }
233 void set_app_id(const std::string
& app_id
) { app_id_
= app_id
; }
236 // Overridden from GetDataRequest.
237 net::URLFetcher::RequestType
GetRequestType() const override
;
239 // Overridden from DriveApiDataRequest.
240 GURL
GetURLInternal() const override
;
243 const DriveApiUrlGenerator url_generator_
;
244 std::string file_id_
;
247 DISALLOW_COPY_AND_ASSIGN(FilesAuthorizeRequest
);
250 //============================ FilesInsertRequest =============================
252 // Enumeration type for specifying visibility of files.
253 enum FileVisibility
{
254 FILE_VISIBILITY_DEFAULT
,
255 FILE_VISIBILITY_PRIVATE
,
258 // This class performs the request for creating a resource.
259 // This request is mapped to
260 // https://developers.google.com/drive/v2/reference/files/insert
261 // See also https://developers.google.com/drive/manage-uploads and
262 // https://developers.google.com/drive/folder
263 class FilesInsertRequest
: public DriveApiDataRequest
<FileResource
> {
265 FilesInsertRequest(RequestSender
* sender
,
266 const DriveApiUrlGenerator
& url_generator
,
267 const FileResourceCallback
& callback
);
268 ~FilesInsertRequest() override
;
270 // Optional parameter
271 void set_visibility(FileVisibility visibility
) {
272 visibility_
= visibility
;
275 // Optional request body.
276 const base::Time
& last_viewed_by_me_date() const {
277 return last_viewed_by_me_date_
;
279 void set_last_viewed_by_me_date(const base::Time
& last_viewed_by_me_date
) {
280 last_viewed_by_me_date_
= last_viewed_by_me_date
;
283 const std::string
& mime_type() const { return mime_type_
; }
284 void set_mime_type(const std::string
& mime_type
) {
285 mime_type_
= mime_type
;
288 const base::Time
& modified_date() const { return modified_date_
; }
289 void set_modified_date(const base::Time
& modified_date
) {
290 modified_date_
= modified_date
;
293 const std::vector
<std::string
>& parents() const { return parents_
; }
294 void add_parent(const std::string
& parent
) { parents_
.push_back(parent
); }
296 const std::string
& title() const { return title_
; }
297 void set_title(const std::string
& title
) { title_
= title
; }
299 const Properties
& properties() const { return properties_
; }
300 void set_properties(const Properties
& properties
) {
301 properties_
= properties
;
305 // Overridden from GetDataRequest.
306 net::URLFetcher::RequestType
GetRequestType() const override
;
307 bool GetContentData(std::string
* upload_content_type
,
308 std::string
* upload_content
) override
;
310 // Overridden from DriveApiDataRequest.
311 GURL
GetURLInternal() const override
;
314 const DriveApiUrlGenerator url_generator_
;
316 FileVisibility visibility_
;
317 base::Time last_viewed_by_me_date_
;
318 std::string mime_type_
;
319 base::Time modified_date_
;
320 std::vector
<std::string
> parents_
;
322 Properties properties_
;
324 DISALLOW_COPY_AND_ASSIGN(FilesInsertRequest
);
327 //============================== FilesPatchRequest ============================
329 // This class performs the request for patching file metadata.
330 // This request is mapped to
331 // https://developers.google.com/drive/v2/reference/files/patch
332 class FilesPatchRequest
: public DriveApiDataRequest
<FileResource
> {
334 FilesPatchRequest(RequestSender
* sender
,
335 const DriveApiUrlGenerator
& url_generator
,
336 const FileResourceCallback
& callback
);
337 ~FilesPatchRequest() override
;
339 // Required parameter.
340 const std::string
& file_id() const { return file_id_
; }
341 void set_file_id(const std::string
& file_id
) { file_id_
= file_id
; }
343 // Optional parameter.
344 bool set_modified_date() const { return set_modified_date_
; }
345 void set_set_modified_date(bool set_modified_date
) {
346 set_modified_date_
= set_modified_date
;
349 bool update_viewed_date() const { return update_viewed_date_
; }
350 void set_update_viewed_date(bool update_viewed_date
) {
351 update_viewed_date_
= update_viewed_date
;
354 // Optional request body.
355 // Note: "Files: patch" accepts any "Files resource" data, but this class
356 // only supports limited members of it for now. We can extend it upon
358 const std::string
& title() const { return title_
; }
359 void set_title(const std::string
& title
) { title_
= title
; }
361 const base::Time
& modified_date() const { return modified_date_
; }
362 void set_modified_date(const base::Time
& modified_date
) {
363 modified_date_
= modified_date
;
366 const base::Time
& last_viewed_by_me_date() const {
367 return last_viewed_by_me_date_
;
369 void set_last_viewed_by_me_date(const base::Time
& last_viewed_by_me_date
) {
370 last_viewed_by_me_date_
= last_viewed_by_me_date
;
373 const std::vector
<std::string
>& parents() const { return parents_
; }
374 void add_parent(const std::string
& parent
) { parents_
.push_back(parent
); }
376 const Properties
& properties() const { return properties_
; }
377 void set_properties(const Properties
& properties
) {
378 properties_
= properties
;
382 // Overridden from URLFetchRequestBase.
383 net::URLFetcher::RequestType
GetRequestType() const override
;
384 std::vector
<std::string
> GetExtraRequestHeaders() const override
;
385 bool GetContentData(std::string
* upload_content_type
,
386 std::string
* upload_content
) override
;
388 // Overridden from DriveApiDataRequest.
389 GURL
GetURLInternal() const override
;
392 const DriveApiUrlGenerator url_generator_
;
394 std::string file_id_
;
395 bool set_modified_date_
;
396 bool update_viewed_date_
;
399 base::Time modified_date_
;
400 base::Time last_viewed_by_me_date_
;
401 std::vector
<std::string
> parents_
;
402 Properties properties_
;
404 DISALLOW_COPY_AND_ASSIGN(FilesPatchRequest
);
407 //============================= FilesCopyRequest ==============================
409 // This class performs the request for copying a resource.
410 // This request is mapped to
411 // https://developers.google.com/drive/v2/reference/files/copy
412 class FilesCopyRequest
: public DriveApiDataRequest
<FileResource
> {
414 // Upon completion, |callback| will be called. |callback| must not be null.
415 FilesCopyRequest(RequestSender
* sender
,
416 const DriveApiUrlGenerator
& url_generator
,
417 const FileResourceCallback
& callback
);
418 ~FilesCopyRequest() override
;
420 // Required parameter.
421 const std::string
& file_id() const { return file_id_
; }
422 void set_file_id(const std::string
& file_id
) { file_id_
= file_id
; }
424 // Optional parameter
425 void set_visibility(FileVisibility visibility
) {
426 visibility_
= visibility
;
429 // Optional request body.
430 const std::vector
<std::string
>& parents() const { return parents_
; }
431 void add_parent(const std::string
& parent
) { parents_
.push_back(parent
); }
433 const base::Time
& modified_date() const { return modified_date_
; }
434 void set_modified_date(const base::Time
& modified_date
) {
435 modified_date_
= modified_date
;
438 const std::string
& title() const { return title_
; }
439 void set_title(const std::string
& title
) { title_
= title
; }
442 // Overridden from URLFetchRequestBase.
443 net::URLFetcher::RequestType
GetRequestType() const override
;
444 bool GetContentData(std::string
* upload_content_type
,
445 std::string
* upload_content
) override
;
447 // Overridden from DriveApiDataRequest.
448 GURL
GetURLInternal() const override
;
451 const DriveApiUrlGenerator url_generator_
;
453 std::string file_id_
;
454 FileVisibility visibility_
;
455 base::Time modified_date_
;
456 std::vector
<std::string
> parents_
;
459 DISALLOW_COPY_AND_ASSIGN(FilesCopyRequest
);
462 //============================= FilesListRequest =============================
464 // This class performs the request for fetching FileList.
465 // The result may contain only first part of the result. The remaining result
466 // should be able to be fetched by ContinueGetFileListRequest defined below,
467 // or by FilesListRequest with setting page token.
468 // This request is mapped to
469 // https://developers.google.com/drive/v2/reference/files/list
470 class FilesListRequest
: public DriveApiDataRequest
<FileList
> {
472 FilesListRequest(RequestSender
* sender
,
473 const DriveApiUrlGenerator
& url_generator
,
474 const FileListCallback
& callback
);
475 ~FilesListRequest() override
;
477 // Optional parameter
478 int max_results() const { return max_results_
; }
479 void set_max_results(int max_results
) { max_results_
= max_results
; }
481 const std::string
& page_token() const { return page_token_
; }
482 void set_page_token(const std::string
& page_token
) {
483 page_token_
= page_token
;
486 const std::string
& q() const { return q_
; }
487 void set_q(const std::string
& q
) { q_
= q
; }
490 // Overridden from DriveApiDataRequest.
491 GURL
GetURLInternal() const override
;
494 const DriveApiUrlGenerator url_generator_
;
496 std::string page_token_
;
499 DISALLOW_COPY_AND_ASSIGN(FilesListRequest
);
502 //========================= FilesListNextPageRequest ==========================
504 // There are two ways to obtain next pages of "Files: list" result (if paged).
505 // 1) Set pageToken and all params used for the initial request.
506 // 2) Use URL in the nextLink field in the previous response.
507 // This class implements 2)'s request.
508 class FilesListNextPageRequest
: public DriveApiDataRequest
<FileList
> {
510 FilesListNextPageRequest(RequestSender
* sender
,
511 const FileListCallback
& callback
);
512 ~FilesListNextPageRequest() override
;
514 const GURL
& next_link() const { return next_link_
; }
515 void set_next_link(const GURL
& next_link
) { next_link_
= next_link
; }
518 // Overridden from DriveApiDataRequest.
519 GURL
GetURLInternal() const override
;
524 DISALLOW_COPY_AND_ASSIGN(FilesListNextPageRequest
);
527 //============================= FilesDeleteRequest =============================
529 // This class performs the request for deleting a resource.
530 // This request is mapped to
531 // https://developers.google.com/drive/v2/reference/files/delete
532 class FilesDeleteRequest
: public EntryActionRequest
{
534 FilesDeleteRequest(RequestSender
* sender
,
535 const DriveApiUrlGenerator
& url_generator
,
536 const EntryActionCallback
& callback
);
537 ~FilesDeleteRequest() override
;
539 // Required parameter.
540 const std::string
& file_id() const { return file_id_
; }
541 void set_file_id(const std::string
& file_id
) { file_id_
= file_id
; }
542 void set_etag(const std::string
& etag
) { etag_
= etag
; }
545 // Overridden from UrlFetchRequestBase.
546 net::URLFetcher::RequestType
GetRequestType() const override
;
547 GURL
GetURL() const override
;
548 std::vector
<std::string
> GetExtraRequestHeaders() const override
;
551 const DriveApiUrlGenerator url_generator_
;
552 std::string file_id_
;
555 DISALLOW_COPY_AND_ASSIGN(FilesDeleteRequest
);
558 //============================= FilesTrashRequest ==============================
560 // This class performs the request for trashing a resource.
561 // This request is mapped to
562 // https://developers.google.com/drive/v2/reference/files/trash
563 class FilesTrashRequest
: public DriveApiDataRequest
<FileResource
> {
565 FilesTrashRequest(RequestSender
* sender
,
566 const DriveApiUrlGenerator
& url_generator
,
567 const FileResourceCallback
& callback
);
568 ~FilesTrashRequest() override
;
570 // Required parameter.
571 const std::string
& file_id() const { return file_id_
; }
572 void set_file_id(const std::string
& file_id
) { file_id_
= file_id
; }
575 // Overridden from UrlFetchRequestBase.
576 net::URLFetcher::RequestType
GetRequestType() const override
;
578 // Overridden from DriveApiDataRequest.
579 GURL
GetURLInternal() const override
;
582 const DriveApiUrlGenerator url_generator_
;
583 std::string file_id_
;
585 DISALLOW_COPY_AND_ASSIGN(FilesTrashRequest
);
588 //============================== AboutGetRequest =============================
590 // This class performs the request for fetching About data.
591 // This request is mapped to
592 // https://developers.google.com/drive/v2/reference/about/get
593 class AboutGetRequest
: public DriveApiDataRequest
<AboutResource
> {
595 AboutGetRequest(RequestSender
* sender
,
596 const DriveApiUrlGenerator
& url_generator
,
597 const AboutResourceCallback
& callback
);
598 ~AboutGetRequest() override
;
601 // Overridden from DriveApiDataRequest.
602 GURL
GetURLInternal() const override
;
605 const DriveApiUrlGenerator url_generator_
;
607 DISALLOW_COPY_AND_ASSIGN(AboutGetRequest
);
610 //============================ ChangesListRequest ============================
612 // This class performs the request for fetching ChangeList.
613 // The result may contain only first part of the result. The remaining result
614 // should be able to be fetched by ContinueGetFileListRequest defined below.
615 // or by ChangesListRequest with setting page token.
616 // This request is mapped to
617 // https://developers.google.com/drive/v2/reference/changes/list
618 class ChangesListRequest
: public DriveApiDataRequest
<ChangeList
> {
620 ChangesListRequest(RequestSender
* sender
,
621 const DriveApiUrlGenerator
& url_generator
,
622 const ChangeListCallback
& callback
);
623 ~ChangesListRequest() override
;
625 // Optional parameter
626 bool include_deleted() const { return include_deleted_
; }
627 void set_include_deleted(bool include_deleted
) {
628 include_deleted_
= include_deleted
;
631 int max_results() const { return max_results_
; }
632 void set_max_results(int max_results
) { max_results_
= max_results
; }
634 const std::string
& page_token() const { return page_token_
; }
635 void set_page_token(const std::string
& page_token
) {
636 page_token_
= page_token
;
639 int64
start_change_id() const { return start_change_id_
; }
640 void set_start_change_id(int64 start_change_id
) {
641 start_change_id_
= start_change_id
;
645 // Overridden from DriveApiDataRequest.
646 GURL
GetURLInternal() const override
;
649 const DriveApiUrlGenerator url_generator_
;
650 bool include_deleted_
;
652 std::string page_token_
;
653 int64 start_change_id_
;
655 DISALLOW_COPY_AND_ASSIGN(ChangesListRequest
);
658 //======================== ChangesListNextPageRequest =========================
660 // There are two ways to obtain next pages of "Changes: list" result (if paged).
661 // 1) Set pageToken and all params used for the initial request.
662 // 2) Use URL in the nextLink field in the previous response.
663 // This class implements 2)'s request.
664 class ChangesListNextPageRequest
: public DriveApiDataRequest
<ChangeList
> {
666 ChangesListNextPageRequest(RequestSender
* sender
,
667 const ChangeListCallback
& callback
);
668 ~ChangesListNextPageRequest() override
;
670 const GURL
& next_link() const { return next_link_
; }
671 void set_next_link(const GURL
& next_link
) { next_link_
= next_link
; }
674 // Overridden from DriveApiDataRequest.
675 GURL
GetURLInternal() const override
;
680 DISALLOW_COPY_AND_ASSIGN(ChangesListNextPageRequest
);
683 //============================= AppsListRequest ============================
685 // This class performs the request for fetching AppList.
686 // This request is mapped to
687 // https://developers.google.com/drive/v2/reference/apps/list
688 class AppsListRequest
: public DriveApiDataRequest
<AppList
> {
690 AppsListRequest(RequestSender
* sender
,
691 const DriveApiUrlGenerator
& url_generator
,
692 bool use_internal_endpoint
,
693 const AppListCallback
& callback
);
694 ~AppsListRequest() override
;
697 // Overridden from DriveApiDataRequest.
698 GURL
GetURLInternal() const override
;
701 const DriveApiUrlGenerator url_generator_
;
702 const bool use_internal_endpoint_
;
704 DISALLOW_COPY_AND_ASSIGN(AppsListRequest
);
707 //============================= AppsDeleteRequest ==============================
709 // This class performs the request for deleting a Drive app.
710 // This request is mapped to
711 // https://developers.google.com/drive/v2/reference/files/trash
712 class AppsDeleteRequest
: public EntryActionRequest
{
714 AppsDeleteRequest(RequestSender
* sender
,
715 const DriveApiUrlGenerator
& url_generator
,
716 const EntryActionCallback
& callback
);
717 ~AppsDeleteRequest() override
;
719 // Required parameter.
720 const std::string
& app_id() const { return app_id_
; }
721 void set_app_id(const std::string
& app_id
) { app_id_
= app_id
; }
724 // Overridden from UrlFetchRequestBase.
725 net::URLFetcher::RequestType
GetRequestType() const override
;
726 GURL
GetURL() const override
;
729 const DriveApiUrlGenerator url_generator_
;
732 DISALLOW_COPY_AND_ASSIGN(AppsDeleteRequest
);
735 //========================== ChildrenInsertRequest ============================
737 // This class performs the request for inserting a resource to a directory.
738 // This request is mapped to
739 // https://developers.google.com/drive/v2/reference/children/insert
740 class ChildrenInsertRequest
: public EntryActionRequest
{
742 ChildrenInsertRequest(RequestSender
* sender
,
743 const DriveApiUrlGenerator
& url_generator
,
744 const EntryActionCallback
& callback
);
745 ~ChildrenInsertRequest() override
;
747 // Required parameter.
748 const std::string
& folder_id() const { return folder_id_
; }
749 void set_folder_id(const std::string
& folder_id
) {
750 folder_id_
= folder_id
;
754 const std::string
& id() const { return id_
; }
755 void set_id(const std::string
& id
) { id_
= id
; }
758 // UrlFetchRequestBase overrides.
759 net::URLFetcher::RequestType
GetRequestType() const override
;
760 GURL
GetURL() const override
;
761 bool GetContentData(std::string
* upload_content_type
,
762 std::string
* upload_content
) override
;
765 const DriveApiUrlGenerator url_generator_
;
766 std::string folder_id_
;
769 DISALLOW_COPY_AND_ASSIGN(ChildrenInsertRequest
);
772 //========================== ChildrenDeleteRequest ============================
774 // This class performs the request for removing a resource from a directory.
775 // This request is mapped to
776 // https://developers.google.com/drive/v2/reference/children/delete
777 class ChildrenDeleteRequest
: public EntryActionRequest
{
779 // |callback| must not be null.
780 ChildrenDeleteRequest(RequestSender
* sender
,
781 const DriveApiUrlGenerator
& url_generator
,
782 const EntryActionCallback
& callback
);
783 ~ChildrenDeleteRequest() override
;
785 // Required parameter.
786 const std::string
& child_id() const { return child_id_
; }
787 void set_child_id(const std::string
& child_id
) {
788 child_id_
= child_id
;
791 const std::string
& folder_id() const { return folder_id_
; }
792 void set_folder_id(const std::string
& folder_id
) {
793 folder_id_
= folder_id
;
797 // UrlFetchRequestBase overrides.
798 net::URLFetcher::RequestType
GetRequestType() const override
;
799 GURL
GetURL() const override
;
802 const DriveApiUrlGenerator url_generator_
;
803 std::string child_id_
;
804 std::string folder_id_
;
806 DISALLOW_COPY_AND_ASSIGN(ChildrenDeleteRequest
);
809 //======================= InitiateUploadNewFileRequest =======================
811 // This class performs the request for initiating the upload of a new file.
812 class InitiateUploadNewFileRequest
: public InitiateUploadRequestBase
{
814 // |parent_resource_id| should be the resource id of the parent directory.
815 // |title| should be set.
816 // See also the comments of InitiateUploadRequestBase for more details
817 // about the other parameters.
818 InitiateUploadNewFileRequest(RequestSender
* sender
,
819 const DriveApiUrlGenerator
& url_generator
,
820 const std::string
& content_type
,
821 int64 content_length
,
822 const std::string
& parent_resource_id
,
823 const std::string
& title
,
824 const InitiateUploadCallback
& callback
);
825 ~InitiateUploadNewFileRequest() override
;
827 // Optional parameters.
828 const base::Time
& modified_date() const { return modified_date_
; }
829 void set_modified_date(const base::Time
& modified_date
) {
830 modified_date_
= modified_date
;
832 const base::Time
& last_viewed_by_me_date() const {
833 return last_viewed_by_me_date_
;
835 void set_last_viewed_by_me_date(const base::Time
& last_viewed_by_me_date
) {
836 last_viewed_by_me_date_
= last_viewed_by_me_date
;
838 const Properties
& properties() const { return properties_
; }
839 void set_properties(const Properties
& properties
) {
840 properties_
= properties
;
844 // UrlFetchRequestBase overrides.
845 GURL
GetURL() const override
;
846 net::URLFetcher::RequestType
GetRequestType() const override
;
847 bool GetContentData(std::string
* upload_content_type
,
848 std::string
* upload_content
) override
;
851 const DriveApiUrlGenerator url_generator_
;
852 const std::string parent_resource_id_
;
853 const std::string title_
;
855 base::Time modified_date_
;
856 base::Time last_viewed_by_me_date_
;
857 Properties properties_
;
859 DISALLOW_COPY_AND_ASSIGN(InitiateUploadNewFileRequest
);
862 //==================== InitiateUploadExistingFileRequest =====================
864 // This class performs the request for initiating the upload of an existing
866 class InitiateUploadExistingFileRequest
: public InitiateUploadRequestBase
{
868 // |upload_url| should be the upload_url() of the file
869 // (resumable-create-media URL)
870 // |etag| should be set if it is available to detect the upload confliction.
871 // See also the comments of InitiateUploadRequestBase for more details
872 // about the other parameters.
873 InitiateUploadExistingFileRequest(RequestSender
* sender
,
874 const DriveApiUrlGenerator
& url_generator
,
875 const std::string
& content_type
,
876 int64 content_length
,
877 const std::string
& resource_id
,
878 const std::string
& etag
,
879 const InitiateUploadCallback
& callback
);
880 ~InitiateUploadExistingFileRequest() override
;
882 // Optional parameters.
883 const std::string
& parent_resource_id() const { return parent_resource_id_
; }
884 void set_parent_resource_id(const std::string
& parent_resource_id
) {
885 parent_resource_id_
= parent_resource_id
;
887 const std::string
& title() const { return title_
; }
888 void set_title(const std::string
& title
) { title_
= title
; }
889 const base::Time
& modified_date() const { return modified_date_
; }
890 void set_modified_date(const base::Time
& modified_date
) {
891 modified_date_
= modified_date
;
893 const base::Time
& last_viewed_by_me_date() const {
894 return last_viewed_by_me_date_
;
896 void set_last_viewed_by_me_date(const base::Time
& last_viewed_by_me_date
) {
897 last_viewed_by_me_date_
= last_viewed_by_me_date
;
899 const Properties
& properties() const { return properties_
; }
900 void set_properties(const Properties
& properties
) {
901 properties_
= properties
;
905 // UrlFetchRequestBase overrides.
906 GURL
GetURL() const override
;
907 net::URLFetcher::RequestType
GetRequestType() const override
;
908 std::vector
<std::string
> GetExtraRequestHeaders() const override
;
909 bool GetContentData(std::string
* upload_content_type
,
910 std::string
* upload_content
) override
;
913 const DriveApiUrlGenerator url_generator_
;
914 const std::string resource_id_
;
915 const std::string etag_
;
917 std::string parent_resource_id_
;
919 base::Time modified_date_
;
920 base::Time last_viewed_by_me_date_
;
921 Properties properties_
;
923 DISALLOW_COPY_AND_ASSIGN(InitiateUploadExistingFileRequest
);
926 // Callback used for ResumeUpload() and GetUploadStatus().
927 typedef base::Callback
<void(
928 const UploadRangeResponse
& response
,
929 scoped_ptr
<FileResource
> new_resource
)> UploadRangeCallback
;
931 //============================ ResumeUploadRequest ===========================
933 // Performs the request for resuming the upload of a file.
934 class ResumeUploadRequest
: public ResumeUploadRequestBase
{
936 // See also ResumeUploadRequestBase's comment for parameters meaning.
937 // |callback| must not be null. |progress_callback| may be null.
938 ResumeUploadRequest(RequestSender
* sender
,
939 const GURL
& upload_location
,
940 int64 start_position
,
942 int64 content_length
,
943 const std::string
& content_type
,
944 const base::FilePath
& local_file_path
,
945 const UploadRangeCallback
& callback
,
946 const ProgressCallback
& progress_callback
);
947 ~ResumeUploadRequest() override
;
950 // UploadRangeRequestBase overrides.
951 void OnRangeRequestComplete(const UploadRangeResponse
& response
,
952 scoped_ptr
<base::Value
> value
) override
;
953 // content::UrlFetcherDelegate overrides.
954 void OnURLFetchUploadProgress(const net::URLFetcher
* source
,
956 int64 total
) override
;
959 const UploadRangeCallback callback_
;
960 const ProgressCallback progress_callback_
;
962 DISALLOW_COPY_AND_ASSIGN(ResumeUploadRequest
);
965 //========================== GetUploadStatusRequest ==========================
967 // Performs the request to fetch the current upload status of a file.
968 class GetUploadStatusRequest
: public GetUploadStatusRequestBase
{
970 // See also GetUploadStatusRequestBase's comment for parameters meaning.
971 // |callback| must not be null.
972 GetUploadStatusRequest(RequestSender
* sender
,
973 const GURL
& upload_url
,
974 int64 content_length
,
975 const UploadRangeCallback
& callback
);
976 ~GetUploadStatusRequest() override
;
979 // UploadRangeRequestBase overrides.
980 void OnRangeRequestComplete(const UploadRangeResponse
& response
,
981 scoped_ptr
<base::Value
> value
) override
;
984 const UploadRangeCallback callback_
;
986 DISALLOW_COPY_AND_ASSIGN(GetUploadStatusRequest
);
989 //======================= MultipartUploadNewFileDelegate =======================
991 // This class performs the request for initiating the upload of a new file.
992 class MultipartUploadNewFileDelegate
: public MultipartUploadRequestBase
{
994 // |parent_resource_id| should be the resource id of the parent directory.
995 // |title| should be set.
996 // See also the comments of MultipartUploadRequestBase for more details
997 // about the other parameters.
998 MultipartUploadNewFileDelegate(base::SequencedTaskRunner
* task_runner
,
999 const std::string
& title
,
1000 const std::string
& parent_resource_id
,
1001 const std::string
& content_type
,
1002 int64 content_length
,
1003 const base::Time
& modified_date
,
1004 const base::Time
& last_viewed_by_me_date
,
1005 const base::FilePath
& local_file_path
,
1006 const Properties
& properties
,
1007 const DriveApiUrlGenerator
& url_generator
,
1008 const FileResourceCallback
& callback
,
1009 const ProgressCallback
& progress_callback
);
1010 ~MultipartUploadNewFileDelegate() override
;
1013 // UrlFetchRequestBase overrides.
1014 GURL
GetURL() const override
;
1015 net::URLFetcher::RequestType
GetRequestType() const override
;
1018 const bool has_modified_date_
;
1019 const DriveApiUrlGenerator url_generator_
;
1021 DISALLOW_COPY_AND_ASSIGN(MultipartUploadNewFileDelegate
);
1024 //====================== MultipartUploadExistingFileDelegate ===================
1026 // This class performs the request for initiating the upload of a new file.
1027 class MultipartUploadExistingFileDelegate
: public MultipartUploadRequestBase
{
1029 // |parent_resource_id| should be the resource id of the parent directory.
1030 // |title| should be set.
1031 // See also the comments of MultipartUploadRequestBase for more details
1032 // about the other parameters.
1033 MultipartUploadExistingFileDelegate(
1034 base::SequencedTaskRunner
* task_runner
,
1035 const std::string
& title
,
1036 const std::string
& resource_id
,
1037 const std::string
& parent_resource_id
,
1038 const std::string
& content_type
,
1039 int64 content_length
,
1040 const base::Time
& modified_date
,
1041 const base::Time
& last_viewed_by_me_date
,
1042 const base::FilePath
& local_file_path
,
1043 const std::string
& etag
,
1044 const Properties
& properties
,
1045 const DriveApiUrlGenerator
& url_generator
,
1046 const FileResourceCallback
& callback
,
1047 const ProgressCallback
& progress_callback
);
1048 ~MultipartUploadExistingFileDelegate() override
;
1051 // UrlFetchRequestBase overrides.
1052 std::vector
<std::string
> GetExtraRequestHeaders() const override
;
1053 GURL
GetURL() const override
;
1054 net::URLFetcher::RequestType
GetRequestType() const override
;
1057 const std::string resource_id_
;
1058 const std::string etag_
;
1059 const bool has_modified_date_
;
1060 const DriveApiUrlGenerator url_generator_
;
1062 DISALLOW_COPY_AND_ASSIGN(MultipartUploadExistingFileDelegate
);
1065 //========================== DownloadFileRequest ==========================
1067 // This class performs the request for downloading of a specified file.
1068 class DownloadFileRequest
: public DownloadFileRequestBase
{
1070 // See also DownloadFileRequestBase's comment for parameters meaning.
1071 DownloadFileRequest(RequestSender
* sender
,
1072 const DriveApiUrlGenerator
& url_generator
,
1073 const std::string
& resource_id
,
1074 const base::FilePath
& output_file_path
,
1075 const DownloadActionCallback
& download_action_callback
,
1076 const GetContentCallback
& get_content_callback
,
1077 const ProgressCallback
& progress_callback
);
1078 ~DownloadFileRequest() override
;
1080 DISALLOW_COPY_AND_ASSIGN(DownloadFileRequest
);
1083 //========================== PermissionsInsertRequest ==========================
1085 // Enumeration type for specifying type of permissions.
1086 enum PermissionType
{
1087 PERMISSION_TYPE_ANYONE
,
1088 PERMISSION_TYPE_DOMAIN
,
1089 PERMISSION_TYPE_GROUP
,
1090 PERMISSION_TYPE_USER
,
1093 // Enumeration type for specifying the role of permissions.
1094 enum PermissionRole
{
1095 PERMISSION_ROLE_OWNER
,
1096 PERMISSION_ROLE_READER
,
1097 PERMISSION_ROLE_WRITER
,
1098 PERMISSION_ROLE_COMMENTER
,
1101 // This class performs the request for adding permission on a specified file.
1102 class PermissionsInsertRequest
: public EntryActionRequest
{
1104 // See https://developers.google.com/drive/v2/reference/permissions/insert.
1105 PermissionsInsertRequest(RequestSender
* sender
,
1106 const DriveApiUrlGenerator
& url_generator
,
1107 const EntryActionCallback
& callback
);
1108 ~PermissionsInsertRequest() override
;
1110 void set_id(const std::string
& id
) { id_
= id
; }
1111 void set_type(PermissionType type
) { type_
= type
; }
1112 void set_role(PermissionRole role
) { role_
= role
; }
1113 void set_value(const std::string
& value
) { value_
= value
; }
1115 // UrlFetchRequestBase overrides.
1116 GURL
GetURL() const override
;
1117 net::URLFetcher::RequestType
GetRequestType() const override
;
1118 bool GetContentData(std::string
* upload_content_type
,
1119 std::string
* upload_content
) override
;
1122 const DriveApiUrlGenerator url_generator_
;
1124 PermissionType type_
;
1125 PermissionRole role_
;
1128 DISALLOW_COPY_AND_ASSIGN(PermissionsInsertRequest
);
1131 //======================= SingleBatchableDelegateRequest =======================
1133 // Request that is operated by single BatchableDelegate.
1134 class SingleBatchableDelegateRequest
: public UrlFetchRequestBase
{
1136 // The instance takes ownership of |delegate|.
1137 SingleBatchableDelegateRequest(RequestSender
* sender
,
1138 BatchableDelegate
* delegate
);
1139 ~SingleBatchableDelegateRequest() override
;
1142 GURL
GetURL() const override
;
1143 net::URLFetcher::RequestType
GetRequestType() const override
;
1144 std::vector
<std::string
> GetExtraRequestHeaders() const override
;
1145 void Prepare(const PrepareCallback
& callback
) override
;
1146 bool GetContentData(std::string
* upload_content_type
,
1147 std::string
* upload_content
) override
;
1148 void RunCallbackOnPrematureFailure(DriveApiErrorCode code
) override
;
1149 void ProcessURLFetchResults(const net::URLFetcher
* source
) override
;
1150 void OnURLFetchUploadProgress(const net::URLFetcher
* source
,
1152 int64 total
) override
;
1153 scoped_ptr
<BatchableDelegate
> delegate_
;
1155 // Note: This should remain the last member so it'll be destroyed and
1156 // invalidate its weak pointers before any other members are destroyed.
1157 base::WeakPtrFactory
<SingleBatchableDelegateRequest
> weak_ptr_factory_
;
1159 DISALLOW_COPY_AND_ASSIGN(SingleBatchableDelegateRequest
);
1162 //========================== BatchUploadRequest ==========================
1164 class BatchUploadChildEntry
{
1166 explicit BatchUploadChildEntry(BatchableDelegate
* request
);
1167 ~BatchUploadChildEntry();
1168 scoped_ptr
<BatchableDelegate
> request
;
1174 DISALLOW_COPY_AND_ASSIGN(BatchUploadChildEntry
);
1177 class BatchUploadRequest
: public UrlFetchRequestBase
{
1179 BatchUploadRequest(RequestSender
* sender
,
1180 const DriveApiUrlGenerator
& url_generator
);
1181 ~BatchUploadRequest() override
;
1183 // Adds request to the batch request. The instance takes ownership of
1185 void AddRequest(BatchableDelegate
* request
);
1187 // Completes building batch upload request, and starts to send the request to
1188 // server. Must add at least one request before calling |Commit|.
1191 // Obtains weak pointer of this.
1192 base::WeakPtr
<BatchUploadRequest
> GetWeakPtrAsBatchUploadRequest();
1194 // Set boundary. Only tests can use this method.
1195 void SetBoundaryForTesting(const std::string
& boundary
);
1197 // Obtains reference to RequestSender that owns the request.
1198 RequestSender
* sender() const { return sender_
; }
1200 // Obtains URLGenerator.
1201 const DriveApiUrlGenerator
& url_generator() const { return url_generator_
; }
1203 // UrlFetchRequestBase overrides.
1204 void Prepare(const PrepareCallback
& callback
) override
;
1205 void Cancel() override
;
1206 GURL
GetURL() const override
;
1207 net::URLFetcher::RequestType
GetRequestType() const override
;
1208 std::vector
<std::string
> GetExtraRequestHeaders() const override
;
1209 bool GetContentData(std::string
* upload_content_type
,
1210 std::string
* upload_content
) override
;
1211 void ProcessURLFetchResults(const net::URLFetcher
* source
) override
;
1212 void RunCallbackOnPrematureFailure(DriveApiErrorCode code
) override
;
1214 // content::UrlFetcherDelegate overrides.
1215 void OnURLFetchUploadProgress(const net::URLFetcher
* source
,
1217 int64 total
) override
;
1220 typedef void* RequestID
;
1221 // Obtains corresponding child entry of |request_id|. Returns NULL if the
1222 // entry is not found.
1223 ScopedVector
<BatchUploadChildEntry
>::iterator
GetChildEntry(
1224 RequestID request_id
);
1226 // Called after child requests' |Prepare| method.
1227 void OnChildRequestPrepared(RequestID request_id
, DriveApiErrorCode result
);
1229 // Complete |Prepare| if possible.
1230 void MayCompletePrepare();
1232 // Process result for each child.
1233 void ProcessURLFetchResultsForChild(RequestID id
, const std::string
& body
);
1235 RequestSender
* const sender_
;
1236 const DriveApiUrlGenerator url_generator_
;
1237 ScopedVector
<BatchUploadChildEntry
> child_requests_
;
1239 PrepareCallback prepare_callback_
;
1242 // Boundary of multipart body.
1243 std::string boundary_
;
1245 // Multipart of child requests.
1246 ContentTypeAndData upload_content_
;
1248 // Last reported progress value.
1249 int64 last_progress_value_
;
1251 // Note: This should remain the last member so it'll be destroyed and
1252 // invalidate its weak pointers before any other members are destroyed.
1253 base::WeakPtrFactory
<BatchUploadRequest
> weak_ptr_factory_
;
1255 DISALLOW_COPY_AND_ASSIGN(BatchUploadRequest
);
1258 } // namespace drive
1259 } // namespace google_apis
1261 #endif // GOOGLE_APIS_DRIVE_DRIVE_API_REQUESTS_H_