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

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

Issue 305913002: drive: Replace GetResourceListCallback in DriveServiceInterface with FileListCallback (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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 "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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698