Index: chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.cc |
diff --git a/chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.cc b/chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.cc |
index 5d3d9956eb322495bf3222708e4353b542cd662c..89a05092e2f12057e7b68d18cbf7048601de4407 100644 |
--- a/chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.cc |
+++ b/chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.cc |
@@ -13,6 +13,8 @@ |
#include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h" |
#include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" |
#include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h" |
+#include "chrome/browser/sync_file_system/drive_backend/sync_task_manager.h" |
+#include "chrome/browser/sync_file_system/drive_backend/sync_task_token.h" |
#include "chrome/browser/sync_file_system/logger.h" |
#include "google_apis/drive/drive_api_parser.h" |
#include "google_apis/drive/gdata_wapi_parser.h" |
@@ -25,10 +27,6 @@ namespace { |
//////////////////////////////////////////////////////////////////////////////// |
// Functions below are for wrapping the access to legacy GData WAPI classes. |
-bool IsDeleted(const google_apis::ResourceEntry& entry) { |
- return entry.deleted(); |
-} |
- |
bool HasNoParents(const google_apis::ResourceEntry& entry) { |
return !entry.GetLinkByType(google_apis::Link::LINK_PARENT); |
} |
@@ -52,24 +50,10 @@ bool LessOnCreationTime(const google_apis::ResourceEntry& left, |
return left.published_time() < right.published_time(); |
} |
-// Posts a request to continue listing. Returns false if the list doesn't need |
-// listing anymore. |
-bool GetRemainingFileList( |
- google_apis::CancelCallback* cancel_callback, |
- drive::DriveServiceInterface* api_service, |
- const google_apis::ResourceList& resource_list, |
- const google_apis::GetResourceListCallback& callback) { |
- GURL next_url; |
- if (!resource_list.GetNextFeedURL(&next_url)) |
- return false; |
- |
- *cancel_callback = api_service->GetRemainingFileList(next_url, callback); |
- return true; |
-} |
- |
-std::string GetID(const google_apis::ResourceEntry& entry) { |
- return entry.resource_id(); |
-} |
+typedef base::Callback<void(scoped_ptr<SyncTaskToken> token, |
+ google_apis::GDataErrorCode error, |
+ scoped_ptr<google_apis::ResourceList> resources)> |
+ TokenAndResourceListCallback; |
ScopedVector<google_apis::FileResource> ConvertResourceEntriesToFileResources( |
const ScopedVector<google_apis::ResourceEntry>& entries) { |
@@ -113,21 +97,21 @@ SyncEngineInitializer::~SyncEngineInitializer() { |
cancel_callback_.Run(); |
} |
-void SyncEngineInitializer::RunSequential(const SyncStatusCallback& callback) { |
+void SyncEngineInitializer::Run(scoped_ptr<SyncTaskToken> token) { |
util::Log(logging::LOG_VERBOSE, FROM_HERE, "[Initialize] Start."); |
// The metadata seems to have been already initialized. Just return with OK. |
if (sync_context_ && sync_context_->GetMetadataDatabase()) { |
util::Log(logging::LOG_VERBOSE, FROM_HERE, |
"[Initialize] Already initialized."); |
- callback.Run(SYNC_STATUS_OK); |
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK); |
return; |
} |
MetadataDatabase::Create( |
task_runner_.get(), database_path_, env_override_, |
base::Bind(&SyncEngineInitializer::DidCreateMetadataDatabase, |
- weak_ptr_factory_.GetWeakPtr(), callback)); |
+ weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
} |
scoped_ptr<MetadataDatabase> SyncEngineInitializer::PassMetadataDatabase() { |
@@ -135,13 +119,13 @@ scoped_ptr<MetadataDatabase> SyncEngineInitializer::PassMetadataDatabase() { |
} |
void SyncEngineInitializer::DidCreateMetadataDatabase( |
- const SyncStatusCallback& callback, |
+ scoped_ptr<SyncTaskToken> token, |
SyncStatusCode status, |
scoped_ptr<MetadataDatabase> instance) { |
if (status != SYNC_STATUS_OK) { |
util::Log(logging::LOG_VERBOSE, FROM_HERE, |
"[Initialize] Failed to initialize MetadataDatabase."); |
- callback.Run(status); |
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
return; |
} |
@@ -150,23 +134,23 @@ void SyncEngineInitializer::DidCreateMetadataDatabase( |
if (metadata_database_->HasSyncRoot()) { |
util::Log(logging::LOG_VERBOSE, FROM_HERE, |
"[Initialize] Found local cache of sync-root."); |
- callback.Run(SYNC_STATUS_OK); |
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK); |
return; |
} |
- GetAboutResource(callback); |
+ GetAboutResource(token.Pass()); |
} |
void SyncEngineInitializer::GetAboutResource( |
- const SyncStatusCallback& callback) { |
+ scoped_ptr<SyncTaskToken> token) { |
set_used_network(true); |
drive_service_->GetAboutResource( |
base::Bind(&SyncEngineInitializer::DidGetAboutResource, |
- weak_ptr_factory_.GetWeakPtr(), callback)); |
+ weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
} |
void SyncEngineInitializer::DidGetAboutResource( |
- const SyncStatusCallback& callback, |
+ scoped_ptr<SyncTaskToken> token, |
google_apis::GDataErrorCode error, |
scoped_ptr<google_apis::AboutResource> about_resource) { |
cancel_callback_.Reset(); |
@@ -175,7 +159,7 @@ void SyncEngineInitializer::DidGetAboutResource( |
if (status != SYNC_STATUS_OK) { |
util::Log(logging::LOG_VERBOSE, FROM_HERE, |
"[Initialize] Failed to get AboutResource."); |
- callback.Run(status); |
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
return; |
} |
@@ -184,14 +168,14 @@ void SyncEngineInitializer::DidGetAboutResource( |
largest_change_id_ = about_resource->largest_change_id(); |
DCHECK(!root_folder_id_.empty()); |
- FindSyncRoot(callback); |
+ FindSyncRoot(token.Pass()); |
} |
-void SyncEngineInitializer::FindSyncRoot(const SyncStatusCallback& callback) { |
+void SyncEngineInitializer::FindSyncRoot(scoped_ptr<SyncTaskToken> token) { |
if (find_sync_root_retry_count_++ >= kMaxRetry) { |
util::Log(logging::LOG_VERBOSE, FROM_HERE, |
"[Initialize] Reached max retry count."); |
- callback.Run(SYNC_STATUS_FAILED); |
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); |
return; |
} |
@@ -201,11 +185,11 @@ void SyncEngineInitializer::FindSyncRoot(const SyncStatusCallback& callback) { |
std::string(), // parent_folder_id |
base::Bind(&SyncEngineInitializer::DidFindSyncRoot, |
weak_ptr_factory_.GetWeakPtr(), |
- callback)); |
+ base::Passed(&token))); |
} |
void SyncEngineInitializer::DidFindSyncRoot( |
- const SyncStatusCallback& callback, |
+ scoped_ptr<SyncTaskToken> token, |
google_apis::GDataErrorCode error, |
scoped_ptr<google_apis::ResourceList> resource_list) { |
cancel_callback_.Reset(); |
@@ -214,7 +198,7 @@ void SyncEngineInitializer::DidFindSyncRoot( |
if (status != SYNC_STATUS_OK) { |
util::Log(logging::LOG_VERBOSE, FROM_HERE, |
"[Initialize] Failed to find sync root."); |
- callback.Run(status); |
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
return; |
} |
@@ -222,7 +206,7 @@ void SyncEngineInitializer::DidFindSyncRoot( |
NOTREACHED(); |
util::Log(logging::LOG_VERBOSE, FROM_HERE, |
"[Initialize] Got invalid resource list."); |
- callback.Run(SYNC_STATUS_FAILED); |
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); |
return; |
} |
@@ -234,7 +218,7 @@ void SyncEngineInitializer::DidFindSyncRoot( |
google_apis::ResourceEntry* entry = *itr; |
// Ignore deleted folder. |
- if (IsDeleted(*entry)) |
+ if (entry->deleted()) |
continue; |
// Pick an orphaned folder or a direct child of the root folder and |
@@ -251,28 +235,30 @@ void SyncEngineInitializer::DidFindSyncRoot( |
set_used_network(true); |
// If there are more results, retrieve them. |
- if (GetRemainingFileList( |
- &cancel_callback_, |
- drive_service_, *resource_list, |
- base::Bind(&SyncEngineInitializer::DidFindSyncRoot, |
- weak_ptr_factory_.GetWeakPtr(), |
- callback))) |
+ GURL next_url; |
+ if (resource_list->GetNextFeedURL(&next_url)) { |
+ cancel_callback_ = drive_service_->GetRemainingFileList( |
+ next_url, |
+ base::Bind(&SyncEngineInitializer::DidFindSyncRoot, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ base::Passed(&token))); |
return; |
+ } |
if (!sync_root_folder_) { |
- CreateSyncRoot(callback); |
+ CreateSyncRoot(token.Pass()); |
return; |
} |
if (!HasNoParents(*sync_root_folder_)) { |
- DetachSyncRoot(callback); |
+ DetachSyncRoot(token.Pass()); |
return; |
} |
- ListAppRootFolders(callback); |
+ ListAppRootFolders(token.Pass()); |
} |
-void SyncEngineInitializer::CreateSyncRoot(const SyncStatusCallback& callback) { |
+void SyncEngineInitializer::CreateSyncRoot(scoped_ptr<SyncTaskToken> token) { |
DCHECK(!sync_root_folder_); |
set_used_network(true); |
cancel_callback_ = drive_service_->AddNewDirectory( |
@@ -280,11 +266,11 @@ void SyncEngineInitializer::CreateSyncRoot(const SyncStatusCallback& callback) { |
drive::DriveServiceInterface::AddNewDirectoryOptions(), |
base::Bind(&SyncEngineInitializer::DidCreateSyncRoot, |
weak_ptr_factory_.GetWeakPtr(), |
- callback)); |
+ base::Passed(&token))); |
} |
void SyncEngineInitializer::DidCreateSyncRoot( |
- const SyncStatusCallback& callback, |
+ scoped_ptr<SyncTaskToken> token, |
google_apis::GDataErrorCode error, |
scoped_ptr<google_apis::ResourceEntry> entry) { |
DCHECK(!sync_root_folder_); |
@@ -294,25 +280,25 @@ void SyncEngineInitializer::DidCreateSyncRoot( |
if (status != SYNC_STATUS_OK) { |
util::Log(logging::LOG_VERBOSE, FROM_HERE, |
"[Initialize] Failed to create sync root."); |
- callback.Run(status); |
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
return; |
} |
- FindSyncRoot(callback); |
+ FindSyncRoot(token.Pass()); |
} |
-void SyncEngineInitializer::DetachSyncRoot(const SyncStatusCallback& callback) { |
+void SyncEngineInitializer::DetachSyncRoot(scoped_ptr<SyncTaskToken> token) { |
DCHECK(sync_root_folder_); |
set_used_network(true); |
cancel_callback_ = drive_service_->RemoveResourceFromDirectory( |
- root_folder_id_, GetID(*sync_root_folder_), |
+ root_folder_id_, sync_root_folder_->resource_id(), |
base::Bind(&SyncEngineInitializer::DidDetachSyncRoot, |
weak_ptr_factory_.GetWeakPtr(), |
- callback)); |
+ base::Passed(&token))); |
} |
void SyncEngineInitializer::DidDetachSyncRoot( |
- const SyncStatusCallback& callback, |
+ scoped_ptr<SyncTaskToken> token, |
google_apis::GDataErrorCode error) { |
cancel_callback_.Reset(); |
@@ -320,26 +306,26 @@ void SyncEngineInitializer::DidDetachSyncRoot( |
if (status != SYNC_STATUS_OK) { |
util::Log(logging::LOG_VERBOSE, FROM_HERE, |
"[Initialize] Failed to detach sync root."); |
- callback.Run(status); |
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
return; |
} |
- ListAppRootFolders(callback); |
+ ListAppRootFolders(token.Pass()); |
} |
void SyncEngineInitializer::ListAppRootFolders( |
- const SyncStatusCallback& callback) { |
+ scoped_ptr<SyncTaskToken> token) { |
DCHECK(sync_root_folder_); |
set_used_network(true); |
cancel_callback_ = drive_service_->GetResourceListInDirectory( |
- GetID(*sync_root_folder_), |
+ sync_root_folder_->resource_id(), |
base::Bind(&SyncEngineInitializer::DidListAppRootFolders, |
weak_ptr_factory_.GetWeakPtr(), |
- callback)); |
+ base::Passed(&token))); |
} |
void SyncEngineInitializer::DidListAppRootFolders( |
- const SyncStatusCallback& callback, |
+ scoped_ptr<SyncTaskToken> token, |
google_apis::GDataErrorCode error, |
scoped_ptr<google_apis::ResourceList> resource_list) { |
cancel_callback_.Reset(); |
@@ -348,7 +334,7 @@ void SyncEngineInitializer::DidListAppRootFolders( |
if (status != SYNC_STATUS_OK) { |
util::Log(logging::LOG_VERBOSE, FROM_HERE, |
"[Initialize] Failed to get initial app-root folders."); |
- callback.Run(status); |
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
return; |
} |
@@ -356,7 +342,7 @@ void SyncEngineInitializer::DidListAppRootFolders( |
NOTREACHED(); |
util::Log(logging::LOG_VERBOSE, FROM_HERE, |
"[Initialize] Got invalid initial app-root list."); |
- callback.Run(SYNC_STATUS_FAILED); |
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); |
return; |
} |
@@ -367,19 +353,20 @@ void SyncEngineInitializer::DidListAppRootFolders( |
new_entries->weak_clear(); |
set_used_network(true); |
- if (GetRemainingFileList( |
- &cancel_callback_, |
- drive_service_, |
- *resource_list, |
- base::Bind(&SyncEngineInitializer::DidListAppRootFolders, |
- weak_ptr_factory_.GetWeakPtr(), callback))) |
+ GURL next_url; |
+ if (resource_list->GetNextFeedURL(&next_url)) { |
+ cancel_callback_ = drive_service_->GetRemainingFileList( |
+ next_url, |
+ base::Bind(&SyncEngineInitializer::DidListAppRootFolders, |
+ weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
return; |
+ } |
- PopulateDatabase(callback); |
+ PopulateDatabase(token.Pass()); |
} |
void SyncEngineInitializer::PopulateDatabase( |
- const SyncStatusCallback& callback) { |
+ scoped_ptr<SyncTaskToken> token) { |
DCHECK(sync_root_folder_); |
metadata_database_->PopulateInitialData( |
largest_change_id_, |
@@ -387,24 +374,23 @@ void SyncEngineInitializer::PopulateDatabase( |
*sync_root_folder_), |
ConvertResourceEntriesToFileResources(app_root_folders_), |
base::Bind(&SyncEngineInitializer::DidPopulateDatabase, |
- weak_ptr_factory_.GetWeakPtr(), |
- callback)); |
+ weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
} |
void SyncEngineInitializer::DidPopulateDatabase( |
- const SyncStatusCallback& callback, |
+ scoped_ptr<SyncTaskToken> token, |
SyncStatusCode status) { |
if (status != SYNC_STATUS_OK) { |
util::Log(logging::LOG_VERBOSE, FROM_HERE, |
"[Initialize] Failed to populate initial data" |
" to MetadataDatabase."); |
- callback.Run(status); |
+ SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
return; |
} |
util::Log(logging::LOG_VERBOSE, FROM_HERE, |
"[Initialize] Completed successfully."); |
- callback.Run(SYNC_STATUS_OK); |
+ SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK); |
} |
} // namespace drive_backend |