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