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
21namespace google_apis {
22
23// Callback used for requests that the server returns FileResource data
24// formatted into JSON value.
25typedef 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.
31typedef 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.
36typedef base::Callback<void(GDataErrorCode error,
37                            scoped_ptr<ChangeList> entry)> ChangeListCallback;
38
39namespace 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
47class DriveApiPartialFieldRequest : public UrlFetchRequestBase {
48 public:
49  explicit DriveApiPartialFieldRequest(RequestSender* sender);
50  virtual ~DriveApiPartialFieldRequest();
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  virtual 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|.
74template<class DataType>
75class 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
144class FilesGetRequest : public DriveApiDataRequest<FileResource> {
145 public:
146  FilesGetRequest(RequestSender* sender,
147                  const DriveApiUrlGenerator& url_generator,
148                  const FileResourceCallback& callback);
149  virtual ~FilesGetRequest();
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  virtual 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.
170class FilesAuthorizeRequest : public DriveApiDataRequest<FileResource> {
171 public:
172  FilesAuthorizeRequest(RequestSender* sender,
173                        const DriveApiUrlGenerator& url_generator,
174                        const FileResourceCallback& callback);
175  virtual ~FilesAuthorizeRequest();
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  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
186
187  // Overridden from DriveApiDataRequest.
188  virtual 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
205class FilesInsertRequest : public DriveApiDataRequest<FileResource> {
206 public:
207  FilesInsertRequest(RequestSender* sender,
208                     const DriveApiUrlGenerator& url_generator,
209                     const FileResourceCallback& callback);
210  virtual ~FilesInsertRequest();
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  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
239  virtual bool GetContentData(std::string* upload_content_type,
240                              std::string* upload_content) OVERRIDE;
241
242  // Overridden from DriveApiDataRequest.
243  virtual 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
262class FilesPatchRequest : public DriveApiDataRequest<FileResource> {
263 public:
264  FilesPatchRequest(RequestSender* sender,
265                    const DriveApiUrlGenerator& url_generator,
266                    const FileResourceCallback& callback);
267  virtual ~FilesPatchRequest();
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  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
309  virtual std::vector<std::string> GetExtraRequestHeaders() const OVERRIDE;
310  virtual bool GetContentData(std::string* upload_content_type,
311                              std::string* upload_content) OVERRIDE;
312
313  // Overridden from DriveApiDataRequest.
314  virtual 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
336class 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  virtual ~FilesCopyRequest();
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  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
363  virtual bool GetContentData(std::string* upload_content_type,
364                              std::string* upload_content) OVERRIDE;
365
366  // Overridden from DriveApiDataRequest.
367  virtual 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
388class FilesListRequest : public DriveApiDataRequest<FileList> {
389 public:
390  FilesListRequest(RequestSender* sender,
391                   const DriveApiUrlGenerator& url_generator,
392                   const FileListCallback& callback);
393  virtual ~FilesListRequest();
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  virtual 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.
426class FilesListNextPageRequest : public DriveApiDataRequest<FileList> {
427 public:
428  FilesListNextPageRequest(RequestSender* sender,
429                           const FileListCallback& callback);
430  virtual ~FilesListNextPageRequest();
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  virtual 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
450class FilesDeleteRequest : public EntryActionRequest {
451 public:
452  FilesDeleteRequest(RequestSender* sender,
453                     const DriveApiUrlGenerator& url_generator,
454                     const EntryActionCallback& callback);
455  virtual ~FilesDeleteRequest();
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  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
465  virtual GURL GetURL() const OVERRIDE;
466  virtual 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
481class FilesTrashRequest : public DriveApiDataRequest<FileResource> {
482 public:
483  FilesTrashRequest(RequestSender* sender,
484                    const DriveApiUrlGenerator& url_generator,
485                    const FileResourceCallback& callback);
486  virtual ~FilesTrashRequest();
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  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
495
496  // Overridden from DriveApiDataRequest.
497  virtual 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
511class AboutGetRequest : public DriveApiDataRequest<AboutResource> {
512 public:
513  AboutGetRequest(RequestSender* sender,
514                  const DriveApiUrlGenerator& url_generator,
515                  const AboutResourceCallback& callback);
516  virtual ~AboutGetRequest();
517
518 protected:
519  // Overridden from DriveApiDataRequest.
520  virtual 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
536class ChangesListRequest : public DriveApiDataRequest<ChangeList> {
537 public:
538  ChangesListRequest(RequestSender* sender,
539                     const DriveApiUrlGenerator& url_generator,
540                     const ChangeListCallback& callback);
541  virtual ~ChangesListRequest();
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  virtual 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.
582class ChangesListNextPageRequest : public DriveApiDataRequest<ChangeList> {
583 public:
584  ChangesListNextPageRequest(RequestSender* sender,
585                             const ChangeListCallback& callback);
586  virtual ~ChangesListNextPageRequest();
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  virtual 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
606class 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  virtual ~AppsListRequest();
613
614 protected:
615  // Overridden from DriveApiDataRequest.
616  virtual 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
630class AppsDeleteRequest : public EntryActionRequest {
631 public:
632  AppsDeleteRequest(RequestSender* sender,
633                    const DriveApiUrlGenerator& url_generator,
634                    const EntryActionCallback& callback);
635  virtual ~AppsDeleteRequest();
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  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
644  virtual 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
658class ChildrenInsertRequest : public EntryActionRequest {
659 public:
660  ChildrenInsertRequest(RequestSender* sender,
661                        const DriveApiUrlGenerator& url_generator,
662                        const EntryActionCallback& callback);
663  virtual ~ChildrenInsertRequest();
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  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
678  virtual GURL GetURL() const OVERRIDE;
679  virtual 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
695class 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  virtual ~ChildrenDeleteRequest();
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  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
717  virtual 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.
730class 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  virtual ~InitiateUploadNewFileRequest();
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  virtual GURL GetURL() const OVERRIDE;
760  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
761  virtual 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.
779class 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  virtual ~InitiateUploadExistingFileRequest();
794
795
796  // Optional parameters.
797  const std::string& parent_resource_id() const { return parent_resource_id_; }
798  void set_parent_resource_id(const std::string& parent_resource_id) {
799    parent_resource_id_ = parent_resource_id;
800  }
801  const std::string& title() const { return title_; }
802  void set_title(const std::string& title) { title_ = title; }
803  const base::Time& modified_date() const { return modified_date_; }
804  void set_modified_date(const base::Time& modified_date) {
805    modified_date_ = modified_date;
806  }
807  const base::Time& last_viewed_by_me_date() const {
808    return last_viewed_by_me_date_;
809  }
810  void set_last_viewed_by_me_date(const base::Time& last_viewed_by_me_date) {
811    last_viewed_by_me_date_ = last_viewed_by_me_date;
812  }
813
814 protected:
815  // UrlFetchRequestBase overrides.
816  virtual GURL GetURL() const OVERRIDE;
817  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
818  virtual std::vector<std::string> GetExtraRequestHeaders() const OVERRIDE;
819  virtual bool GetContentData(std::string* upload_content_type,
820                              std::string* upload_content) OVERRIDE;
821
822 private:
823  const DriveApiUrlGenerator url_generator_;
824  const std::string resource_id_;
825  const std::string etag_;
826
827  std::string parent_resource_id_;
828  std::string title_;
829  base::Time modified_date_;
830  base::Time last_viewed_by_me_date_;
831
832  DISALLOW_COPY_AND_ASSIGN(InitiateUploadExistingFileRequest);
833};
834
835// Callback used for ResumeUpload() and GetUploadStatus().
836typedef base::Callback<void(
837    const UploadRangeResponse& response,
838    scoped_ptr<FileResource> new_resource)> UploadRangeCallback;
839
840//============================ ResumeUploadRequest ===========================
841
842// Performs the request for resuming the upload of a file.
843class ResumeUploadRequest : public ResumeUploadRequestBase {
844 public:
845  // See also ResumeUploadRequestBase's comment for parameters meaning.
846  // |callback| must not be null. |progress_callback| may be null.
847  ResumeUploadRequest(RequestSender* sender,
848                      const GURL& upload_location,
849                      int64 start_position,
850                      int64 end_position,
851                      int64 content_length,
852                      const std::string& content_type,
853                      const base::FilePath& local_file_path,
854                      const UploadRangeCallback& callback,
855                      const ProgressCallback& progress_callback);
856  virtual ~ResumeUploadRequest();
857
858 protected:
859  // UploadRangeRequestBase overrides.
860  virtual void OnRangeRequestComplete(
861      const UploadRangeResponse& response,
862      scoped_ptr<base::Value> value) OVERRIDE;
863  // content::UrlFetcherDelegate overrides.
864  virtual void OnURLFetchUploadProgress(const net::URLFetcher* source,
865                                        int64 current, int64 total) OVERRIDE;
866
867 private:
868  const UploadRangeCallback callback_;
869  const ProgressCallback progress_callback_;
870
871  DISALLOW_COPY_AND_ASSIGN(ResumeUploadRequest);
872};
873
874//========================== GetUploadStatusRequest ==========================
875
876// Performs the request to fetch the current upload status of a file.
877class GetUploadStatusRequest : public GetUploadStatusRequestBase {
878 public:
879  // See also GetUploadStatusRequestBase's comment for parameters meaning.
880  // |callback| must not be null.
881  GetUploadStatusRequest(RequestSender* sender,
882                         const GURL& upload_url,
883                         int64 content_length,
884                         const UploadRangeCallback& callback);
885  virtual ~GetUploadStatusRequest();
886
887 protected:
888  // UploadRangeRequestBase overrides.
889  virtual void OnRangeRequestComplete(
890      const UploadRangeResponse& response,
891      scoped_ptr<base::Value> value) OVERRIDE;
892
893 private:
894  const UploadRangeCallback callback_;
895
896  DISALLOW_COPY_AND_ASSIGN(GetUploadStatusRequest);
897};
898
899//========================== DownloadFileRequest ==========================
900
901// This class performs the request for downloading of a specified file.
902class 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                      const DownloadActionCallback& download_action_callback,
910                      const GetContentCallback& get_content_callback,
911                      const ProgressCallback& progress_callback);
912  virtual ~DownloadFileRequest();
913
914  DISALLOW_COPY_AND_ASSIGN(DownloadFileRequest);
915};
916
917//========================== PermissionsInsertRequest ==========================
918
919// Enumeration type for specifying type of permissions.
920enum PermissionType {
921  PERMISSION_TYPE_ANYONE,
922  PERMISSION_TYPE_DOMAIN,
923  PERMISSION_TYPE_GROUP,
924  PERMISSION_TYPE_USER,
925};
926
927// Enumeration type for specifying the role of permissions.
928enum PermissionRole {
929  PERMISSION_ROLE_OWNER,
930  PERMISSION_ROLE_READER,
931  PERMISSION_ROLE_WRITER,
932  PERMISSION_ROLE_COMMENTER,
933};
934
935// This class performs the request for adding permission on a specified file.
936class PermissionsInsertRequest : public EntryActionRequest {
937 public:
938  // See https://developers.google.com/drive/v2/reference/permissions/insert.
939  PermissionsInsertRequest(RequestSender* sender,
940                           const DriveApiUrlGenerator& url_generator,
941                           const EntryActionCallback& callback);
942  virtual ~PermissionsInsertRequest();
943
944  void set_id(const std::string& id) { id_ = id; }
945  void set_type(PermissionType type) { type_ = type; }
946  void set_role(PermissionRole role) { role_ = role; }
947  void set_value(const std::string& value) { value_ = value; }
948
949  // UrlFetchRequestBase overrides.
950  virtual GURL GetURL() const OVERRIDE;
951  virtual net::URLFetcher::RequestType GetRequestType() const OVERRIDE;
952  virtual bool GetContentData(std::string* upload_content_type,
953                              std::string* upload_content) OVERRIDE;
954
955 private:
956  const DriveApiUrlGenerator url_generator_;
957  std::string id_;
958  PermissionType type_;
959  PermissionRole role_;
960  std::string value_;
961
962  DISALLOW_COPY_AND_ASSIGN(PermissionsInsertRequest);
963};
964
965}  // namespace drive
966}  // namespace google_apis
967
968#endif  // GOOGLE_APIS_DRIVE_DRIVE_API_REQUESTS_H_
969