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 "base/message_loop/message_loop_proxy.h" | 10 #include "base/message_loop/message_loop_proxy.h" |
11 #include "chrome/browser/drive/drive_api_service.h" | 11 #include "chrome/browser/drive/drive_api_service.h" |
12 #include "chrome/browser/drive/drive_api_util.h" | |
13 #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" |
14 #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" |
15 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" | 14 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" |
16 #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" |
17 #include "chrome/browser/sync_file_system/drive_backend/sync_task_manager.h" | 16 #include "chrome/browser/sync_file_system/drive_backend/sync_task_manager.h" |
18 #include "chrome/browser/sync_file_system/drive_backend/sync_task_token.h" | 17 #include "chrome/browser/sync_file_system/drive_backend/sync_task_token.h" |
19 #include "chrome/browser/sync_file_system/logger.h" | 18 #include "chrome/browser/sync_file_system/logger.h" |
20 #include "google_apis/drive/drive_api_parser.h" | 19 #include "google_apis/drive/drive_api_parser.h" |
21 #include "google_apis/drive/gdata_wapi_parser.h" | 20 #include "google_apis/drive/gdata_wapi_parser.h" |
22 | 21 |
23 namespace sync_file_system { | 22 namespace sync_file_system { |
24 namespace drive_backend { | 23 namespace drive_backend { |
25 | 24 |
26 namespace { | 25 namespace { |
27 | 26 |
28 //////////////////////////////////////////////////////////////////////////////// | 27 //////////////////////////////////////////////////////////////////////////////// |
29 // 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. |
30 | 29 |
31 bool HasNoParents(const google_apis::ResourceEntry& entry) { | 30 bool HasNoParents(const google_apis::FileResource& entry) { |
32 return !entry.GetLinkByType(google_apis::Link::LINK_PARENT); | 31 return entry.parents().empty(); |
33 } | 32 } |
34 | 33 |
35 bool HasFolderAsParent(const google_apis::ResourceEntry& entry, | 34 bool HasFolderAsParent(const google_apis::FileResource& entry, |
36 const std::string& parent_id) { | 35 const std::string& parent_id) { |
37 const ScopedVector<google_apis::Link>& links = entry.links(); | 36 for (size_t i = 0; i < entry.parents().size(); ++i) { |
38 for (ScopedVector<google_apis::Link>::const_iterator itr = links.begin(); | 37 if (entry.parents()[i].file_id() == parent_id) |
39 itr != links.end(); ++itr) { | |
40 const google_apis::Link& link = **itr; | |
41 if (link.type() != google_apis::Link::LINK_PARENT) | |
42 continue; | |
43 if (drive::util::ExtractResourceIdFromUrl(link.href()) == parent_id) | |
44 return true; | 38 return true; |
45 } | 39 } |
46 return false; | 40 return false; |
47 } | 41 } |
48 | 42 |
49 bool LessOnCreationTime(const google_apis::ResourceEntry& left, | 43 bool LessOnCreationTime(const google_apis::FileResource& left, |
50 const google_apis::ResourceEntry& right) { | 44 const google_apis::FileResource& right) { |
51 return left.published_time() < right.published_time(); | 45 return left.created_date() < right.created_date(); |
52 } | 46 } |
53 | 47 |
54 typedef base::Callback<void(scoped_ptr<SyncTaskToken> token, | 48 typedef base::Callback<void(scoped_ptr<SyncTaskToken> token, |
55 google_apis::GDataErrorCode error, | 49 google_apis::GDataErrorCode error, |
56 scoped_ptr<google_apis::ResourceList> resources)> | 50 scoped_ptr<google_apis::ResourceList> resources)> |
57 TokenAndResourceListCallback; | 51 TokenAndResourceListCallback; |
58 | 52 |
59 ScopedVector<google_apis::FileResource> ConvertResourceEntriesToFileResources( | |
60 const ScopedVector<google_apis::ResourceEntry>& entries) { | |
61 ScopedVector<google_apis::FileResource> resources; | |
62 for (ScopedVector<google_apis::ResourceEntry>::const_iterator itr = | |
63 entries.begin(); | |
64 itr != entries.end(); | |
65 ++itr) { | |
66 resources.push_back( | |
67 drive::util::ConvertResourceEntryToFileResource( | |
68 **itr).release()); | |
69 } | |
70 return resources.Pass(); | |
71 } | |
72 | |
73 // Functions above are for wrapping the access to legacy GData WAPI classes. | 53 // Functions above are for wrapping the access to legacy GData WAPI classes. |
74 //////////////////////////////////////////////////////////////////////////////// | 54 //////////////////////////////////////////////////////////////////////////////// |
75 | 55 |
76 } // namespace | 56 } // namespace |
77 | 57 |
78 SyncEngineInitializer::SyncEngineInitializer( | 58 SyncEngineInitializer::SyncEngineInitializer( |
79 SyncEngineContext* sync_context, | 59 SyncEngineContext* sync_context, |
80 const base::FilePath& database_path, | 60 const base::FilePath& database_path, |
81 leveldb::Env* env_override) | 61 leveldb::Env* env_override) |
82 : sync_context_(sync_context), | 62 : sync_context_(sync_context), |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 kSyncRootFolderTitle, | 165 kSyncRootFolderTitle, |
186 std::string(), // parent_folder_id | 166 std::string(), // parent_folder_id |
187 base::Bind(&SyncEngineInitializer::DidFindSyncRoot, | 167 base::Bind(&SyncEngineInitializer::DidFindSyncRoot, |
188 weak_ptr_factory_.GetWeakPtr(), | 168 weak_ptr_factory_.GetWeakPtr(), |
189 base::Passed(&token))); | 169 base::Passed(&token))); |
190 } | 170 } |
191 | 171 |
192 void SyncEngineInitializer::DidFindSyncRoot( | 172 void SyncEngineInitializer::DidFindSyncRoot( |
193 scoped_ptr<SyncTaskToken> token, | 173 scoped_ptr<SyncTaskToken> token, |
194 google_apis::GDataErrorCode error, | 174 google_apis::GDataErrorCode error, |
195 scoped_ptr<google_apis::ResourceList> resource_list) { | 175 scoped_ptr<google_apis::FileList> file_list) { |
196 cancel_callback_.Reset(); | 176 cancel_callback_.Reset(); |
197 | 177 |
198 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 178 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
199 if (status != SYNC_STATUS_OK) { | 179 if (status != SYNC_STATUS_OK) { |
200 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 180 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
201 "[Initialize] Failed to find sync root."); | 181 "[Initialize] Failed to find sync root."); |
202 SyncTaskManager::NotifyTaskDone(token.Pass(), status); | 182 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
203 return; | 183 return; |
204 } | 184 } |
205 | 185 |
206 if (!resource_list) { | 186 if (!file_list) { |
207 NOTREACHED(); | 187 NOTREACHED(); |
208 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 188 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
209 "[Initialize] Got invalid resource list."); | 189 "[Initialize] Got invalid resource list."); |
210 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); | 190 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); |
211 return; | 191 return; |
212 } | 192 } |
213 | 193 |
214 ScopedVector<google_apis::ResourceEntry>* entries = | 194 ScopedVector<google_apis::FileResource>* items = file_list->mutable_items(); |
215 resource_list->mutable_entries(); | 195 for (ScopedVector<google_apis::FileResource>::iterator itr = items->begin(); |
216 for (ScopedVector<google_apis::ResourceEntry>::iterator itr = | 196 itr != items->end(); ++itr) { |
217 entries->begin(); | 197 google_apis::FileResource* entry = *itr; |
218 itr != entries->end(); ++itr) { | |
219 google_apis::ResourceEntry* entry = *itr; | |
220 | 198 |
221 // Ignore deleted folder. | 199 // Ignore deleted folder. |
222 if (entry->deleted()) | 200 if (entry->labels().is_trashed()) |
223 continue; | 201 continue; |
224 | 202 |
225 // Pick an orphaned folder or a direct child of the root folder and | 203 // Pick an orphaned folder or a direct child of the root folder and |
226 // ignore others. | 204 // ignore others. |
227 DCHECK(!root_folder_id_.empty()); | 205 DCHECK(!root_folder_id_.empty()); |
228 if (!HasNoParents(*entry) && !HasFolderAsParent(*entry, root_folder_id_)) | 206 if (!HasNoParents(*entry) && !HasFolderAsParent(*entry, root_folder_id_)) |
229 continue; | 207 continue; |
230 | 208 |
231 if (!sync_root_folder_ || LessOnCreationTime(*entry, *sync_root_folder_)) { | 209 if (!sync_root_folder_ || LessOnCreationTime(*entry, *sync_root_folder_)) { |
232 sync_root_folder_.reset(entry); | 210 sync_root_folder_.reset(entry); |
233 *itr = NULL; | 211 *itr = NULL; |
234 } | 212 } |
235 } | 213 } |
236 | 214 |
237 set_used_network(true); | 215 set_used_network(true); |
238 // If there are more results, retrieve them. | 216 // If there are more results, retrieve them. |
239 GURL next_url; | 217 if (!file_list->next_link().is_empty()) { |
240 if (resource_list->GetNextFeedURL(&next_url)) { | |
241 cancel_callback_ = sync_context_->GetDriveService()->GetRemainingFileList( | 218 cancel_callback_ = sync_context_->GetDriveService()->GetRemainingFileList( |
242 next_url, | 219 file_list->next_link(), |
243 base::Bind(&SyncEngineInitializer::DidFindSyncRoot, | 220 base::Bind(&SyncEngineInitializer::DidFindSyncRoot, |
244 weak_ptr_factory_.GetWeakPtr(), | 221 weak_ptr_factory_.GetWeakPtr(), |
245 base::Passed(&token))); | 222 base::Passed(&token))); |
246 return; | 223 return; |
247 } | 224 } |
248 | 225 |
249 if (!sync_root_folder_) { | 226 if (!sync_root_folder_) { |
250 CreateSyncRoot(token.Pass()); | 227 CreateSyncRoot(token.Pass()); |
251 return; | 228 return; |
252 } | 229 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 | 264 |
288 FindSyncRoot(token.Pass()); | 265 FindSyncRoot(token.Pass()); |
289 } | 266 } |
290 | 267 |
291 void SyncEngineInitializer::DetachSyncRoot(scoped_ptr<SyncTaskToken> token) { | 268 void SyncEngineInitializer::DetachSyncRoot(scoped_ptr<SyncTaskToken> token) { |
292 DCHECK(sync_root_folder_); | 269 DCHECK(sync_root_folder_); |
293 set_used_network(true); | 270 set_used_network(true); |
294 cancel_callback_ = | 271 cancel_callback_ = |
295 sync_context_->GetDriveService()->RemoveResourceFromDirectory( | 272 sync_context_->GetDriveService()->RemoveResourceFromDirectory( |
296 root_folder_id_, | 273 root_folder_id_, |
297 sync_root_folder_->resource_id(), | 274 sync_root_folder_->file_id(), |
298 base::Bind(&SyncEngineInitializer::DidDetachSyncRoot, | 275 base::Bind(&SyncEngineInitializer::DidDetachSyncRoot, |
299 weak_ptr_factory_.GetWeakPtr(), | 276 weak_ptr_factory_.GetWeakPtr(), |
300 base::Passed(&token))); | 277 base::Passed(&token))); |
301 } | 278 } |
302 | 279 |
303 void SyncEngineInitializer::DidDetachSyncRoot( | 280 void SyncEngineInitializer::DidDetachSyncRoot( |
304 scoped_ptr<SyncTaskToken> token, | 281 scoped_ptr<SyncTaskToken> token, |
305 google_apis::GDataErrorCode error) { | 282 google_apis::GDataErrorCode error) { |
306 cancel_callback_.Reset(); | 283 cancel_callback_.Reset(); |
307 | 284 |
308 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 285 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
309 if (status != SYNC_STATUS_OK) { | 286 if (status != SYNC_STATUS_OK) { |
310 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 287 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
311 "[Initialize] Failed to detach sync root."); | 288 "[Initialize] Failed to detach sync root."); |
312 SyncTaskManager::NotifyTaskDone(token.Pass(), status); | 289 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
313 return; | 290 return; |
314 } | 291 } |
315 | 292 |
316 ListAppRootFolders(token.Pass()); | 293 ListAppRootFolders(token.Pass()); |
317 } | 294 } |
318 | 295 |
319 void SyncEngineInitializer::ListAppRootFolders( | 296 void SyncEngineInitializer::ListAppRootFolders( |
320 scoped_ptr<SyncTaskToken> token) { | 297 scoped_ptr<SyncTaskToken> token) { |
321 DCHECK(sync_root_folder_); | 298 DCHECK(sync_root_folder_); |
322 set_used_network(true); | 299 set_used_network(true); |
323 cancel_callback_ = | 300 cancel_callback_ = |
324 sync_context_->GetDriveService()->GetResourceListInDirectory( | 301 sync_context_->GetDriveService()->GetFileListInDirectory( |
325 sync_root_folder_->resource_id(), | 302 sync_root_folder_->file_id(), |
326 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, | 303 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, |
327 weak_ptr_factory_.GetWeakPtr(), | 304 weak_ptr_factory_.GetWeakPtr(), |
328 base::Passed(&token))); | 305 base::Passed(&token))); |
329 } | 306 } |
330 | 307 |
331 void SyncEngineInitializer::DidListAppRootFolders( | 308 void SyncEngineInitializer::DidListAppRootFolders( |
332 scoped_ptr<SyncTaskToken> token, | 309 scoped_ptr<SyncTaskToken> token, |
333 google_apis::GDataErrorCode error, | 310 google_apis::GDataErrorCode error, |
334 scoped_ptr<google_apis::ResourceList> resource_list) { | 311 scoped_ptr<google_apis::FileList> file_list) { |
335 cancel_callback_.Reset(); | 312 cancel_callback_.Reset(); |
336 | 313 |
337 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 314 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
338 if (status != SYNC_STATUS_OK) { | 315 if (status != SYNC_STATUS_OK) { |
339 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 316 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
340 "[Initialize] Failed to get initial app-root folders."); | 317 "[Initialize] Failed to get initial app-root folders."); |
341 SyncTaskManager::NotifyTaskDone(token.Pass(), status); | 318 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
342 return; | 319 return; |
343 } | 320 } |
344 | 321 |
345 if (!resource_list) { | 322 if (!file_list) { |
346 NOTREACHED(); | 323 NOTREACHED(); |
347 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 324 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
348 "[Initialize] Got invalid initial app-root list."); | 325 "[Initialize] Got invalid initial app-root list."); |
349 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); | 326 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); |
350 return; | 327 return; |
351 } | 328 } |
352 | 329 |
353 ScopedVector<google_apis::ResourceEntry>* new_entries = | 330 ScopedVector<google_apis::FileResource>* new_entries = |
354 resource_list->mutable_entries(); | 331 file_list->mutable_items(); |
355 app_root_folders_.insert(app_root_folders_.end(), | 332 app_root_folders_.insert(app_root_folders_.end(), |
356 new_entries->begin(), new_entries->end()); | 333 new_entries->begin(), new_entries->end()); |
357 new_entries->weak_clear(); | 334 new_entries->weak_clear(); |
358 | 335 |
359 set_used_network(true); | 336 set_used_network(true); |
360 GURL next_url; | 337 if (!file_list->next_link().is_empty()) { |
361 if (resource_list->GetNextFeedURL(&next_url)) { | |
362 cancel_callback_ = | 338 cancel_callback_ = |
363 sync_context_->GetDriveService()->GetRemainingFileList( | 339 sync_context_->GetDriveService()->GetRemainingFileList( |
364 next_url, | 340 file_list->next_link(), |
365 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, | 341 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, |
366 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); | 342 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
367 return; | 343 return; |
368 } | 344 } |
369 | 345 |
370 PopulateDatabase(token.Pass()); | 346 PopulateDatabase(token.Pass()); |
371 } | 347 } |
372 | 348 |
373 void SyncEngineInitializer::PopulateDatabase( | 349 void SyncEngineInitializer::PopulateDatabase( |
374 scoped_ptr<SyncTaskToken> token) { | 350 scoped_ptr<SyncTaskToken> token) { |
375 DCHECK(sync_root_folder_); | 351 DCHECK(sync_root_folder_); |
376 metadata_database_->PopulateInitialData( | 352 metadata_database_->PopulateInitialData( |
377 largest_change_id_, | 353 largest_change_id_, |
378 *drive::util::ConvertResourceEntryToFileResource( | 354 *sync_root_folder_, |
379 *sync_root_folder_), | 355 app_root_folders_, |
380 ConvertResourceEntriesToFileResources(app_root_folders_), | |
381 base::Bind(&SyncEngineInitializer::DidPopulateDatabase, | 356 base::Bind(&SyncEngineInitializer::DidPopulateDatabase, |
382 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); | 357 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
383 } | 358 } |
384 | 359 |
385 void SyncEngineInitializer::DidPopulateDatabase( | 360 void SyncEngineInitializer::DidPopulateDatabase( |
386 scoped_ptr<SyncTaskToken> token, | 361 scoped_ptr<SyncTaskToken> token, |
387 SyncStatusCode status) { | 362 SyncStatusCode status) { |
388 if (status != SYNC_STATUS_OK) { | 363 if (status != SYNC_STATUS_OK) { |
389 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 364 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
390 "[Initialize] Failed to populate initial data" | 365 "[Initialize] Failed to populate initial data" |
391 " to MetadataDatabase."); | 366 " to MetadataDatabase."); |
392 SyncTaskManager::NotifyTaskDone(token.Pass(), status); | 367 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
393 return; | 368 return; |
394 } | 369 } |
395 | 370 |
396 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 371 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
397 "[Initialize] Completed successfully."); | 372 "[Initialize] Completed successfully."); |
398 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK); | 373 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK); |
399 } | 374 } |
400 | 375 |
401 } // namespace drive_backend | 376 } // namespace drive_backend |
402 } // namespace sync_file_system | 377 } // namespace sync_file_system |
OLD | NEW |