// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_API_UTIL_INTERFACE_H_ #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_API_UTIL_INTERFACE_H_ #include <string> #include "base/callback_forward.h" #include "google_apis/drive/gdata_errorcode.h" #include "google_apis/drive/gdata_wapi_parser.h" class GURL; class Profile; namespace base { class Time; } namespace google_apis { class DriveUploaderInterface; } namespace webkit_blob { class ScopedFile; } namespace sync_file_system { namespace drive_backend { class APIUtilObserver { public: APIUtilObserver() {} virtual ~APIUtilObserver() {} virtual void OnAuthenticated() = 0; virtual void OnNetworkConnected() = 0; private: DISALLOW_COPY_AND_ASSIGN(APIUtilObserver); }; // The implementation of this class is responsible for talking to the Drive // service to get and put Drive directories, files and metadata. // This class is owned by DriveFileSyncService. class APIUtilInterface { public: typedef base::Callback<void(google_apis::GDataErrorCode error)> GDataErrorCallback; typedef base::Callback<void(google_apis::GDataErrorCode error, const std::string& file_md5, int64 file_size, const base::Time& last_updated, webkit_blob::ScopedFile downloaded)> DownloadFileCallback; typedef base::Callback<void(google_apis::GDataErrorCode error, const std::string& resource_id, const std::string& file_md5)> UploadFileCallback; typedef base::Callback< void(google_apis::GDataErrorCode error, const std::string& resource_id)> ResourceIdCallback; typedef base::Callback<void(google_apis::GDataErrorCode error, int64 changestamp)> ChangeStampCallback; typedef base::Callback<void(google_apis::GDataErrorCode error, scoped_ptr<google_apis::ResourceList> feed)> ResourceListCallback; typedef base::Callback<void(google_apis::GDataErrorCode error, scoped_ptr<google_apis::ResourceEntry> entry)> ResourceEntryCallback; APIUtilInterface() {} virtual ~APIUtilInterface() {} virtual void AddObserver(APIUtilObserver* observer) = 0; virtual void RemoveObserver(APIUtilObserver* observer) = 0; // Fetches Resource ID of the directory where we should place all files to // sync. Upon completion, invokes |callback|. // If the directory does not exist on the server this also creates // the directory. // // Returns HTTP_SUCCESS if the directory already exists. // Returns HTTP_CREATED if the directory was not found and created. virtual void GetDriveDirectoryForSyncRoot( const ResourceIdCallback& callback) = 0; // Fetches Resource ID of the directory for the |origin|. // Upon completion, invokes |callback|. // If the directory does not exist on the server this also creates // the directory. // // Returns HTTP_SUCCESS if the directory already exists. // Returns HTTP_CREATED if the directory was not found and created. virtual void GetDriveDirectoryForOrigin( const std::string& sync_root_resource_id, const GURL& origin, const ResourceIdCallback& callback) = 0; // Fetches the largest changestamp for the signed-in account. // Upon completion, invokes |callback|. virtual void GetLargestChangeStamp(const ChangeStampCallback& callback) = 0; // Fetches the resource entry for the file identified by |resource_id|. // Upon completion, invokes |callback|. virtual void GetResourceEntry(const std::string& resource_id, const ResourceEntryCallback& callback) = 0; // Lists files in the directory identified by |resource_id|. // Upon completion, invokes |callback|. // The result may be chunked and may have successive results. The caller needs // to call ContunueListing with the result of GetNextFeedURL to get complete // list of files. virtual void ListFiles(const std::string& directory_resource_id, const ResourceListCallback& callback) = 0; // Lists changes that happened after |start_changestamp|. // Upon completion, invokes |callback|. // The result may be chunked and may have successive results. The caller needs // to call ContunueListing with the result of GetNextFeedURL to get complete // list of changes. virtual void ListChanges(int64 start_changestamp, const ResourceListCallback& callback) = 0; // Fetches the next chunk of ResourceList identified by |next_link|. // Upon completion, invokes |callback|. virtual void ContinueListing(const GURL& next_link, const ResourceListCallback& callback) = 0; // Downloads the file identified by |resource_id| from Drive to // |local_file_path|. // |local_file_md5| represents the hash value of the local file to be updated. // If |local_file_md5| is equal to remote file's value, cancels the download // and invokes |callback| with GDataErrorCode::HTTP_NOT_MODIFIED immediately. // When there is no local file to be updated, |local_file_md5| should be // empty. virtual void DownloadFile(const std::string& resource_id, const std::string& local_file_md5, const DownloadFileCallback& callback) = 0; // Uploads the new file |local_file_path| with specified |title| into the // directory identified by |directory_resource_id|. // Upon completion, invokes |callback| and returns HTTP_CREATED if the file // is created. virtual void UploadNewFile(const std::string& directory_resource_id, const base::FilePath& local_file_path, const std::string& title, const UploadFileCallback& callback) = 0; // Uploads the existing file identified by |local_file_path|. // |remote_file_md5| represents the expected hash value of the file to be // updated on Drive. If |remote_file_md5| is different from the actual value, // cancels the upload and invokes |callback| with // GDataErrorCode::HTTP_CONFLICT immediately. // Returns HTTP_SUCCESS if the file uploaded successfully. virtual void UploadExistingFile(const std::string& resource_id, const std::string& remote_file_md5, const base::FilePath& local_file_path, const UploadFileCallback& callback) = 0; // Creates a new directory with specified |title| into the directory // identified by |parent_resource_id|. // Upon completion, invokes |callback| and returns HTTP_CREATED if // the directory is created. virtual void CreateDirectory(const std::string& parent_resource_id, const std::string& title, const ResourceIdCallback& callback) = 0; // Returns true if the user is authenticated. virtual bool IsAuthenticated() const = 0; // Deletes the file identified by |resource_id|. // A directory is considered a file and will cause a recursive delete if // given as the |resource_id|. // TODO(tzik): Rename this function to DeleteResource. // // |remote_file_md5| represents the expected hash value of the file to be // deleted from Drive. If |remote_file_md5| is empty, then it's implied that // the file should be deleted on the remote side regardless. If // |remote_file_md5| is not empty and is different from the actual value, // the deletion operation is canceled and the |callback| with // GDataErrorCode::HTTP_CONFLICT is invoked immediately. virtual void DeleteFile(const std::string& resource_id, const std::string& remote_file_md5, const GDataErrorCallback& callback) = 0; // Ensures the sync root directory is not in 'My Drive'. Even if the directory // is in directories other than 'My Drive', it will not be removed from there. virtual void EnsureSyncRootIsNotInMyDrive( const std::string& sync_root_resource_id) = 0; private: DISALLOW_COPY_AND_ASSIGN(APIUtilInterface); }; } // namespace drive_backend } // namespace sync_file_system #endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_API_UTIL_INTERFACE_H_