| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.
h" | 5 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.
h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "chrome/browser/drive/drive_api_service.h" | 10 #include "chrome/browser/drive/drive_api_service.h" |
| 11 #include "chrome/browser/drive/drive_api_util.h" | 11 #include "chrome/browser/drive/drive_api_util.h" |
| 12 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.
h" | 12 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.
h" |
| 13 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h" | 13 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h" |
| 14 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" | 14 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" |
| 15 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h" | 15 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h" |
| 16 #include "chrome/browser/sync_file_system/drive_backend/sync_task_manager.h" |
| 17 #include "chrome/browser/sync_file_system/drive_backend/sync_task_token.h" |
| 16 #include "chrome/browser/sync_file_system/logger.h" | 18 #include "chrome/browser/sync_file_system/logger.h" |
| 17 #include "google_apis/drive/drive_api_parser.h" | 19 #include "google_apis/drive/drive_api_parser.h" |
| 18 #include "google_apis/drive/gdata_wapi_parser.h" | 20 #include "google_apis/drive/gdata_wapi_parser.h" |
| 19 | 21 |
| 20 namespace sync_file_system { | 22 namespace sync_file_system { |
| 21 namespace drive_backend { | 23 namespace drive_backend { |
| 22 | 24 |
| 23 namespace { | 25 namespace { |
| 24 | 26 |
| 25 //////////////////////////////////////////////////////////////////////////////// | 27 //////////////////////////////////////////////////////////////////////////////// |
| 26 // Functions below are for wrapping the access to legacy GData WAPI classes. | 28 // Functions below are for wrapping the access to legacy GData WAPI classes. |
| 27 | 29 |
| 28 bool IsDeleted(const google_apis::ResourceEntry& entry) { | |
| 29 return entry.deleted(); | |
| 30 } | |
| 31 | |
| 32 bool HasNoParents(const google_apis::ResourceEntry& entry) { | 30 bool HasNoParents(const google_apis::ResourceEntry& entry) { |
| 33 return !entry.GetLinkByType(google_apis::Link::LINK_PARENT); | 31 return !entry.GetLinkByType(google_apis::Link::LINK_PARENT); |
| 34 } | 32 } |
| 35 | 33 |
| 36 bool HasFolderAsParent(const google_apis::ResourceEntry& entry, | 34 bool HasFolderAsParent(const google_apis::ResourceEntry& entry, |
| 37 const std::string& parent_id) { | 35 const std::string& parent_id) { |
| 38 const ScopedVector<google_apis::Link>& links = entry.links(); | 36 const ScopedVector<google_apis::Link>& links = entry.links(); |
| 39 for (ScopedVector<google_apis::Link>::const_iterator itr = links.begin(); | 37 for (ScopedVector<google_apis::Link>::const_iterator itr = links.begin(); |
| 40 itr != links.end(); ++itr) { | 38 itr != links.end(); ++itr) { |
| 41 const google_apis::Link& link = **itr; | 39 const google_apis::Link& link = **itr; |
| 42 if (link.type() != google_apis::Link::LINK_PARENT) | 40 if (link.type() != google_apis::Link::LINK_PARENT) |
| 43 continue; | 41 continue; |
| 44 if (drive::util::ExtractResourceIdFromUrl(link.href()) == parent_id) | 42 if (drive::util::ExtractResourceIdFromUrl(link.href()) == parent_id) |
| 45 return true; | 43 return true; |
| 46 } | 44 } |
| 47 return false; | 45 return false; |
| 48 } | 46 } |
| 49 | 47 |
| 50 bool LessOnCreationTime(const google_apis::ResourceEntry& left, | 48 bool LessOnCreationTime(const google_apis::ResourceEntry& left, |
| 51 const google_apis::ResourceEntry& right) { | 49 const google_apis::ResourceEntry& right) { |
| 52 return left.published_time() < right.published_time(); | 50 return left.published_time() < right.published_time(); |
| 53 } | 51 } |
| 54 | 52 |
| 55 // Posts a request to continue listing. Returns false if the list doesn't need | 53 typedef base::Callback<void(scoped_ptr<SyncTaskToken> token, |
| 56 // listing anymore. | 54 google_apis::GDataErrorCode error, |
| 57 bool GetRemainingFileList( | 55 scoped_ptr<google_apis::ResourceList> resources)> |
| 58 google_apis::CancelCallback* cancel_callback, | 56 TokenAndResourceListCallback; |
| 59 drive::DriveServiceInterface* api_service, | |
| 60 const google_apis::ResourceList& resource_list, | |
| 61 const google_apis::GetResourceListCallback& callback) { | |
| 62 GURL next_url; | |
| 63 if (!resource_list.GetNextFeedURL(&next_url)) | |
| 64 return false; | |
| 65 | |
| 66 *cancel_callback = api_service->GetRemainingFileList(next_url, callback); | |
| 67 return true; | |
| 68 } | |
| 69 | |
| 70 std::string GetID(const google_apis::ResourceEntry& entry) { | |
| 71 return entry.resource_id(); | |
| 72 } | |
| 73 | 57 |
| 74 ScopedVector<google_apis::FileResource> ConvertResourceEntriesToFileResources( | 58 ScopedVector<google_apis::FileResource> ConvertResourceEntriesToFileResources( |
| 75 const ScopedVector<google_apis::ResourceEntry>& entries) { | 59 const ScopedVector<google_apis::ResourceEntry>& entries) { |
| 76 ScopedVector<google_apis::FileResource> resources; | 60 ScopedVector<google_apis::FileResource> resources; |
| 77 for (ScopedVector<google_apis::ResourceEntry>::const_iterator itr = | 61 for (ScopedVector<google_apis::ResourceEntry>::const_iterator itr = |
| 78 entries.begin(); | 62 entries.begin(); |
| 79 itr != entries.end(); | 63 itr != entries.end(); |
| 80 ++itr) { | 64 ++itr) { |
| 81 resources.push_back( | 65 resources.push_back( |
| 82 drive::util::ConvertResourceEntryToFileResource( | 66 drive::util::ConvertResourceEntryToFileResource( |
| (...skipping 23 matching lines...) Expand all Loading... |
| 106 weak_ptr_factory_(this) { | 90 weak_ptr_factory_(this) { |
| 107 DCHECK(task_runner); | 91 DCHECK(task_runner); |
| 108 DCHECK(drive_service_); | 92 DCHECK(drive_service_); |
| 109 } | 93 } |
| 110 | 94 |
| 111 SyncEngineInitializer::~SyncEngineInitializer() { | 95 SyncEngineInitializer::~SyncEngineInitializer() { |
| 112 if (!cancel_callback_.is_null()) | 96 if (!cancel_callback_.is_null()) |
| 113 cancel_callback_.Run(); | 97 cancel_callback_.Run(); |
| 114 } | 98 } |
| 115 | 99 |
| 116 void SyncEngineInitializer::RunSequential(const SyncStatusCallback& callback) { | 100 void SyncEngineInitializer::Run(scoped_ptr<SyncTaskToken> token) { |
| 117 util::Log(logging::LOG_VERBOSE, FROM_HERE, "[Initialize] Start."); | 101 util::Log(logging::LOG_VERBOSE, FROM_HERE, "[Initialize] Start."); |
| 118 | 102 |
| 119 // The metadata seems to have been already initialized. Just return with OK. | 103 // The metadata seems to have been already initialized. Just return with OK. |
| 120 if (sync_context_ && sync_context_->GetMetadataDatabase()) { | 104 if (sync_context_ && sync_context_->GetMetadataDatabase()) { |
| 121 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 105 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 122 "[Initialize] Already initialized."); | 106 "[Initialize] Already initialized."); |
| 123 callback.Run(SYNC_STATUS_OK); | 107 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK); |
| 124 return; | 108 return; |
| 125 } | 109 } |
| 126 | 110 |
| 127 MetadataDatabase::Create( | 111 MetadataDatabase::Create( |
| 128 task_runner_.get(), database_path_, env_override_, | 112 task_runner_.get(), database_path_, env_override_, |
| 129 base::Bind(&SyncEngineInitializer::DidCreateMetadataDatabase, | 113 base::Bind(&SyncEngineInitializer::DidCreateMetadataDatabase, |
| 130 weak_ptr_factory_.GetWeakPtr(), callback)); | 114 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
| 131 } | 115 } |
| 132 | 116 |
| 133 scoped_ptr<MetadataDatabase> SyncEngineInitializer::PassMetadataDatabase() { | 117 scoped_ptr<MetadataDatabase> SyncEngineInitializer::PassMetadataDatabase() { |
| 134 return metadata_database_.Pass(); | 118 return metadata_database_.Pass(); |
| 135 } | 119 } |
| 136 | 120 |
| 137 void SyncEngineInitializer::DidCreateMetadataDatabase( | 121 void SyncEngineInitializer::DidCreateMetadataDatabase( |
| 138 const SyncStatusCallback& callback, | 122 scoped_ptr<SyncTaskToken> token, |
| 139 SyncStatusCode status, | 123 SyncStatusCode status, |
| 140 scoped_ptr<MetadataDatabase> instance) { | 124 scoped_ptr<MetadataDatabase> instance) { |
| 141 if (status != SYNC_STATUS_OK) { | 125 if (status != SYNC_STATUS_OK) { |
| 142 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 126 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 143 "[Initialize] Failed to initialize MetadataDatabase."); | 127 "[Initialize] Failed to initialize MetadataDatabase."); |
| 144 callback.Run(status); | 128 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
| 145 return; | 129 return; |
| 146 } | 130 } |
| 147 | 131 |
| 148 DCHECK(instance); | 132 DCHECK(instance); |
| 149 metadata_database_ = instance.Pass(); | 133 metadata_database_ = instance.Pass(); |
| 150 if (metadata_database_->HasSyncRoot()) { | 134 if (metadata_database_->HasSyncRoot()) { |
| 151 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 135 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 152 "[Initialize] Found local cache of sync-root."); | 136 "[Initialize] Found local cache of sync-root."); |
| 153 callback.Run(SYNC_STATUS_OK); | 137 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK); |
| 154 return; | 138 return; |
| 155 } | 139 } |
| 156 | 140 |
| 157 GetAboutResource(callback); | 141 GetAboutResource(token.Pass()); |
| 158 } | 142 } |
| 159 | 143 |
| 160 void SyncEngineInitializer::GetAboutResource( | 144 void SyncEngineInitializer::GetAboutResource( |
| 161 const SyncStatusCallback& callback) { | 145 scoped_ptr<SyncTaskToken> token) { |
| 162 set_used_network(true); | 146 set_used_network(true); |
| 163 drive_service_->GetAboutResource( | 147 drive_service_->GetAboutResource( |
| 164 base::Bind(&SyncEngineInitializer::DidGetAboutResource, | 148 base::Bind(&SyncEngineInitializer::DidGetAboutResource, |
| 165 weak_ptr_factory_.GetWeakPtr(), callback)); | 149 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
| 166 } | 150 } |
| 167 | 151 |
| 168 void SyncEngineInitializer::DidGetAboutResource( | 152 void SyncEngineInitializer::DidGetAboutResource( |
| 169 const SyncStatusCallback& callback, | 153 scoped_ptr<SyncTaskToken> token, |
| 170 google_apis::GDataErrorCode error, | 154 google_apis::GDataErrorCode error, |
| 171 scoped_ptr<google_apis::AboutResource> about_resource) { | 155 scoped_ptr<google_apis::AboutResource> about_resource) { |
| 172 cancel_callback_.Reset(); | 156 cancel_callback_.Reset(); |
| 173 | 157 |
| 174 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 158 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
| 175 if (status != SYNC_STATUS_OK) { | 159 if (status != SYNC_STATUS_OK) { |
| 176 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 160 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 177 "[Initialize] Failed to get AboutResource."); | 161 "[Initialize] Failed to get AboutResource."); |
| 178 callback.Run(status); | 162 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
| 179 return; | 163 return; |
| 180 } | 164 } |
| 181 | 165 |
| 182 DCHECK(about_resource); | 166 DCHECK(about_resource); |
| 183 root_folder_id_ = about_resource->root_folder_id(); | 167 root_folder_id_ = about_resource->root_folder_id(); |
| 184 largest_change_id_ = about_resource->largest_change_id(); | 168 largest_change_id_ = about_resource->largest_change_id(); |
| 185 | 169 |
| 186 DCHECK(!root_folder_id_.empty()); | 170 DCHECK(!root_folder_id_.empty()); |
| 187 FindSyncRoot(callback); | 171 FindSyncRoot(token.Pass()); |
| 188 } | 172 } |
| 189 | 173 |
| 190 void SyncEngineInitializer::FindSyncRoot(const SyncStatusCallback& callback) { | 174 void SyncEngineInitializer::FindSyncRoot(scoped_ptr<SyncTaskToken> token) { |
| 191 if (find_sync_root_retry_count_++ >= kMaxRetry) { | 175 if (find_sync_root_retry_count_++ >= kMaxRetry) { |
| 192 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 176 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 193 "[Initialize] Reached max retry count."); | 177 "[Initialize] Reached max retry count."); |
| 194 callback.Run(SYNC_STATUS_FAILED); | 178 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); |
| 195 return; | 179 return; |
| 196 } | 180 } |
| 197 | 181 |
| 198 set_used_network(true); | 182 set_used_network(true); |
| 199 cancel_callback_ = drive_service_->SearchByTitle( | 183 cancel_callback_ = drive_service_->SearchByTitle( |
| 200 kSyncRootFolderTitle, | 184 kSyncRootFolderTitle, |
| 201 std::string(), // parent_folder_id | 185 std::string(), // parent_folder_id |
| 202 base::Bind(&SyncEngineInitializer::DidFindSyncRoot, | 186 base::Bind(&SyncEngineInitializer::DidFindSyncRoot, |
| 203 weak_ptr_factory_.GetWeakPtr(), | 187 weak_ptr_factory_.GetWeakPtr(), |
| 204 callback)); | 188 base::Passed(&token))); |
| 205 } | 189 } |
| 206 | 190 |
| 207 void SyncEngineInitializer::DidFindSyncRoot( | 191 void SyncEngineInitializer::DidFindSyncRoot( |
| 208 const SyncStatusCallback& callback, | 192 scoped_ptr<SyncTaskToken> token, |
| 209 google_apis::GDataErrorCode error, | 193 google_apis::GDataErrorCode error, |
| 210 scoped_ptr<google_apis::ResourceList> resource_list) { | 194 scoped_ptr<google_apis::ResourceList> resource_list) { |
| 211 cancel_callback_.Reset(); | 195 cancel_callback_.Reset(); |
| 212 | 196 |
| 213 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 197 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
| 214 if (status != SYNC_STATUS_OK) { | 198 if (status != SYNC_STATUS_OK) { |
| 215 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 199 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 216 "[Initialize] Failed to find sync root."); | 200 "[Initialize] Failed to find sync root."); |
| 217 callback.Run(status); | 201 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
| 218 return; | 202 return; |
| 219 } | 203 } |
| 220 | 204 |
| 221 if (!resource_list) { | 205 if (!resource_list) { |
| 222 NOTREACHED(); | 206 NOTREACHED(); |
| 223 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 207 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 224 "[Initialize] Got invalid resource list."); | 208 "[Initialize] Got invalid resource list."); |
| 225 callback.Run(SYNC_STATUS_FAILED); | 209 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); |
| 226 return; | 210 return; |
| 227 } | 211 } |
| 228 | 212 |
| 229 ScopedVector<google_apis::ResourceEntry>* entries = | 213 ScopedVector<google_apis::ResourceEntry>* entries = |
| 230 resource_list->mutable_entries(); | 214 resource_list->mutable_entries(); |
| 231 for (ScopedVector<google_apis::ResourceEntry>::iterator itr = | 215 for (ScopedVector<google_apis::ResourceEntry>::iterator itr = |
| 232 entries->begin(); | 216 entries->begin(); |
| 233 itr != entries->end(); ++itr) { | 217 itr != entries->end(); ++itr) { |
| 234 google_apis::ResourceEntry* entry = *itr; | 218 google_apis::ResourceEntry* entry = *itr; |
| 235 | 219 |
| 236 // Ignore deleted folder. | 220 // Ignore deleted folder. |
| 237 if (IsDeleted(*entry)) | 221 if (entry->deleted()) |
| 238 continue; | 222 continue; |
| 239 | 223 |
| 240 // Pick an orphaned folder or a direct child of the root folder and | 224 // Pick an orphaned folder or a direct child of the root folder and |
| 241 // ignore others. | 225 // ignore others. |
| 242 DCHECK(!root_folder_id_.empty()); | 226 DCHECK(!root_folder_id_.empty()); |
| 243 if (!HasNoParents(*entry) && !HasFolderAsParent(*entry, root_folder_id_)) | 227 if (!HasNoParents(*entry) && !HasFolderAsParent(*entry, root_folder_id_)) |
| 244 continue; | 228 continue; |
| 245 | 229 |
| 246 if (!sync_root_folder_ || LessOnCreationTime(*entry, *sync_root_folder_)) { | 230 if (!sync_root_folder_ || LessOnCreationTime(*entry, *sync_root_folder_)) { |
| 247 sync_root_folder_.reset(entry); | 231 sync_root_folder_.reset(entry); |
| 248 *itr = NULL; | 232 *itr = NULL; |
| 249 } | 233 } |
| 250 } | 234 } |
| 251 | 235 |
| 252 set_used_network(true); | 236 set_used_network(true); |
| 253 // If there are more results, retrieve them. | 237 // If there are more results, retrieve them. |
| 254 if (GetRemainingFileList( | 238 GURL next_url; |
| 255 &cancel_callback_, | 239 if (resource_list->GetNextFeedURL(&next_url)) { |
| 256 drive_service_, *resource_list, | 240 cancel_callback_ = drive_service_->GetRemainingFileList( |
| 257 base::Bind(&SyncEngineInitializer::DidFindSyncRoot, | 241 next_url, |
| 258 weak_ptr_factory_.GetWeakPtr(), | 242 base::Bind(&SyncEngineInitializer::DidFindSyncRoot, |
| 259 callback))) | 243 weak_ptr_factory_.GetWeakPtr(), |
| 244 base::Passed(&token))); |
| 260 return; | 245 return; |
| 246 } |
| 261 | 247 |
| 262 if (!sync_root_folder_) { | 248 if (!sync_root_folder_) { |
| 263 CreateSyncRoot(callback); | 249 CreateSyncRoot(token.Pass()); |
| 264 return; | 250 return; |
| 265 } | 251 } |
| 266 | 252 |
| 267 if (!HasNoParents(*sync_root_folder_)) { | 253 if (!HasNoParents(*sync_root_folder_)) { |
| 268 DetachSyncRoot(callback); | 254 DetachSyncRoot(token.Pass()); |
| 269 return; | 255 return; |
| 270 } | 256 } |
| 271 | 257 |
| 272 ListAppRootFolders(callback); | 258 ListAppRootFolders(token.Pass()); |
| 273 } | 259 } |
| 274 | 260 |
| 275 void SyncEngineInitializer::CreateSyncRoot(const SyncStatusCallback& callback) { | 261 void SyncEngineInitializer::CreateSyncRoot(scoped_ptr<SyncTaskToken> token) { |
| 276 DCHECK(!sync_root_folder_); | 262 DCHECK(!sync_root_folder_); |
| 277 set_used_network(true); | 263 set_used_network(true); |
| 278 cancel_callback_ = drive_service_->AddNewDirectory( | 264 cancel_callback_ = drive_service_->AddNewDirectory( |
| 279 root_folder_id_, kSyncRootFolderTitle, | 265 root_folder_id_, kSyncRootFolderTitle, |
| 280 drive::DriveServiceInterface::AddNewDirectoryOptions(), | 266 drive::DriveServiceInterface::AddNewDirectoryOptions(), |
| 281 base::Bind(&SyncEngineInitializer::DidCreateSyncRoot, | 267 base::Bind(&SyncEngineInitializer::DidCreateSyncRoot, |
| 282 weak_ptr_factory_.GetWeakPtr(), | 268 weak_ptr_factory_.GetWeakPtr(), |
| 283 callback)); | 269 base::Passed(&token))); |
| 284 } | 270 } |
| 285 | 271 |
| 286 void SyncEngineInitializer::DidCreateSyncRoot( | 272 void SyncEngineInitializer::DidCreateSyncRoot( |
| 287 const SyncStatusCallback& callback, | 273 scoped_ptr<SyncTaskToken> token, |
| 288 google_apis::GDataErrorCode error, | 274 google_apis::GDataErrorCode error, |
| 289 scoped_ptr<google_apis::ResourceEntry> entry) { | 275 scoped_ptr<google_apis::ResourceEntry> entry) { |
| 290 DCHECK(!sync_root_folder_); | 276 DCHECK(!sync_root_folder_); |
| 291 cancel_callback_.Reset(); | 277 cancel_callback_.Reset(); |
| 292 | 278 |
| 293 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 279 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
| 294 if (status != SYNC_STATUS_OK) { | 280 if (status != SYNC_STATUS_OK) { |
| 295 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 281 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 296 "[Initialize] Failed to create sync root."); | 282 "[Initialize] Failed to create sync root."); |
| 297 callback.Run(status); | 283 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
| 298 return; | 284 return; |
| 299 } | 285 } |
| 300 | 286 |
| 301 FindSyncRoot(callback); | 287 FindSyncRoot(token.Pass()); |
| 302 } | 288 } |
| 303 | 289 |
| 304 void SyncEngineInitializer::DetachSyncRoot(const SyncStatusCallback& callback) { | 290 void SyncEngineInitializer::DetachSyncRoot(scoped_ptr<SyncTaskToken> token) { |
| 305 DCHECK(sync_root_folder_); | 291 DCHECK(sync_root_folder_); |
| 306 set_used_network(true); | 292 set_used_network(true); |
| 307 cancel_callback_ = drive_service_->RemoveResourceFromDirectory( | 293 cancel_callback_ = drive_service_->RemoveResourceFromDirectory( |
| 308 root_folder_id_, GetID(*sync_root_folder_), | 294 root_folder_id_, sync_root_folder_->resource_id(), |
| 309 base::Bind(&SyncEngineInitializer::DidDetachSyncRoot, | 295 base::Bind(&SyncEngineInitializer::DidDetachSyncRoot, |
| 310 weak_ptr_factory_.GetWeakPtr(), | 296 weak_ptr_factory_.GetWeakPtr(), |
| 311 callback)); | 297 base::Passed(&token))); |
| 312 } | 298 } |
| 313 | 299 |
| 314 void SyncEngineInitializer::DidDetachSyncRoot( | 300 void SyncEngineInitializer::DidDetachSyncRoot( |
| 315 const SyncStatusCallback& callback, | 301 scoped_ptr<SyncTaskToken> token, |
| 316 google_apis::GDataErrorCode error) { | 302 google_apis::GDataErrorCode error) { |
| 317 cancel_callback_.Reset(); | 303 cancel_callback_.Reset(); |
| 318 | 304 |
| 319 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 305 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
| 320 if (status != SYNC_STATUS_OK) { | 306 if (status != SYNC_STATUS_OK) { |
| 321 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 307 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 322 "[Initialize] Failed to detach sync root."); | 308 "[Initialize] Failed to detach sync root."); |
| 323 callback.Run(status); | 309 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
| 324 return; | 310 return; |
| 325 } | 311 } |
| 326 | 312 |
| 327 ListAppRootFolders(callback); | 313 ListAppRootFolders(token.Pass()); |
| 328 } | 314 } |
| 329 | 315 |
| 330 void SyncEngineInitializer::ListAppRootFolders( | 316 void SyncEngineInitializer::ListAppRootFolders( |
| 331 const SyncStatusCallback& callback) { | 317 scoped_ptr<SyncTaskToken> token) { |
| 332 DCHECK(sync_root_folder_); | 318 DCHECK(sync_root_folder_); |
| 333 set_used_network(true); | 319 set_used_network(true); |
| 334 cancel_callback_ = drive_service_->GetResourceListInDirectory( | 320 cancel_callback_ = drive_service_->GetResourceListInDirectory( |
| 335 GetID(*sync_root_folder_), | 321 sync_root_folder_->resource_id(), |
| 336 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, | 322 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, |
| 337 weak_ptr_factory_.GetWeakPtr(), | 323 weak_ptr_factory_.GetWeakPtr(), |
| 338 callback)); | 324 base::Passed(&token))); |
| 339 } | 325 } |
| 340 | 326 |
| 341 void SyncEngineInitializer::DidListAppRootFolders( | 327 void SyncEngineInitializer::DidListAppRootFolders( |
| 342 const SyncStatusCallback& callback, | 328 scoped_ptr<SyncTaskToken> token, |
| 343 google_apis::GDataErrorCode error, | 329 google_apis::GDataErrorCode error, |
| 344 scoped_ptr<google_apis::ResourceList> resource_list) { | 330 scoped_ptr<google_apis::ResourceList> resource_list) { |
| 345 cancel_callback_.Reset(); | 331 cancel_callback_.Reset(); |
| 346 | 332 |
| 347 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 333 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
| 348 if (status != SYNC_STATUS_OK) { | 334 if (status != SYNC_STATUS_OK) { |
| 349 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 335 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 350 "[Initialize] Failed to get initial app-root folders."); | 336 "[Initialize] Failed to get initial app-root folders."); |
| 351 callback.Run(status); | 337 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
| 352 return; | 338 return; |
| 353 } | 339 } |
| 354 | 340 |
| 355 if (!resource_list) { | 341 if (!resource_list) { |
| 356 NOTREACHED(); | 342 NOTREACHED(); |
| 357 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 343 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 358 "[Initialize] Got invalid initial app-root list."); | 344 "[Initialize] Got invalid initial app-root list."); |
| 359 callback.Run(SYNC_STATUS_FAILED); | 345 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); |
| 360 return; | 346 return; |
| 361 } | 347 } |
| 362 | 348 |
| 363 ScopedVector<google_apis::ResourceEntry>* new_entries = | 349 ScopedVector<google_apis::ResourceEntry>* new_entries = |
| 364 resource_list->mutable_entries(); | 350 resource_list->mutable_entries(); |
| 365 app_root_folders_.insert(app_root_folders_.end(), | 351 app_root_folders_.insert(app_root_folders_.end(), |
| 366 new_entries->begin(), new_entries->end()); | 352 new_entries->begin(), new_entries->end()); |
| 367 new_entries->weak_clear(); | 353 new_entries->weak_clear(); |
| 368 | 354 |
| 369 set_used_network(true); | 355 set_used_network(true); |
| 370 if (GetRemainingFileList( | 356 GURL next_url; |
| 371 &cancel_callback_, | 357 if (resource_list->GetNextFeedURL(&next_url)) { |
| 372 drive_service_, | 358 cancel_callback_ = drive_service_->GetRemainingFileList( |
| 373 *resource_list, | 359 next_url, |
| 374 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, | 360 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, |
| 375 weak_ptr_factory_.GetWeakPtr(), callback))) | 361 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
| 376 return; | 362 return; |
| 363 } |
| 377 | 364 |
| 378 PopulateDatabase(callback); | 365 PopulateDatabase(token.Pass()); |
| 379 } | 366 } |
| 380 | 367 |
| 381 void SyncEngineInitializer::PopulateDatabase( | 368 void SyncEngineInitializer::PopulateDatabase( |
| 382 const SyncStatusCallback& callback) { | 369 scoped_ptr<SyncTaskToken> token) { |
| 383 DCHECK(sync_root_folder_); | 370 DCHECK(sync_root_folder_); |
| 384 metadata_database_->PopulateInitialData( | 371 metadata_database_->PopulateInitialData( |
| 385 largest_change_id_, | 372 largest_change_id_, |
| 386 *drive::util::ConvertResourceEntryToFileResource( | 373 *drive::util::ConvertResourceEntryToFileResource( |
| 387 *sync_root_folder_), | 374 *sync_root_folder_), |
| 388 ConvertResourceEntriesToFileResources(app_root_folders_), | 375 ConvertResourceEntriesToFileResources(app_root_folders_), |
| 389 base::Bind(&SyncEngineInitializer::DidPopulateDatabase, | 376 base::Bind(&SyncEngineInitializer::DidPopulateDatabase, |
| 390 weak_ptr_factory_.GetWeakPtr(), | 377 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
| 391 callback)); | |
| 392 } | 378 } |
| 393 | 379 |
| 394 void SyncEngineInitializer::DidPopulateDatabase( | 380 void SyncEngineInitializer::DidPopulateDatabase( |
| 395 const SyncStatusCallback& callback, | 381 scoped_ptr<SyncTaskToken> token, |
| 396 SyncStatusCode status) { | 382 SyncStatusCode status) { |
| 397 if (status != SYNC_STATUS_OK) { | 383 if (status != SYNC_STATUS_OK) { |
| 398 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 384 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 399 "[Initialize] Failed to populate initial data" | 385 "[Initialize] Failed to populate initial data" |
| 400 " to MetadataDatabase."); | 386 " to MetadataDatabase."); |
| 401 callback.Run(status); | 387 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
| 402 return; | 388 return; |
| 403 } | 389 } |
| 404 | 390 |
| 405 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 391 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
| 406 "[Initialize] Completed successfully."); | 392 "[Initialize] Completed successfully."); |
| 407 callback.Run(SYNC_STATUS_OK); | 393 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK); |
| 408 } | 394 } |
| 409 | 395 |
| 410 } // namespace drive_backend | 396 } // namespace drive_backend |
| 411 } // namespace sync_file_system | 397 } // namespace sync_file_system |
| OLD | NEW |