Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / google_apis / drive / drive_api_requests.h
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef GOOGLE_APIS_DRIVE_DRIVE_API_REQUESTS_H_
6 #define GOOGLE_APIS_DRIVE_DRIVE_API_REQUESTS_H_
7
8 #include <string>
9
10 #include "base/callback_forward.h"
11 #include "base/location.h"
12 #include "base/sequenced_task_runner.h"
13 #include "base/task_runner_util.h"
14 #include "base/time/time.h"
15 #include "base/values.h"
16 #include "google_apis/drive/base_requests.h"
17 #include "google_apis/drive/drive_api_parser.h"
18 #include "google_apis/drive/drive_api_url_generator.h"
19 #include "google_apis/drive/drive_common_callbacks.h"
20
21 namespace google_apis {
22
23 // Callback used for requests that the server returns FileResource data
24 // formatted into JSON value.
25 typedef base::Callback<void(GDataErrorCode error,
26                             scoped_ptr<FileResource> entry)>
27     FileResourceCallback;
28
29 // Callback used for requests that the server returns FileList data
30 // formatted into JSON value.
31 typedef base::Callback<void(GDataErrorCode error,
32                             scoped_ptr<FileList> entry)> FileListCallback;
33
34 // Callback used for requests that the server returns ChangeList data
35 // formatted into JSON value.
36 typedef base::Callback<void(GDataErrorCode error,
37                             scoped_ptr<ChangeList> entry)> ChangeListCallback;
38
39 namespace drive {
40
41 //============================ DriveApiPartialFieldRequest ====================
42
43 // This is base class of the Drive API related requests. All Drive API requests
44 // support partial request (to improve the performance). The function can be
45 // shared among the Drive API requests.
46 // See also https://developers.google.com/drive/performance
47 class DriveApiPartialFieldRequest : public UrlFetchRequestBase {
48  public:
49   explicit DriveApiPartialFieldRequest(RequestSender* sender);
50   ~DriveApiPartialFieldRequest() override;
51
52   // Optional parameter.
53   const std::string& fields() const { return fields_; }
54   void set_fields(const std::string& fields) { fields_ = fields; }
55
56  protected:
57   // UrlFetchRequestBase overrides.
58   GURL GetURL() const override;
59
60   // Derived classes should override GetURLInternal instead of GetURL()
61   // directly.
62   virtual GURL GetURLInternal() const = 0;
63
64  private:
65   std::string fields_;
66
67   DISALLOW_COPY_AND_ASSIGN(DriveApiPartialFieldRequest);
68 };
69
70 //============================ DriveApiDataRequest ===========================
71
72 // The base class of Drive API related requests that receive a JSON response
73 // representing |DataType|.
74 template<class DataType>
75 class DriveApiDataRequest : public DriveApiPartialFieldRequest {
76  public:
77   typedef base::Callback<void(GDataErrorCode error,
78                               scoped_ptr<DataType> data)> Callback;
79
80   // |callback| is called when the request finishes either by success or by
81   // failure. On success, a JSON Value object is passed. It must not be null.
82   DriveApiDataRequest(RequestSender* sender, const Callback& callback)
83       : DriveApiPartialFieldRequest(sender),
84         callback_(callback),
85         weak_ptr_factory_(this) {
86     DCHECK(!callback_.is_null());
87   }
88   virtual ~DriveApiDataRequest() {}
89
90  protected:
91   // UrlFetchRequestBase overrides.
92   virtual void ProcessURLFetchResults(const net::URLFetcher* source) override {
93     GDataErrorCode error = GetErrorCode();
94     switch (error) {
95       case HTTP_SUCCESS:
96       case HTTP_CREATED:
97         base::PostTaskAndReplyWithResult(
98             blocking_task_runner(),
99             FROM_HERE,
100             base::Bind(&DriveApiDataRequest::Parse, response_writer()->data()),
101             base::Bind(&DriveApiDataRequest::OnDataParsed,
102                        weak_ptr_factory_.GetWeakPtr(), error));
103         break;
104       default:
105         RunCallbackOnPrematureFailure(error);
106         OnProcessURLFetchResultsComplete();
107         break;
108     }
109   }
110
111   virtual void RunCallbackOnPrematureFailure(GDataErrorCode error) override {
112     callback_.Run(error, scoped_ptr<DataType>());
113   }
114
115  private:
116   // Parses the |json| string by using DataType::CreateFrom.
117   static scoped_ptr<DataType> Parse(const std::string& json) {
118     scoped_ptr<base::Value> value = ParseJson(json);
119     return value ? DataType::CreateFrom(*value) : scoped_ptr<DataType>();
120   }
121
122   // Receives the parsed result and invokes the callback.
123   void OnDataParsed(GDataErrorCode error, scoped_ptr<DataType> value) {
124     if (!value)
125       error = GDATA_PARSE_ERROR;
126     callback_.Run(error, value.Pass());
127     OnProcessURLFetchResultsComplete();
128   }
129
130   const Callback callback_;
131
132   // Note: This should remain the last member so it'll be destroyed and
133   // invalidate its weak pointers before any other members are destroyed.
134   base::WeakPtrFactory<DriveApiDataRequest> weak_ptr_factory_;
135
136   DISALLOW_COPY_AND_ASSIGN(DriveApiDataRequest);
137 };
138
139 //=============================== FilesGetRequest =============================
140
141 // This class performs the request for fetching a file.
142 // This request is mapped to
143 // https://developers.google.com/drive/v2/reference/files/get
144 class FilesGetRequest : public DriveApiDataRequest<FileResource> {
145  public:
146   FilesGetRequest(RequestSender* sender,
147                   const DriveApiUrlGenerator& url_generator,
148                   const FileResourceCallback& callback);
149   ~FilesGetRequest() override;
150
151   // Required parameter.
152   const std::string& file_id() const { return file_id_; }
153   void set_file_id(const std::string& file_id) { file_id_ = file_id; }
154
155  protected:
156   // Overridden from DriveApiDataRequest.
157   GURL GetURLInternal() const override;
158
159  private:
160   const DriveApiUrlGenerator url_generator_;
161   std::string file_id_;
162
163   DISALLOW_COPY_AND_ASSIGN(FilesGetRequest);
164 };
165
166 //============================ FilesAuthorizeRequest ===========================
167
168 // This class performs request for authorizing an app to access a file.
169 // This request is mapped to /drive/v2internal/file/authorize internal endpoint.
170 class FilesAuthorizeRequest : public DriveApiDataRequest<FileResource> {
171  public:
172   FilesAuthorizeRequest(RequestSender* sender,
173                         const DriveApiUrlGenerator& url_generator,
174                         const FileResourceCallback& callback);
175   ~FilesAuthorizeRequest() override;
176
177   // Required parameter.
178   const std::string& file_id() const { return file_id_; }
179   void set_file_id(const std::string& file_id) { file_id_ = file_id; }
180   const std::string& app_id() const { return app_id_; }
181   void set_app_id(const std::string& app_id) { app_id_ = app_id; }
182
183  protected:
184   // Overridden from GetDataRequest.
185   net::URLFetcher::RequestType GetRequestType() const override;
186
187   // Overridden from DriveApiDataRequest.
188   GURL GetURLInternal() const override;
189
190  private:
191   const DriveApiUrlGenerator url_generator_;
192   std::string file_id_;
193   std::string app_id_;
194
195   DISALLOW_COPY_AND_ASSIGN(FilesAuthorizeRequest);
196 };
197
198 //============================ FilesInsertRequest =============================
199
200 // This class performs the request for creating a resource.
201 // This request is mapped to
202 // https://developers.google.com/drive/v2/reference/files/insert
203 // See also https://developers.google.com/drive/manage-uploads and
204 // https://developers.google.com/drive/folder
205 class FilesInsertRequest : public DriveApiDataRequest<FileResource> {
206  public:
207   FilesInsertRequest(RequestSender* sender,
208                      const DriveApiUrlGenerator& url_generator,
209                      const FileResourceCallback& callback);
210   ~FilesInsertRequest() override;
211
212   // Optional request body.
213   const base::Time& last_viewed_by_me_date() const {
214     return last_viewed_by_me_date_;
215   }
216   void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) {
217     last_viewed_by_me_date_ = last_viewed_by_me_date;
218   }
219
220   const std::string& mime_type() const { return mime_type_; }
221   void set_mime_type(const std::string& mime_type) {
222     mime_type_ = mime_type;
223   }
224
225   const base::Time& modified_date() const { return modified_date_; }
226   void set_modified_date(const base::Time& modified_date) {
227     modified_date_ = modified_date;
228   }
229
230   const std::vector<std::string>& parents() const { return parents_; }
231   void add_parent(const std::string& parent) { parents_.push_back(parent); }
232
233   const std::string& title() const { return title_; }
234   void set_title(const std::string& title) { title_ = title; }
235
236  protected:
237   // Overridden from GetDataRequest.
238   net::URLFetcher::RequestType GetRequestType() const override;
239   bool GetContentData(std::string* upload_content_type,
240                       std::string* upload_content) override;
241
242   // Overridden from DriveApiDataRequest.
243   GURL GetURLInternal() const override;
244
245  private:
246   const DriveApiUrlGenerator url_generator_;
247
248   base::Time last_viewed_by_me_date_;
249   std::string mime_type_;
250   base::Time modified_date_;
251   std::vector<std::string> parents_;
252   std::string title_;
253
254   DISALLOW_COPY_AND_ASSIGN(FilesInsertRequest);
255 };
256
257 //============================== FilesPatchRequest ============================
258
259 // This class performs the request for patching file metadata.
260 // This request is mapped to
261 // https://developers.google.com/drive/v2/reference/files/patch
262 class FilesPatchRequest : public DriveApiDataRequest<FileResource> {
263  public:
264   FilesPatchRequest(RequestSender* sender,
265                     const DriveApiUrlGenerator& url_generator,
266                     const FileResourceCallback& callback);
267   ~FilesPatchRequest() override;
268
269   // Required parameter.
270   const std::string& file_id() const { return file_id_; }
271   void set_file_id(const std::string& file_id) { file_id_ = file_id; }
272
273   // Optional parameter.
274   bool set_modified_date() const { return set_modified_date_; }
275   void set_set_modified_date(bool set_modified_date) {
276     set_modified_date_ = set_modified_date;
277   }
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
284   // Optional request body.
285   // Note: "Files: patch" accepts any "Files resource" data, but this class
286   // only supports limited members of it for now. We can extend it upon
287   // requirments.
288   const std::string& title() const { return title_; }
289   void set_title(const std::string& title) { title_ = title; }
290
291   const base::Time& modified_date() const { return modified_date_; }
292   void set_modified_date(const base::Time& modified_date) {
293     modified_date_ = modified_date;
294   }
295
296   const base::Time& last_viewed_by_me_date() const {
297     return last_viewed_by_me_date_;
298   }
299   void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) {
300     last_viewed_by_me_date_ = last_viewed_by_me_date;
301   }
302
303   const std::vector<std::string>& parents() const { return parents_; }
304   void add_parent(const std::string& parent) { parents_.push_back(parent); }
305
306  protected:
307   // Overridden from URLFetchRequestBase.
308   net::URLFetcher::RequestType GetRequestType() const override;
309   std::vector<std::string> GetExtraRequestHeaders() const override;
310   bool GetContentData(std::string* upload_content_type,
311                       std::string* upload_content) override;
312
313   // Overridden from DriveApiDataRequest.
314   GURL GetURLInternal() const override;
315
316  private:
317   const DriveApiUrlGenerator url_generator_;
318
319   std::string file_id_;
320   bool set_modified_date_;
321   bool update_viewed_date_;
322
323   std::string title_;
324   base::Time modified_date_;
325   base::Time last_viewed_by_me_date_;
326   std::vector<std::string> parents_;
327
328   DISALLOW_COPY_AND_ASSIGN(FilesPatchRequest);
329 };
330
331 //============================= FilesCopyRequest ==============================
332
333 // This class performs the request for copying a resource.
334 // This request is mapped to
335 // https://developers.google.com/drive/v2/reference/files/copy
336 class FilesCopyRequest : public DriveApiDataRequest<FileResource> {
337  public:
338   // Upon completion, |callback| will be called. |callback| must not be null.
339   FilesCopyRequest(RequestSender* sender,
340                    const DriveApiUrlGenerator& url_generator,
341                    const FileResourceCallback& callback);
342   ~FilesCopyRequest() override;
343
344   // Required parameter.
345   const std::string& file_id() const { return file_id_; }
346   void set_file_id(const std::string& file_id) { file_id_ = file_id; }
347
348   // Optional request body.
349   const std::vector<std::string>& parents() const { return parents_; }
350   void add_parent(const std::string& parent) { parents_.push_back(parent); }
351
352   const base::Time& modified_date() const { return modified_date_; }
353   void set_modified_date(const base::Time& modified_date) {
354     modified_date_ = modified_date;
355   }
356
357   const std::string& title() const { return title_; }
358   void set_title(const std::string& title) { title_ = title; }
359
360  protected:
361   // Overridden from URLFetchRequestBase.
362   net::URLFetcher::RequestType GetRequestType() const override;
363   bool GetContentData(std::string* upload_content_type,
364                       std::string* upload_content) override;
365
366   // Overridden from DriveApiDataRequest.
367   GURL GetURLInternal() const override;
368
369  private:
370   const DriveApiUrlGenerator url_generator_;
371
372   std::string file_id_;
373   base::Time modified_date_;
374   std::vector<std::string> parents_;
375   std::string title_;
376
377   DISALLOW_COPY_AND_ASSIGN(FilesCopyRequest);
378 };
379
380 //============================= FilesListRequest =============================
381
382 // This class performs the request for fetching FileList.
383 // The result may contain only first part of the result. The remaining result
384 // should be able to be fetched by ContinueGetFileListRequest defined below,
385 // or by FilesListRequest with setting page token.
386 // This request is mapped to
387 // https://developers.google.com/drive/v2/reference/files/list
388 class FilesListRequest : public DriveApiDataRequest<FileList> {
389  public:
390   FilesListRequest(RequestSender* sender,
391                    const DriveApiUrlGenerator& url_generator,
392                    const FileListCallback& callback);
393   ~FilesListRequest() override;
394
395   // Optional parameter
396   int max_results() const { return max_results_; }
397   void set_max_results(int max_results) { max_results_ = max_results; }
398
399   const std::string& page_token() const { return page_token_; }
400   void set_page_token(const std::string& page_token) {
401     page_token_ = page_token;
402   }
403
404   const std::string& q() const { return q_; }
405   void set_q(const std::string& q) { q_ = q; }
406
407  protected:
408   // Overridden from DriveApiDataRequest.
409   GURL GetURLInternal() const override;
410
411  private:
412   const DriveApiUrlGenerator url_generator_;
413   int max_results_;
414   std::string page_token_;
415   std::string q_;
416
417   DISALLOW_COPY_AND_ASSIGN(FilesListRequest);
418 };
419
420 //========================= FilesListNextPageRequest ==========================
421
422 // There are two ways to obtain next pages of "Files: list" result (if paged).
423 // 1) Set pageToken and all params used for the initial request.
424 // 2) Use URL in the nextLink field in the previous response.
425 // This class implements 2)'s request.
426 class FilesListNextPageRequest : public DriveApiDataRequest<FileList> {
427  public:
428   FilesListNextPageRequest(RequestSender* sender,
429                            const FileListCallback& callback);
430   ~FilesListNextPageRequest() override;
431
432   const GURL& next_link() const { return next_link_; }
433   void set_next_link(const GURL& next_link) { next_link_ = next_link; }
434
435  protected:
436   // Overridden from DriveApiDataRequest.
437   GURL GetURLInternal() const override;
438
439  private:
440   GURL next_link_;
441
442   DISALLOW_COPY_AND_ASSIGN(FilesListNextPageRequest);
443 };
444
445 //============================= FilesDeleteRequest =============================
446
447 // This class performs the request for deleting a resource.
448 // This request is mapped to
449 // https://developers.google.com/drive/v2/reference/files/delete
450 class FilesDeleteRequest : public EntryActionRequest {
451  public:
452   FilesDeleteRequest(RequestSender* sender,
453                      const DriveApiUrlGenerator& url_generator,
454                      const EntryActionCallback& callback);
455   ~FilesDeleteRequest() override;
456
457   // Required parameter.
458   const std::string& file_id() const { return file_id_; }
459   void set_file_id(const std::string& file_id) { file_id_ = file_id; }
460   void set_etag(const std::string& etag) { etag_ = etag; }
461
462  protected:
463   // Overridden from UrlFetchRequestBase.
464   net::URLFetcher::RequestType GetRequestType() const override;
465   GURL GetURL() const override;
466   std::vector<std::string> GetExtraRequestHeaders() const override;
467
468  private:
469   const DriveApiUrlGenerator url_generator_;
470   std::string file_id_;
471   std::string etag_;
472
473   DISALLOW_COPY_AND_ASSIGN(FilesDeleteRequest);
474 };
475
476 //============================= FilesTrashRequest ==============================
477
478 // This class performs the request for trashing a resource.
479 // This request is mapped to
480 // https://developers.google.com/drive/v2/reference/files/trash
481 class FilesTrashRequest : public DriveApiDataRequest<FileResource> {
482  public:
483   FilesTrashRequest(RequestSender* sender,
484                     const DriveApiUrlGenerator& url_generator,
485                     const FileResourceCallback& callback);
486   ~FilesTrashRequest() override;
487
488   // Required parameter.
489   const std::string& file_id() const { return file_id_; }
490   void set_file_id(const std::string& file_id) { file_id_ = file_id; }
491
492  protected:
493   // Overridden from UrlFetchRequestBase.
494   net::URLFetcher::RequestType GetRequestType() const override;
495
496   // Overridden from DriveApiDataRequest.
497   GURL GetURLInternal() const override;
498
499  private:
500   const DriveApiUrlGenerator url_generator_;
501   std::string file_id_;
502
503   DISALLOW_COPY_AND_ASSIGN(FilesTrashRequest);
504 };
505
506 //============================== AboutGetRequest =============================
507
508 // This class performs the request for fetching About data.
509 // This request is mapped to
510 // https://developers.google.com/drive/v2/reference/about/get
511 class AboutGetRequest : public DriveApiDataRequest<AboutResource> {
512  public:
513   AboutGetRequest(RequestSender* sender,
514                   const DriveApiUrlGenerator& url_generator,
515                   const AboutResourceCallback& callback);
516   ~AboutGetRequest() override;
517
518  protected:
519   // Overridden from DriveApiDataRequest.
520   GURL GetURLInternal() const override;
521
522  private:
523   const DriveApiUrlGenerator url_generator_;
524
525   DISALLOW_COPY_AND_ASSIGN(AboutGetRequest);
526 };
527
528 //============================ ChangesListRequest ============================
529
530 // This class performs the request for fetching ChangeList.
531 // The result may contain only first part of the result. The remaining result
532 // should be able to be fetched by ContinueGetFileListRequest defined below.
533 // or by ChangesListRequest with setting page token.
534 // This request is mapped to
535 // https://developers.google.com/drive/v2/reference/changes/list
536 class ChangesListRequest : public DriveApiDataRequest<ChangeList> {
537  public:
538   ChangesListRequest(RequestSender* sender,
539                      const DriveApiUrlGenerator& url_generator,
540                      const ChangeListCallback& callback);
541   ~ChangesListRequest() override;
542
543   // Optional parameter
544   bool include_deleted() const { return include_deleted_; }
545   void set_include_deleted(bool include_deleted) {
546     include_deleted_ = include_deleted;
547   }
548
549   int max_results() const { return max_results_; }
550   void set_max_results(int max_results) { max_results_ = max_results; }
551
552   const std::string& page_token() const { return page_token_; }
553   void set_page_token(const std::string& page_token) {
554     page_token_ = page_token;
555   }
556
557   int64 start_change_id() const { return start_change_id_; }
558   void set_start_change_id(int64 start_change_id) {
559     start_change_id_ = start_change_id;
560   }
561
562  protected:
563   // Overridden from DriveApiDataRequest.
564   GURL GetURLInternal() const override;
565
566  private:
567   const DriveApiUrlGenerator url_generator_;
568   bool include_deleted_;
569   int max_results_;
570   std::string page_token_;
571   int64 start_change_id_;
572
573   DISALLOW_COPY_AND_ASSIGN(ChangesListRequest);
574 };
575
576 //======================== ChangesListNextPageRequest =========================
577
578 // There are two ways to obtain next pages of "Changes: list" result (if paged).
579 // 1) Set pageToken and all params used for the initial request.
580 // 2) Use URL in the nextLink field in the previous response.
581 // This class implements 2)'s request.
582 class ChangesListNextPageRequest : public DriveApiDataRequest<ChangeList> {
583  public:
584   ChangesListNextPageRequest(RequestSender* sender,
585                              const ChangeListCallback& callback);
586   ~ChangesListNextPageRequest() override;
587
588   const GURL& next_link() const { return next_link_; }
589   void set_next_link(const GURL& next_link) { next_link_ = next_link; }
590
591  protected:
592   // Overridden from DriveApiDataRequest.
593   GURL GetURLInternal() const override;
594
595  private:
596   GURL next_link_;
597
598   DISALLOW_COPY_AND_ASSIGN(ChangesListNextPageRequest);
599 };
600
601 //============================= AppsListRequest ============================
602
603 // This class performs the request for fetching AppList.
604 // This request is mapped to
605 // https://developers.google.com/drive/v2/reference/apps/list
606 class AppsListRequest : public DriveApiDataRequest<AppList> {
607  public:
608   AppsListRequest(RequestSender* sender,
609                   const DriveApiUrlGenerator& url_generator,
610                   bool use_internal_endpoint,
611                   const AppListCallback& callback);
612   ~AppsListRequest() override;
613
614  protected:
615   // Overridden from DriveApiDataRequest.
616   GURL GetURLInternal() const override;
617
618  private:
619   const DriveApiUrlGenerator url_generator_;
620   bool use_internal_endpoint_;
621
622   DISALLOW_COPY_AND_ASSIGN(AppsListRequest);
623 };
624
625 //============================= AppsDeleteRequest ==============================
626
627 // This class performs the request for deleting a Drive app.
628 // This request is mapped to
629 // https://developers.google.com/drive/v2/reference/files/trash
630 class AppsDeleteRequest : public EntryActionRequest {
631  public:
632   AppsDeleteRequest(RequestSender* sender,
633                     const DriveApiUrlGenerator& url_generator,
634                     const EntryActionCallback& callback);
635   ~AppsDeleteRequest() override;
636
637   // Required parameter.
638   const std::string& app_id() const { return app_id_; }
639   void set_app_id(const std::string& app_id) { app_id_ = app_id; }
640
641  protected:
642   // Overridden from UrlFetchRequestBase.
643   net::URLFetcher::RequestType GetRequestType() const override;
644   GURL GetURL() const override;
645
646  private:
647   const DriveApiUrlGenerator url_generator_;
648   std::string app_id_;
649
650   DISALLOW_COPY_AND_ASSIGN(AppsDeleteRequest);
651 };
652
653 //========================== ChildrenInsertRequest ============================
654
655 // This class performs the request for inserting a resource to a directory.
656 // This request is mapped to
657 // https://developers.google.com/drive/v2/reference/children/insert
658 class ChildrenInsertRequest : public EntryActionRequest {
659  public:
660   ChildrenInsertRequest(RequestSender* sender,
661                         const DriveApiUrlGenerator& url_generator,
662                         const EntryActionCallback& callback);
663   ~ChildrenInsertRequest() override;
664
665   // Required parameter.
666   const std::string& folder_id() const { return folder_id_; }
667   void set_folder_id(const std::string& folder_id) {
668     folder_id_ = folder_id;
669   }
670
671   // Required body.
672   const std::string& id() const { return id_; }
673   void set_id(const std::string& id) { id_ = id; }
674
675  protected:
676   // UrlFetchRequestBase overrides.
677   net::URLFetcher::RequestType GetRequestType() const override;
678   GURL GetURL() const override;
679   bool GetContentData(std::string* upload_content_type,
680                       std::string* upload_content) override;
681
682  private:
683   const DriveApiUrlGenerator url_generator_;
684   std::string folder_id_;
685   std::string id_;
686
687   DISALLOW_COPY_AND_ASSIGN(ChildrenInsertRequest);
688 };
689
690 //========================== ChildrenDeleteRequest ============================
691
692 // This class performs the request for removing a resource from a directory.
693 // This request is mapped to
694 // https://developers.google.com/drive/v2/reference/children/delete
695 class ChildrenDeleteRequest : public EntryActionRequest {
696  public:
697   // |callback| must not be null.
698   ChildrenDeleteRequest(RequestSender* sender,
699                         const DriveApiUrlGenerator& url_generator,
700                         const EntryActionCallback& callback);
701   ~ChildrenDeleteRequest() override;
702
703   // Required parameter.
704   const std::string& child_id() const { return child_id_; }
705   void set_child_id(const std::string& child_id) {
706     child_id_ = child_id;
707   }
708
709   const std::string& folder_id() const { return folder_id_; }
710   void set_folder_id(const std::string& folder_id) {
711     folder_id_ = folder_id;
712   }
713
714  protected:
715   // UrlFetchRequestBase overrides.
716   net::URLFetcher::RequestType GetRequestType() const override;
717   GURL GetURL() const override;
718
719  private:
720   const DriveApiUrlGenerator url_generator_;
721   std::string child_id_;
722   std::string folder_id_;
723
724   DISALLOW_COPY_AND_ASSIGN(ChildrenDeleteRequest);
725 };
726
727 //======================= InitiateUploadNewFileRequest =======================
728
729 // This class performs the request for initiating the upload of a new file.
730 class InitiateUploadNewFileRequest : public InitiateUploadRequestBase {
731  public:
732   // |parent_resource_id| should be the resource id of the parent directory.
733   // |title| should be set.
734   // See also the comments of InitiateUploadRequestBase for more details
735   // about the other parameters.
736   InitiateUploadNewFileRequest(RequestSender* sender,
737                                const DriveApiUrlGenerator& url_generator,
738                                const std::string& content_type,
739                                int64 content_length,
740                                const std::string& parent_resource_id,
741                                const std::string& title,
742                                const InitiateUploadCallback& callback);
743   ~InitiateUploadNewFileRequest() override;
744
745   // Optional parameters.
746   const base::Time& modified_date() const { return modified_date_; }
747   void set_modified_date(const base::Time& modified_date) {
748     modified_date_ = modified_date;
749   }
750   const base::Time& last_viewed_by_me_date() const {
751     return last_viewed_by_me_date_;
752   }
753   void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) {
754     last_viewed_by_me_date_ = last_viewed_by_me_date;
755   }
756
757  protected:
758   // UrlFetchRequestBase overrides.
759   GURL GetURL() const override;
760   net::URLFetcher::RequestType GetRequestType() const override;
761   bool GetContentData(std::string* upload_content_type,
762                       std::string* upload_content) override;
763
764  private:
765   const DriveApiUrlGenerator url_generator_;
766   const std::string parent_resource_id_;
767   const std::string title_;
768
769   base::Time modified_date_;
770   base::Time last_viewed_by_me_date_;
771
772   DISALLOW_COPY_AND_ASSIGN(InitiateUploadNewFileRequest);
773 };
774
775 //==================== InitiateUploadExistingFileRequest =====================
776
777 // This class performs the request for initiating the upload of an existing
778 // file.
779 class InitiateUploadExistingFileRequest : public InitiateUploadRequestBase {
780  public:
781   // |upload_url| should be the upload_url() of the file
782   //    (resumable-create-media URL)
783   // |etag| should be set if it is available to detect the upload confliction.
784   // See also the comments of InitiateUploadRequestBase for more details
785   // about the other parameters.
786   InitiateUploadExistingFileRequest(RequestSender* sender,
787                                     const DriveApiUrlGenerator& url_generator,
788                                     const std::string& content_type,
789                                     int64 content_length,
790                                     const std::string& resource_id,
791                                     const std::string& etag,
792                                     const InitiateUploadCallback& callback);
793   ~InitiateUploadExistingFileRequest() override;
794
795   // Optional parameters.
796   const std::string& parent_resource_id() const { return parent_resource_id_; }
797   void set_parent_resource_id(const std::string& parent_resource_id) {
798     parent_resource_id_ = parent_resource_id;
799   }
800   const std::string& title() const { return title_; }
801   void set_title(const std::string& title) { title_ = title; }
802   const base::Time& modified_date() const { return modified_date_; }
803   void set_modified_date(const base::Time& modified_date) {
804     modified_date_ = modified_date;
805   }
806   const base::Time& last_viewed_by_me_date() const {
807     return last_viewed_by_me_date_;
808   }
809   void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) {
810     last_viewed_by_me_date_ = last_viewed_by_me_date;
811   }
812
813  protected:
814   // UrlFetchRequestBase overrides.
815   GURL GetURL() const override;
816   net::URLFetcher::RequestType GetRequestType() const override;
817   std::vector<std::string> GetExtraRequestHeaders() const override;
818   bool GetContentData(std::string* upload_content_type,
819                       std::string* upload_content) override;
820
821  private:
822   const DriveApiUrlGenerator url_generator_;
823   const std::string resource_id_;
824   const std::string etag_;
825
826   std::string parent_resource_id_;
827   std::string title_;
828   base::Time modified_date_;
829   base::Time last_viewed_by_me_date_;
830
831   DISALLOW_COPY_AND_ASSIGN(InitiateUploadExistingFileRequest);
832 };
833
834 // Callback used for ResumeUpload() and GetUploadStatus().
835 typedef base::Callback<void(
836     const UploadRangeResponse& response,
837     scoped_ptr<FileResource> new_resource)> UploadRangeCallback;
838
839 //============================ ResumeUploadRequest ===========================
840
841 // Performs the request for resuming the upload of a file.
842 class ResumeUploadRequest : public ResumeUploadRequestBase {
843  public:
844   // See also ResumeUploadRequestBase's comment for parameters meaning.
845   // |callback| must not be null. |progress_callback| may be null.
846   ResumeUploadRequest(RequestSender* sender,
847                       const GURL& upload_location,
848                       int64 start_position,
849                       int64 end_position,
850                       int64 content_length,
851                       const std::string& content_type,
852                       const base::FilePath& local_file_path,
853                       const UploadRangeCallback& callback,
854                       const ProgressCallback& progress_callback);
855   ~ResumeUploadRequest() override;
856
857  protected:
858   // UploadRangeRequestBase overrides.
859   void OnRangeRequestComplete(const UploadRangeResponse& response,
860                               scoped_ptr<base::Value> value) override;
861   // content::UrlFetcherDelegate overrides.
862   void OnURLFetchUploadProgress(const net::URLFetcher* source,
863                                 int64 current,
864                                 int64 total) override;
865
866  private:
867   const UploadRangeCallback callback_;
868   const ProgressCallback progress_callback_;
869
870   DISALLOW_COPY_AND_ASSIGN(ResumeUploadRequest);
871 };
872
873 //========================== GetUploadStatusRequest ==========================
874
875 // Performs the request to fetch the current upload status of a file.
876 class GetUploadStatusRequest : public GetUploadStatusRequestBase {
877  public:
878   // See also GetUploadStatusRequestBase's comment for parameters meaning.
879   // |callback| must not be null.
880   GetUploadStatusRequest(RequestSender* sender,
881                          const GURL& upload_url,
882                          int64 content_length,
883                          const UploadRangeCallback& callback);
884   ~GetUploadStatusRequest() override;
885
886  protected:
887   // UploadRangeRequestBase overrides.
888   void OnRangeRequestComplete(const UploadRangeResponse& response,
889                               scoped_ptr<base::Value> value) override;
890
891  private:
892   const UploadRangeCallback callback_;
893
894   DISALLOW_COPY_AND_ASSIGN(GetUploadStatusRequest);
895 };
896
897 //========================== DownloadFileRequest ==========================
898
899 // This class performs the request for downloading of a specified file.
900 class DownloadFileRequest : public DownloadFileRequestBase {
901  public:
902   // See also DownloadFileRequestBase's comment for parameters meaning.
903   DownloadFileRequest(RequestSender* sender,
904                       const DriveApiUrlGenerator& url_generator,
905                       const std::string& resource_id,
906                       const base::FilePath& output_file_path,
907                       const DownloadActionCallback& download_action_callback,
908                       const GetContentCallback& get_content_callback,
909                       const ProgressCallback& progress_callback);
910   ~DownloadFileRequest() override;
911
912   DISALLOW_COPY_AND_ASSIGN(DownloadFileRequest);
913 };
914
915 //========================== PermissionsInsertRequest ==========================
916
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
925 // Enumeration type for specifying the role of permissions.
926 enum PermissionRole {
927   PERMISSION_ROLE_OWNER,
928   PERMISSION_ROLE_READER,
929   PERMISSION_ROLE_WRITER,
930   PERMISSION_ROLE_COMMENTER,
931 };
932
933 // This class performs the request for adding permission on a specified file.
934 class PermissionsInsertRequest : public EntryActionRequest {
935  public:
936   // See https://developers.google.com/drive/v2/reference/permissions/insert.
937   PermissionsInsertRequest(RequestSender* sender,
938                            const DriveApiUrlGenerator& url_generator,
939                            const EntryActionCallback& callback);
940   ~PermissionsInsertRequest() override;
941
942   void set_id(const std::string& id) { id_ = id; }
943   void set_type(PermissionType type) { type_ = type; }
944   void set_role(PermissionRole role) { role_ = role; }
945   void set_value(const std::string& value) { value_ = value; }
946
947   // UrlFetchRequestBase overrides.
948   GURL GetURL() const override;
949   net::URLFetcher::RequestType GetRequestType() const override;
950   bool GetContentData(std::string* upload_content_type,
951                       std::string* upload_content) override;
952
953  private:
954   const DriveApiUrlGenerator url_generator_;
955   std::string id_;
956   PermissionType type_;
957   PermissionRole role_;
958   std::string value_;
959
960   DISALLOW_COPY_AND_ASSIGN(PermissionsInsertRequest);
961 };
962
963 }  // namespace drive
964 }  // namespace google_apis
965
966 #endif  // GOOGLE_APIS_DRIVE_DRIVE_API_REQUESTS_H_