• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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   virtual ~DriveApiPartialFieldRequest();
51 
52   // Optional parameter.
fields()53   const std::string& fields() const { return fields_; }
set_fields(const std::string & 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|.
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.
DriveApiDataRequest(RequestSender * sender,const Callback & callback)82   DriveApiDataRequest(RequestSender* sender, const Callback& callback)
83       : DriveApiPartialFieldRequest(sender),
84         callback_(callback),
85         weak_ptr_factory_(this) {
86     DCHECK(!callback_.is_null());
87   }
~DriveApiDataRequest()88   virtual ~DriveApiDataRequest() {}
89 
90  protected:
91   // UrlFetchRequestBase overrides.
ProcessURLFetchResults(const net::URLFetcher * source)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 
RunCallbackOnPrematureFailure(GDataErrorCode error)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.
Parse(const std::string & json)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.
OnDataParsed(GDataErrorCode error,scoped_ptr<DataType> value)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   virtual ~FilesGetRequest();
150 
151   // Required parameter.
file_id()152   const std::string& file_id() const { return file_id_; }
set_file_id(const std::string & 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.
170 class 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.
file_id()178   const std::string& file_id() const { return file_id_; }
set_file_id(const std::string & file_id)179   void set_file_id(const std::string& file_id) { file_id_ = file_id; }
app_id()180   const std::string& app_id() const { return app_id_; }
set_app_id(const std::string & 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
205 class 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.
last_viewed_by_me_date()213   const base::Time& last_viewed_by_me_date() const {
214     return last_viewed_by_me_date_;
215   }
set_last_viewed_by_me_date(const base::Time & last_viewed_by_me_date)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 
mime_type()220   const std::string& mime_type() const { return mime_type_; }
set_mime_type(const std::string & mime_type)221   void set_mime_type(const std::string& mime_type) {
222     mime_type_ = mime_type;
223   }
224 
modified_date()225   const base::Time& modified_date() const { return modified_date_; }
set_modified_date(const base::Time & modified_date)226   void set_modified_date(const base::Time& modified_date) {
227     modified_date_ = modified_date;
228   }
229 
parents()230   const std::vector<std::string>& parents() const { return parents_; }
add_parent(const std::string & parent)231   void add_parent(const std::string& parent) { parents_.push_back(parent); }
232 
title()233   const std::string& title() const { return title_; }
set_title(const std::string & 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
262 class 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.
file_id()270   const std::string& file_id() const { return file_id_; }
set_file_id(const std::string & file_id)271   void set_file_id(const std::string& file_id) { file_id_ = file_id; }
272 
273   // Optional parameter.
set_modified_date()274   bool set_modified_date() const { return set_modified_date_; }
set_set_modified_date(bool set_modified_date)275   void set_set_modified_date(bool set_modified_date) {
276     set_modified_date_ = set_modified_date;
277   }
278 
update_viewed_date()279   bool update_viewed_date() const { return update_viewed_date_; }
set_update_viewed_date(bool 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.
title()288   const std::string& title() const { return title_; }
set_title(const std::string & title)289   void set_title(const std::string& title) { title_ = title; }
290 
modified_date()291   const base::Time& modified_date() const { return modified_date_; }
set_modified_date(const base::Time & modified_date)292   void set_modified_date(const base::Time& modified_date) {
293     modified_date_ = modified_date;
294   }
295 
last_viewed_by_me_date()296   const base::Time& last_viewed_by_me_date() const {
297     return last_viewed_by_me_date_;
298   }
set_last_viewed_by_me_date(const base::Time & last_viewed_by_me_date)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 
parents()303   const std::vector<std::string>& parents() const { return parents_; }
add_parent(const std::string & parent)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
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   virtual ~FilesCopyRequest();
343 
344   // Required parameter.
file_id()345   const std::string& file_id() const { return file_id_; }
set_file_id(const std::string & file_id)346   void set_file_id(const std::string& file_id) { file_id_ = file_id; }
347 
348   // Optional request body.
parents()349   const std::vector<std::string>& parents() const { return parents_; }
add_parent(const std::string & parent)350   void add_parent(const std::string& parent) { parents_.push_back(parent); }
351 
modified_date()352   const base::Time& modified_date() const { return modified_date_; }
set_modified_date(const base::Time & modified_date)353   void set_modified_date(const base::Time& modified_date) {
354     modified_date_ = modified_date;
355   }
356 
title()357   const std::string& title() const { return title_; }
set_title(const std::string & 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
388 class 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
max_results()396   int max_results() const { return max_results_; }
set_max_results(int max_results)397   void set_max_results(int max_results) { max_results_ = max_results; }
398 
page_token()399   const std::string& page_token() const { return page_token_; }
set_page_token(const std::string & page_token)400   void set_page_token(const std::string& page_token) {
401     page_token_ = page_token;
402   }
403 
q()404   const std::string& q() const { return q_; }
set_q(const std::string & 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.
426 class FilesListNextPageRequest : public DriveApiDataRequest<FileList> {
427  public:
428   FilesListNextPageRequest(RequestSender* sender,
429                            const FileListCallback& callback);
430   virtual ~FilesListNextPageRequest();
431 
next_link()432   const GURL& next_link() const { return next_link_; }
set_next_link(const GURL & 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
450 class 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.
file_id()458   const std::string& file_id() const { return file_id_; }
set_file_id(const std::string & file_id)459   void set_file_id(const std::string& file_id) { file_id_ = file_id; }
set_etag(const std::string & etag)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
481 class 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.
file_id()489   const std::string& file_id() const { return file_id_; }
set_file_id(const std::string & 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
511 class 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
536 class 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
include_deleted()544   bool include_deleted() const { return include_deleted_; }
set_include_deleted(bool include_deleted)545   void set_include_deleted(bool include_deleted) {
546     include_deleted_ = include_deleted;
547   }
548 
max_results()549   int max_results() const { return max_results_; }
set_max_results(int max_results)550   void set_max_results(int max_results) { max_results_ = max_results; }
551 
page_token()552   const std::string& page_token() const { return page_token_; }
set_page_token(const std::string & page_token)553   void set_page_token(const std::string& page_token) {
554     page_token_ = page_token;
555   }
556 
start_change_id()557   int64 start_change_id() const { return start_change_id_; }
set_start_change_id(int64 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.
582 class ChangesListNextPageRequest : public DriveApiDataRequest<ChangeList> {
583  public:
584   ChangesListNextPageRequest(RequestSender* sender,
585                              const ChangeListCallback& callback);
586   virtual ~ChangesListNextPageRequest();
587 
next_link()588   const GURL& next_link() const { return next_link_; }
set_next_link(const GURL & 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
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   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
630 class 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.
app_id()638   const std::string& app_id() const { return app_id_; }
set_app_id(const std::string & 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
658 class 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.
folder_id()666   const std::string& folder_id() const { return folder_id_; }
set_folder_id(const std::string & folder_id)667   void set_folder_id(const std::string& folder_id) {
668     folder_id_ = folder_id;
669   }
670 
671   // Required body.
id()672   const std::string& id() const { return id_; }
set_id(const std::string & 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
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   virtual ~ChildrenDeleteRequest();
702 
703   // Required parameter.
child_id()704   const std::string& child_id() const { return child_id_; }
set_child_id(const std::string & child_id)705   void set_child_id(const std::string& child_id) {
706     child_id_ = child_id;
707   }
708 
folder_id()709   const std::string& folder_id() const { return folder_id_; }
set_folder_id(const std::string & 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.
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   virtual ~InitiateUploadNewFileRequest();
744 
745   // Optional parameters.
modified_date()746   const base::Time& modified_date() const { return modified_date_; }
set_modified_date(const base::Time & modified_date)747   void set_modified_date(const base::Time& modified_date) {
748     modified_date_ = modified_date;
749   }
last_viewed_by_me_date()750   const base::Time& last_viewed_by_me_date() const {
751     return last_viewed_by_me_date_;
752   }
set_last_viewed_by_me_date(const base::Time & last_viewed_by_me_date)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.
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   virtual ~InitiateUploadExistingFileRequest();
794 
795 
796   // Optional parameters.
parent_resource_id()797   const std::string& parent_resource_id() const { return parent_resource_id_; }
set_parent_resource_id(const std::string & parent_resource_id)798   void set_parent_resource_id(const std::string& parent_resource_id) {
799     parent_resource_id_ = parent_resource_id;
800   }
title()801   const std::string& title() const { return title_; }
set_title(const std::string & title)802   void set_title(const std::string& title) { title_ = title; }
modified_date()803   const base::Time& modified_date() const { return modified_date_; }
set_modified_date(const base::Time & modified_date)804   void set_modified_date(const base::Time& modified_date) {
805     modified_date_ = modified_date;
806   }
last_viewed_by_me_date()807   const base::Time& last_viewed_by_me_date() const {
808     return last_viewed_by_me_date_;
809   }
set_last_viewed_by_me_date(const base::Time & last_viewed_by_me_date)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().
836 typedef 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.
843 class 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.
877 class 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.
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                       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.
920 enum 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.
928 enum 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.
936 class 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 
set_id(const std::string & id)944   void set_id(const std::string& id) { id_ = id; }
set_type(PermissionType type)945   void set_type(PermissionType type) { type_ = type; }
set_role(PermissionRole role)946   void set_role(PermissionRole role) { role_ = role; }
set_value(const std::string & value)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