drive_api_requests.h 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332
  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. #ifndef GOOGLE_APIS_DRIVE_DRIVE_API_REQUESTS_H_
  5. #define GOOGLE_APIS_DRIVE_DRIVE_API_REQUESTS_H_
  6. #include <stdint.h>
  7. #include <memory>
  8. #include <string>
  9. #include <utility>
  10. #include <vector>
  11. #include "base/bind.h"
  12. #include "base/callback_forward.h"
  13. #include "base/location.h"
  14. #include "base/memory/raw_ptr.h"
  15. #include "base/task/sequenced_task_runner.h"
  16. #include "base/task/task_runner_util.h"
  17. #include "base/time/time.h"
  18. #include "base/values.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_base_requests.h"
  22. #include "google_apis/drive/drive_common_callbacks.h"
  23. #include "services/network/public/mojom/url_response_head.mojom-forward.h"
  24. namespace google_apis {
  25. // Callback used for requests that the server returns TeamDrive data
  26. // formatted into JSON value.
  27. using TeamDriveListCallback =
  28. base::OnceCallback<void(ApiErrorCode error,
  29. std::unique_ptr<TeamDriveList> entry)>;
  30. // Callback used for requests that the server returns FileList data
  31. // formatted into JSON value.
  32. typedef base::OnceCallback<void(ApiErrorCode error,
  33. std::unique_ptr<FileList> entry)>
  34. FileListCallback;
  35. // DEPRECATED: Please use ChangeListOnceCallback instead
  36. // Callback used for requests that the server returns ChangeList data
  37. // formatted into JSON value.
  38. using ChangeListCallback =
  39. base::OnceCallback<void(ApiErrorCode error,
  40. std::unique_ptr<ChangeList> entry)>;
  41. using ChangeListOnceCallback =
  42. base::OnceCallback<void(ApiErrorCode error,
  43. std::unique_ptr<ChangeList> entry)>;
  44. // Callback used for requests that the server returns StartToken data
  45. // formatted into JSON value.
  46. using StartPageTokenCallback =
  47. base::OnceCallback<void(ApiErrorCode error,
  48. std::unique_ptr<StartPageToken> entry)>;
  49. namespace drive {
  50. // Represents a property for a file or a directory.
  51. // https://developers.google.com/drive/v2/reference/properties
  52. class Property {
  53. public:
  54. Property();
  55. ~Property();
  56. // Visibility of the property. Either limited to the same client, or to any.
  57. enum Visibility { VISIBILITY_PRIVATE, VISIBILITY_PUBLIC };
  58. // Whether the property is public or private.
  59. Visibility visibility() const { return visibility_; }
  60. // Name of the property.
  61. const std::string& key() const { return key_; }
  62. // Value of the property.
  63. const std::string& value() const { return value_; }
  64. void set_visibility(Visibility visibility) { visibility_ = visibility; }
  65. void set_key(const std::string& key) { key_ = key; }
  66. void set_value(const std::string& value) { value_ = value; }
  67. private:
  68. Visibility visibility_;
  69. std::string key_;
  70. std::string value_;
  71. };
  72. // List of properties for a single file or a directory.
  73. typedef std::vector<Property> Properties;
  74. // Child response embedded in multipart parent response.
  75. struct MultipartHttpResponse {
  76. MultipartHttpResponse();
  77. ~MultipartHttpResponse();
  78. ApiErrorCode code = HTTP_SUCCESS;
  79. std::string body;
  80. };
  81. // Splits multipart |response| into |parts|. Each part must be HTTP sub-response
  82. // of drive batch request. |content_type| is a value of Content-Type response
  83. // header. Returns true on success.
  84. bool ParseMultipartResponse(const std::string& content_type,
  85. const std::string& response,
  86. std::vector<MultipartHttpResponse>* parts);
  87. //============================ DriveApiPartialFieldRequest ====================
  88. // This is base class of the Drive API related requests. All Drive API requests
  89. // support partial request (to improve the performance). The function can be
  90. // shared among the Drive API requests.
  91. // See also https://developers.google.com/drive/performance
  92. class DriveApiPartialFieldRequest : public DriveUrlFetchRequestBase {
  93. public:
  94. explicit DriveApiPartialFieldRequest(RequestSender* sender);
  95. DriveApiPartialFieldRequest(const DriveApiPartialFieldRequest&) = delete;
  96. DriveApiPartialFieldRequest& operator=(const DriveApiPartialFieldRequest&) =
  97. delete;
  98. ~DriveApiPartialFieldRequest() override;
  99. // Optional parameter.
  100. const std::string& fields() const { return fields_; }
  101. void set_fields(const std::string& fields) { fields_ = fields; }
  102. protected:
  103. // UrlFetchRequestBase overrides.
  104. GURL GetURL() const override;
  105. // Derived classes should override GetURLInternal instead of GetURL()
  106. // directly.
  107. virtual GURL GetURLInternal() const = 0;
  108. private:
  109. std::string fields_;
  110. };
  111. //============================ DriveApiDataRequest ===========================
  112. // The base class of Drive API related requests that receive a JSON response
  113. // representing |DataType|.
  114. template <class DataType>
  115. class DriveApiDataRequest : public DriveApiPartialFieldRequest {
  116. public:
  117. using Callback = base::OnceCallback<void(ApiErrorCode error,
  118. std::unique_ptr<DataType> data)>;
  119. // |callback| is called when the request finishes either by success or by
  120. // failure. On success, a JSON Value object is passed. It must not be null.
  121. DriveApiDataRequest(RequestSender* sender, Callback callback)
  122. : DriveApiPartialFieldRequest(sender), callback_(std::move(callback)) {
  123. DCHECK(!callback_.is_null());
  124. }
  125. DriveApiDataRequest(const DriveApiDataRequest&) = delete;
  126. DriveApiDataRequest& operator=(const DriveApiDataRequest&) = delete;
  127. ~DriveApiDataRequest() override {}
  128. protected:
  129. // UrlFetchRequestBase overrides.
  130. void ProcessURLFetchResults(
  131. const network::mojom::URLResponseHead* response_head,
  132. base::FilePath response_file,
  133. std::string response_body) override {
  134. ApiErrorCode error = GetErrorCode();
  135. switch (error) {
  136. case HTTP_SUCCESS:
  137. case HTTP_CREATED:
  138. base::PostTaskAndReplyWithResult(
  139. blocking_task_runner(), FROM_HERE,
  140. base::BindOnce(&DriveApiDataRequest::Parse,
  141. std::move(response_body)),
  142. base::BindOnce(&DriveApiDataRequest::OnDataParsed,
  143. weak_ptr_factory_.GetWeakPtr(), error));
  144. break;
  145. default:
  146. RunCallbackOnPrematureFailure(error);
  147. OnProcessURLFetchResultsComplete();
  148. break;
  149. }
  150. }
  151. void RunCallbackOnPrematureFailure(ApiErrorCode error) override {
  152. std::move(callback_).Run(error, std::unique_ptr<DataType>());
  153. }
  154. private:
  155. // Parses the |json| string by using DataType::CreateFrom.
  156. static std::unique_ptr<DataType> Parse(std::string json) {
  157. std::unique_ptr<base::Value> value = ParseJson(json);
  158. return value ? DataType::CreateFrom(*value) : std::unique_ptr<DataType>();
  159. }
  160. // Receives the parsed result and invokes the callback.
  161. void OnDataParsed(ApiErrorCode error, std::unique_ptr<DataType> value) {
  162. if (!value)
  163. error = PARSE_ERROR;
  164. std::move(callback_).Run(error, std::move(value));
  165. OnProcessURLFetchResultsComplete();
  166. }
  167. Callback callback_;
  168. // Note: This should remain the last member so it'll be destroyed and
  169. // invalidate its weak pointers before any other members are destroyed.
  170. base::WeakPtrFactory<DriveApiDataRequest> weak_ptr_factory_{this};
  171. };
  172. //=============================== FilesGetRequest =============================
  173. // This class performs the request for fetching a file.
  174. // This request is mapped to
  175. // https://developers.google.com/drive/v2/reference/files/get
  176. class FilesGetRequest : public DriveApiDataRequest<FileResource> {
  177. public:
  178. FilesGetRequest(RequestSender* sender,
  179. const DriveApiUrlGenerator& url_generator,
  180. FileResourceCallback callback);
  181. FilesGetRequest(const FilesGetRequest&) = delete;
  182. FilesGetRequest& operator=(const FilesGetRequest&) = delete;
  183. ~FilesGetRequest() override;
  184. // Required parameter.
  185. const std::string& file_id() const { return file_id_; }
  186. void set_file_id(const std::string& file_id) { file_id_ = file_id; }
  187. // Optional parameter.
  188. const GURL& embed_origin() const { return embed_origin_; }
  189. void set_embed_origin(const GURL& embed_origin) {
  190. embed_origin_ = embed_origin;
  191. }
  192. protected:
  193. // Overridden from DriveApiDataRequest.
  194. GURL GetURLInternal() const override;
  195. private:
  196. const DriveApiUrlGenerator url_generator_;
  197. std::string file_id_;
  198. GURL embed_origin_;
  199. };
  200. //============================ FilesInsertRequest =============================
  201. // Enumeration type for specifying visibility of files.
  202. enum FileVisibility {
  203. FILE_VISIBILITY_DEFAULT,
  204. FILE_VISIBILITY_PRIVATE,
  205. };
  206. // This class performs the request for creating a resource.
  207. // This request is mapped to
  208. // https://developers.google.com/drive/v2/reference/files/insert
  209. // See also https://developers.google.com/drive/manage-uploads and
  210. // https://developers.google.com/drive/folder
  211. class FilesInsertRequest : public DriveApiDataRequest<FileResource> {
  212. public:
  213. FilesInsertRequest(RequestSender* sender,
  214. const DriveApiUrlGenerator& url_generator,
  215. FileResourceCallback callback);
  216. FilesInsertRequest(const FilesInsertRequest&) = delete;
  217. FilesInsertRequest& operator=(const FilesInsertRequest&) = delete;
  218. ~FilesInsertRequest() override;
  219. // Optional parameter
  220. void set_visibility(FileVisibility visibility) { visibility_ = visibility; }
  221. // Optional request body.
  222. const base::Time& last_viewed_by_me_date() const {
  223. return last_viewed_by_me_date_;
  224. }
  225. void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) {
  226. last_viewed_by_me_date_ = last_viewed_by_me_date;
  227. }
  228. const std::string& mime_type() const { return mime_type_; }
  229. void set_mime_type(const std::string& mime_type) { mime_type_ = mime_type; }
  230. const base::Time& modified_date() const { return modified_date_; }
  231. void set_modified_date(const base::Time& modified_date) {
  232. modified_date_ = modified_date;
  233. }
  234. const std::vector<std::string>& parents() const { return parents_; }
  235. void add_parent(const std::string& parent) { parents_.push_back(parent); }
  236. const std::string& title() const { return title_; }
  237. void set_title(const std::string& title) { title_ = title; }
  238. const Properties& properties() const { return properties_; }
  239. void set_properties(const Properties& properties) {
  240. properties_ = properties;
  241. }
  242. protected:
  243. // Overridden from GetDataRequest.
  244. std::string GetRequestType() const override;
  245. bool GetContentData(std::string* upload_content_type,
  246. std::string* upload_content) override;
  247. // Overridden from DriveApiDataRequest.
  248. GURL GetURLInternal() const override;
  249. private:
  250. const DriveApiUrlGenerator url_generator_;
  251. FileVisibility visibility_;
  252. base::Time last_viewed_by_me_date_;
  253. std::string mime_type_;
  254. base::Time modified_date_;
  255. std::vector<std::string> parents_;
  256. std::string title_;
  257. Properties properties_;
  258. };
  259. //============================== FilesPatchRequest ============================
  260. // This class performs the request for patching file metadata.
  261. // This request is mapped to
  262. // https://developers.google.com/drive/v2/reference/files/patch
  263. class FilesPatchRequest : public DriveApiDataRequest<FileResource> {
  264. public:
  265. FilesPatchRequest(RequestSender* sender,
  266. const DriveApiUrlGenerator& url_generator,
  267. FileResourceCallback callback);
  268. FilesPatchRequest(const FilesPatchRequest&) = delete;
  269. FilesPatchRequest& operator=(const FilesPatchRequest&) = delete;
  270. ~FilesPatchRequest() override;
  271. // Required parameter.
  272. const std::string& file_id() const { return file_id_; }
  273. void set_file_id(const std::string& file_id) { file_id_ = file_id; }
  274. // Optional parameter.
  275. bool set_modified_date() const { return set_modified_date_; }
  276. void set_set_modified_date(bool set_modified_date) {
  277. set_modified_date_ = set_modified_date;
  278. }
  279. bool update_viewed_date() const { return update_viewed_date_; }
  280. void set_update_viewed_date(bool update_viewed_date) {
  281. update_viewed_date_ = update_viewed_date;
  282. }
  283. // Optional request body.
  284. // Note: "Files: patch" accepts any "Files resource" data, but this class
  285. // only supports limited members of it for now. We can extend it upon
  286. // requirments.
  287. const std::string& title() const { return title_; }
  288. void set_title(const std::string& title) { title_ = title; }
  289. const base::Time& modified_date() const { return modified_date_; }
  290. void set_modified_date(const base::Time& modified_date) {
  291. modified_date_ = modified_date;
  292. }
  293. const base::Time& last_viewed_by_me_date() const {
  294. return last_viewed_by_me_date_;
  295. }
  296. void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) {
  297. last_viewed_by_me_date_ = last_viewed_by_me_date;
  298. }
  299. const std::vector<std::string>& parents() const { return parents_; }
  300. void add_parent(const std::string& parent) { parents_.push_back(parent); }
  301. const Properties& properties() const { return properties_; }
  302. void set_properties(const Properties& properties) {
  303. properties_ = properties;
  304. }
  305. protected:
  306. // Overridden from URLFetchRequestBase.
  307. std::string GetRequestType() const override;
  308. std::vector<std::string> GetExtraRequestHeaders() const override;
  309. bool GetContentData(std::string* upload_content_type,
  310. std::string* upload_content) override;
  311. // Overridden from DriveApiDataRequest.
  312. GURL GetURLInternal() const override;
  313. private:
  314. const DriveApiUrlGenerator url_generator_;
  315. std::string file_id_;
  316. bool set_modified_date_;
  317. bool update_viewed_date_;
  318. std::string title_;
  319. base::Time modified_date_;
  320. base::Time last_viewed_by_me_date_;
  321. std::vector<std::string> parents_;
  322. Properties properties_;
  323. };
  324. //============================= FilesCopyRequest ==============================
  325. // This class performs the request for copying a resource.
  326. // This request is mapped to
  327. // https://developers.google.com/drive/v2/reference/files/copy
  328. class FilesCopyRequest : public DriveApiDataRequest<FileResource> {
  329. public:
  330. // Upon completion, |callback| will be called. |callback| must not be null.
  331. FilesCopyRequest(RequestSender* sender,
  332. const DriveApiUrlGenerator& url_generator,
  333. FileResourceCallback callback);
  334. FilesCopyRequest(const FilesCopyRequest&) = delete;
  335. FilesCopyRequest& operator=(const FilesCopyRequest&) = delete;
  336. ~FilesCopyRequest() override;
  337. // Required parameter.
  338. const std::string& file_id() const { return file_id_; }
  339. void set_file_id(const std::string& file_id) { file_id_ = file_id; }
  340. // Optional parameter
  341. void set_visibility(FileVisibility visibility) { visibility_ = visibility; }
  342. // Optional request body.
  343. const std::vector<std::string>& parents() const { return parents_; }
  344. void add_parent(const std::string& parent) { parents_.push_back(parent); }
  345. const base::Time& modified_date() const { return modified_date_; }
  346. void set_modified_date(const base::Time& modified_date) {
  347. modified_date_ = modified_date;
  348. }
  349. const std::string& title() const { return title_; }
  350. void set_title(const std::string& title) { title_ = title; }
  351. protected:
  352. // Overridden from URLFetchRequestBase.
  353. std::string GetRequestType() const override;
  354. bool GetContentData(std::string* upload_content_type,
  355. std::string* upload_content) override;
  356. // Overridden from DriveApiDataRequest.
  357. GURL GetURLInternal() const override;
  358. private:
  359. const DriveApiUrlGenerator url_generator_;
  360. std::string file_id_;
  361. FileVisibility visibility_;
  362. base::Time modified_date_;
  363. std::vector<std::string> parents_;
  364. std::string title_;
  365. };
  366. //========================== TeamDriveListRequest =============================
  367. // This class performs the request for fetching TeamDrive list.
  368. // The result may contain only first part of the result. The remaining result
  369. // should be able to be fetched by another request using this class, by
  370. // setting the next_page_token from previous call, to page_token.
  371. // This request is mapped to
  372. // https://developers.google.com/drive/v2/reference/teamdrives/list
  373. class TeamDriveListRequest : public DriveApiDataRequest<TeamDriveList> {
  374. public:
  375. TeamDriveListRequest(RequestSender* sender,
  376. const DriveApiUrlGenerator& url_generator,
  377. TeamDriveListCallback callback);
  378. TeamDriveListRequest(const TeamDriveListRequest&) = delete;
  379. TeamDriveListRequest& operator=(const TeamDriveListRequest&) = delete;
  380. ~TeamDriveListRequest() override;
  381. // Optional parameter
  382. int max_results() const { return max_results_; }
  383. void set_max_results(int max_results) { max_results_ = max_results; }
  384. const std::string& page_token() const { return page_token_; }
  385. void set_page_token(const std::string& page_token) {
  386. page_token_ = page_token;
  387. }
  388. protected:
  389. // Overridden from DriveApiDataRequest.
  390. GURL GetURLInternal() const override;
  391. private:
  392. const DriveApiUrlGenerator url_generator_;
  393. int max_results_;
  394. std::string page_token_;
  395. };
  396. //========================== StartPageTokenRequest =============================
  397. // This class performs the request for fetching the start page token.
  398. // |team_drive_id_| may be empty, in which case the start page token will be
  399. // returned for the users changes.
  400. // This request is mapped to
  401. // https://developers.google.com/drive/v2/reference/changes/getStartPageToken
  402. class StartPageTokenRequest : public DriveApiDataRequest<StartPageToken> {
  403. public:
  404. StartPageTokenRequest(RequestSender* sender,
  405. const DriveApiUrlGenerator& url_generator,
  406. StartPageTokenCallback callback);
  407. StartPageTokenRequest(const StartPageTokenRequest&) = delete;
  408. StartPageTokenRequest& operator=(const StartPageTokenRequest&) = delete;
  409. ~StartPageTokenRequest() override;
  410. // Optional parameter
  411. const std::string& team_drive_id() const { return team_drive_id_; }
  412. void set_team_drive_id(const std::string& team_drive_id) {
  413. team_drive_id_ = team_drive_id;
  414. }
  415. protected:
  416. // Overridden from DriveApiDataRequest.
  417. GURL GetURLInternal() const override;
  418. private:
  419. const DriveApiUrlGenerator url_generator_;
  420. std::string team_drive_id_;
  421. };
  422. //============================= FilesListRequest =============================
  423. // This class performs the request for fetching FileList.
  424. // The result may contain only first part of the result. The remaining result
  425. // should be able to be fetched by ContinueGetFileListRequest defined below,
  426. // or by FilesListRequest with setting page token.
  427. // This request is mapped to
  428. // https://developers.google.com/drive/v2/reference/files/list
  429. class FilesListRequest : public DriveApiDataRequest<FileList> {
  430. public:
  431. FilesListRequest(RequestSender* sender,
  432. const DriveApiUrlGenerator& url_generator,
  433. FileListCallback callback);
  434. FilesListRequest(const FilesListRequest&) = delete;
  435. FilesListRequest& operator=(const FilesListRequest&) = delete;
  436. ~FilesListRequest() override;
  437. // Optional parameter
  438. int max_results() const { return max_results_; }
  439. void set_max_results(int max_results) { max_results_ = max_results; }
  440. const std::string& page_token() const { return page_token_; }
  441. void set_page_token(const std::string& page_token) {
  442. page_token_ = page_token;
  443. }
  444. FilesListCorpora corpora() const { return corpora_; }
  445. void set_corpora(FilesListCorpora corpora) { corpora_ = corpora; }
  446. const std::string& team_drive_id() const { return team_drive_id_; }
  447. void set_team_drive_id(const std::string& team_drive_id) {
  448. team_drive_id_ = team_drive_id;
  449. }
  450. const std::string& q() const { return q_; }
  451. void set_q(const std::string& q) { q_ = q; }
  452. protected:
  453. // Overridden from DriveApiDataRequest.
  454. GURL GetURLInternal() const override;
  455. private:
  456. const DriveApiUrlGenerator url_generator_;
  457. int max_results_;
  458. std::string page_token_;
  459. FilesListCorpora corpora_;
  460. std::string team_drive_id_;
  461. std::string q_;
  462. };
  463. //========================= FilesListNextPageRequest ==========================
  464. // There are two ways to obtain next pages of "Files: list" result (if paged).
  465. // 1) Set pageToken and all params used for the initial request.
  466. // 2) Use URL in the nextLink field in the previous response.
  467. // This class implements 2)'s request.
  468. class FilesListNextPageRequest : public DriveApiDataRequest<FileList> {
  469. public:
  470. FilesListNextPageRequest(RequestSender* sender, FileListCallback callback);
  471. FilesListNextPageRequest(const FilesListNextPageRequest&) = delete;
  472. FilesListNextPageRequest& operator=(const FilesListNextPageRequest&) = delete;
  473. ~FilesListNextPageRequest() override;
  474. const GURL& next_link() const { return next_link_; }
  475. void set_next_link(const GURL& next_link) { next_link_ = next_link; }
  476. protected:
  477. // Overridden from DriveApiDataRequest.
  478. GURL GetURLInternal() const override;
  479. private:
  480. GURL next_link_;
  481. };
  482. //============================= FilesDeleteRequest =============================
  483. // This class performs the request for deleting a resource.
  484. // This request is mapped to
  485. // https://developers.google.com/drive/v2/reference/files/delete
  486. class FilesDeleteRequest : public EntryActionRequest {
  487. public:
  488. FilesDeleteRequest(RequestSender* sender,
  489. const DriveApiUrlGenerator& url_generator,
  490. EntryActionCallback callback);
  491. FilesDeleteRequest(const FilesDeleteRequest&) = delete;
  492. FilesDeleteRequest& operator=(const FilesDeleteRequest&) = delete;
  493. ~FilesDeleteRequest() override;
  494. // Required parameter.
  495. const std::string& file_id() const { return file_id_; }
  496. void set_file_id(const std::string& file_id) { file_id_ = file_id; }
  497. void set_etag(const std::string& etag) { etag_ = etag; }
  498. protected:
  499. // Overridden from UrlFetchRequestBase.
  500. std::string GetRequestType() const override;
  501. GURL GetURL() const override;
  502. std::vector<std::string> GetExtraRequestHeaders() const override;
  503. private:
  504. const DriveApiUrlGenerator url_generator_;
  505. std::string file_id_;
  506. std::string etag_;
  507. };
  508. //============================= FilesTrashRequest ==============================
  509. // This class performs the request for trashing a resource.
  510. // This request is mapped to
  511. // https://developers.google.com/drive/v2/reference/files/trash
  512. class FilesTrashRequest : public DriveApiDataRequest<FileResource> {
  513. public:
  514. FilesTrashRequest(RequestSender* sender,
  515. const DriveApiUrlGenerator& url_generator,
  516. FileResourceCallback callback);
  517. FilesTrashRequest(const FilesTrashRequest&) = delete;
  518. FilesTrashRequest& operator=(const FilesTrashRequest&) = delete;
  519. ~FilesTrashRequest() override;
  520. // Required parameter.
  521. const std::string& file_id() const { return file_id_; }
  522. void set_file_id(const std::string& file_id) { file_id_ = file_id; }
  523. protected:
  524. // Overridden from UrlFetchRequestBase.
  525. std::string GetRequestType() const override;
  526. // Overridden from DriveApiDataRequest.
  527. GURL GetURLInternal() const override;
  528. private:
  529. const DriveApiUrlGenerator url_generator_;
  530. std::string file_id_;
  531. };
  532. //============================== AboutGetRequest =============================
  533. // This class performs the request for fetching About data.
  534. // This request is mapped to
  535. // https://developers.google.com/drive/v2/reference/about/get
  536. class AboutGetRequest : public DriveApiDataRequest<AboutResource> {
  537. public:
  538. AboutGetRequest(RequestSender* sender,
  539. const DriveApiUrlGenerator& url_generator,
  540. AboutResourceCallback callback);
  541. AboutGetRequest(const AboutGetRequest&) = delete;
  542. AboutGetRequest& operator=(const AboutGetRequest&) = delete;
  543. ~AboutGetRequest() override;
  544. protected:
  545. // Overridden from DriveApiDataRequest.
  546. GURL GetURLInternal() const override;
  547. private:
  548. const DriveApiUrlGenerator url_generator_;
  549. };
  550. //============================ ChangesListRequest ============================
  551. // This class performs the request for fetching ChangeList.
  552. // The result may contain only first part of the result. The remaining result
  553. // should be able to be fetched by ContinueGetFileListRequest defined below.
  554. // or by ChangesListRequest with setting page token.
  555. // This request is mapped to
  556. // https://developers.google.com/drive/v2/reference/changes/list
  557. class ChangesListRequest : public DriveApiDataRequest<ChangeList> {
  558. public:
  559. ChangesListRequest(RequestSender* sender,
  560. const DriveApiUrlGenerator& url_generator,
  561. ChangeListCallback callback);
  562. ChangesListRequest(const ChangesListRequest&) = delete;
  563. ChangesListRequest& operator=(const ChangesListRequest&) = delete;
  564. ~ChangesListRequest() override;
  565. // Optional parameter
  566. bool include_deleted() const { return include_deleted_; }
  567. void set_include_deleted(bool include_deleted) {
  568. include_deleted_ = include_deleted;
  569. }
  570. int max_results() const { return max_results_; }
  571. void set_max_results(int max_results) { max_results_ = max_results; }
  572. const std::string& page_token() const { return page_token_; }
  573. void set_page_token(const std::string& page_token) {
  574. page_token_ = page_token;
  575. }
  576. int64_t start_change_id() const { return start_change_id_; }
  577. void set_start_change_id(int64_t start_change_id) {
  578. start_change_id_ = start_change_id;
  579. }
  580. const std::string& team_drive_id() const { return team_drive_id_; }
  581. void set_team_drive_id(const std::string& team_drive_id) {
  582. team_drive_id_ = team_drive_id;
  583. }
  584. protected:
  585. // Overridden from DriveApiDataRequest.
  586. GURL GetURLInternal() const override;
  587. private:
  588. const DriveApiUrlGenerator url_generator_;
  589. bool include_deleted_;
  590. int max_results_;
  591. std::string page_token_;
  592. int64_t start_change_id_;
  593. std::string team_drive_id_;
  594. };
  595. //======================== ChangesListNextPageRequest =========================
  596. // There are two ways to obtain next pages of "Changes: list" result (if paged).
  597. // 1) Set pageToken and all params used for the initial request.
  598. // 2) Use URL in the nextLink field in the previous response.
  599. // This class implements 2)'s request.
  600. class ChangesListNextPageRequest : public DriveApiDataRequest<ChangeList> {
  601. public:
  602. ChangesListNextPageRequest(RequestSender* sender,
  603. ChangeListCallback callback);
  604. ChangesListNextPageRequest(const ChangesListNextPageRequest&) = delete;
  605. ChangesListNextPageRequest& operator=(const ChangesListNextPageRequest&) =
  606. delete;
  607. ~ChangesListNextPageRequest() override;
  608. const GURL& next_link() const { return next_link_; }
  609. void set_next_link(const GURL& next_link) { next_link_ = next_link; }
  610. protected:
  611. // Overridden from DriveApiDataRequest.
  612. GURL GetURLInternal() const override;
  613. private:
  614. GURL next_link_;
  615. };
  616. //========================== ChildrenInsertRequest ============================
  617. // This class performs the request for inserting a resource to a directory.
  618. // This request is mapped to
  619. // https://developers.google.com/drive/v2/reference/children/insert
  620. class ChildrenInsertRequest : public EntryActionRequest {
  621. public:
  622. ChildrenInsertRequest(RequestSender* sender,
  623. const DriveApiUrlGenerator& url_generator,
  624. EntryActionCallback callback);
  625. ChildrenInsertRequest(const ChildrenInsertRequest&) = delete;
  626. ChildrenInsertRequest& operator=(const ChildrenInsertRequest&) = delete;
  627. ~ChildrenInsertRequest() override;
  628. // Required parameter.
  629. const std::string& folder_id() const { return folder_id_; }
  630. void set_folder_id(const std::string& folder_id) { folder_id_ = folder_id; }
  631. // Required body.
  632. const std::string& id() const { return id_; }
  633. void set_id(const std::string& id) { id_ = id; }
  634. protected:
  635. // UrlFetchRequestBase overrides.
  636. std::string GetRequestType() const override;
  637. GURL GetURL() const override;
  638. bool GetContentData(std::string* upload_content_type,
  639. std::string* upload_content) override;
  640. private:
  641. const DriveApiUrlGenerator url_generator_;
  642. std::string folder_id_;
  643. std::string id_;
  644. };
  645. //========================== ChildrenDeleteRequest ============================
  646. // This class performs the request for removing a resource from a directory.
  647. // This request is mapped to
  648. // https://developers.google.com/drive/v2/reference/children/delete
  649. class ChildrenDeleteRequest : public EntryActionRequest {
  650. public:
  651. // |callback| must not be null.
  652. ChildrenDeleteRequest(RequestSender* sender,
  653. const DriveApiUrlGenerator& url_generator,
  654. EntryActionCallback callback);
  655. ChildrenDeleteRequest(const ChildrenDeleteRequest&) = delete;
  656. ChildrenDeleteRequest& operator=(const ChildrenDeleteRequest&) = delete;
  657. ~ChildrenDeleteRequest() override;
  658. // Required parameter.
  659. const std::string& child_id() const { return child_id_; }
  660. void set_child_id(const std::string& child_id) { child_id_ = child_id; }
  661. const std::string& folder_id() const { return folder_id_; }
  662. void set_folder_id(const std::string& folder_id) { folder_id_ = folder_id; }
  663. protected:
  664. // UrlFetchRequestBase overrides.
  665. std::string GetRequestType() const override;
  666. GURL GetURL() const override;
  667. private:
  668. const DriveApiUrlGenerator url_generator_;
  669. std::string child_id_;
  670. std::string folder_id_;
  671. };
  672. //======================= InitiateUploadNewFileRequest =======================
  673. // This class performs the request for initiating the upload of a new file.
  674. class InitiateUploadNewFileRequest : public InitiateUploadRequestBase {
  675. public:
  676. // |parent_resource_id| should be the resource id of the parent directory.
  677. // |title| should be set.
  678. // See also the comments of InitiateUploadRequestBase for more details
  679. // about the other parameters.
  680. InitiateUploadNewFileRequest(RequestSender* sender,
  681. const DriveApiUrlGenerator& url_generator,
  682. const std::string& content_type,
  683. int64_t content_length,
  684. const std::string& parent_resource_id,
  685. const std::string& title,
  686. InitiateUploadCallback callback);
  687. InitiateUploadNewFileRequest(const InitiateUploadNewFileRequest&) = delete;
  688. InitiateUploadNewFileRequest& operator=(const InitiateUploadNewFileRequest&) =
  689. delete;
  690. ~InitiateUploadNewFileRequest() override;
  691. // Optional parameters.
  692. const base::Time& modified_date() const { return modified_date_; }
  693. void set_modified_date(const base::Time& modified_date) {
  694. modified_date_ = modified_date;
  695. }
  696. const base::Time& last_viewed_by_me_date() const {
  697. return last_viewed_by_me_date_;
  698. }
  699. void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) {
  700. last_viewed_by_me_date_ = last_viewed_by_me_date;
  701. }
  702. const Properties& properties() const { return properties_; }
  703. void set_properties(const Properties& properties) {
  704. properties_ = properties;
  705. }
  706. protected:
  707. // UrlFetchRequestBase overrides.
  708. GURL GetURL() const override;
  709. std::string GetRequestType() const override;
  710. bool GetContentData(std::string* upload_content_type,
  711. std::string* upload_content) override;
  712. private:
  713. const DriveApiUrlGenerator url_generator_;
  714. const std::string parent_resource_id_;
  715. const std::string title_;
  716. base::Time modified_date_;
  717. base::Time last_viewed_by_me_date_;
  718. Properties properties_;
  719. };
  720. //==================== InitiateUploadExistingFileRequest =====================
  721. // This class performs the request for initiating the upload of an existing
  722. // file.
  723. class InitiateUploadExistingFileRequest : public InitiateUploadRequestBase {
  724. public:
  725. // |upload_url| should be the upload_url() of the file
  726. // (resumable-create-media URL)
  727. // |etag| should be set if it is available to detect the upload confliction.
  728. // See also the comments of InitiateUploadRequestBase for more details
  729. // about the other parameters.
  730. InitiateUploadExistingFileRequest(RequestSender* sender,
  731. const DriveApiUrlGenerator& url_generator,
  732. const std::string& content_type,
  733. int64_t content_length,
  734. const std::string& resource_id,
  735. const std::string& etag,
  736. InitiateUploadCallback callback);
  737. InitiateUploadExistingFileRequest(const InitiateUploadExistingFileRequest&) =
  738. delete;
  739. InitiateUploadExistingFileRequest& operator=(
  740. const InitiateUploadExistingFileRequest&) = delete;
  741. ~InitiateUploadExistingFileRequest() override;
  742. // Optional parameters.
  743. const std::string& parent_resource_id() const { return parent_resource_id_; }
  744. void set_parent_resource_id(const std::string& parent_resource_id) {
  745. parent_resource_id_ = parent_resource_id;
  746. }
  747. const std::string& title() const { return title_; }
  748. void set_title(const std::string& title) { title_ = title; }
  749. const base::Time& modified_date() const { return modified_date_; }
  750. void set_modified_date(const base::Time& modified_date) {
  751. modified_date_ = modified_date;
  752. }
  753. const base::Time& last_viewed_by_me_date() const {
  754. return last_viewed_by_me_date_;
  755. }
  756. void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) {
  757. last_viewed_by_me_date_ = last_viewed_by_me_date;
  758. }
  759. const Properties& properties() const { return properties_; }
  760. void set_properties(const Properties& properties) {
  761. properties_ = properties;
  762. }
  763. protected:
  764. // UrlFetchRequestBase overrides.
  765. GURL GetURL() const override;
  766. std::string GetRequestType() const override;
  767. std::vector<std::string> GetExtraRequestHeaders() const override;
  768. bool GetContentData(std::string* upload_content_type,
  769. std::string* upload_content) override;
  770. private:
  771. const DriveApiUrlGenerator url_generator_;
  772. const std::string resource_id_;
  773. const std::string etag_;
  774. std::string parent_resource_id_;
  775. std::string title_;
  776. base::Time modified_date_;
  777. base::Time last_viewed_by_me_date_;
  778. Properties properties_;
  779. };
  780. // Callback used for ResumeUpload() and GetUploadStatus().
  781. typedef base::OnceCallback<void(const UploadRangeResponse& response,
  782. std::unique_ptr<FileResource> new_resource)>
  783. UploadRangeCallback;
  784. //============================ ResumeUploadRequest ===========================
  785. // Performs the request for resuming the upload of a file.
  786. class ResumeUploadRequest : public ResumeUploadRequestBase {
  787. public:
  788. // See also ResumeUploadRequestBase's comment for parameters meaning.
  789. // |callback| must not be null. |progress_callback| may be null.
  790. ResumeUploadRequest(RequestSender* sender,
  791. const GURL& upload_location,
  792. int64_t start_position,
  793. int64_t end_position,
  794. int64_t content_length,
  795. const std::string& content_type,
  796. const base::FilePath& local_file_path,
  797. UploadRangeCallback callback,
  798. ProgressCallback progress_callback);
  799. ResumeUploadRequest(const ResumeUploadRequest&) = delete;
  800. ResumeUploadRequest& operator=(const ResumeUploadRequest&) = delete;
  801. ~ResumeUploadRequest() override;
  802. protected:
  803. // UploadRangeRequestBase overrides.
  804. void OnRangeRequestComplete(const UploadRangeResponse& response,
  805. std::unique_ptr<base::Value> value) override;
  806. private:
  807. UploadRangeCallback callback_;
  808. };
  809. //========================== GetUploadStatusRequest ==========================
  810. // Performs the request to fetch the current upload status of a file.
  811. class GetUploadStatusRequest : public GetUploadStatusRequestBase {
  812. public:
  813. // See also GetUploadStatusRequestBase's comment for parameters meaning.
  814. // |callback| must not be null.
  815. GetUploadStatusRequest(RequestSender* sender,
  816. const GURL& upload_url,
  817. int64_t content_length,
  818. UploadRangeCallback callback);
  819. GetUploadStatusRequest(const GetUploadStatusRequest&) = delete;
  820. GetUploadStatusRequest& operator=(const GetUploadStatusRequest&) = delete;
  821. ~GetUploadStatusRequest() override;
  822. protected:
  823. // UploadRangeRequestBase overrides.
  824. void OnRangeRequestComplete(const UploadRangeResponse& response,
  825. std::unique_ptr<base::Value> value) override;
  826. private:
  827. UploadRangeCallback callback_;
  828. };
  829. //======================= MultipartUploadNewFileDelegate =======================
  830. // This class performs the request for initiating the upload of a new file.
  831. class MultipartUploadNewFileDelegate : public MultipartUploadRequestBase {
  832. public:
  833. // |parent_resource_id| should be the resource id of the parent directory.
  834. // |title| should be set.
  835. // See also the comments of MultipartUploadRequestBase for more details
  836. // about the other parameters.
  837. MultipartUploadNewFileDelegate(base::SequencedTaskRunner* task_runner,
  838. const std::string& title,
  839. const std::string& parent_resource_id,
  840. const std::string& content_type,
  841. int64_t content_length,
  842. const base::Time& modified_date,
  843. const base::Time& last_viewed_by_me_date,
  844. const base::FilePath& local_file_path,
  845. const Properties& properties,
  846. const DriveApiUrlGenerator& url_generator,
  847. FileResourceCallback callback,
  848. ProgressCallback progress_callback);
  849. MultipartUploadNewFileDelegate(const MultipartUploadNewFileDelegate&) =
  850. delete;
  851. MultipartUploadNewFileDelegate& operator=(
  852. const MultipartUploadNewFileDelegate&) = delete;
  853. ~MultipartUploadNewFileDelegate() override;
  854. protected:
  855. // UrlFetchRequestBase overrides.
  856. GURL GetURL() const override;
  857. std::string GetRequestType() const override;
  858. private:
  859. const bool has_modified_date_;
  860. const DriveApiUrlGenerator url_generator_;
  861. };
  862. //====================== MultipartUploadExistingFileDelegate ===================
  863. // This class performs the request for initiating the upload of a new file.
  864. class MultipartUploadExistingFileDelegate : public MultipartUploadRequestBase {
  865. public:
  866. // |parent_resource_id| should be the resource id of the parent directory.
  867. // |title| should be set.
  868. // See also the comments of MultipartUploadRequestBase for more details
  869. // about the other parameters.
  870. MultipartUploadExistingFileDelegate(base::SequencedTaskRunner* task_runner,
  871. const std::string& title,
  872. const std::string& resource_id,
  873. const std::string& parent_resource_id,
  874. const std::string& content_type,
  875. int64_t content_length,
  876. const base::Time& modified_date,
  877. const base::Time& last_viewed_by_me_date,
  878. const base::FilePath& local_file_path,
  879. const std::string& etag,
  880. const Properties& properties,
  881. const DriveApiUrlGenerator& url_generator,
  882. FileResourceCallback callback,
  883. ProgressCallback progress_callback);
  884. MultipartUploadExistingFileDelegate(
  885. const MultipartUploadExistingFileDelegate&) = delete;
  886. MultipartUploadExistingFileDelegate& operator=(
  887. const MultipartUploadExistingFileDelegate&) = delete;
  888. ~MultipartUploadExistingFileDelegate() override;
  889. protected:
  890. // UrlFetchRequestBase overrides.
  891. std::vector<std::string> GetExtraRequestHeaders() const override;
  892. GURL GetURL() const override;
  893. std::string GetRequestType() const override;
  894. private:
  895. const std::string resource_id_;
  896. const std::string etag_;
  897. const bool has_modified_date_;
  898. const DriveApiUrlGenerator url_generator_;
  899. };
  900. //========================== DownloadFileRequest ==========================
  901. // This class performs the request for downloading of a specified file.
  902. class DownloadFileRequest : public DownloadFileRequestBase {
  903. public:
  904. // See also DownloadFileRequestBase's comment for parameters meaning.
  905. DownloadFileRequest(RequestSender* sender,
  906. const DriveApiUrlGenerator& url_generator,
  907. const std::string& resource_id,
  908. const base::FilePath& output_file_path,
  909. DownloadActionCallback download_action_callback,
  910. const GetContentCallback& get_content_callback,
  911. ProgressCallback progress_callback);
  912. DownloadFileRequest(const DownloadFileRequest&) = delete;
  913. DownloadFileRequest& operator=(const DownloadFileRequest&) = delete;
  914. ~DownloadFileRequest() override;
  915. };
  916. //========================== PermissionsInsertRequest ==========================
  917. // Enumeration type for specifying type of permissions.
  918. enum PermissionType {
  919. PERMISSION_TYPE_ANYONE,
  920. PERMISSION_TYPE_DOMAIN,
  921. PERMISSION_TYPE_GROUP,
  922. PERMISSION_TYPE_USER,
  923. };
  924. // Enumeration type for specifying the role of permissions.
  925. enum PermissionRole {
  926. PERMISSION_ROLE_OWNER,
  927. PERMISSION_ROLE_READER,
  928. PERMISSION_ROLE_WRITER,
  929. PERMISSION_ROLE_COMMENTER,
  930. };
  931. // This class performs the request for adding permission on a specified file.
  932. class PermissionsInsertRequest : public EntryActionRequest {
  933. public:
  934. // See https://developers.google.com/drive/v2/reference/permissions/insert.
  935. PermissionsInsertRequest(RequestSender* sender,
  936. const DriveApiUrlGenerator& url_generator,
  937. EntryActionCallback callback);
  938. PermissionsInsertRequest(const PermissionsInsertRequest&) = delete;
  939. PermissionsInsertRequest& operator=(const PermissionsInsertRequest&) = delete;
  940. ~PermissionsInsertRequest() override;
  941. void set_id(const std::string& id) { id_ = id; }
  942. void set_type(PermissionType type) { type_ = type; }
  943. void set_role(PermissionRole role) { role_ = role; }
  944. void set_value(const std::string& value) { value_ = value; }
  945. // UrlFetchRequestBase overrides.
  946. GURL GetURL() const override;
  947. std::string GetRequestType() const override;
  948. bool GetContentData(std::string* upload_content_type,
  949. std::string* upload_content) override;
  950. private:
  951. const DriveApiUrlGenerator url_generator_;
  952. std::string id_;
  953. PermissionType type_;
  954. PermissionRole role_;
  955. std::string value_;
  956. };
  957. //======================= SingleBatchableDelegateRequest =======================
  958. // Request that is operated by single BatchableDelegate.
  959. class SingleBatchableDelegateRequest : public DriveUrlFetchRequestBase {
  960. public:
  961. SingleBatchableDelegateRequest(RequestSender* sender,
  962. std::unique_ptr<BatchableDelegate> delegate);
  963. SingleBatchableDelegateRequest(const SingleBatchableDelegateRequest&) =
  964. delete;
  965. SingleBatchableDelegateRequest& operator=(
  966. const SingleBatchableDelegateRequest&) = delete;
  967. ~SingleBatchableDelegateRequest() override;
  968. private:
  969. GURL GetURL() const override;
  970. std::string GetRequestType() const override;
  971. std::vector<std::string> GetExtraRequestHeaders() const override;
  972. void Prepare(PrepareCallback callback) override;
  973. bool GetContentData(std::string* upload_content_type,
  974. std::string* upload_content) override;
  975. void RunCallbackOnPrematureFailure(ApiErrorCode code) override;
  976. void ProcessURLFetchResults(
  977. const network::mojom::URLResponseHead* response_head,
  978. base::FilePath response_file,
  979. std::string response_body) override;
  980. void OnUploadProgress(int64_t current, int64_t total);
  981. std::unique_ptr<BatchableDelegate> delegate_;
  982. // Note: This should remain the last member so it'll be destroyed and
  983. // invalidate its weak pointers before any other members are destroyed.
  984. base::WeakPtrFactory<SingleBatchableDelegateRequest> weak_ptr_factory_{this};
  985. };
  986. //========================== BatchUploadRequest ==========================
  987. class BatchUploadChildEntry {
  988. public:
  989. explicit BatchUploadChildEntry(BatchableDelegate* request);
  990. BatchUploadChildEntry(const BatchUploadChildEntry&) = delete;
  991. BatchUploadChildEntry& operator=(const BatchUploadChildEntry&) = delete;
  992. ~BatchUploadChildEntry();
  993. std::unique_ptr<BatchableDelegate> request;
  994. bool prepared;
  995. int64_t data_offset;
  996. int64_t data_size;
  997. };
  998. class BatchUploadRequest : public DriveUrlFetchRequestBase {
  999. public:
  1000. BatchUploadRequest(RequestSender* sender,
  1001. const DriveApiUrlGenerator& url_generator);
  1002. BatchUploadRequest(const BatchUploadRequest&) = delete;
  1003. BatchUploadRequest& operator=(const BatchUploadRequest&) = delete;
  1004. ~BatchUploadRequest() override;
  1005. // Adds request to the batch request. The instance takes ownership of
  1006. // |request|.
  1007. void AddRequest(BatchableDelegate* request);
  1008. // Completes building batch upload request, and starts to send the request to
  1009. // server. Must add at least one request before calling |Commit|.
  1010. void Commit();
  1011. // Obtains weak pointer of this.
  1012. base::WeakPtr<BatchUploadRequest> GetWeakPtrAsBatchUploadRequest();
  1013. // Set boundary. Only tests can use this method.
  1014. void SetBoundaryForTesting(const std::string& boundary);
  1015. // Obtains reference to RequestSender that owns the request.
  1016. RequestSender* sender() const { return sender_; }
  1017. // Obtains URLGenerator.
  1018. const DriveApiUrlGenerator& url_generator() const { return url_generator_; }
  1019. // UrlFetchRequestBase overrides.
  1020. void Prepare(PrepareCallback callback) override;
  1021. void Cancel() override;
  1022. GURL GetURL() const override;
  1023. std::string GetRequestType() const override;
  1024. std::vector<std::string> GetExtraRequestHeaders() const override;
  1025. bool GetContentData(std::string* upload_content_type,
  1026. std::string* upload_content) override;
  1027. void ProcessURLFetchResults(
  1028. const network::mojom::URLResponseHead* response_head,
  1029. base::FilePath response_file,
  1030. std::string response_body) override;
  1031. void RunCallbackOnPrematureFailure(ApiErrorCode code) override;
  1032. // Called by UrlFetchRequestBase to report upload progress.
  1033. void OnUploadProgress(int64_t current, int64_t total);
  1034. private:
  1035. typedef void* RequestID;
  1036. // Obtains corresponding child entry of |request_id|. Returns NULL if the
  1037. // entry is not found.
  1038. std::vector<std::unique_ptr<BatchUploadChildEntry>>::iterator GetChildEntry(
  1039. RequestID request_id);
  1040. // Called after child requests' |Prepare| method.
  1041. void OnChildRequestPrepared(RequestID request_id, ApiErrorCode result);
  1042. // Complete |Prepare| if possible.
  1043. void MayCompletePrepare();
  1044. // Process result for each child.
  1045. void ProcessURLFetchResultsForChild(RequestID id, const std::string& body);
  1046. const raw_ptr<RequestSender> sender_;
  1047. const DriveApiUrlGenerator url_generator_;
  1048. std::vector<std::unique_ptr<BatchUploadChildEntry>> child_requests_;
  1049. PrepareCallback prepare_callback_;
  1050. bool committed_;
  1051. // Boundary of multipart body.
  1052. std::string boundary_;
  1053. // Multipart of child requests.
  1054. ContentTypeAndData upload_content_;
  1055. // Last reported progress value.
  1056. int64_t last_progress_value_;
  1057. // Note: This should remain the last member so it'll be destroyed and
  1058. // invalidate its weak pointers before any other members are destroyed.
  1059. base::WeakPtrFactory<BatchUploadRequest> weak_ptr_factory_{this};
  1060. };
  1061. } // namespace drive
  1062. } // namespace google_apis
  1063. #endif // GOOGLE_APIS_DRIVE_DRIVE_API_REQUESTS_H_