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/drive/file_system.h" | 5 #include "chrome/browser/chromeos/drive/file_system.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/message_loop/message_loop_proxy.h" | 9 #include "base/message_loop/message_loop_proxy.h" |
10 #include "base/platform_file.h" | 10 #include "base/platform_file.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 namespace { | 50 namespace { |
51 | 51 |
52 // Gets a ResourceEntry from the metadata, and overwrites its file info when the | 52 // Gets a ResourceEntry from the metadata, and overwrites its file info when the |
53 // cached file is dirty. | 53 // cached file is dirty. |
54 FileError GetLocallyStoredResourceEntry( | 54 FileError GetLocallyStoredResourceEntry( |
55 internal::ResourceMetadata* resource_metadata, | 55 internal::ResourceMetadata* resource_metadata, |
56 internal::FileCache* cache, | 56 internal::FileCache* cache, |
57 const base::FilePath& file_path, | 57 const base::FilePath& file_path, |
58 ResourceEntry* entry) { | 58 ResourceEntry* entry) { |
59 std::string local_id; | 59 std::string local_id; |
60 FileError error = | 60 FileError error = resource_metadata->GetIdByPath(file_path, &local_id); |
61 resource_metadata->GetIdByPath(file_path, &local_id); | |
62 if (error != FILE_ERROR_OK) | 61 if (error != FILE_ERROR_OK) |
63 return error; | 62 return error; |
64 | 63 |
65 error = resource_metadata->GetResourceEntryById(local_id, entry); | 64 error = resource_metadata->GetResourceEntryById(local_id, entry); |
66 if (error != FILE_ERROR_OK) | 65 if (error != FILE_ERROR_OK) |
67 return error; | 66 return error; |
68 | 67 |
69 // For entries that will never be cached, use the original resource entry | 68 // For entries that will never be cached, use the original resource entry |
70 // as is. | 69 // as is. |
71 if (!entry->has_file_specific_info() || | 70 if (!entry->has_file_specific_info() || |
(...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
640 } | 639 } |
641 | 640 |
642 void FileSystem::GetResourceEntryByPathAfterGetEntry( | 641 void FileSystem::GetResourceEntryByPathAfterGetEntry( |
643 const base::FilePath& file_path, | 642 const base::FilePath& file_path, |
644 const GetResourceEntryCallback& callback, | 643 const GetResourceEntryCallback& callback, |
645 scoped_ptr<ResourceEntry> entry, | 644 scoped_ptr<ResourceEntry> entry, |
646 FileError error) { | 645 FileError error) { |
647 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 646 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
648 DCHECK(!callback.is_null()); | 647 DCHECK(!callback.is_null()); |
649 | 648 |
650 if (error == FILE_ERROR_OK) { | 649 if (error == FILE_ERROR_NOT_FOUND) { |
651 callback.Run(error, entry.Pass()); | 650 // If the information about the path is not in the local ResourceMetadata, |
652 return; | 651 // try fetching information of the directory and retry. |
| 652 // |
| 653 // Note: this forms mutual recursion between GetResourceEntryByPath and |
| 654 // LoadDirectoryIfNeeded, because directory loading requires the existence |
| 655 // of directory entry itself. The recursion terminates because we always go |
| 656 // up the hierarchy by .DirName() bounded under the Drive root path. |
| 657 if (util::GetDriveGrandRootPath().IsParent(file_path)) { |
| 658 LoadDirectoryIfNeeded( |
| 659 file_path.DirName(), |
| 660 base::Bind(&FileSystem::GetResourceEntryByPathAfterLoad, |
| 661 weak_ptr_factory_.GetWeakPtr(), |
| 662 file_path, |
| 663 callback)); |
| 664 return; |
| 665 } |
653 } | 666 } |
654 | 667 |
655 // If the information about the path is not in the local ResourceMetadata, | 668 callback.Run(error, entry.Pass()); |
656 // try fetching information of the directory and retry. | |
657 LoadDirectoryIfNeeded( | |
658 file_path.DirName(), | |
659 base::Bind(&FileSystem::GetResourceEntryByPathAfterLoad, | |
660 weak_ptr_factory_.GetWeakPtr(), | |
661 file_path, | |
662 callback)); | |
663 } | 669 } |
664 | 670 |
665 void FileSystem::GetResourceEntryByPathAfterLoad( | 671 void FileSystem::GetResourceEntryByPathAfterLoad( |
666 const base::FilePath& file_path, | 672 const base::FilePath& file_path, |
667 const GetResourceEntryCallback& callback, | 673 const GetResourceEntryCallback& callback, |
668 FileError error) { | 674 FileError error) { |
669 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 675 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
670 DCHECK(!callback.is_null()); | 676 DCHECK(!callback.is_null()); |
671 | 677 |
672 if (error != FILE_ERROR_OK) { | 678 if (error != FILE_ERROR_OK) { |
(...skipping 28 matching lines...) Expand all Loading... |
701 weak_ptr_factory_.GetWeakPtr(), | 707 weak_ptr_factory_.GetWeakPtr(), |
702 directory_path, | 708 directory_path, |
703 callback)); | 709 callback)); |
704 } | 710 } |
705 | 711 |
706 void FileSystem::LoadDirectoryIfNeeded(const base::FilePath& directory_path, | 712 void FileSystem::LoadDirectoryIfNeeded(const base::FilePath& directory_path, |
707 const FileOperationCallback& callback) { | 713 const FileOperationCallback& callback) { |
708 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 714 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
709 DCHECK(!callback.is_null()); | 715 DCHECK(!callback.is_null()); |
710 | 716 |
711 // ResourceMetadata may know about the entry even if the resource | 717 GetResourceEntryByPath( |
712 // metadata is not yet fully loaded. | |
713 resource_metadata_->GetResourceEntryByPathOnUIThread( | |
714 directory_path, | 718 directory_path, |
715 base::Bind(&FileSystem::LoadDirectoryIfNeededAfterGetEntry, | 719 base::Bind(&FileSystem::LoadDirectoryIfNeededAfterGetEntry, |
716 weak_ptr_factory_.GetWeakPtr(), | 720 weak_ptr_factory_.GetWeakPtr(), |
717 directory_path, | 721 directory_path, |
718 callback)); | 722 callback)); |
719 } | 723 } |
720 | 724 |
721 void FileSystem::LoadDirectoryIfNeededAfterGetEntry( | 725 void FileSystem::LoadDirectoryIfNeededAfterGetEntry( |
722 const base::FilePath& directory_path, | 726 const base::FilePath& directory_path, |
723 const FileOperationCallback& callback, | 727 const FileOperationCallback& callback, |
724 FileError error, | 728 FileError error, |
725 scoped_ptr<ResourceEntry> entry) { | 729 scoped_ptr<ResourceEntry> entry) { |
726 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 730 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
727 DCHECK(!callback.is_null()); | 731 DCHECK(!callback.is_null()); |
728 | 732 |
729 if (error != FILE_ERROR_OK || | 733 if (error != FILE_ERROR_OK) { |
730 entry->resource_id() == util::kDriveOtherDirSpecialResourceId) { | 734 callback.Run(error); |
731 // If we don't know about the directory, or it is the "drive/other" | |
732 // directory that has to gather all orphan entries, start loading full | |
733 // resource list. | |
734 change_list_loader_->LoadIfNeeded(internal::DirectoryFetchInfo(), callback); | |
735 return; | 735 return; |
736 } | 736 } |
737 | 737 |
738 if (!entry->file_info().is_directory()) { | 738 if (!entry->file_info().is_directory()) { |
739 callback.Run(FILE_ERROR_NOT_A_DIRECTORY); | 739 callback.Run(FILE_ERROR_NOT_A_DIRECTORY); |
740 return; | 740 return; |
741 } | 741 } |
742 | 742 |
743 // Pass the directory fetch info so we can fetch the contents of the | 743 // Pass the directory fetch info so we can fetch the contents of the |
744 // directory before loading change lists. | 744 // directory before loading change lists. |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1089 if (util::IsSpecialResourceId(id)) | 1089 if (util::IsSpecialResourceId(id)) |
1090 return; | 1090 return; |
1091 | 1091 |
1092 util::Log(logging::LOG_INFO, | 1092 util::Log(logging::LOG_INFO, |
1093 "Thumbnail refresh for %s", directory_path.AsUTF8Unsafe().c_str()); | 1093 "Thumbnail refresh for %s", directory_path.AsUTF8Unsafe().c_str()); |
1094 change_list_loader_->LoadDirectoryFromServer( | 1094 change_list_loader_->LoadDirectoryFromServer( |
1095 id, base::Bind(&util::EmptyFileOperationCallback)); | 1095 id, base::Bind(&util::EmptyFileOperationCallback)); |
1096 } | 1096 } |
1097 | 1097 |
1098 } // namespace drive | 1098 } // namespace drive |
OLD | NEW |