1 // Copyright 2013 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_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_API_UTIL_H_ 6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_API_UTIL_H_ 7 8 #include <map> 9 #include <string> 10 11 #include "base/memory/weak_ptr.h" 12 #include "base/threading/non_thread_safe.h" 13 #include "chrome/browser/drive/drive_service_interface.h" 14 #include "chrome/browser/sync_file_system/drive_backend_v1/api_util_interface.h" 15 #include "net/base/network_change_notifier.h" 16 #include "webkit/common/blob/scoped_file.h" 17 18 class GURL; 19 class Profile; 20 class ProfileOAuth2TokenService; 21 class SigninManagerBase; 22 23 namespace drive { class DriveUploaderInterface; } 24 25 namespace sync_file_system { 26 namespace drive_backend { 27 28 // This class is responsible for talking to the Drive service to get and put 29 // Drive directories, files and metadata. 30 // This class is owned by DriveFileSyncService. 31 class APIUtil : public APIUtilInterface, 32 public drive::DriveServiceObserver, 33 public net::NetworkChangeNotifier::ConnectionTypeObserver, 34 public base::NonThreadSafe, 35 public base::SupportsWeakPtr<APIUtil> { 36 public: 37 // The resulting status of EnsureTitleUniqueness. 38 enum EnsureUniquenessStatus { 39 NO_DUPLICATES_FOUND, 40 RESOLVED_DUPLICATES, 41 }; 42 43 typedef base::Callback<void(google_apis::GDataErrorCode, 44 EnsureUniquenessStatus status, 45 scoped_ptr<google_apis::ResourceEntry> entry)> 46 EnsureUniquenessCallback; 47 48 APIUtil(Profile* profile, const base::FilePath& temp_dir_path); 49 virtual ~APIUtil(); 50 51 virtual void AddObserver(APIUtilObserver* observer) OVERRIDE; 52 virtual void RemoveObserver(APIUtilObserver* observer) OVERRIDE; 53 54 static scoped_ptr<APIUtil> CreateForTesting( 55 const base::FilePath& temp_dir_path, 56 scoped_ptr<drive::DriveServiceInterface> drive_service, 57 scoped_ptr<drive::DriveUploaderInterface> drive_uploader); 58 59 // APIUtilInterface overrides. 60 virtual void GetDriveDirectoryForSyncRoot(const ResourceIdCallback& callback) 61 OVERRIDE; 62 virtual void GetDriveDirectoryForOrigin( 63 const std::string& sync_root_resource_id, 64 const GURL& origin, 65 const ResourceIdCallback& callback) OVERRIDE; 66 virtual void GetLargestChangeStamp(const ChangeStampCallback& callback) 67 OVERRIDE; 68 virtual void GetResourceEntry(const std::string& resource_id, 69 const ResourceEntryCallback& callback) OVERRIDE; 70 virtual void ListFiles(const std::string& directory_resource_id, 71 const ResourceListCallback& callback) OVERRIDE; 72 virtual void ListChanges(int64 start_changestamp, 73 const ResourceListCallback& callback) OVERRIDE; 74 virtual void ContinueListing(const GURL& next_link, 75 const ResourceListCallback& callback) OVERRIDE; 76 virtual void DownloadFile(const std::string& resource_id, 77 const std::string& local_file_md5, 78 const DownloadFileCallback& callback) OVERRIDE; 79 virtual void UploadNewFile(const std::string& directory_resource_id, 80 const base::FilePath& local_file_path, 81 const std::string& title, 82 const UploadFileCallback& callback) OVERRIDE; 83 virtual void UploadExistingFile(const std::string& resource_id, 84 const std::string& remote_file_md5, 85 const base::FilePath& local_file_path, 86 const UploadFileCallback& callback) OVERRIDE; 87 virtual void CreateDirectory(const std::string& parent_resource_id, 88 const std::string& title, 89 const ResourceIdCallback& callback) OVERRIDE; 90 virtual bool IsAuthenticated() const OVERRIDE; 91 virtual void DeleteFile(const std::string& resource_id, 92 const std::string& remote_file_md5, 93 const GDataErrorCallback& callback) OVERRIDE; 94 virtual void EnsureSyncRootIsNotInMyDrive( 95 const std::string& sync_root_resource_id) OVERRIDE; 96 97 static std::string GetSyncRootDirectoryName(); 98 static std::string OriginToDirectoryTitle(const GURL& origin); 99 static GURL DirectoryTitleToOrigin(const std::string& title); 100 101 // DriveServiceObserver overrides. 102 virtual void OnReadyToSendRequests() OVERRIDE; 103 104 // ConnectionTypeObserver overrides. 105 virtual void OnConnectionTypeChanged( 106 net::NetworkChangeNotifier::ConnectionType type) OVERRIDE; 107 108 private: 109 typedef int64 UploadKey; 110 typedef std::map<UploadKey, UploadFileCallback> UploadCallbackMap; 111 112 friend class APIUtilTest; 113 114 // Constructor for test use. 115 APIUtil(const base::FilePath& temp_dir_path, 116 scoped_ptr<drive::DriveServiceInterface> drive_service, 117 scoped_ptr<drive::DriveUploaderInterface> drive_uploader, 118 const std::string& account_id); 119 120 void GetDriveRootResourceId(const GDataErrorCallback& callback); 121 void DidGetDriveRootResourceId( 122 const GDataErrorCallback& callback, 123 google_apis::GDataErrorCode error, 124 scoped_ptr<google_apis::AboutResource> about_resource); 125 126 void DidGetDriveRootResourceIdForGetSyncRoot( 127 const ResourceIdCallback& callback, 128 google_apis::GDataErrorCode error); 129 130 void DidGetDirectory(const std::string& parent_resource_id, 131 const std::string& directory_name, 132 const ResourceIdCallback& callback, 133 google_apis::GDataErrorCode error, 134 scoped_ptr<google_apis::ResourceList> feed); 135 136 void DidCreateDirectory(const std::string& parent_resource_id, 137 const std::string& title, 138 const ResourceIdCallback& callback, 139 google_apis::GDataErrorCode error, 140 scoped_ptr<google_apis::FileResource> entry); 141 142 void DidEnsureUniquenessForCreateDirectory( 143 const ResourceIdCallback& callback, 144 google_apis::GDataErrorCode error, 145 EnsureUniquenessStatus status, 146 scoped_ptr<google_apis::ResourceEntry> entry); 147 148 void SearchByTitle(const std::string& title, 149 const std::string& directory_resource_id, 150 const ResourceListCallback& callback); 151 152 void DidGetLargestChangeStamp( 153 const ChangeStampCallback& callback, 154 google_apis::GDataErrorCode error, 155 scoped_ptr<google_apis::AboutResource> about_resource); 156 157 void DidGetDriveRootResourceIdForEnsureSyncRoot( 158 const std::string& sync_root_resource_id, 159 google_apis::GDataErrorCode error); 160 161 void DidGetFileList(const ResourceListCallback& callback, 162 google_apis::GDataErrorCode error, 163 scoped_ptr<google_apis::FileList> file_list); 164 165 void DidGetChangeList(const ResourceListCallback& callback, 166 google_apis::GDataErrorCode error, 167 scoped_ptr<google_apis::ChangeList> change_list); 168 169 void DidGetFileResource(const ResourceEntryCallback& callback, 170 google_apis::GDataErrorCode error, 171 scoped_ptr<google_apis::FileResource> entry); 172 173 void DidGetTemporaryFileForDownload( 174 const std::string& resource_id, 175 const std::string& local_file_md5, 176 scoped_ptr<webkit_blob::ScopedFile> local_file, 177 const DownloadFileCallback& callback, 178 bool success); 179 180 void DownloadFileInternal(const std::string& local_file_md5, 181 scoped_ptr<webkit_blob::ScopedFile> local_file, 182 const DownloadFileCallback& callback, 183 google_apis::GDataErrorCode error, 184 scoped_ptr<google_apis::ResourceEntry> entry); 185 186 void DidDownloadFile(scoped_ptr<google_apis::ResourceEntry> entry, 187 scoped_ptr<webkit_blob::ScopedFile> local_file, 188 const DownloadFileCallback& callback, 189 google_apis::GDataErrorCode error, 190 const base::FilePath& downloaded_file_path); 191 192 void DidUploadNewFile(const std::string& parent_resource_id, 193 const std::string& title, 194 UploadKey upload_key, 195 google_apis::GDataErrorCode error, 196 scoped_ptr<google_apis::ResourceEntry> entry); 197 198 void DidEnsureUniquenessForCreateFile( 199 const std::string& expected_resource_id, 200 const UploadFileCallback& callback, 201 google_apis::GDataErrorCode error, 202 EnsureUniquenessStatus status, 203 scoped_ptr<google_apis::ResourceEntry> entry); 204 205 void UploadExistingFileInternal(const std::string& remote_file_md5, 206 const base::FilePath& local_file_path, 207 const UploadFileCallback& callback, 208 google_apis::GDataErrorCode error, 209 scoped_ptr<google_apis::ResourceEntry> entry); 210 211 void DidUploadExistingFile(UploadKey upload_key, 212 google_apis::GDataErrorCode error, 213 scoped_ptr<google_apis::ResourceEntry> entry); 214 215 void DeleteFileInternal(const std::string& remote_file_md5, 216 const GDataErrorCallback& callback, 217 google_apis::GDataErrorCode error, 218 scoped_ptr<google_apis::ResourceEntry> entry); 219 220 void DidDeleteFile(const GDataErrorCallback& callback, 221 google_apis::GDataErrorCode error); 222 223 void EnsureTitleUniqueness(const std::string& parent_resource_id, 224 const std::string& expected_title, 225 const EnsureUniquenessCallback& callback); 226 void DidListEntriesToEnsureUniqueness( 227 const std::string& parent_resource_id, 228 const std::string& expected_title, 229 const EnsureUniquenessCallback& callback, 230 google_apis::GDataErrorCode error, 231 scoped_ptr<google_apis::ResourceList> feed); 232 void DeleteEntriesForEnsuringTitleUniqueness( 233 ScopedVector<google_apis::ResourceEntry> entries, 234 const GDataErrorCallback& callback); 235 void DidDeleteEntriesForEnsuringTitleUniqueness( 236 ScopedVector<google_apis::ResourceEntry> entries, 237 const GDataErrorCallback& callback, 238 google_apis::GDataErrorCode error); 239 240 UploadKey RegisterUploadCallback(const UploadFileCallback& callback); 241 UploadFileCallback GetAndUnregisterUploadCallback(UploadKey key); 242 void CancelAllUploads(google_apis::GDataErrorCode error); 243 244 std::string GetRootResourceId() const; 245 246 scoped_ptr<drive::DriveServiceInterface> drive_service_; 247 scoped_ptr<drive::DriveUploaderInterface> drive_uploader_; 248 249 ProfileOAuth2TokenService* oauth_service_; 250 SigninManagerBase* signin_manager_; 251 252 UploadCallbackMap upload_callback_map_; 253 UploadKey upload_next_key_; 254 255 base::FilePath temp_dir_path_; 256 257 std::string root_resource_id_; 258 259 bool has_initialized_token_; 260 261 ObserverList<APIUtilObserver> observers_; 262 263 DISALLOW_COPY_AND_ASSIGN(APIUtil); 264 }; 265 266 } // namespace drive_backend 267 } // namespace sync_file_system 268 269 #endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_API_UTIL_H_ 270