Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.cc

Issue 204133004: [SyncFS] Make SyncEngineInitializer run as a background task (3/3) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698