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 754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 const FilePath local_file_path; | 765 const FilePath local_file_path; |
766 const FilePath remote_file_path; | 766 const FilePath remote_file_path; |
767 const FileOperationCallback callback; | 767 const FileOperationCallback callback; |
768 }; | 768 }; |
769 | 769 |
770 // GDataFileSystem class implementation. | 770 // GDataFileSystem class implementation. |
771 | 771 |
772 GDataFileSystem::GDataFileSystem( | 772 GDataFileSystem::GDataFileSystem( |
773 Profile* profile, | 773 Profile* profile, |
774 GDataCache* cache, | 774 GDataCache* cache, |
| 775 GDataDirectoryService* directory_service, |
775 DocumentsServiceInterface* documents_service, | 776 DocumentsServiceInterface* documents_service, |
776 GDataUploaderInterface* uploader, | 777 GDataUploaderInterface* uploader, |
777 DriveWebAppsRegistryInterface* webapps_registry, | 778 DriveWebAppsRegistryInterface* webapps_registry, |
778 base::SequencedTaskRunner* blocking_task_runner) | 779 base::SequencedTaskRunner* blocking_task_runner) |
779 : profile_(profile), | 780 : profile_(profile), |
780 cache_(cache), | 781 cache_(cache), |
| 782 directory_service_(directory_service), |
781 uploader_(uploader), | 783 uploader_(uploader), |
782 documents_service_(documents_service), | 784 documents_service_(documents_service), |
783 webapps_registry_(webapps_registry), | 785 webapps_registry_(webapps_registry), |
784 update_timer_(true /* retain_user_task */, true /* is_repeating */), | 786 update_timer_(true /* retain_user_task */, true /* is_repeating */), |
785 hide_hosted_docs_(false), | 787 hide_hosted_docs_(false), |
786 ui_weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 788 ui_weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
787 ui_weak_ptr_(ui_weak_ptr_factory_.GetWeakPtr()), | 789 ui_weak_ptr_(ui_weak_ptr_factory_.GetWeakPtr()), |
788 blocking_task_runner_(blocking_task_runner) { | 790 blocking_task_runner_(blocking_task_runner) { |
789 // Should be created from the file browser extension API on UI thread. | 791 // Should be created from the file browser extension API on UI thread. |
790 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 792 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
791 } | 793 } |
792 | 794 |
793 void GDataFileSystem::Initialize() { | 795 void GDataFileSystem::Initialize() { |
794 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 796 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
795 | 797 |
796 documents_service_->Initialize(profile_); | 798 documents_service_->Initialize(profile_); |
797 | 799 |
798 directory_service_.reset(new GDataDirectoryService); | |
799 | |
800 PrefService* pref_service = profile_->GetPrefs(); | 800 PrefService* pref_service = profile_->GetPrefs(); |
801 hide_hosted_docs_ = pref_service->GetBoolean(prefs::kDisableGDataHostedFiles); | 801 hide_hosted_docs_ = pref_service->GetBoolean(prefs::kDisableGDataHostedFiles); |
802 | 802 |
803 InitializePreferenceObserver(); | 803 InitializePreferenceObserver(); |
804 } | 804 } |
805 | 805 |
806 void GDataFileSystem::CheckForUpdates() { | 806 void GDataFileSystem::CheckForUpdates() { |
807 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 807 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
808 ContentOrigin initial_origin = directory_service_->origin(); | 808 ContentOrigin initial_origin = directory_service_->origin(); |
809 if (initial_origin == FROM_SERVER) { | 809 if (initial_origin == FROM_SERVER) { |
(...skipping 1322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2132 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2132 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2133 | 2133 |
2134 GDataFileError error = GDataToGDataFileError(status); | 2134 GDataFileError error = GDataToGDataFileError(status); |
2135 | 2135 |
2136 scoped_ptr<GDataEntry> fresh_entry; | 2136 scoped_ptr<GDataEntry> fresh_entry; |
2137 if (error == GDATA_FILE_OK) { | 2137 if (error == GDATA_FILE_OK) { |
2138 scoped_ptr<DocumentEntry> doc_entry(DocumentEntry::ExtractAndParse(*data)); | 2138 scoped_ptr<DocumentEntry> doc_entry(DocumentEntry::ExtractAndParse(*data)); |
2139 if (doc_entry.get()) { | 2139 if (doc_entry.get()) { |
2140 fresh_entry.reset( | 2140 fresh_entry.reset( |
2141 GDataEntry::FromDocumentEntry(NULL, doc_entry.get(), | 2141 GDataEntry::FromDocumentEntry(NULL, doc_entry.get(), |
2142 directory_service_.get())); | 2142 directory_service_)); |
2143 } | 2143 } |
2144 if (!fresh_entry.get() || !fresh_entry->AsGDataFile()) { | 2144 if (!fresh_entry.get() || !fresh_entry->AsGDataFile()) { |
2145 LOG(ERROR) << "Got invalid entry from server for " << params.resource_id; | 2145 LOG(ERROR) << "Got invalid entry from server for " << params.resource_id; |
2146 error = GDATA_FILE_ERROR_FAILED; | 2146 error = GDATA_FILE_ERROR_FAILED; |
2147 } | 2147 } |
2148 } | 2148 } |
2149 | 2149 |
2150 if (error != GDATA_FILE_OK) { | 2150 if (error != GDATA_FILE_OK) { |
2151 if (!params.get_file_callback.is_null()) { | 2151 if (!params.get_file_callback.is_null()) { |
2152 params.get_file_callback.Run(error, | 2152 params.get_file_callback.Run(error, |
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2668 if (!callback.is_null()) | 2668 if (!callback.is_null()) |
2669 callback.Run(error, result_vec.Pass()); | 2669 callback.Run(error, result_vec.Pass()); |
2670 return; | 2670 return; |
2671 } | 2671 } |
2672 | 2672 |
2673 // Go through all entires generated by the feed and add them to the search | 2673 // Go through all entires generated by the feed and add them to the search |
2674 // result directory. | 2674 // result directory. |
2675 for (size_t i = 0; i < feed->entries().size(); ++i) { | 2675 for (size_t i = 0; i < feed->entries().size(); ++i) { |
2676 DocumentEntry* doc = const_cast<DocumentEntry*>(feed->entries()[i]); | 2676 DocumentEntry* doc = const_cast<DocumentEntry*>(feed->entries()[i]); |
2677 scoped_ptr<GDataEntry> entry( | 2677 scoped_ptr<GDataEntry> entry( |
2678 GDataEntry::FromDocumentEntry(NULL, doc, directory_service_.get())); | 2678 GDataEntry::FromDocumentEntry(NULL, doc, directory_service_)); |
2679 | 2679 |
2680 if (!entry.get()) | 2680 if (!entry.get()) |
2681 continue; | 2681 continue; |
2682 | 2682 |
2683 DCHECK_EQ(doc->resource_id(), entry->resource_id()); | 2683 DCHECK_EQ(doc->resource_id(), entry->resource_id()); |
2684 DCHECK(!entry->is_deleted()); | 2684 DCHECK(!entry->is_deleted()); |
2685 | 2685 |
2686 std::string entry_resource_id = entry->resource_id(); | 2686 std::string entry_resource_id = entry->resource_id(); |
2687 | 2687 |
2688 // This will do nothing if the entry is not already present in file system. | 2688 // This will do nothing if the entry is not already present in file system. |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2985 | 2985 |
2986 scoped_ptr<DocumentEntry> doc_entry(DocumentEntry::ExtractAndParse(*data)); | 2986 scoped_ptr<DocumentEntry> doc_entry(DocumentEntry::ExtractAndParse(*data)); |
2987 if (!doc_entry.get()) { | 2987 if (!doc_entry.get()) { |
2988 if (!callback.is_null()) | 2988 if (!callback.is_null()) |
2989 callback.Run(GDATA_FILE_ERROR_FAILED); | 2989 callback.Run(GDATA_FILE_ERROR_FAILED); |
2990 | 2990 |
2991 return; | 2991 return; |
2992 } | 2992 } |
2993 | 2993 |
2994 GDataEntry* entry = GDataEntry::FromDocumentEntry( | 2994 GDataEntry* entry = GDataEntry::FromDocumentEntry( |
2995 directory_service_->root(), doc_entry.get(), directory_service_.get()); | 2995 directory_service_->root(), doc_entry.get(), directory_service_); |
2996 if (!entry) { | 2996 if (!entry) { |
2997 if (!callback.is_null()) | 2997 if (!callback.is_null()) |
2998 callback.Run(GDATA_FILE_ERROR_FAILED); | 2998 callback.Run(GDATA_FILE_ERROR_FAILED); |
2999 | 2999 |
3000 return; | 3000 return; |
3001 } | 3001 } |
3002 | 3002 |
3003 // |entry| was added in the root directory on the server, so we should | 3003 // |entry| was added in the root directory on the server, so we should |
3004 // first add it to |root_| to mirror the state and then move it to the | 3004 // first add it to |root_| to mirror the state and then move it to the |
3005 // destination directory by AddEntryToDirectory(). | 3005 // destination directory by AddEntryToDirectory(). |
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3486 root_feed_upload_link->href()); | 3486 root_feed_upload_link->href()); |
3487 *feed_changestamp = feed->largest_changestamp(); | 3487 *feed_changestamp = feed->largest_changestamp(); |
3488 DCHECK_GE(*feed_changestamp, 0); | 3488 DCHECK_GE(*feed_changestamp, 0); |
3489 } | 3489 } |
3490 | 3490 |
3491 for (ScopedVector<DocumentEntry>::const_iterator iter = | 3491 for (ScopedVector<DocumentEntry>::const_iterator iter = |
3492 feed->entries().begin(); | 3492 feed->entries().begin(); |
3493 iter != feed->entries().end(); ++iter) { | 3493 iter != feed->entries().end(); ++iter) { |
3494 DocumentEntry* doc = *iter; | 3494 DocumentEntry* doc = *iter; |
3495 GDataEntry* entry = GDataEntry::FromDocumentEntry( | 3495 GDataEntry* entry = GDataEntry::FromDocumentEntry( |
3496 NULL, doc, directory_service_.get()); | 3496 NULL, doc, directory_service_); |
3497 // Some document entries don't map into files (i.e. sites). | 3497 // Some document entries don't map into files (i.e. sites). |
3498 if (!entry) | 3498 if (!entry) |
3499 continue; | 3499 continue; |
3500 // Count the number of files. | 3500 // Count the number of files. |
3501 GDataFile* as_file = entry->AsGDataFile(); | 3501 GDataFile* as_file = entry->AsGDataFile(); |
3502 if (as_file) { | 3502 if (as_file) { |
3503 if (as_file->is_hosted_document()) | 3503 if (as_file->is_hosted_document()) |
3504 ++uma_stats->num_hosted_documents; | 3504 ++uma_stats->num_hosted_documents; |
3505 else | 3505 else |
3506 ++uma_stats->num_regular_files; | 3506 ++uma_stats->num_regular_files; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3584 return GDATA_FILE_ERROR_FAILED; | 3584 return GDATA_FILE_ERROR_FAILED; |
3585 | 3585 |
3586 // Check if parent is a directory since in theory since this is a callback | 3586 // Check if parent is a directory since in theory since this is a callback |
3587 // something could in the meantime have nuked the parent dir and created a | 3587 // something could in the meantime have nuked the parent dir and created a |
3588 // file with the exact same name. | 3588 // file with the exact same name. |
3589 GDataDirectory* parent_dir = entry->AsGDataDirectory(); | 3589 GDataDirectory* parent_dir = entry->AsGDataDirectory(); |
3590 if (!parent_dir) | 3590 if (!parent_dir) |
3591 return GDATA_FILE_ERROR_FAILED; | 3591 return GDATA_FILE_ERROR_FAILED; |
3592 | 3592 |
3593 GDataEntry* new_entry = GDataEntry::FromDocumentEntry( | 3593 GDataEntry* new_entry = GDataEntry::FromDocumentEntry( |
3594 parent_dir, doc_entry.get(), directory_service_.get()); | 3594 parent_dir, doc_entry.get(), directory_service_); |
3595 if (!new_entry) | 3595 if (!new_entry) |
3596 return GDATA_FILE_ERROR_FAILED; | 3596 return GDATA_FILE_ERROR_FAILED; |
3597 | 3597 |
3598 parent_dir->AddEntry(new_entry); | 3598 parent_dir->AddEntry(new_entry); |
3599 | 3599 |
3600 NotifyDirectoryChanged(directory_path); | 3600 NotifyDirectoryChanged(directory_path); |
3601 return GDATA_FILE_OK; | 3601 return GDATA_FILE_OK; |
3602 } | 3602 } |
3603 | 3603 |
3604 GDataFileSystem::FindMissingDirectoryResult | 3604 GDataFileSystem::FindMissingDirectoryResult |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3709 } | 3709 } |
3710 | 3710 |
3711 GDataDirectory* parent_dir = dir_entry->AsGDataDirectory(); | 3711 GDataDirectory* parent_dir = dir_entry->AsGDataDirectory(); |
3712 if (!parent_dir) { | 3712 if (!parent_dir) { |
3713 callback.Run(); | 3713 callback.Run(); |
3714 return; | 3714 return; |
3715 } | 3715 } |
3716 | 3716 |
3717 scoped_ptr<GDataEntry> new_entry( | 3717 scoped_ptr<GDataEntry> new_entry( |
3718 GDataEntry::FromDocumentEntry( | 3718 GDataEntry::FromDocumentEntry( |
3719 parent_dir, entry.get(), directory_service_.get())); | 3719 parent_dir, entry.get(), directory_service_)); |
3720 if (!new_entry.get()) { | 3720 if (!new_entry.get()) { |
3721 callback.Run(); | 3721 callback.Run(); |
3722 return; | 3722 return; |
3723 } | 3723 } |
3724 | 3724 |
3725 if (upload_mode == UPLOAD_EXISTING_FILE) { | 3725 if (upload_mode == UPLOAD_EXISTING_FILE) { |
3726 // Remove an existing entry, which should be present. | 3726 // Remove an existing entry, which should be present. |
3727 const std::string& resource_id = new_entry->resource_id(); | 3727 const std::string& resource_id = new_entry->resource_id(); |
3728 directory_service_->GetEntryByResourceIdAsync(resource_id, | 3728 directory_service_->GetEntryByResourceIdAsync(resource_id, |
3729 base::Bind(&RemoveStaleEntryOnUpload, resource_id, parent_dir)); | 3729 base::Bind(&RemoveStaleEntryOnUpload, resource_id, parent_dir)); |
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4111 // must go through here. Removes the |file_path| from the remembered set so | 4111 // must go through here. Removes the |file_path| from the remembered set so |
4112 // that subsequent operations can open the file again. | 4112 // that subsequent operations can open the file again. |
4113 open_files_.erase(file_path); | 4113 open_files_.erase(file_path); |
4114 | 4114 |
4115 // Then invokes the user-supplied callback function. | 4115 // Then invokes the user-supplied callback function. |
4116 if (!callback.is_null()) | 4116 if (!callback.is_null()) |
4117 callback.Run(result); | 4117 callback.Run(result); |
4118 } | 4118 } |
4119 | 4119 |
4120 } // namespace gdata | 4120 } // namespace gdata |
OLD | NEW |