OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/chromeos/gdata/gdata_file_system.h" | 5 #include "chrome/browser/chromeos/gdata/gdata_file_system.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 const GetEntryInfoWithFilePathCallback& callback, | 561 const GetEntryInfoWithFilePathCallback& callback, |
562 const FilePath& path, | 562 const FilePath& path, |
563 GDataFileError error, | 563 GDataFileError error, |
564 scoped_ptr<GDataEntryProto> entry_proto) { | 564 scoped_ptr<GDataEntryProto> entry_proto) { |
565 if (!callback.is_null()) | 565 if (!callback.is_null()) |
566 callback.Run(error, path, entry_proto.Pass()); | 566 callback.Run(error, path, entry_proto.Pass()); |
567 } | 567 } |
568 | 568 |
569 } // namespace | 569 } // namespace |
570 | 570 |
| 571 // Struct used to record UMA stats with FeedToFileResourceMap(). |
| 572 // |
| 573 // TODO(satorux): Move this to a new file. crbug.com/130669 |
| 574 struct FeedToFileResourceMapUmaStats { |
| 575 FeedToFileResourceMapUmaStats() |
| 576 : num_regular_files(0), |
| 577 num_hosted_documents(0) {} |
| 578 |
| 579 typedef std::map<DocumentEntry::EntryKind, int> EntryKindToCountMap; |
| 580 int num_regular_files; |
| 581 int num_hosted_documents; |
| 582 EntryKindToCountMap num_files_with_entry_kind; |
| 583 }; |
| 584 |
| 585 // GDataWapiFeedProcessor is used to process feeds from WAPI (codename for |
| 586 // Documents List API). |
| 587 // |
| 588 // TODO(satorux): Move this into a new file. crbug.com/130669 |
| 589 class GDataWapiFeedProcessor { |
| 590 public: |
| 591 explicit GDataWapiFeedProcessor(GDataDirectoryService* directory_service) |
| 592 : directory_service_(directory_service) { |
| 593 } |
| 594 |
| 595 // Applies the documents feeds to the file system using |directory_service_|. |
| 596 // |
| 597 // |start_changestamp| determines the type of feed to process. The value is |
| 598 // set to zero for the root feeds, every other value is for the delta feeds. |
| 599 // |
| 600 // In the case of processing the root feeds |root_feed_changestamp| is used |
| 601 // as its initial changestamp value. The value comes from |
| 602 // AccountMetadataFeed. |
| 603 GDataFileError ApplyFeeds(const std::vector<DocumentFeed*>& feed_list, |
| 604 int start_changestamp, |
| 605 int root_feed_changestamp, |
| 606 std::set<FilePath>* changed_dirs); |
| 607 |
| 608 // Converts list of document feeds from collected feeds into |
| 609 // FileResourceIdMap. |
| 610 GDataFileError FeedToFileResourceMap( |
| 611 const std::vector<DocumentFeed*>& feed_list, |
| 612 FileResourceIdMap* file_map, |
| 613 int* feed_changestamp, |
| 614 FeedToFileResourceMapUmaStats* uma_stats); |
| 615 |
| 616 private: |
| 617 // Updates UMA histograms about file counts. |
| 618 void UpdateFileCountUmaHistograms( |
| 619 const FeedToFileResourceMapUmaStats& uma_stats) const; |
| 620 |
| 621 // Applies the pre-processed feed from |file_map| map onto the file system. |
| 622 // All entries in |file_map| will be erased (i.e. the map becomes empty), |
| 623 // and values are deleted. |
| 624 void ApplyFeedFromFileUrlMap(bool is_delta_feed, |
| 625 int feed_changestamp, |
| 626 FileResourceIdMap* file_map, |
| 627 std::set<FilePath>* changed_dirs); |
| 628 |
| 629 // Helper function for adding new |file| from the feed into |directory|. It |
| 630 // checks the type of file and updates |changed_dirs| if this file adding |
| 631 // operation needs to raise directory notification update. If file is being |
| 632 // added to |orphaned_dir_service| such notifications are not raised since |
| 633 // we ignore such files and don't add them to the file system now. |
| 634 static void AddEntryToDirectoryAndCollectChangedDirectories( |
| 635 GDataEntry* entry, |
| 636 GDataDirectory* directory, |
| 637 GDataDirectoryService* orphaned_dir_service, |
| 638 std::set<FilePath>* changed_dirs); |
| 639 |
| 640 // Helper function for removing |entry| from |directory|. If |entry| is a |
| 641 // directory too, it will collect all its children file paths into |
| 642 // |changed_dirs| as well. |
| 643 static void RemoveEntryFromDirectoryAndCollectChangedDirectories( |
| 644 GDataDirectory* directory, |
| 645 GDataEntry* entry, |
| 646 std::set<FilePath>* changed_dirs); |
| 647 |
| 648 // Finds directory where new |file| should be added to during feed processing. |
| 649 // |orphaned_entries_dir| collects files/dirs that don't have a parent in |
| 650 // either locally cached file system or in this new feed. |
| 651 GDataDirectory* FindDirectoryForNewEntry( |
| 652 GDataEntry* new_entry, |
| 653 const FileResourceIdMap& file_map, |
| 654 GDataDirectoryService* orphaned_dir_service); |
| 655 |
| 656 GDataDirectoryService* directory_service_; |
| 657 DISALLOW_COPY_AND_ASSIGN(GDataWapiFeedProcessor); |
| 658 }; |
| 659 |
571 // GDataFileSystem::GetDocumentsParams struct implementation. | 660 // GDataFileSystem::GetDocumentsParams struct implementation. |
572 struct GDataFileSystem::GetDocumentsParams { | 661 struct GDataFileSystem::GetDocumentsParams { |
573 GetDocumentsParams(int start_changestamp, | 662 GetDocumentsParams(int start_changestamp, |
574 int root_feed_changestamp, | 663 int root_feed_changestamp, |
575 std::vector<DocumentFeed*>* feed_list, | 664 std::vector<DocumentFeed*>* feed_list, |
576 bool should_fetch_multiple_feeds, | 665 bool should_fetch_multiple_feeds, |
577 const FilePath& search_file_path, | 666 const FilePath& search_file_path, |
578 const std::string& search_query, | 667 const std::string& search_query, |
579 const std::string& directory_resource_id, | 668 const std::string& directory_resource_id, |
580 const FindEntryCallback& callback); | 669 const FindEntryCallback& callback); |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
708 resource_id(resource_id), | 797 resource_id(resource_id), |
709 md5(md5), | 798 md5(md5), |
710 mime_type(mime_type), | 799 mime_type(mime_type), |
711 get_file_callback(get_file_callback), | 800 get_file_callback(get_file_callback), |
712 get_download_data_callback(get_download_data_callback) { | 801 get_download_data_callback(get_download_data_callback) { |
713 } | 802 } |
714 | 803 |
715 GDataFileSystem::GetFileFromCacheParams::~GetFileFromCacheParams() { | 804 GDataFileSystem::GetFileFromCacheParams::~GetFileFromCacheParams() { |
716 } | 805 } |
717 | 806 |
718 // GDataFileSystem::FeedToFileResourceMapUmaStats implementation. | |
719 struct GDataFileSystem::FeedToFileResourceMapUmaStats { | |
720 FeedToFileResourceMapUmaStats() | |
721 : num_regular_files(0), | |
722 num_hosted_documents(0) {} | |
723 | |
724 typedef std::map<DocumentEntry::EntryKind, int> EntryKindToCountMap; | |
725 int num_regular_files; | |
726 int num_hosted_documents; | |
727 EntryKindToCountMap num_files_with_entry_kind; | |
728 }; | |
729 | |
730 // GDataFileSystem::StartFileUploadParams implementation. | 807 // GDataFileSystem::StartFileUploadParams implementation. |
731 struct GDataFileSystem::StartFileUploadParams { | 808 struct GDataFileSystem::StartFileUploadParams { |
732 StartFileUploadParams(const FilePath& in_local_file_path, | 809 StartFileUploadParams(const FilePath& in_local_file_path, |
733 const FilePath& in_remote_file_path, | 810 const FilePath& in_remote_file_path, |
734 const FileOperationCallback& in_callback) | 811 const FileOperationCallback& in_callback) |
735 : local_file_path(in_local_file_path), | 812 : local_file_path(in_local_file_path), |
736 remote_file_path(in_remote_file_path), | 813 remote_file_path(in_remote_file_path), |
737 callback(in_callback) {} | 814 callback(in_callback) {} |
738 | 815 |
739 const FilePath local_file_path; | 816 const FilePath local_file_path; |
(...skipping 1615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2355 const FilePath& directory_path = params->search_file_path; | 2432 const FilePath& directory_path = params->search_file_path; |
2356 if (error != GDATA_FILE_OK) { | 2433 if (error != GDATA_FILE_OK) { |
2357 LOG(ERROR) << "Failed to refresh directory: " << directory_path.value() | 2434 LOG(ERROR) << "Failed to refresh directory: " << directory_path.value() |
2358 << ": " << error; | 2435 << ": " << error; |
2359 return; | 2436 return; |
2360 } | 2437 } |
2361 | 2438 |
2362 int unused_delta_feed_changestamp = 0; | 2439 int unused_delta_feed_changestamp = 0; |
2363 FeedToFileResourceMapUmaStats unused_uma_stats; | 2440 FeedToFileResourceMapUmaStats unused_uma_stats; |
2364 FileResourceIdMap file_map; | 2441 FileResourceIdMap file_map; |
2365 error = FeedToFileResourceMap(*params->feed_list, | 2442 GDataWapiFeedProcessor feed_processor(directory_service_.get()); |
2366 &file_map, | 2443 error = feed_processor.FeedToFileResourceMap( |
2367 &unused_delta_feed_changestamp, | 2444 *params->feed_list, |
2368 &unused_uma_stats); | 2445 &file_map, |
| 2446 &unused_delta_feed_changestamp, |
| 2447 &unused_uma_stats); |
2369 if (error != GDATA_FILE_OK) { | 2448 if (error != GDATA_FILE_OK) { |
2370 LOG(ERROR) << "Failed to convert feed: " << directory_path.value() | 2449 LOG(ERROR) << "Failed to convert feed: " << directory_path.value() |
2371 << ": " << error; | 2450 << ": " << error; |
2372 return; | 2451 return; |
2373 } | 2452 } |
2374 | 2453 |
2375 directory_service_->GetEntryByResourceIdAsync(params->directory_resource_id, | 2454 directory_service_->GetEntryByResourceIdAsync(params->directory_resource_id, |
2376 base::Bind(&GDataFileSystem::RequestDirectoryRefreshByEntry, | 2455 base::Bind(&GDataFileSystem::RequestDirectoryRefreshByEntry, |
2377 ui_weak_ptr_, | 2456 ui_weak_ptr_, |
2378 directory_path, | 2457 directory_path, |
(...skipping 893 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3272 return GDATA_FILE_OK; | 3351 return GDATA_FILE_OK; |
3273 } | 3352 } |
3274 | 3353 |
3275 GDataFileError GDataFileSystem::UpdateFromFeed( | 3354 GDataFileError GDataFileSystem::UpdateFromFeed( |
3276 const std::vector<DocumentFeed*>& feed_list, | 3355 const std::vector<DocumentFeed*>& feed_list, |
3277 int start_changestamp, | 3356 int start_changestamp, |
3278 int root_feed_changestamp) { | 3357 int root_feed_changestamp) { |
3279 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 3358 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
3280 DVLOG(1) << "Updating directory with a feed"; | 3359 DVLOG(1) << "Updating directory with a feed"; |
3281 | 3360 |
| 3361 std::set<FilePath> changed_dirs; |
| 3362 |
| 3363 GDataWapiFeedProcessor feed_processor(directory_service_.get()); |
| 3364 const GDataFileError error = feed_processor.ApplyFeeds( |
| 3365 feed_list, |
| 3366 start_changestamp, |
| 3367 root_feed_changestamp, |
| 3368 &changed_dirs); |
| 3369 |
| 3370 // Don't send directory content change notification while performing |
| 3371 // the initial content retrieval. |
| 3372 const bool should_notify_directory_changed = (start_changestamp != 0); |
| 3373 if (should_notify_directory_changed) { |
| 3374 for (std::set<FilePath>::iterator dir_iter = changed_dirs.begin(); |
| 3375 dir_iter != changed_dirs.end(); ++dir_iter) { |
| 3376 NotifyDirectoryChanged(*dir_iter); |
| 3377 } |
| 3378 } |
| 3379 |
| 3380 return error; |
| 3381 } |
| 3382 |
| 3383 GDataFileError GDataWapiFeedProcessor::ApplyFeeds( |
| 3384 const std::vector<DocumentFeed*>& feed_list, |
| 3385 int start_changestamp, |
| 3386 int root_feed_changestamp, |
| 3387 std::set<FilePath>* changed_dirs) { |
3282 bool is_delta_feed = start_changestamp != 0; | 3388 bool is_delta_feed = start_changestamp != 0; |
3283 | 3389 |
3284 directory_service_->set_origin(FROM_SERVER); | 3390 directory_service_->set_origin(FROM_SERVER); |
3285 | 3391 |
3286 int delta_feed_changestamp = 0; | 3392 int delta_feed_changestamp = 0; |
3287 FeedToFileResourceMapUmaStats uma_stats; | 3393 FeedToFileResourceMapUmaStats uma_stats; |
3288 FileResourceIdMap file_map; | 3394 FileResourceIdMap file_map; |
3289 GDataFileError error = FeedToFileResourceMap(feed_list, | 3395 GDataFileError error = FeedToFileResourceMap(feed_list, |
3290 &file_map, | 3396 &file_map, |
3291 &delta_feed_changestamp, | 3397 &delta_feed_changestamp, |
3292 &uma_stats); | 3398 &uma_stats); |
3293 if (error != GDATA_FILE_OK) | 3399 if (error != GDATA_FILE_OK) |
3294 return error; | 3400 return error; |
3295 | 3401 |
3296 ApplyFeedFromFileUrlMap( | 3402 ApplyFeedFromFileUrlMap( |
3297 is_delta_feed, | 3403 is_delta_feed, |
3298 is_delta_feed ? delta_feed_changestamp : root_feed_changestamp, | 3404 is_delta_feed ? delta_feed_changestamp : root_feed_changestamp, |
3299 &file_map); | 3405 &file_map, |
| 3406 changed_dirs); |
3300 | 3407 |
3301 // Shouldn't record histograms when processing delta feeds. | 3408 // Shouldn't record histograms when processing delta feeds. |
3302 if (!is_delta_feed) | 3409 if (!is_delta_feed) |
3303 UpdateFileCountUmaHistograms(uma_stats); | 3410 UpdateFileCountUmaHistograms(uma_stats); |
3304 | 3411 |
3305 return GDATA_FILE_OK; | 3412 return GDATA_FILE_OK; |
3306 } | 3413 } |
3307 | 3414 |
3308 void GDataFileSystem::UpdateFileCountUmaHistograms( | 3415 void GDataWapiFeedProcessor::UpdateFileCountUmaHistograms( |
3309 const FeedToFileResourceMapUmaStats& uma_stats) const { | 3416 const FeedToFileResourceMapUmaStats& uma_stats) const { |
3310 const int num_total_files = | 3417 const int num_total_files = |
3311 uma_stats.num_hosted_documents + uma_stats.num_regular_files; | 3418 uma_stats.num_hosted_documents + uma_stats.num_regular_files; |
3312 UMA_HISTOGRAM_COUNTS("GData.NumberOfRegularFiles", | 3419 UMA_HISTOGRAM_COUNTS("GData.NumberOfRegularFiles", |
3313 uma_stats.num_regular_files); | 3420 uma_stats.num_regular_files); |
3314 UMA_HISTOGRAM_COUNTS("GData.NumberOfHostedDocuments", | 3421 UMA_HISTOGRAM_COUNTS("GData.NumberOfHostedDocuments", |
3315 uma_stats.num_hosted_documents); | 3422 uma_stats.num_hosted_documents); |
3316 UMA_HISTOGRAM_COUNTS("GData.NumberOfTotalFiles", num_total_files); | 3423 UMA_HISTOGRAM_COUNTS("GData.NumberOfTotalFiles", num_total_files); |
3317 const std::vector<int> all_entry_kinds = DocumentEntry::GetAllEntryKinds(); | 3424 const std::vector<int> all_entry_kinds = DocumentEntry::GetAllEntryKinds(); |
3318 for (FeedToFileResourceMapUmaStats::EntryKindToCountMap::const_iterator iter = | 3425 for (FeedToFileResourceMapUmaStats::EntryKindToCountMap::const_iterator iter = |
3319 uma_stats.num_files_with_entry_kind.begin(); | 3426 uma_stats.num_files_with_entry_kind.begin(); |
3320 iter != uma_stats.num_files_with_entry_kind.end(); | 3427 iter != uma_stats.num_files_with_entry_kind.end(); |
3321 ++iter) { | 3428 ++iter) { |
3322 const DocumentEntry::EntryKind kind = iter->first; | 3429 const DocumentEntry::EntryKind kind = iter->first; |
3323 const int count = iter->second; | 3430 const int count = iter->second; |
3324 for (int i = 0; i < count; ++i) { | 3431 for (int i = 0; i < count; ++i) { |
3325 UMA_HISTOGRAM_CUSTOM_ENUMERATION( | 3432 UMA_HISTOGRAM_CUSTOM_ENUMERATION( |
3326 "GData.EntryKind", kind, all_entry_kinds); | 3433 "GData.EntryKind", kind, all_entry_kinds); |
3327 } | 3434 } |
3328 } | 3435 } |
3329 } | 3436 } |
3330 | 3437 |
3331 void GDataFileSystem::ApplyFeedFromFileUrlMap( | 3438 void GDataWapiFeedProcessor::ApplyFeedFromFileUrlMap( |
3332 bool is_delta_feed, | 3439 bool is_delta_feed, |
3333 int feed_changestamp, | 3440 int feed_changestamp, |
3334 FileResourceIdMap* file_map) { | 3441 FileResourceIdMap* file_map, |
| 3442 std::set<FilePath>* changed_dirs) { |
3335 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 3443 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
3336 | 3444 DCHECK(changed_dirs); |
3337 // Don't send directory content change notification while performing | |
3338 // the initial content retrieval. | |
3339 const bool should_notify_directory_changed = is_delta_feed; | |
3340 | |
3341 std::set<FilePath> changed_dirs; | |
3342 | 3445 |
3343 if (!is_delta_feed) { // Full update. | 3446 if (!is_delta_feed) { // Full update. |
3344 directory_service_->root()->RemoveChildren(); | 3447 directory_service_->root()->RemoveChildren(); |
3345 changed_dirs.insert(directory_service_->root()->GetFilePath()); | 3448 changed_dirs->insert(directory_service_->root()->GetFilePath()); |
3346 } | 3449 } |
3347 directory_service_->set_largest_changestamp(feed_changestamp); | 3450 directory_service_->set_largest_changestamp(feed_changestamp); |
3348 | 3451 |
3349 scoped_ptr<GDataDirectoryService> orphaned_dir_service( | 3452 scoped_ptr<GDataDirectoryService> orphaned_dir_service( |
3350 new GDataDirectoryService); | 3453 new GDataDirectoryService); |
3351 // Go through all entries generated by the feed and apply them to the local | 3454 // Go through all entries generated by the feed and apply them to the local |
3352 // snapshot of the file system. | 3455 // snapshot of the file system. |
3353 for (FileResourceIdMap::iterator it = file_map->begin(); | 3456 for (FileResourceIdMap::iterator it = file_map->begin(); |
3354 it != file_map->end();) { | 3457 it != file_map->end();) { |
3355 // Ensure that the entry is deleted, unless the ownership is explicitly | 3458 // Ensure that the entry is deleted, unless the ownership is explicitly |
(...skipping 10 matching lines...) Expand all Loading... |
3366 DVLOG(1) << "Removing file " << entry->base_name(); | 3469 DVLOG(1) << "Removing file " << entry->base_name(); |
3367 if (!old_entry) | 3470 if (!old_entry) |
3368 continue; | 3471 continue; |
3369 | 3472 |
3370 dest_dir = old_entry->parent(); | 3473 dest_dir = old_entry->parent(); |
3371 if (!dest_dir) { | 3474 if (!dest_dir) { |
3372 NOTREACHED(); | 3475 NOTREACHED(); |
3373 continue; | 3476 continue; |
3374 } | 3477 } |
3375 RemoveEntryFromDirectoryAndCollectChangedDirectories( | 3478 RemoveEntryFromDirectoryAndCollectChangedDirectories( |
3376 dest_dir, old_entry, &changed_dirs); | 3479 dest_dir, old_entry, changed_dirs); |
3377 } else if (old_entry) { // Change or move of existing entry. | 3480 } else if (old_entry) { // Change or move of existing entry. |
3378 // Please note that entry rename is just a special case of change here | 3481 // Please note that entry rename is just a special case of change here |
3379 // since name is just one of the properties that can change. | 3482 // since name is just one of the properties that can change. |
3380 DVLOG(1) << "Changed file " << entry->base_name(); | 3483 DVLOG(1) << "Changed file " << entry->base_name(); |
3381 dest_dir = old_entry->parent(); | 3484 dest_dir = old_entry->parent(); |
3382 if (!dest_dir) { | 3485 if (!dest_dir) { |
3383 NOTREACHED(); | 3486 NOTREACHED(); |
3384 continue; | 3487 continue; |
3385 } | 3488 } |
3386 // Move children files over if we are dealing with directories. | 3489 // Move children files over if we are dealing with directories. |
3387 if (old_entry->AsGDataDirectory() && entry->AsGDataDirectory()) { | 3490 if (old_entry->AsGDataDirectory() && entry->AsGDataDirectory()) { |
3388 entry->AsGDataDirectory()->TakeOverEntries( | 3491 entry->AsGDataDirectory()->TakeOverEntries( |
3389 old_entry->AsGDataDirectory()); | 3492 old_entry->AsGDataDirectory()); |
3390 } | 3493 } |
3391 // Remove the old instance of this entry. | 3494 // Remove the old instance of this entry. |
3392 RemoveEntryFromDirectoryAndCollectChangedDirectories( | 3495 RemoveEntryFromDirectoryAndCollectChangedDirectories( |
3393 dest_dir, old_entry, &changed_dirs); | 3496 dest_dir, old_entry, changed_dirs); |
3394 // Did we actually move the new file to another directory? | 3497 // Did we actually move the new file to another directory? |
3395 if (dest_dir->resource_id() != entry->parent_resource_id()) { | 3498 if (dest_dir->resource_id() != entry->parent_resource_id()) { |
3396 changed_dirs.insert(dest_dir->GetFilePath()); | 3499 changed_dirs->insert(dest_dir->GetFilePath()); |
3397 dest_dir = FindDirectoryForNewEntry(entry.get(), | 3500 dest_dir = FindDirectoryForNewEntry(entry.get(), |
3398 *file_map, | 3501 *file_map, |
3399 orphaned_dir_service.get()); | 3502 orphaned_dir_service.get()); |
3400 } | 3503 } |
3401 DCHECK(dest_dir); | 3504 DCHECK(dest_dir); |
3402 AddEntryToDirectoryAndCollectChangedDirectories( | 3505 AddEntryToDirectoryAndCollectChangedDirectories( |
3403 entry.release(), | 3506 entry.release(), |
3404 dest_dir, | 3507 dest_dir, |
3405 orphaned_dir_service.get(), | 3508 orphaned_dir_service.get(), |
3406 &changed_dirs); | 3509 changed_dirs); |
3407 } else { // Adding a new file. | 3510 } else { // Adding a new file. |
3408 dest_dir = FindDirectoryForNewEntry(entry.get(), | 3511 dest_dir = FindDirectoryForNewEntry(entry.get(), |
3409 *file_map, | 3512 *file_map, |
3410 orphaned_dir_service.get()); | 3513 orphaned_dir_service.get()); |
3411 DCHECK(dest_dir); | 3514 DCHECK(dest_dir); |
3412 AddEntryToDirectoryAndCollectChangedDirectories( | 3515 AddEntryToDirectoryAndCollectChangedDirectories( |
3413 entry.release(), | 3516 entry.release(), |
3414 dest_dir, | 3517 dest_dir, |
3415 orphaned_dir_service.get(), | 3518 orphaned_dir_service.get(), |
3416 &changed_dirs); | 3519 changed_dirs); |
3417 } | 3520 } |
3418 | 3521 |
3419 // Record changed directory if this was a delta feed and the parent | 3522 // Record changed directory if this was a delta feed and the parent |
3420 // directory is already properly rooted within its parent. | 3523 // directory is already properly rooted within its parent. |
3421 if (dest_dir && (dest_dir->parent() || | 3524 if (dest_dir && (dest_dir->parent() || |
3422 dest_dir == directory_service_->root()) && | 3525 dest_dir == directory_service_->root()) && |
3423 dest_dir != orphaned_dir_service->root() && is_delta_feed) { | 3526 dest_dir != orphaned_dir_service->root() && is_delta_feed) { |
3424 changed_dirs.insert(dest_dir->GetFilePath()); | 3527 changed_dirs->insert(dest_dir->GetFilePath()); |
3425 } | 3528 } |
3426 } | 3529 } |
3427 // All entry must be erased from the map. | 3530 // All entry must be erased from the map. |
3428 DCHECK(file_map->empty()); | 3531 DCHECK(file_map->empty()); |
3429 | |
3430 if (should_notify_directory_changed) { | |
3431 for (std::set<FilePath>::iterator dir_iter = changed_dirs.begin(); | |
3432 dir_iter != changed_dirs.end(); ++dir_iter) { | |
3433 NotifyDirectoryChanged(*dir_iter); | |
3434 } | |
3435 } | |
3436 } | 3532 } |
3437 | 3533 |
3438 // static | 3534 // static |
3439 void GDataFileSystem::AddEntryToDirectoryAndCollectChangedDirectories( | 3535 void GDataWapiFeedProcessor::AddEntryToDirectoryAndCollectChangedDirectories( |
3440 GDataEntry* entry, | 3536 GDataEntry* entry, |
3441 GDataDirectory* directory, | 3537 GDataDirectory* directory, |
3442 GDataDirectoryService* orphaned_dir_service, | 3538 GDataDirectoryService* orphaned_dir_service, |
3443 std::set<FilePath>* changed_dirs) { | 3539 std::set<FilePath>* changed_dirs) { |
3444 directory->AddEntry(entry); | 3540 directory->AddEntry(entry); |
3445 if (entry->AsGDataDirectory() && directory != orphaned_dir_service->root()) | 3541 if (entry->AsGDataDirectory() && directory != orphaned_dir_service->root()) |
3446 changed_dirs->insert(entry->GetFilePath()); | 3542 changed_dirs->insert(entry->GetFilePath()); |
3447 } | 3543 } |
3448 | 3544 |
3449 // static | 3545 // static |
3450 void GDataFileSystem::RemoveEntryFromDirectoryAndCollectChangedDirectories( | 3546 void GDataWapiFeedProcessor:: |
| 3547 RemoveEntryFromDirectoryAndCollectChangedDirectories( |
3451 GDataDirectory* directory, | 3548 GDataDirectory* directory, |
3452 GDataEntry* entry, | 3549 GDataEntry* entry, |
3453 std::set<FilePath>* changed_dirs) { | 3550 std::set<FilePath>* changed_dirs) { |
3454 // Get the list of all sub-directory paths, so we can notify their listeners | 3551 // Get the list of all sub-directory paths, so we can notify their listeners |
3455 // that they are smoked. | 3552 // that they are smoked. |
3456 GetChildDirectoryPaths(entry, changed_dirs); | 3553 GetChildDirectoryPaths(entry, changed_dirs); |
3457 directory->RemoveEntry(entry); | 3554 directory->RemoveEntry(entry); |
3458 } | 3555 } |
3459 | 3556 |
3460 // static | 3557 // static |
3461 void GDataFileSystem::RemoveStaleEntryOnUpload(const std::string& resource_id, | 3558 void GDataFileSystem::RemoveStaleEntryOnUpload(const std::string& resource_id, |
3462 GDataDirectory* parent_dir, | 3559 GDataDirectory* parent_dir, |
3463 GDataEntry* existing_entry) { | 3560 GDataEntry* existing_entry) { |
3464 if (existing_entry && | 3561 if (existing_entry && |
3465 // This should always match, but just in case. | 3562 // This should always match, but just in case. |
3466 existing_entry->parent() == parent_dir) { | 3563 existing_entry->parent() == parent_dir) { |
3467 parent_dir->RemoveEntry(existing_entry); | 3564 parent_dir->RemoveEntry(existing_entry); |
3468 } else { | 3565 } else { |
3469 LOG(ERROR) << "Entry for the existing file not found: " << resource_id; | 3566 LOG(ERROR) << "Entry for the existing file not found: " << resource_id; |
3470 } | 3567 } |
3471 } | 3568 } |
3472 | 3569 |
3473 GDataDirectory* GDataFileSystem::FindDirectoryForNewEntry( | 3570 GDataDirectory* GDataWapiFeedProcessor::FindDirectoryForNewEntry( |
3474 GDataEntry* new_entry, | 3571 GDataEntry* new_entry, |
3475 const FileResourceIdMap& file_map, | 3572 const FileResourceIdMap& file_map, |
3476 GDataDirectoryService* orphaned_dir_service) { | 3573 GDataDirectoryService* orphaned_dir_service) { |
3477 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 3574 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
3478 GDataDirectory* dir = NULL; | 3575 GDataDirectory* dir = NULL; |
3479 // Added file. | 3576 // Added file. |
3480 const std::string& parent_id = new_entry->parent_resource_id(); | 3577 const std::string& parent_id = new_entry->parent_resource_id(); |
3481 if (parent_id.empty()) { | 3578 if (parent_id.empty()) { |
3482 dir = directory_service_->root(); | 3579 dir = directory_service_->root(); |
3483 DVLOG(1) << "Root parent for " << new_entry->base_name(); | 3580 DVLOG(1) << "Root parent for " << new_entry->base_name(); |
(...skipping 12 matching lines...) Expand all Loading... |
3496 << " in file_map " << parent_id; | 3593 << " in file_map " << parent_id; |
3497 } else { | 3594 } else { |
3498 DVLOG(1) << "Adding orphan " << new_entry->GetFilePath().value(); | 3595 DVLOG(1) << "Adding orphan " << new_entry->GetFilePath().value(); |
3499 dir = orphaned_dir_service->root(); | 3596 dir = orphaned_dir_service->root(); |
3500 } | 3597 } |
3501 } | 3598 } |
3502 } | 3599 } |
3503 return dir; | 3600 return dir; |
3504 } | 3601 } |
3505 | 3602 |
3506 GDataFileError GDataFileSystem::FeedToFileResourceMap( | 3603 GDataFileError GDataWapiFeedProcessor::FeedToFileResourceMap( |
3507 const std::vector<DocumentFeed*>& feed_list, | 3604 const std::vector<DocumentFeed*>& feed_list, |
3508 FileResourceIdMap* file_map, | 3605 FileResourceIdMap* file_map, |
3509 int* feed_changestamp, | 3606 int* feed_changestamp, |
3510 FeedToFileResourceMapUmaStats* uma_stats) { | 3607 FeedToFileResourceMapUmaStats* uma_stats) { |
3511 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 3608 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
3512 DCHECK(uma_stats); | 3609 DCHECK(uma_stats); |
3513 | 3610 |
3514 GDataFileError error = GDATA_FILE_OK; | 3611 GDataFileError error = GDATA_FILE_OK; |
3515 uma_stats->num_regular_files = 0; | 3612 uma_stats->num_regular_files = 0; |
3516 uma_stats->num_hosted_documents = 0; | 3613 uma_stats->num_hosted_documents = 0; |
(...skipping 11 matching lines...) Expand all Loading... |
3528 root_feed_upload_link->href()); | 3625 root_feed_upload_link->href()); |
3529 *feed_changestamp = feed->largest_changestamp(); | 3626 *feed_changestamp = feed->largest_changestamp(); |
3530 DCHECK_GE(*feed_changestamp, 0); | 3627 DCHECK_GE(*feed_changestamp, 0); |
3531 } | 3628 } |
3532 | 3629 |
3533 for (ScopedVector<DocumentEntry>::const_iterator iter = | 3630 for (ScopedVector<DocumentEntry>::const_iterator iter = |
3534 feed->entries().begin(); | 3631 feed->entries().begin(); |
3535 iter != feed->entries().end(); ++iter) { | 3632 iter != feed->entries().end(); ++iter) { |
3536 DocumentEntry* doc = *iter; | 3633 DocumentEntry* doc = *iter; |
3537 GDataEntry* entry = GDataEntry::FromDocumentEntry( | 3634 GDataEntry* entry = GDataEntry::FromDocumentEntry( |
3538 NULL, doc, directory_service_.get()); | 3635 NULL, doc, directory_service_); |
3539 // Some document entries don't map into files (i.e. sites). | 3636 // Some document entries don't map into files (i.e. sites). |
3540 if (!entry) | 3637 if (!entry) |
3541 continue; | 3638 continue; |
3542 // Count the number of files. | 3639 // Count the number of files. |
3543 GDataFile* as_file = entry->AsGDataFile(); | 3640 GDataFile* as_file = entry->AsGDataFile(); |
3544 if (as_file) { | 3641 if (as_file) { |
3545 if (as_file->is_hosted_document()) | 3642 if (as_file->is_hosted_document()) |
3546 ++uma_stats->num_hosted_documents; | 3643 ++uma_stats->num_hosted_documents; |
3547 else | 3644 else |
3548 ++uma_stats->num_regular_files; | 3645 ++uma_stats->num_regular_files; |
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4258 } | 4355 } |
4259 | 4356 |
4260 PlatformFileInfoProto entry_file_info; | 4357 PlatformFileInfoProto entry_file_info; |
4261 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info); | 4358 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info); |
4262 *entry_proto->mutable_file_info() = entry_file_info; | 4359 *entry_proto->mutable_file_info() = entry_file_info; |
4263 if (!callback.is_null()) | 4360 if (!callback.is_null()) |
4264 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); | 4361 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); |
4265 } | 4362 } |
4266 | 4363 |
4267 } // namespace gdata | 4364 } // namespace gdata |
OLD | NEW |