| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef GOOGLE_APIS_DRIVE_DRIVE_API_REQUESTS_H_ |
| #define GOOGLE_APIS_DRIVE_DRIVE_API_REQUESTS_H_ |
| |
| #include <stdint.h> |
| |
| #include <memory> |
| #include <string> |
| #include <utility> |
| #include <vector> |
| |
| #include "base/bind.h" |
| #include "base/callback_forward.h" |
| #include "base/location.h" |
| #include "base/memory/raw_ptr.h" |
| #include "base/task/sequenced_task_runner.h" |
| #include "base/task/task_runner_util.h" |
| #include "base/time/time.h" |
| #include "base/values.h" |
| #include "google_apis/drive/drive_api_parser.h" |
| #include "google_apis/drive/drive_api_url_generator.h" |
| #include "google_apis/drive/drive_base_requests.h" |
| #include "google_apis/drive/drive_common_callbacks.h" |
| #include "services/network/public/mojom/url_response_head.mojom-forward.h" |
| |
| namespace google_apis { |
| |
| // Callback used for requests that the server returns TeamDrive data |
| // formatted into JSON value. |
| using TeamDriveListCallback = |
| base::OnceCallback<void(ApiErrorCode error, |
| std::unique_ptr<TeamDriveList> entry)>; |
| |
| // Callback used for requests that the server returns FileList data |
| // formatted into JSON value. |
| typedef base::OnceCallback<void(ApiErrorCode error, |
| std::unique_ptr<FileList> entry)> |
| FileListCallback; |
| |
| // DEPRECATED: Please use ChangeListOnceCallback instead |
| // Callback used for requests that the server returns ChangeList data |
| // formatted into JSON value. |
| using ChangeListCallback = |
| base::OnceCallback<void(ApiErrorCode error, |
| std::unique_ptr<ChangeList> entry)>; |
| |
| using ChangeListOnceCallback = |
| base::OnceCallback<void(ApiErrorCode error, |
| std::unique_ptr<ChangeList> entry)>; |
| |
| // Callback used for requests that the server returns StartToken data |
| // formatted into JSON value. |
| using StartPageTokenCallback = |
| base::OnceCallback<void(ApiErrorCode error, |
| std::unique_ptr<StartPageToken> entry)>; |
| |
| namespace drive { |
| |
| // Represents a property for a file or a directory. |
| // https://developers.google.com/drive/v2/reference/properties |
| class Property { |
| public: |
| Property(); |
| ~Property(); |
| |
| // Visibility of the property. Either limited to the same client, or to any. |
| enum Visibility { VISIBILITY_PRIVATE, VISIBILITY_PUBLIC }; |
| |
| // Whether the property is public or private. |
| Visibility visibility() const { return visibility_; } |
| |
| // Name of the property. |
| const std::string& key() const { return key_; } |
| |
| // Value of the property. |
| const std::string& value() const { return value_; } |
| |
| void set_visibility(Visibility visibility) { visibility_ = visibility; } |
| void set_key(const std::string& key) { key_ = key; } |
| void set_value(const std::string& value) { value_ = value; } |
| |
| private: |
| Visibility visibility_; |
| std::string key_; |
| std::string value_; |
| }; |
| |
| // List of properties for a single file or a directory. |
| typedef std::vector<Property> Properties; |
| |
| // Child response embedded in multipart parent response. |
| struct MultipartHttpResponse { |
| MultipartHttpResponse(); |
| ~MultipartHttpResponse(); |
| ApiErrorCode code = HTTP_SUCCESS; |
| std::string body; |
| }; |
| |
| // Splits multipart |response| into |parts|. Each part must be HTTP sub-response |
| // of drive batch request. |content_type| is a value of Content-Type response |
| // header. Returns true on success. |
| bool ParseMultipartResponse(const std::string& content_type, |
| const std::string& response, |
| std::vector<MultipartHttpResponse>* parts); |
| |
| //============================ DriveApiPartialFieldRequest ==================== |
| |
| // This is base class of the Drive API related requests. All Drive API requests |
| // support partial request (to improve the performance). The function can be |
| // shared among the Drive API requests. |
| // See also https://developers.google.com/drive/performance |
| class DriveApiPartialFieldRequest : public DriveUrlFetchRequestBase { |
| public: |
| explicit DriveApiPartialFieldRequest(RequestSender* sender); |
| |
| DriveApiPartialFieldRequest(const DriveApiPartialFieldRequest&) = delete; |
| DriveApiPartialFieldRequest& operator=(const DriveApiPartialFieldRequest&) = |
| delete; |
| |
| ~DriveApiPartialFieldRequest() override; |
| |
| // Optional parameter. |
| const std::string& fields() const { return fields_; } |
| void set_fields(const std::string& fields) { fields_ = fields; } |
| |
| protected: |
| // UrlFetchRequestBase overrides. |
| GURL GetURL() const override; |
| |
| // Derived classes should override GetURLInternal instead of GetURL() |
| // directly. |
| virtual GURL GetURLInternal() const = 0; |
| |
| private: |
| std::string fields_; |
| }; |
| |
| //============================ DriveApiDataRequest =========================== |
| |
| // The base class of Drive API related requests that receive a JSON response |
| // representing |DataType|. |
| template <class DataType> |
| class DriveApiDataRequest : public DriveApiPartialFieldRequest { |
| public: |
| using Callback = base::OnceCallback<void(ApiErrorCode error, |
| std::unique_ptr<DataType> data)>; |
| |
| // |callback| is called when the request finishes either by success or by |
| // failure. On success, a JSON Value object is passed. It must not be null. |
| DriveApiDataRequest(RequestSender* sender, Callback callback) |
| : DriveApiPartialFieldRequest(sender), callback_(std::move(callback)) { |
| DCHECK(!callback_.is_null()); |
| } |
| |
| DriveApiDataRequest(const DriveApiDataRequest&) = delete; |
| DriveApiDataRequest& operator=(const DriveApiDataRequest&) = delete; |
| |
| ~DriveApiDataRequest() override {} |
| |
| protected: |
| // UrlFetchRequestBase overrides. |
| void ProcessURLFetchResults( |
| const network::mojom::URLResponseHead* response_head, |
| base::FilePath response_file, |
| std::string response_body) override { |
| ApiErrorCode error = GetErrorCode(); |
| switch (error) { |
| case HTTP_SUCCESS: |
| case HTTP_CREATED: |
| base::PostTaskAndReplyWithResult( |
| blocking_task_runner(), FROM_HERE, |
| base::BindOnce(&DriveApiDataRequest::Parse, |
| std::move(response_body)), |
| base::BindOnce(&DriveApiDataRequest::OnDataParsed, |
| weak_ptr_factory_.GetWeakPtr(), error)); |
| break; |
| default: |
| RunCallbackOnPrematureFailure(error); |
| OnProcessURLFetchResultsComplete(); |
| break; |
| } |
| } |
| |
| void RunCallbackOnPrematureFailure(ApiErrorCode error) override { |
| std::move(callback_).Run(error, std::unique_ptr<DataType>()); |
| } |
| |
| private: |
| // Parses the |json| string by using DataType::CreateFrom. |
| static std::unique_ptr<DataType> Parse(std::string json) { |
| std::unique_ptr<base::Value> value = ParseJson(json); |
| return value ? DataType::CreateFrom(*value) : std::unique_ptr<DataType>(); |
| } |
| |
| // Receives the parsed result and invokes the callback. |
| void OnDataParsed(ApiErrorCode error, std::unique_ptr<DataType> value) { |
| if (!value) |
| error = PARSE_ERROR; |
| std::move(callback_).Run(error, std::move(value)); |
| OnProcessURLFetchResultsComplete(); |
| } |
| |
| Callback callback_; |
| |
| // Note: This should remain the last member so it'll be destroyed and |
| // invalidate its weak pointers before any other members are destroyed. |
| base::WeakPtrFactory<DriveApiDataRequest> weak_ptr_factory_{this}; |
| }; |
| |
| //=============================== FilesGetRequest ============================= |
| |
| // This class performs the request for fetching a file. |
| // This request is mapped to |
| // https://developers.google.com/drive/v2/reference/files/get |
| class FilesGetRequest : public DriveApiDataRequest<FileResource> { |
| public: |
| FilesGetRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| FileResourceCallback callback); |
| |
| FilesGetRequest(const FilesGetRequest&) = delete; |
| FilesGetRequest& operator=(const FilesGetRequest&) = delete; |
| |
| ~FilesGetRequest() override; |
| |
| // Required parameter. |
| const std::string& file_id() const { return file_id_; } |
| void set_file_id(const std::string& file_id) { file_id_ = file_id; } |
| |
| // Optional parameter. |
| const GURL& embed_origin() const { return embed_origin_; } |
| void set_embed_origin(const GURL& embed_origin) { |
| embed_origin_ = embed_origin; |
| } |
| |
| protected: |
| // Overridden from DriveApiDataRequest. |
| GURL GetURLInternal() const override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| std::string file_id_; |
| GURL embed_origin_; |
| }; |
| |
| //============================ FilesInsertRequest ============================= |
| |
| // Enumeration type for specifying visibility of files. |
| enum FileVisibility { |
| FILE_VISIBILITY_DEFAULT, |
| FILE_VISIBILITY_PRIVATE, |
| }; |
| |
| // This class performs the request for creating a resource. |
| // This request is mapped to |
| // https://developers.google.com/drive/v2/reference/files/insert |
| // See also https://developers.google.com/drive/manage-uploads and |
| // https://developers.google.com/drive/folder |
| class FilesInsertRequest : public DriveApiDataRequest<FileResource> { |
| public: |
| FilesInsertRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| FileResourceCallback callback); |
| |
| FilesInsertRequest(const FilesInsertRequest&) = delete; |
| FilesInsertRequest& operator=(const FilesInsertRequest&) = delete; |
| |
| ~FilesInsertRequest() override; |
| |
| // Optional parameter |
| void set_visibility(FileVisibility visibility) { visibility_ = visibility; } |
| |
| // Optional request body. |
| const base::Time& last_viewed_by_me_date() const { |
| return last_viewed_by_me_date_; |
| } |
| void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) { |
| last_viewed_by_me_date_ = last_viewed_by_me_date; |
| } |
| |
| const std::string& mime_type() const { return mime_type_; } |
| void set_mime_type(const std::string& mime_type) { mime_type_ = mime_type; } |
| |
| const base::Time& modified_date() const { return modified_date_; } |
| void set_modified_date(const base::Time& modified_date) { |
| modified_date_ = modified_date; |
| } |
| |
| const std::vector<std::string>& parents() const { return parents_; } |
| void add_parent(const std::string& parent) { parents_.push_back(parent); } |
| |
| const std::string& title() const { return title_; } |
| void set_title(const std::string& title) { title_ = title; } |
| |
| const Properties& properties() const { return properties_; } |
| void set_properties(const Properties& properties) { |
| properties_ = properties; |
| } |
| |
| protected: |
| // Overridden from GetDataRequest. |
| std::string GetRequestType() const override; |
| bool GetContentData(std::string* upload_content_type, |
| std::string* upload_content) override; |
| |
| // Overridden from DriveApiDataRequest. |
| GURL GetURLInternal() const override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| |
| FileVisibility visibility_; |
| base::Time last_viewed_by_me_date_; |
| std::string mime_type_; |
| base::Time modified_date_; |
| std::vector<std::string> parents_; |
| std::string title_; |
| Properties properties_; |
| }; |
| |
| //============================== FilesPatchRequest ============================ |
| |
| // This class performs the request for patching file metadata. |
| // This request is mapped to |
| // https://developers.google.com/drive/v2/reference/files/patch |
| class FilesPatchRequest : public DriveApiDataRequest<FileResource> { |
| public: |
| FilesPatchRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| FileResourceCallback callback); |
| |
| FilesPatchRequest(const FilesPatchRequest&) = delete; |
| FilesPatchRequest& operator=(const FilesPatchRequest&) = delete; |
| |
| ~FilesPatchRequest() override; |
| |
| // Required parameter. |
| const std::string& file_id() const { return file_id_; } |
| void set_file_id(const std::string& file_id) { file_id_ = file_id; } |
| |
| // Optional parameter. |
| bool set_modified_date() const { return set_modified_date_; } |
| void set_set_modified_date(bool set_modified_date) { |
| set_modified_date_ = set_modified_date; |
| } |
| |
| bool update_viewed_date() const { return update_viewed_date_; } |
| void set_update_viewed_date(bool update_viewed_date) { |
| update_viewed_date_ = update_viewed_date; |
| } |
| |
| // Optional request body. |
| // Note: "Files: patch" accepts any "Files resource" data, but this class |
| // only supports limited members of it for now. We can extend it upon |
| // requirments. |
| const std::string& title() const { return title_; } |
| void set_title(const std::string& title) { title_ = title; } |
| |
| const base::Time& modified_date() const { return modified_date_; } |
| void set_modified_date(const base::Time& modified_date) { |
| modified_date_ = modified_date; |
| } |
| |
| const base::Time& last_viewed_by_me_date() const { |
| return last_viewed_by_me_date_; |
| } |
| void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) { |
| last_viewed_by_me_date_ = last_viewed_by_me_date; |
| } |
| |
| const std::vector<std::string>& parents() const { return parents_; } |
| void add_parent(const std::string& parent) { parents_.push_back(parent); } |
| |
| const Properties& properties() const { return properties_; } |
| void set_properties(const Properties& properties) { |
| properties_ = properties; |
| } |
| |
| protected: |
| // Overridden from URLFetchRequestBase. |
| std::string GetRequestType() const override; |
| std::vector<std::string> GetExtraRequestHeaders() const override; |
| bool GetContentData(std::string* upload_content_type, |
| std::string* upload_content) override; |
| |
| // Overridden from DriveApiDataRequest. |
| GURL GetURLInternal() const override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| |
| std::string file_id_; |
| bool set_modified_date_; |
| bool update_viewed_date_; |
| |
| std::string title_; |
| base::Time modified_date_; |
| base::Time last_viewed_by_me_date_; |
| std::vector<std::string> parents_; |
| Properties properties_; |
| }; |
| |
| //============================= FilesCopyRequest ============================== |
| |
| // This class performs the request for copying a resource. |
| // This request is mapped to |
| // https://developers.google.com/drive/v2/reference/files/copy |
| class FilesCopyRequest : public DriveApiDataRequest<FileResource> { |
| public: |
| // Upon completion, |callback| will be called. |callback| must not be null. |
| FilesCopyRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| FileResourceCallback callback); |
| |
| FilesCopyRequest(const FilesCopyRequest&) = delete; |
| FilesCopyRequest& operator=(const FilesCopyRequest&) = delete; |
| |
| ~FilesCopyRequest() override; |
| |
| // Required parameter. |
| const std::string& file_id() const { return file_id_; } |
| void set_file_id(const std::string& file_id) { file_id_ = file_id; } |
| |
| // Optional parameter |
| void set_visibility(FileVisibility visibility) { visibility_ = visibility; } |
| |
| // Optional request body. |
| const std::vector<std::string>& parents() const { return parents_; } |
| void add_parent(const std::string& parent) { parents_.push_back(parent); } |
| |
| const base::Time& modified_date() const { return modified_date_; } |
| void set_modified_date(const base::Time& modified_date) { |
| modified_date_ = modified_date; |
| } |
| |
| const std::string& title() const { return title_; } |
| void set_title(const std::string& title) { title_ = title; } |
| |
| protected: |
| // Overridden from URLFetchRequestBase. |
| std::string GetRequestType() const override; |
| bool GetContentData(std::string* upload_content_type, |
| std::string* upload_content) override; |
| |
| // Overridden from DriveApiDataRequest. |
| GURL GetURLInternal() const override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| |
| std::string file_id_; |
| FileVisibility visibility_; |
| base::Time modified_date_; |
| std::vector<std::string> parents_; |
| std::string title_; |
| }; |
| |
| //========================== TeamDriveListRequest ============================= |
| |
| // This class performs the request for fetching TeamDrive list. |
| // The result may contain only first part of the result. The remaining result |
| // should be able to be fetched by another request using this class, by |
| // setting the next_page_token from previous call, to page_token. |
| // This request is mapped to |
| // https://developers.google.com/drive/v2/reference/teamdrives/list |
| class TeamDriveListRequest : public DriveApiDataRequest<TeamDriveList> { |
| public: |
| TeamDriveListRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| TeamDriveListCallback callback); |
| |
| TeamDriveListRequest(const TeamDriveListRequest&) = delete; |
| TeamDriveListRequest& operator=(const TeamDriveListRequest&) = delete; |
| |
| ~TeamDriveListRequest() override; |
| |
| // Optional parameter |
| int max_results() const { return max_results_; } |
| void set_max_results(int max_results) { max_results_ = max_results; } |
| |
| const std::string& page_token() const { return page_token_; } |
| void set_page_token(const std::string& page_token) { |
| page_token_ = page_token; |
| } |
| |
| protected: |
| // Overridden from DriveApiDataRequest. |
| GURL GetURLInternal() const override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| int max_results_; |
| std::string page_token_; |
| }; |
| |
| //========================== StartPageTokenRequest ============================= |
| |
| // This class performs the request for fetching the start page token. |
| // |team_drive_id_| may be empty, in which case the start page token will be |
| // returned for the users changes. |
| // This request is mapped to |
| // https://developers.google.com/drive/v2/reference/changes/getStartPageToken |
| class StartPageTokenRequest : public DriveApiDataRequest<StartPageToken> { |
| public: |
| StartPageTokenRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| StartPageTokenCallback callback); |
| |
| StartPageTokenRequest(const StartPageTokenRequest&) = delete; |
| StartPageTokenRequest& operator=(const StartPageTokenRequest&) = delete; |
| |
| ~StartPageTokenRequest() override; |
| |
| // Optional parameter |
| const std::string& team_drive_id() const { return team_drive_id_; } |
| void set_team_drive_id(const std::string& team_drive_id) { |
| team_drive_id_ = team_drive_id; |
| } |
| |
| protected: |
| // Overridden from DriveApiDataRequest. |
| GURL GetURLInternal() const override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| std::string team_drive_id_; |
| }; |
| |
| //============================= FilesListRequest ============================= |
| |
| // This class performs the request for fetching FileList. |
| // The result may contain only first part of the result. The remaining result |
| // should be able to be fetched by ContinueGetFileListRequest defined below, |
| // or by FilesListRequest with setting page token. |
| // This request is mapped to |
| // https://developers.google.com/drive/v2/reference/files/list |
| class FilesListRequest : public DriveApiDataRequest<FileList> { |
| public: |
| FilesListRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| FileListCallback callback); |
| |
| FilesListRequest(const FilesListRequest&) = delete; |
| FilesListRequest& operator=(const FilesListRequest&) = delete; |
| |
| ~FilesListRequest() override; |
| |
| // Optional parameter |
| int max_results() const { return max_results_; } |
| void set_max_results(int max_results) { max_results_ = max_results; } |
| |
| const std::string& page_token() const { return page_token_; } |
| void set_page_token(const std::string& page_token) { |
| page_token_ = page_token; |
| } |
| |
| FilesListCorpora corpora() const { return corpora_; } |
| void set_corpora(FilesListCorpora corpora) { corpora_ = corpora; } |
| |
| const std::string& team_drive_id() const { return team_drive_id_; } |
| void set_team_drive_id(const std::string& team_drive_id) { |
| team_drive_id_ = team_drive_id; |
| } |
| |
| const std::string& q() const { return q_; } |
| void set_q(const std::string& q) { q_ = q; } |
| |
| protected: |
| // Overridden from DriveApiDataRequest. |
| GURL GetURLInternal() const override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| int max_results_; |
| std::string page_token_; |
| FilesListCorpora corpora_; |
| std::string team_drive_id_; |
| std::string q_; |
| }; |
| |
| //========================= FilesListNextPageRequest ========================== |
| |
| // There are two ways to obtain next pages of "Files: list" result (if paged). |
| // 1) Set pageToken and all params used for the initial request. |
| // 2) Use URL in the nextLink field in the previous response. |
| // This class implements 2)'s request. |
| class FilesListNextPageRequest : public DriveApiDataRequest<FileList> { |
| public: |
| FilesListNextPageRequest(RequestSender* sender, FileListCallback callback); |
| |
| FilesListNextPageRequest(const FilesListNextPageRequest&) = delete; |
| FilesListNextPageRequest& operator=(const FilesListNextPageRequest&) = delete; |
| |
| ~FilesListNextPageRequest() override; |
| |
| const GURL& next_link() const { return next_link_; } |
| void set_next_link(const GURL& next_link) { next_link_ = next_link; } |
| |
| protected: |
| // Overridden from DriveApiDataRequest. |
| GURL GetURLInternal() const override; |
| |
| private: |
| GURL next_link_; |
| }; |
| |
| //============================= FilesDeleteRequest ============================= |
| |
| // This class performs the request for deleting a resource. |
| // This request is mapped to |
| // https://developers.google.com/drive/v2/reference/files/delete |
| class FilesDeleteRequest : public EntryActionRequest { |
| public: |
| FilesDeleteRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| EntryActionCallback callback); |
| |
| FilesDeleteRequest(const FilesDeleteRequest&) = delete; |
| FilesDeleteRequest& operator=(const FilesDeleteRequest&) = delete; |
| |
| ~FilesDeleteRequest() override; |
| |
| // Required parameter. |
| const std::string& file_id() const { return file_id_; } |
| void set_file_id(const std::string& file_id) { file_id_ = file_id; } |
| void set_etag(const std::string& etag) { etag_ = etag; } |
| |
| protected: |
| // Overridden from UrlFetchRequestBase. |
| std::string GetRequestType() const override; |
| GURL GetURL() const override; |
| std::vector<std::string> GetExtraRequestHeaders() const override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| std::string file_id_; |
| std::string etag_; |
| }; |
| |
| //============================= FilesTrashRequest ============================== |
| |
| // This class performs the request for trashing a resource. |
| // This request is mapped to |
| // https://developers.google.com/drive/v2/reference/files/trash |
| class FilesTrashRequest : public DriveApiDataRequest<FileResource> { |
| public: |
| FilesTrashRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| FileResourceCallback callback); |
| |
| FilesTrashRequest(const FilesTrashRequest&) = delete; |
| FilesTrashRequest& operator=(const FilesTrashRequest&) = delete; |
| |
| ~FilesTrashRequest() override; |
| |
| // Required parameter. |
| const std::string& file_id() const { return file_id_; } |
| void set_file_id(const std::string& file_id) { file_id_ = file_id; } |
| |
| protected: |
| // Overridden from UrlFetchRequestBase. |
| std::string GetRequestType() const override; |
| |
| // Overridden from DriveApiDataRequest. |
| GURL GetURLInternal() const override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| std::string file_id_; |
| }; |
| |
| //============================== AboutGetRequest ============================= |
| |
| // This class performs the request for fetching About data. |
| // This request is mapped to |
| // https://developers.google.com/drive/v2/reference/about/get |
| class AboutGetRequest : public DriveApiDataRequest<AboutResource> { |
| public: |
| AboutGetRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| AboutResourceCallback callback); |
| |
| AboutGetRequest(const AboutGetRequest&) = delete; |
| AboutGetRequest& operator=(const AboutGetRequest&) = delete; |
| |
| ~AboutGetRequest() override; |
| |
| protected: |
| // Overridden from DriveApiDataRequest. |
| GURL GetURLInternal() const override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| }; |
| |
| //============================ ChangesListRequest ============================ |
| |
| // This class performs the request for fetching ChangeList. |
| // The result may contain only first part of the result. The remaining result |
| // should be able to be fetched by ContinueGetFileListRequest defined below. |
| // or by ChangesListRequest with setting page token. |
| // This request is mapped to |
| // https://developers.google.com/drive/v2/reference/changes/list |
| class ChangesListRequest : public DriveApiDataRequest<ChangeList> { |
| public: |
| ChangesListRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| ChangeListCallback callback); |
| |
| ChangesListRequest(const ChangesListRequest&) = delete; |
| ChangesListRequest& operator=(const ChangesListRequest&) = delete; |
| |
| ~ChangesListRequest() override; |
| |
| // Optional parameter |
| bool include_deleted() const { return include_deleted_; } |
| void set_include_deleted(bool include_deleted) { |
| include_deleted_ = include_deleted; |
| } |
| |
| int max_results() const { return max_results_; } |
| void set_max_results(int max_results) { max_results_ = max_results; } |
| |
| const std::string& page_token() const { return page_token_; } |
| void set_page_token(const std::string& page_token) { |
| page_token_ = page_token; |
| } |
| |
| int64_t start_change_id() const { return start_change_id_; } |
| void set_start_change_id(int64_t start_change_id) { |
| start_change_id_ = start_change_id; |
| } |
| |
| const std::string& team_drive_id() const { return team_drive_id_; } |
| void set_team_drive_id(const std::string& team_drive_id) { |
| team_drive_id_ = team_drive_id; |
| } |
| |
| protected: |
| // Overridden from DriveApiDataRequest. |
| GURL GetURLInternal() const override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| bool include_deleted_; |
| int max_results_; |
| std::string page_token_; |
| int64_t start_change_id_; |
| std::string team_drive_id_; |
| }; |
| |
| //======================== ChangesListNextPageRequest ========================= |
| |
| // There are two ways to obtain next pages of "Changes: list" result (if paged). |
| // 1) Set pageToken and all params used for the initial request. |
| // 2) Use URL in the nextLink field in the previous response. |
| // This class implements 2)'s request. |
| class ChangesListNextPageRequest : public DriveApiDataRequest<ChangeList> { |
| public: |
| ChangesListNextPageRequest(RequestSender* sender, |
| ChangeListCallback callback); |
| |
| ChangesListNextPageRequest(const ChangesListNextPageRequest&) = delete; |
| ChangesListNextPageRequest& operator=(const ChangesListNextPageRequest&) = |
| delete; |
| |
| ~ChangesListNextPageRequest() override; |
| |
| const GURL& next_link() const { return next_link_; } |
| void set_next_link(const GURL& next_link) { next_link_ = next_link; } |
| |
| protected: |
| // Overridden from DriveApiDataRequest. |
| GURL GetURLInternal() const override; |
| |
| private: |
| GURL next_link_; |
| }; |
| |
| //========================== ChildrenInsertRequest ============================ |
| |
| // This class performs the request for inserting a resource to a directory. |
| // This request is mapped to |
| // https://developers.google.com/drive/v2/reference/children/insert |
| class ChildrenInsertRequest : public EntryActionRequest { |
| public: |
| ChildrenInsertRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| EntryActionCallback callback); |
| |
| ChildrenInsertRequest(const ChildrenInsertRequest&) = delete; |
| ChildrenInsertRequest& operator=(const ChildrenInsertRequest&) = delete; |
| |
| ~ChildrenInsertRequest() override; |
| |
| // Required parameter. |
| const std::string& folder_id() const { return folder_id_; } |
| void set_folder_id(const std::string& folder_id) { folder_id_ = folder_id; } |
| |
| // Required body. |
| const std::string& id() const { return id_; } |
| void set_id(const std::string& id) { id_ = id; } |
| |
| protected: |
| // UrlFetchRequestBase overrides. |
| std::string GetRequestType() const override; |
| GURL GetURL() const override; |
| bool GetContentData(std::string* upload_content_type, |
| std::string* upload_content) override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| std::string folder_id_; |
| std::string id_; |
| }; |
| |
| //========================== ChildrenDeleteRequest ============================ |
| |
| // This class performs the request for removing a resource from a directory. |
| // This request is mapped to |
| // https://developers.google.com/drive/v2/reference/children/delete |
| class ChildrenDeleteRequest : public EntryActionRequest { |
| public: |
| // |callback| must not be null. |
| ChildrenDeleteRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| EntryActionCallback callback); |
| |
| ChildrenDeleteRequest(const ChildrenDeleteRequest&) = delete; |
| ChildrenDeleteRequest& operator=(const ChildrenDeleteRequest&) = delete; |
| |
| ~ChildrenDeleteRequest() override; |
| |
| // Required parameter. |
| const std::string& child_id() const { return child_id_; } |
| void set_child_id(const std::string& child_id) { child_id_ = child_id; } |
| |
| const std::string& folder_id() const { return folder_id_; } |
| void set_folder_id(const std::string& folder_id) { folder_id_ = folder_id; } |
| |
| protected: |
| // UrlFetchRequestBase overrides. |
| std::string GetRequestType() const override; |
| GURL GetURL() const override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| std::string child_id_; |
| std::string folder_id_; |
| }; |
| |
| //======================= InitiateUploadNewFileRequest ======================= |
| |
| // This class performs the request for initiating the upload of a new file. |
| class InitiateUploadNewFileRequest : public InitiateUploadRequestBase { |
| public: |
| // |parent_resource_id| should be the resource id of the parent directory. |
| // |title| should be set. |
| // See also the comments of InitiateUploadRequestBase for more details |
| // about the other parameters. |
| InitiateUploadNewFileRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| const std::string& content_type, |
| int64_t content_length, |
| const std::string& parent_resource_id, |
| const std::string& title, |
| InitiateUploadCallback callback); |
| |
| InitiateUploadNewFileRequest(const InitiateUploadNewFileRequest&) = delete; |
| InitiateUploadNewFileRequest& operator=(const InitiateUploadNewFileRequest&) = |
| delete; |
| |
| ~InitiateUploadNewFileRequest() override; |
| |
| // Optional parameters. |
| const base::Time& modified_date() const { return modified_date_; } |
| void set_modified_date(const base::Time& modified_date) { |
| modified_date_ = modified_date; |
| } |
| const base::Time& last_viewed_by_me_date() const { |
| return last_viewed_by_me_date_; |
| } |
| void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) { |
| last_viewed_by_me_date_ = last_viewed_by_me_date; |
| } |
| const Properties& properties() const { return properties_; } |
| void set_properties(const Properties& properties) { |
| properties_ = properties; |
| } |
| |
| protected: |
| // UrlFetchRequestBase overrides. |
| GURL GetURL() const override; |
| std::string GetRequestType() const override; |
| bool GetContentData(std::string* upload_content_type, |
| std::string* upload_content) override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| const std::string parent_resource_id_; |
| const std::string title_; |
| |
| base::Time modified_date_; |
| base::Time last_viewed_by_me_date_; |
| Properties properties_; |
| }; |
| |
| //==================== InitiateUploadExistingFileRequest ===================== |
| |
| // This class performs the request for initiating the upload of an existing |
| // file. |
| class InitiateUploadExistingFileRequest : public InitiateUploadRequestBase { |
| public: |
| // |upload_url| should be the upload_url() of the file |
| // (resumable-create-media URL) |
| // |etag| should be set if it is available to detect the upload confliction. |
| // See also the comments of InitiateUploadRequestBase for more details |
| // about the other parameters. |
| InitiateUploadExistingFileRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| const std::string& content_type, |
| int64_t content_length, |
| const std::string& resource_id, |
| const std::string& etag, |
| InitiateUploadCallback callback); |
| |
| InitiateUploadExistingFileRequest(const InitiateUploadExistingFileRequest&) = |
| delete; |
| InitiateUploadExistingFileRequest& operator=( |
| const InitiateUploadExistingFileRequest&) = delete; |
| |
| ~InitiateUploadExistingFileRequest() override; |
| |
| // Optional parameters. |
| const std::string& parent_resource_id() const { return parent_resource_id_; } |
| void set_parent_resource_id(const std::string& parent_resource_id) { |
| parent_resource_id_ = parent_resource_id; |
| } |
| const std::string& title() const { return title_; } |
| void set_title(const std::string& title) { title_ = title; } |
| const base::Time& modified_date() const { return modified_date_; } |
| void set_modified_date(const base::Time& modified_date) { |
| modified_date_ = modified_date; |
| } |
| const base::Time& last_viewed_by_me_date() const { |
| return last_viewed_by_me_date_; |
| } |
| void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) { |
| last_viewed_by_me_date_ = last_viewed_by_me_date; |
| } |
| const Properties& properties() const { return properties_; } |
| void set_properties(const Properties& properties) { |
| properties_ = properties; |
| } |
| |
| protected: |
| // UrlFetchRequestBase overrides. |
| GURL GetURL() const override; |
| std::string GetRequestType() const override; |
| std::vector<std::string> GetExtraRequestHeaders() const override; |
| bool GetContentData(std::string* upload_content_type, |
| std::string* upload_content) override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| const std::string resource_id_; |
| const std::string etag_; |
| |
| std::string parent_resource_id_; |
| std::string title_; |
| base::Time modified_date_; |
| base::Time last_viewed_by_me_date_; |
| Properties properties_; |
| }; |
| |
| // Callback used for ResumeUpload() and GetUploadStatus(). |
| typedef base::OnceCallback<void(const UploadRangeResponse& response, |
| std::unique_ptr<FileResource> new_resource)> |
| UploadRangeCallback; |
| |
| //============================ ResumeUploadRequest =========================== |
| |
| // Performs the request for resuming the upload of a file. |
| class ResumeUploadRequest : public ResumeUploadRequestBase { |
| public: |
| // See also ResumeUploadRequestBase's comment for parameters meaning. |
| // |callback| must not be null. |progress_callback| may be null. |
| ResumeUploadRequest(RequestSender* sender, |
| const GURL& upload_location, |
| int64_t start_position, |
| int64_t end_position, |
| int64_t content_length, |
| const std::string& content_type, |
| const base::FilePath& local_file_path, |
| UploadRangeCallback callback, |
| ProgressCallback progress_callback); |
| |
| ResumeUploadRequest(const ResumeUploadRequest&) = delete; |
| ResumeUploadRequest& operator=(const ResumeUploadRequest&) = delete; |
| |
| ~ResumeUploadRequest() override; |
| |
| protected: |
| // UploadRangeRequestBase overrides. |
| void OnRangeRequestComplete(const UploadRangeResponse& response, |
| std::unique_ptr<base::Value> value) override; |
| |
| private: |
| UploadRangeCallback callback_; |
| }; |
| |
| //========================== GetUploadStatusRequest ========================== |
| |
| // Performs the request to fetch the current upload status of a file. |
| class GetUploadStatusRequest : public GetUploadStatusRequestBase { |
| public: |
| // See also GetUploadStatusRequestBase's comment for parameters meaning. |
| // |callback| must not be null. |
| GetUploadStatusRequest(RequestSender* sender, |
| const GURL& upload_url, |
| int64_t content_length, |
| UploadRangeCallback callback); |
| |
| GetUploadStatusRequest(const GetUploadStatusRequest&) = delete; |
| GetUploadStatusRequest& operator=(const GetUploadStatusRequest&) = delete; |
| |
| ~GetUploadStatusRequest() override; |
| |
| protected: |
| // UploadRangeRequestBase overrides. |
| void OnRangeRequestComplete(const UploadRangeResponse& response, |
| std::unique_ptr<base::Value> value) override; |
| |
| private: |
| UploadRangeCallback callback_; |
| }; |
| |
| //======================= MultipartUploadNewFileDelegate ======================= |
| |
| // This class performs the request for initiating the upload of a new file. |
| class MultipartUploadNewFileDelegate : public MultipartUploadRequestBase { |
| public: |
| // |parent_resource_id| should be the resource id of the parent directory. |
| // |title| should be set. |
| // See also the comments of MultipartUploadRequestBase for more details |
| // about the other parameters. |
| MultipartUploadNewFileDelegate(base::SequencedTaskRunner* task_runner, |
| const std::string& title, |
| const std::string& parent_resource_id, |
| const std::string& content_type, |
| int64_t content_length, |
| const base::Time& modified_date, |
| const base::Time& last_viewed_by_me_date, |
| const base::FilePath& local_file_path, |
| const Properties& properties, |
| const DriveApiUrlGenerator& url_generator, |
| FileResourceCallback callback, |
| ProgressCallback progress_callback); |
| |
| MultipartUploadNewFileDelegate(const MultipartUploadNewFileDelegate&) = |
| delete; |
| MultipartUploadNewFileDelegate& operator=( |
| const MultipartUploadNewFileDelegate&) = delete; |
| |
| ~MultipartUploadNewFileDelegate() override; |
| |
| protected: |
| // UrlFetchRequestBase overrides. |
| GURL GetURL() const override; |
| std::string GetRequestType() const override; |
| |
| private: |
| const bool has_modified_date_; |
| const DriveApiUrlGenerator url_generator_; |
| }; |
| |
| //====================== MultipartUploadExistingFileDelegate =================== |
| |
| // This class performs the request for initiating the upload of a new file. |
| class MultipartUploadExistingFileDelegate : public MultipartUploadRequestBase { |
| public: |
| // |parent_resource_id| should be the resource id of the parent directory. |
| // |title| should be set. |
| // See also the comments of MultipartUploadRequestBase for more details |
| // about the other parameters. |
| MultipartUploadExistingFileDelegate(base::SequencedTaskRunner* task_runner, |
| const std::string& title, |
| const std::string& resource_id, |
| const std::string& parent_resource_id, |
| const std::string& content_type, |
| int64_t content_length, |
| const base::Time& modified_date, |
| const base::Time& last_viewed_by_me_date, |
| const base::FilePath& local_file_path, |
| const std::string& etag, |
| const Properties& properties, |
| const DriveApiUrlGenerator& url_generator, |
| FileResourceCallback callback, |
| ProgressCallback progress_callback); |
| |
| MultipartUploadExistingFileDelegate( |
| const MultipartUploadExistingFileDelegate&) = delete; |
| MultipartUploadExistingFileDelegate& operator=( |
| const MultipartUploadExistingFileDelegate&) = delete; |
| |
| ~MultipartUploadExistingFileDelegate() override; |
| |
| protected: |
| // UrlFetchRequestBase overrides. |
| std::vector<std::string> GetExtraRequestHeaders() const override; |
| GURL GetURL() const override; |
| std::string GetRequestType() const override; |
| |
| private: |
| const std::string resource_id_; |
| const std::string etag_; |
| const bool has_modified_date_; |
| const DriveApiUrlGenerator url_generator_; |
| }; |
| |
| //========================== DownloadFileRequest ========================== |
| |
| // This class performs the request for downloading of a specified file. |
| class DownloadFileRequest : public DownloadFileRequestBase { |
| public: |
| // See also DownloadFileRequestBase's comment for parameters meaning. |
| DownloadFileRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| const std::string& resource_id, |
| const base::FilePath& output_file_path, |
| DownloadActionCallback download_action_callback, |
| const GetContentCallback& get_content_callback, |
| ProgressCallback progress_callback); |
| |
| DownloadFileRequest(const DownloadFileRequest&) = delete; |
| DownloadFileRequest& operator=(const DownloadFileRequest&) = delete; |
| |
| ~DownloadFileRequest() override; |
| }; |
| |
| //========================== PermissionsInsertRequest ========================== |
| |
| // Enumeration type for specifying type of permissions. |
| enum PermissionType { |
| PERMISSION_TYPE_ANYONE, |
| PERMISSION_TYPE_DOMAIN, |
| PERMISSION_TYPE_GROUP, |
| PERMISSION_TYPE_USER, |
| }; |
| |
| // Enumeration type for specifying the role of permissions. |
| enum PermissionRole { |
| PERMISSION_ROLE_OWNER, |
| PERMISSION_ROLE_READER, |
| PERMISSION_ROLE_WRITER, |
| PERMISSION_ROLE_COMMENTER, |
| }; |
| |
| // This class performs the request for adding permission on a specified file. |
| class PermissionsInsertRequest : public EntryActionRequest { |
| public: |
| // See https://developers.google.com/drive/v2/reference/permissions/insert. |
| PermissionsInsertRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator, |
| EntryActionCallback callback); |
| |
| PermissionsInsertRequest(const PermissionsInsertRequest&) = delete; |
| PermissionsInsertRequest& operator=(const PermissionsInsertRequest&) = delete; |
| |
| ~PermissionsInsertRequest() override; |
| |
| void set_id(const std::string& id) { id_ = id; } |
| void set_type(PermissionType type) { type_ = type; } |
| void set_role(PermissionRole role) { role_ = role; } |
| void set_value(const std::string& value) { value_ = value; } |
| |
| // UrlFetchRequestBase overrides. |
| GURL GetURL() const override; |
| std::string GetRequestType() const override; |
| bool GetContentData(std::string* upload_content_type, |
| std::string* upload_content) override; |
| |
| private: |
| const DriveApiUrlGenerator url_generator_; |
| std::string id_; |
| PermissionType type_; |
| PermissionRole role_; |
| std::string value_; |
| }; |
| |
| //======================= SingleBatchableDelegateRequest ======================= |
| |
| // Request that is operated by single BatchableDelegate. |
| class SingleBatchableDelegateRequest : public DriveUrlFetchRequestBase { |
| public: |
| SingleBatchableDelegateRequest(RequestSender* sender, |
| std::unique_ptr<BatchableDelegate> delegate); |
| |
| SingleBatchableDelegateRequest(const SingleBatchableDelegateRequest&) = |
| delete; |
| SingleBatchableDelegateRequest& operator=( |
| const SingleBatchableDelegateRequest&) = delete; |
| |
| ~SingleBatchableDelegateRequest() override; |
| |
| private: |
| GURL GetURL() const override; |
| std::string GetRequestType() const override; |
| std::vector<std::string> GetExtraRequestHeaders() const override; |
| void Prepare(PrepareCallback callback) override; |
| bool GetContentData(std::string* upload_content_type, |
| std::string* upload_content) override; |
| void RunCallbackOnPrematureFailure(ApiErrorCode code) override; |
| void ProcessURLFetchResults( |
| const network::mojom::URLResponseHead* response_head, |
| base::FilePath response_file, |
| std::string response_body) override; |
| void OnUploadProgress(int64_t current, int64_t total); |
| std::unique_ptr<BatchableDelegate> delegate_; |
| |
| // Note: This should remain the last member so it'll be destroyed and |
| // invalidate its weak pointers before any other members are destroyed. |
| base::WeakPtrFactory<SingleBatchableDelegateRequest> weak_ptr_factory_{this}; |
| }; |
| |
| //========================== BatchUploadRequest ========================== |
| |
| class BatchUploadChildEntry { |
| public: |
| explicit BatchUploadChildEntry(BatchableDelegate* request); |
| |
| BatchUploadChildEntry(const BatchUploadChildEntry&) = delete; |
| BatchUploadChildEntry& operator=(const BatchUploadChildEntry&) = delete; |
| |
| ~BatchUploadChildEntry(); |
| std::unique_ptr<BatchableDelegate> request; |
| bool prepared; |
| int64_t data_offset; |
| int64_t data_size; |
| }; |
| |
| class BatchUploadRequest : public DriveUrlFetchRequestBase { |
| public: |
| BatchUploadRequest(RequestSender* sender, |
| const DriveApiUrlGenerator& url_generator); |
| |
| BatchUploadRequest(const BatchUploadRequest&) = delete; |
| BatchUploadRequest& operator=(const BatchUploadRequest&) = delete; |
| |
| ~BatchUploadRequest() override; |
| |
| // Adds request to the batch request. The instance takes ownership of |
| // |request|. |
| void AddRequest(BatchableDelegate* request); |
| |
| // Completes building batch upload request, and starts to send the request to |
| // server. Must add at least one request before calling |Commit|. |
| void Commit(); |
| |
| // Obtains weak pointer of this. |
| base::WeakPtr<BatchUploadRequest> GetWeakPtrAsBatchUploadRequest(); |
| |
| // Set boundary. Only tests can use this method. |
| void SetBoundaryForTesting(const std::string& boundary); |
| |
| // Obtains reference to RequestSender that owns the request. |
| RequestSender* sender() const { return sender_; } |
| |
| // Obtains URLGenerator. |
| const DriveApiUrlGenerator& url_generator() const { return url_generator_; } |
| |
| // UrlFetchRequestBase overrides. |
| void Prepare(PrepareCallback callback) override; |
| void Cancel() override; |
| GURL GetURL() const override; |
| std::string GetRequestType() const override; |
| std::vector<std::string> GetExtraRequestHeaders() const override; |
| bool GetContentData(std::string* upload_content_type, |
| std::string* upload_content) override; |
| void ProcessURLFetchResults( |
| const network::mojom::URLResponseHead* response_head, |
| base::FilePath response_file, |
| std::string response_body) override; |
| void RunCallbackOnPrematureFailure(ApiErrorCode code) override; |
| |
| // Called by UrlFetchRequestBase to report upload progress. |
| void OnUploadProgress(int64_t current, int64_t total); |
| |
| private: |
| typedef void* RequestID; |
| // Obtains corresponding child entry of |request_id|. Returns NULL if the |
| // entry is not found. |
| std::vector<std::unique_ptr<BatchUploadChildEntry>>::iterator GetChildEntry( |
| RequestID request_id); |
| |
| // Called after child requests' |Prepare| method. |
| void OnChildRequestPrepared(RequestID request_id, ApiErrorCode result); |
| |
| // Complete |Prepare| if possible. |
| void MayCompletePrepare(); |
| |
| // Process result for each child. |
| void ProcessURLFetchResultsForChild(RequestID id, const std::string& body); |
| |
| const raw_ptr<RequestSender> sender_; |
| const DriveApiUrlGenerator url_generator_; |
| std::vector<std::unique_ptr<BatchUploadChildEntry>> child_requests_; |
| |
| PrepareCallback prepare_callback_; |
| bool committed_; |
| |
| // Boundary of multipart body. |
| std::string boundary_; |
| |
| // Multipart of child requests. |
| ContentTypeAndData upload_content_; |
| |
| // Last reported progress value. |
| int64_t last_progress_value_; |
| |
| // Note: This should remain the last member so it'll be destroyed and |
| // invalidate its weak pointers before any other members are destroyed. |
| base::WeakPtrFactory<BatchUploadRequest> weak_ptr_factory_{this}; |
| }; |
| |
| } // namespace drive |
| } // namespace google_apis |
| |
| #endif // GOOGLE_APIS_DRIVE_DRIVE_API_REQUESTS_H_ |