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 CHROME_BROWSER_DRIVE_DRIVE_SERVICE_INTERFACE_H_
6#define CHROME_BROWSER_DRIVE_DRIVE_SERVICE_INTERFACE_H_
7
8#include <string>
9
10#include "base/time/time.h"
11#include "google_apis/drive/auth_service_interface.h"
12#include "google_apis/drive/base_requests.h"
13#include "google_apis/drive/drive_api_requests.h"
14#include "google_apis/drive/drive_common_callbacks.h"
15
16namespace base {
17class Time;
18}
19
20namespace drive {
21
22// Observer interface for DriveServiceInterface.
23class DriveServiceObserver {
24 public:
25  // Triggered when the service gets ready to send requests.
26  virtual void OnReadyToSendRequests() {}
27
28  // Called when the refresh token was found to be invalid.
29  virtual void OnRefreshTokenInvalid() {}
30
31 protected:
32  virtual ~DriveServiceObserver() {}
33};
34
35// This defines an interface for sharing by DriveService and MockDriveService
36// so that we can do testing of clients of DriveService.
37//
38// All functions must be called on UI thread. DriveService is built on top of
39// URLFetcher that runs on UI thread.
40class DriveServiceInterface {
41 public:
42  // Optional parameters for AddNewDirectory().
43  struct AddNewDirectoryOptions {
44    AddNewDirectoryOptions();
45    ~AddNewDirectoryOptions();
46
47    // modified_date of the directory.
48    // Pass the null Time if you are not interested in setting this property.
49    base::Time modified_date;
50
51    // last_viewed_by_me_date of the directory.
52    // Pass the null Time if you are not interested in setting this property.
53    base::Time last_viewed_by_me_date;
54  };
55
56  // Optional parameters for InitiateUploadNewFile().
57  struct InitiateUploadNewFileOptions {
58    InitiateUploadNewFileOptions();
59    ~InitiateUploadNewFileOptions();
60
61    // modified_date of the file.
62    // Pass the null Time if you are not interested in setting this property.
63    base::Time modified_date;
64
65    // last_viewed_by_me_date of the file.
66    // Pass the null Time if you are not interested in setting this property.
67    base::Time last_viewed_by_me_date;
68  };
69
70  // Optional parameters for InitiateUploadExistingFile().
71  struct InitiateUploadExistingFileOptions {
72    InitiateUploadExistingFileOptions();
73    ~InitiateUploadExistingFileOptions();
74
75    // Expected ETag of the file. UPLOAD_ERROR_CONFLICT error is generated when
76    // matching fails.
77    // Pass the empty string to disable this behavior.
78    std::string etag;
79
80    // New parent of the file.
81    // Pass the empty string to keep the property unchanged.
82    std::string parent_resource_id;
83
84    // New title of the file.
85    // Pass the empty string to keep the property unchanged.
86    std::string title;
87
88    // New modified_date of the file.
89    // Pass the null Time if you are not interested in setting this property.
90    base::Time modified_date;
91
92    // New last_viewed_by_me_date of the file.
93    // Pass the null Time if you are not interested in setting this property.
94    base::Time last_viewed_by_me_date;
95  };
96
97  virtual ~DriveServiceInterface() {}
98
99  // Common service:
100
101  // Initializes the documents service with |account_id|.
102  virtual void Initialize(const std::string& account_id) = 0;
103
104  // Adds an observer.
105  virtual void AddObserver(DriveServiceObserver* observer) = 0;
106
107  // Removes an observer.
108  virtual void RemoveObserver(DriveServiceObserver* observer) = 0;
109
110  // True if ready to send requests.
111  virtual bool CanSendRequest() const = 0;
112
113  // Authentication service:
114
115  // True if OAuth2 access token is retrieved and believed to be fresh.
116  virtual bool HasAccessToken() const = 0;
117
118  // Gets the cached OAuth2 access token or if empty, then fetches a new one.
119  virtual void RequestAccessToken(
120      const google_apis::AuthStatusCallback& callback) = 0;
121
122  // True if OAuth2 refresh token is present.
123  virtual bool HasRefreshToken() const = 0;
124
125  // Clears OAuth2 access token.
126  virtual void ClearAccessToken() = 0;
127
128  // Clears OAuth2 refresh token.
129  virtual void ClearRefreshToken() = 0;
130
131  // Document access:
132
133  // Returns the resource id for the root directory.
134  virtual std::string GetRootResourceId() const = 0;
135
136  // Fetches a file list of the account. |callback| will be called upon
137  // completion.
138  // If the list is too long, it may be paged. In such a case, a URL to fetch
139  // remaining results will be included in the returned result. See also
140  // GetRemainingFileList.
141  //
142  // |callback| must not be null.
143  virtual google_apis::CancelCallback GetAllFileList(
144      const google_apis::FileListCallback& callback) = 0;
145
146  // Fetches a file list in the directory with |directory_resource_id|.
147  // |callback| will be called upon completion.
148  // If the list is too long, it may be paged. In such a case, a URL to fetch
149  // remaining results will be included in the returned result. See also
150  // GetRemainingFileList.
151  //
152  // |directory_resource_id| must not be empty.
153  // |callback| must not be null.
154  virtual google_apis::CancelCallback GetFileListInDirectory(
155      const std::string& directory_resource_id,
156      const google_apis::FileListCallback& callback) = 0;
157
158  // Searches the resources for the |search_query| from all the user's
159  // resources. |callback| will be called upon completion.
160  // If the list is too long, it may be paged. In such a case, a URL to fetch
161  // remaining results will be included in the returned result. See also
162  // GetRemainingFileList.
163  //
164  // |search_query| must not be empty.
165  // |callback| must not be null.
166  virtual google_apis::CancelCallback Search(
167      const std::string& search_query,
168      const google_apis::FileListCallback& callback) = 0;
169
170  // Searches the resources with the |title|.
171  // |directory_resource_id| is an optional parameter. If it is empty,
172  // the search target is all the existing resources. Otherwise, it is
173  // the resources directly under the directory with |directory_resource_id|.
174  // If the list is too long, it may be paged. In such a case, a URL to fetch
175  // remaining results will be included in the returned result. See also
176  // GetRemainingFileList.
177  //
178  // |title| must not be empty, and |callback| must not be null.
179  virtual google_apis::CancelCallback SearchByTitle(
180      const std::string& title,
181      const std::string& directory_resource_id,
182      const google_apis::FileListCallback& callback) = 0;
183
184  // Fetches change list since |start_changestamp|. |callback| will be
185  // called upon completion.
186  // If the list is too long, it may be paged. In such a case, a URL to fetch
187  // remaining results will be included in the returned result. See also
188  // GetRemainingChangeList.
189  //
190  // |callback| must not be null.
191  virtual google_apis::CancelCallback GetChangeList(
192      int64 start_changestamp,
193      const google_apis::ChangeListCallback& callback) = 0;
194
195  // The result of GetChangeList() may be paged.
196  // In such a case, a next link to fetch remaining result is returned.
197  // The page token can be used for this method. |callback| will be called upon
198  // completion.
199  //
200  // |next_link| must not be empty. |callback| must not be null.
201  virtual google_apis::CancelCallback GetRemainingChangeList(
202      const GURL& next_link,
203      const google_apis::ChangeListCallback& callback) = 0;
204
205  // The result of GetAllFileList(), GetFileListInDirectory(), Search()
206  // and SearchByTitle() may be paged. In such a case, a next link to fetch
207  // remaining result is returned. The page token can be used for this method.
208  // |callback| will be called upon completion.
209  //
210  // |next_link| must not be empty. |callback| must not be null.
211  virtual google_apis::CancelCallback GetRemainingFileList(
212      const GURL& next_link,
213      const google_apis::FileListCallback& callback) = 0;
214
215  // Fetches single entry metadata from server. The entry's file id equals
216  // |resource_id|.
217  // Upon completion, invokes |callback| with results on the calling thread.
218  // |callback| must not be null.
219  virtual google_apis::CancelCallback GetFileResource(
220      const std::string& resource_id,
221      const google_apis::FileResourceCallback& callback) = 0;
222
223  // Fetches an url for the sharing dialog for a single entry with id
224  // |resource_id|, to be embedded in a webview or an iframe with origin
225  // |embed_origin|. The url is returned via |callback| with results on the
226  // calling thread. |callback| must not be null.
227  virtual google_apis::CancelCallback GetShareUrl(
228      const std::string& resource_id,
229      const GURL& embed_origin,
230      const google_apis::GetShareUrlCallback& callback) = 0;
231
232  // Gets the about resource information from the server.
233  // Upon completion, invokes |callback| with results on the calling thread.
234  // |callback| must not be null.
235  virtual google_apis::CancelCallback GetAboutResource(
236      const google_apis::AboutResourceCallback& callback) = 0;
237
238  // Gets the application information from the server.
239  // Upon completion, invokes |callback| with results on the calling thread.
240  // |callback| must not be null.
241  virtual google_apis::CancelCallback GetAppList(
242      const google_apis::AppListCallback& callback) = 0;
243
244  // Permanently deletes a resource identified by its |resource_id|.
245  // If |etag| is not empty and did not match, the deletion fails with
246  // HTTP_PRECONDITION error.
247  // Upon completion, invokes |callback| with results on the calling thread.
248  // |callback| must not be null.
249  virtual google_apis::CancelCallback DeleteResource(
250      const std::string& resource_id,
251      const std::string& etag,
252      const google_apis::EntryActionCallback& callback) = 0;
253
254  // Trashes a resource identified by its |resource_id|.
255  // Upon completion, invokes |callback| with results on the calling thread.
256  // |callback| must not be null.
257  virtual google_apis::CancelCallback TrashResource(
258      const std::string& resource_id,
259      const google_apis::EntryActionCallback& callback) = 0;
260
261  // Makes a copy of a resource with |resource_id|.
262  // The new resource will be put under a directory with |parent_resource_id|,
263  // and it'll be named |new_title|.
264  // If |last_modified| is not null, the modified date of the resource on the
265  // server will be set to the date.
266  // This request is supported only on DriveAPIService, because GData WAPI
267  // doesn't support the function unfortunately.
268  // Upon completion, invokes |callback| with results on the calling thread.
269  // |callback| must not be null.
270  virtual google_apis::CancelCallback CopyResource(
271      const std::string& resource_id,
272      const std::string& parent_resource_id,
273      const std::string& new_title,
274      const base::Time& last_modified,
275      const google_apis::FileResourceCallback& callback) = 0;
276
277  // Updates a resource with |resource_id| to the directory of
278  // |parent_resource_id| with renaming to |new_title|.
279  // If |last_modified| or |last_accessed| is not null, the modified/accessed
280  // date of the resource on the server will be set to the date.
281  // This request is supported only on DriveAPIService, because GData WAPI
282  // doesn't support the function unfortunately.
283  // Upon completion, invokes |callback| with results on the calling thread.
284  // |callback| must not be null.
285  virtual google_apis::CancelCallback UpdateResource(
286      const std::string& resource_id,
287      const std::string& parent_resource_id,
288      const std::string& new_title,
289      const base::Time& last_modified,
290      const base::Time& last_viewed_by_me,
291      const google_apis::FileResourceCallback& callback) = 0;
292
293  // Adds a resource (document, file, or collection) identified by its
294  // |resource_id| to a collection represented by the |parent_resource_id|.
295  // Upon completion, invokes |callback| with results on the calling thread.
296  // |callback| must not be null.
297  virtual google_apis::CancelCallback AddResourceToDirectory(
298      const std::string& parent_resource_id,
299      const std::string& resource_id,
300      const google_apis::EntryActionCallback& callback) = 0;
301
302  // Removes a resource (document, file, collection) identified by its
303  // |resource_id| from a collection represented by the |parent_resource_id|.
304  // Upon completion, invokes |callback| with results on the calling thread.
305  // |callback| must not be null.
306  virtual google_apis::CancelCallback RemoveResourceFromDirectory(
307      const std::string& parent_resource_id,
308      const std::string& resource_id,
309      const google_apis::EntryActionCallback& callback) = 0;
310
311  // Adds new collection with |directory_title| under parent directory
312  // identified with |parent_resource_id|. |parent_resource_id| can be the
313  // value returned by GetRootResourceId to represent the root directory.
314  // Upon completion, invokes |callback| and passes newly created entry on
315  // the calling thread.
316  // This function cannot be named as "CreateDirectory" as it conflicts with
317  // a macro on Windows.
318  // |callback| must not be null.
319  virtual google_apis::CancelCallback AddNewDirectory(
320      const std::string& parent_resource_id,
321      const std::string& directory_title,
322      const AddNewDirectoryOptions& options,
323      const google_apis::FileResourceCallback& callback) = 0;
324
325  // Downloads a file with |resourced_id|. The downloaded file will
326  // be stored at |local_cache_path| location. Upon completion, invokes
327  // |download_action_callback| with results on the calling thread.
328  // If |get_content_callback| is not empty,
329  // URLFetcherDelegate::OnURLFetchDownloadData will be called, which will in
330  // turn invoke |get_content_callback| on the calling thread.
331  // If |progress_callback| is not empty, it is invoked periodically when
332  // the download made some progress.
333  //
334  // |download_action_callback| must not be null.
335  // |get_content_callback| and |progress_callback| may be null.
336  virtual google_apis::CancelCallback DownloadFile(
337      const base::FilePath& local_cache_path,
338      const std::string& resource_id,
339      const google_apis::DownloadActionCallback& download_action_callback,
340      const google_apis::GetContentCallback& get_content_callback,
341      const google_apis::ProgressCallback& progress_callback) = 0;
342
343  // Initiates uploading of a new document/file.
344  // |content_type| and |content_length| should be the ones of the file to be
345  // uploaded.
346  // |callback| must not be null.
347  virtual google_apis::CancelCallback InitiateUploadNewFile(
348      const std::string& content_type,
349      int64 content_length,
350      const std::string& parent_resource_id,
351      const std::string& title,
352      const InitiateUploadNewFileOptions& options,
353      const google_apis::InitiateUploadCallback& callback) = 0;
354
355  // Initiates uploading of an existing document/file.
356  // |content_type| and |content_length| should be the ones of the file to be
357  // uploaded.
358  // |callback| must not be null.
359  virtual google_apis::CancelCallback InitiateUploadExistingFile(
360      const std::string& content_type,
361      int64 content_length,
362      const std::string& resource_id,
363      const InitiateUploadExistingFileOptions& options,
364      const google_apis::InitiateUploadCallback& callback) = 0;
365
366  // Resumes uploading of a document/file on the calling thread.
367  // |callback| must not be null. |progress_callback| may be null.
368  virtual google_apis::CancelCallback ResumeUpload(
369      const GURL& upload_url,
370      int64 start_position,
371      int64 end_position,
372      int64 content_length,
373      const std::string& content_type,
374      const base::FilePath& local_file_path,
375      const google_apis::drive::UploadRangeCallback& callback,
376      const google_apis::ProgressCallback& progress_callback) = 0;
377
378  // Gets the current status of the uploading to |upload_url| from the server.
379  // |drive_file_path| and |content_length| should be set to the same value
380  // which is used for ResumeUpload.
381  // |callback| must not be null.
382  virtual google_apis::CancelCallback GetUploadStatus(
383      const GURL& upload_url,
384      int64 content_length,
385      const google_apis::drive::UploadRangeCallback& callback) = 0;
386
387  // Authorizes a Drive app with the id |app_id| to open the given file.
388  // Upon completion, invokes |callback| with the link to open the file with
389  // the provided app. |callback| must not be null.
390  virtual google_apis::CancelCallback AuthorizeApp(
391      const std::string& resource_id,
392      const std::string& app_id,
393      const google_apis::AuthorizeAppCallback& callback) = 0;
394
395  // Uninstalls a Drive app with the id |app_id|. |callback| must not be null.
396  virtual google_apis::CancelCallback UninstallApp(
397      const std::string& app_id,
398      const google_apis::EntryActionCallback& callback) = 0;
399
400  // Authorizes the account |email| to access |resource_id| as a |role|.
401  //
402  // |callback| must not be null.
403  virtual google_apis::CancelCallback AddPermission(
404      const std::string& resource_id,
405      const std::string& email,
406      google_apis::drive::PermissionRole role,
407      const google_apis::EntryActionCallback& callback) = 0;
408};
409
410}  // namespace drive
411
412#endif  // CHROME_BROWSER_DRIVE_DRIVE_SERVICE_INTERFACE_H_
413