| 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 <errno.h> | 7 #include <errno.h> |
| 8 #include <sys/stat.h> | 8 #include <sys/stat.h> |
| 9 | 9 |
| 10 #include <set> | 10 #include <set> |
| (...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 733 } | 733 } |
| 734 | 734 |
| 735 *mime_type = kMimeTypeJson; | 735 *mime_type = kMimeTypeJson; |
| 736 *file_type = HOSTED_DOCUMENT; | 736 *file_type = HOSTED_DOCUMENT; |
| 737 if (*error != base::PLATFORM_FILE_OK) | 737 if (*error != base::PLATFORM_FILE_OK) |
| 738 temp_file_path->clear(); | 738 temp_file_path->clear(); |
| 739 } | 739 } |
| 740 | 740 |
| 741 } // namespace | 741 } // namespace |
| 742 | 742 |
| 743 // FindEntryDelegate class implementation. | |
| 744 | |
| 745 FindEntryDelegate::~FindEntryDelegate() { | |
| 746 } | |
| 747 | |
| 748 // FindEntryCallbackRelayDelegate class implementation. | |
| 749 // This class is used to relay calls between sync and async versions | |
| 750 // of FindFileByPath(Sync|Async) calls. | |
| 751 class FindEntryCallbackRelayDelegate : public FindEntryDelegate { | |
| 752 public: | |
| 753 explicit FindEntryCallbackRelayDelegate(const FindEntryCallback& callback); | |
| 754 virtual ~FindEntryCallbackRelayDelegate(); | |
| 755 | |
| 756 private: | |
| 757 // FindEntryDelegate overrides. | |
| 758 virtual void OnDone(base::PlatformFileError error, | |
| 759 const FilePath& directory_path, | |
| 760 GDataEntry* entry) OVERRIDE; | |
| 761 | |
| 762 const FindEntryCallback callback_; | |
| 763 }; | |
| 764 | |
| 765 FindEntryCallbackRelayDelegate::FindEntryCallbackRelayDelegate( | |
| 766 const FindEntryCallback& callback) : callback_(callback) { | |
| 767 } | |
| 768 | |
| 769 FindEntryCallbackRelayDelegate::~FindEntryCallbackRelayDelegate() { | |
| 770 } | |
| 771 | |
| 772 void FindEntryCallbackRelayDelegate::OnDone(base::PlatformFileError error, | |
| 773 const FilePath& directory_path, | |
| 774 GDataEntry* entry) { | |
| 775 if (!callback_.is_null()) { | |
| 776 callback_.Run(error, directory_path, entry); | |
| 777 } | |
| 778 } | |
| 779 | |
| 780 // ReadOnlyFindEntryDelegate class implementation. | |
| 781 | |
| 782 ReadOnlyFindEntryDelegate::ReadOnlyFindEntryDelegate() : entry_(NULL) { | |
| 783 } | |
| 784 | |
| 785 void ReadOnlyFindEntryDelegate::OnDone(base::PlatformFileError error, | |
| 786 const FilePath& directory_path, | |
| 787 GDataEntry* entry) { | |
| 788 DCHECK(!entry_); | |
| 789 if (error == base::PLATFORM_FILE_OK) | |
| 790 entry_ = entry; | |
| 791 else | |
| 792 entry_ = NULL; | |
| 793 } | |
| 794 | |
| 795 // GDataFileProperties struct implementation. | 743 // GDataFileProperties struct implementation. |
| 796 | 744 |
| 797 GDataFileProperties::GDataFileProperties() : is_hosted_document(false) { | 745 GDataFileProperties::GDataFileProperties() : is_hosted_document(false) { |
| 798 } | 746 } |
| 799 | 747 |
| 800 GDataFileProperties::~GDataFileProperties() { | 748 GDataFileProperties::~GDataFileProperties() { |
| 801 } | 749 } |
| 802 | 750 |
| 803 // GDataFileSystem::GetDocumentsParams struct implementation. | 751 // GDataFileSystem::GetDocumentsParams struct implementation. |
| 804 | 752 |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 989 // TokenFetcher, used in DocumentsService, must be run on UI thread. | 937 // TokenFetcher, used in DocumentsService, must be run on UI thread. |
| 990 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 938 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 991 | 939 |
| 992 documents_service_->Authenticate(callback); | 940 documents_service_->Authenticate(callback); |
| 993 } | 941 } |
| 994 | 942 |
| 995 void GDataFileSystem::FindEntryByPathSync( | 943 void GDataFileSystem::FindEntryByPathSync( |
| 996 const FilePath& search_file_path, | 944 const FilePath& search_file_path, |
| 997 FindEntryDelegate* delegate) { | 945 FindEntryDelegate* delegate) { |
| 998 base::AutoLock lock(lock_); | 946 base::AutoLock lock(lock_); |
| 999 UnsafeFindEntryByPath(search_file_path, delegate); | 947 root_->FindEntryByPath(search_file_path, delegate); |
| 1000 } | 948 } |
| 1001 | 949 |
| 1002 void GDataFileSystem::FindEntryByResourceIdSync( | 950 void GDataFileSystem::FindEntryByResourceIdSync( |
| 1003 const std::string& resource_id, | 951 const std::string& resource_id, |
| 1004 FindEntryDelegate* delegate) { | 952 FindEntryDelegate* delegate) { |
| 1005 base::AutoLock lock(lock_); // To access the cache map. | 953 base::AutoLock lock(lock_); // To access the cache map. |
| 1006 | 954 |
| 1007 GDataFile* file = NULL; | 955 GDataFile* file = NULL; |
| 1008 GDataEntry* entry = root_->GetEntryByResourceId(resource_id); | 956 GDataEntry* entry = root_->GetEntryByResourceId(resource_id); |
| 1009 if (entry) | 957 if (entry) |
| (...skipping 906 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1916 } | 1864 } |
| 1917 | 1865 |
| 1918 void GDataFileSystem::ResumeUpload( | 1866 void GDataFileSystem::ResumeUpload( |
| 1919 const ResumeUploadParams& params, | 1867 const ResumeUploadParams& params, |
| 1920 const ResumeFileUploadCallback& callback) { | 1868 const ResumeFileUploadCallback& callback) { |
| 1921 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1869 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1922 | 1870 |
| 1923 documents_service_->ResumeUpload(params, callback); | 1871 documents_service_->ResumeUpload(params, callback); |
| 1924 } | 1872 } |
| 1925 | 1873 |
| 1926 void GDataFileSystem::UnsafeFindEntryByPath( | |
| 1927 const FilePath& file_path, | |
| 1928 FindEntryDelegate* delegate) { | |
| 1929 DCHECK(delegate); | |
| 1930 lock_.AssertAcquired(); | |
| 1931 | |
| 1932 std::vector<FilePath::StringType> components; | |
| 1933 file_path.GetComponents(&components); | |
| 1934 | |
| 1935 GDataDirectory* current_dir = root_.get(); | |
| 1936 FilePath directory_path; | |
| 1937 for (size_t i = 0; i < components.size() && current_dir; i++) { | |
| 1938 directory_path = directory_path.Append(current_dir->file_name()); | |
| 1939 | |
| 1940 // Last element must match, if not last then it must be a directory. | |
| 1941 if (i == components.size() - 1) { | |
| 1942 if (current_dir->file_name() == components[i]) | |
| 1943 delegate->OnDone(base::PLATFORM_FILE_OK, directory_path, current_dir); | |
| 1944 else | |
| 1945 delegate->OnDone(base::PLATFORM_FILE_ERROR_NOT_FOUND, FilePath(), NULL); | |
| 1946 | |
| 1947 return; | |
| 1948 } | |
| 1949 | |
| 1950 // Not the last part of the path, search for the next segment. | |
| 1951 GDataFileCollection::const_iterator file_iter = | |
| 1952 current_dir->children().find(components[i + 1]); | |
| 1953 if (file_iter == current_dir->children().end()) { | |
| 1954 delegate->OnDone(base::PLATFORM_FILE_ERROR_NOT_FOUND, FilePath(), NULL); | |
| 1955 return; | |
| 1956 } | |
| 1957 | |
| 1958 // Found file, must be the last segment. | |
| 1959 if (file_iter->second->file_info().is_directory) { | |
| 1960 // Found directory, continue traversal. | |
| 1961 current_dir = file_iter->second->AsGDataDirectory(); | |
| 1962 } else { | |
| 1963 if ((i + 1) == (components.size() - 1)) { | |
| 1964 delegate->OnDone(base::PLATFORM_FILE_OK, | |
| 1965 directory_path, | |
| 1966 file_iter->second); | |
| 1967 } else { | |
| 1968 delegate->OnDone(base::PLATFORM_FILE_ERROR_NOT_FOUND, FilePath(), NULL); | |
| 1969 } | |
| 1970 | |
| 1971 return; | |
| 1972 } | |
| 1973 } | |
| 1974 delegate->OnDone(base::PLATFORM_FILE_ERROR_NOT_FOUND, FilePath(), NULL); | |
| 1975 } | |
| 1976 | |
| 1977 bool GDataFileSystem::GetFileInfoByPath( | 1874 bool GDataFileSystem::GetFileInfoByPath( |
| 1978 const FilePath& file_path, GDataFileProperties* properties) { | 1875 const FilePath& file_path, GDataFileProperties* properties) { |
| 1979 DCHECK(properties); | 1876 DCHECK(properties); |
| 1980 base::AutoLock lock(lock_); | 1877 base::AutoLock lock(lock_); |
| 1981 GDataEntry* entry = GetGDataEntryByPath(file_path); | 1878 GDataEntry* entry = GetGDataEntryByPath(file_path); |
| 1982 if (!entry) | 1879 if (!entry) |
| 1983 return false; | 1880 return false; |
| 1984 | 1881 |
| 1985 properties->file_info = entry->file_info(); | 1882 properties->file_info = entry->file_info(); |
| 1986 properties->resource_id = entry->resource_id(); | 1883 properties->resource_id = entry->resource_id(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2010 NOTREACHED() << "Called on an unexpected thread: " | 1907 NOTREACHED() << "Called on an unexpected thread: " |
| 2011 << base::PlatformThread::CurrentId(); | 1908 << base::PlatformThread::CurrentId(); |
| 2012 return ui_weak_ptr_factory_->GetWeakPtr(); | 1909 return ui_weak_ptr_factory_->GetWeakPtr(); |
| 2013 } | 1910 } |
| 2014 | 1911 |
| 2015 GDataEntry* GDataFileSystem::GetGDataEntryByPath( | 1912 GDataEntry* GDataFileSystem::GetGDataEntryByPath( |
| 2016 const FilePath& file_path) { | 1913 const FilePath& file_path) { |
| 2017 lock_.AssertAcquired(); | 1914 lock_.AssertAcquired(); |
| 2018 // Find directory element within the cached file system snapshot. | 1915 // Find directory element within the cached file system snapshot. |
| 2019 ReadOnlyFindEntryDelegate find_delegate; | 1916 ReadOnlyFindEntryDelegate find_delegate; |
| 2020 UnsafeFindEntryByPath(file_path, &find_delegate); | 1917 root_->FindEntryByPath(file_path, &find_delegate); |
| 2021 return find_delegate.entry(); | 1918 return find_delegate.entry(); |
| 2022 } | 1919 } |
| 2023 | 1920 |
| 2024 void GDataFileSystem::GetCacheState(const std::string& resource_id, | 1921 void GDataFileSystem::GetCacheState(const std::string& resource_id, |
| 2025 const std::string& md5, | 1922 const std::string& md5, |
| 2026 const GetCacheStateCallback& callback) { | 1923 const GetCacheStateCallback& callback) { |
| 2027 // This method originates from GDataFile::GetCacheState, which already locks, | 1924 // This method originates from GDataFile::GetCacheState, which already locks, |
| 2028 // so we shouldn't lock here. | 1925 // so we shouldn't lock here. |
| 2029 UnsafeInitializeCacheIfNecessary(); | 1926 UnsafeInitializeCacheIfNecessary(); |
| 2030 | 1927 |
| (...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2731 RemoveFromCache(resource_id, CacheOperationCallback()); | 2628 RemoveFromCache(resource_id, CacheOperationCallback()); |
| 2732 | 2629 |
| 2733 return base::PLATFORM_FILE_OK; | 2630 return base::PLATFORM_FILE_OK; |
| 2734 } | 2631 } |
| 2735 | 2632 |
| 2736 base::PlatformFileError GDataFileSystem::UpdateFromFeed( | 2633 base::PlatformFileError GDataFileSystem::UpdateFromFeed( |
| 2737 const std::vector<DocumentFeed*>& feed_list, | 2634 const std::vector<DocumentFeed*>& feed_list, |
| 2738 ContentOrigin origin, | 2635 ContentOrigin origin, |
| 2739 int start_changestamp, | 2636 int start_changestamp, |
| 2740 int root_feed_changestamp) { | 2637 int root_feed_changestamp) { |
| 2741 DVLOG(1) << "Updating directory with a feed"; | 2638 DVLOG(1) << "Updating directory with a feed"; |
| 2742 | 2639 |
| 2743 bool is_delta_feed = start_changestamp != 0; | 2640 bool is_delta_feed = start_changestamp != 0; |
| 2744 // We need to lock here as well (despite FindEntryByPath lock) since directory | 2641 // We need to lock here as well (despite FindEntryByPath lock) since directory |
| 2745 // instance below is a 'live' object. | 2642 // instance below is a 'live' object. |
| 2746 base::AutoLock lock(lock_); | 2643 base::AutoLock lock(lock_); |
| 2747 bool should_notify_initial_load = root_->origin() == INITIALIZING; | 2644 bool should_notify_initial_load = root_->origin() == INITIALIZING; |
| 2748 | 2645 |
| 2749 root_->set_origin(origin); | 2646 root_->set_origin(origin); |
| 2750 root_->set_refresh_time(base::Time::Now()); | 2647 root_->set_refresh_time(base::Time::Now()); |
| 2751 | 2648 |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2921 const DocumentFeed* feed = feed_list[i]; | 2818 const DocumentFeed* feed = feed_list[i]; |
| 2922 | 2819 |
| 2923 // Get upload url from the root feed. Links for all other collections will | 2820 // Get upload url from the root feed. Links for all other collections will |
| 2924 // be handled in GDatadirectory::FromDocumentEntry(); | 2821 // be handled in GDatadirectory::FromDocumentEntry(); |
| 2925 if (i == 0) { | 2822 if (i == 0) { |
| 2926 const Link* root_feed_upload_link = | 2823 const Link* root_feed_upload_link = |
| 2927 feed->GetLinkByType(Link::RESUMABLE_CREATE_MEDIA); | 2824 feed->GetLinkByType(Link::RESUMABLE_CREATE_MEDIA); |
| 2928 if (root_feed_upload_link) | 2825 if (root_feed_upload_link) |
| 2929 root_->set_upload_url(root_feed_upload_link->href()); | 2826 root_->set_upload_url(root_feed_upload_link->href()); |
| 2930 *feed_changestamp = feed->largest_changestamp(); | 2827 *feed_changestamp = feed->largest_changestamp(); |
| 2931 DCHECK(*feed_changestamp >= 0); | 2828 DCHECK_GE(*feed_changestamp, 0); |
| 2932 } | 2829 } |
| 2933 | 2830 |
| 2934 for (ScopedVector<DocumentEntry>::const_iterator iter = | 2831 for (ScopedVector<DocumentEntry>::const_iterator iter = |
| 2935 feed->entries().begin(); | 2832 feed->entries().begin(); |
| 2936 iter != feed->entries().end(); ++iter) { | 2833 iter != feed->entries().end(); ++iter) { |
| 2937 DocumentEntry* doc = *iter; | 2834 DocumentEntry* doc = *iter; |
| 2938 GDataEntry* entry = GDataEntry::FromDocumentEntry(NULL, doc, | 2835 GDataEntry* entry = GDataEntry::FromDocumentEntry(NULL, doc, |
| 2939 root_.get()); | 2836 root_.get()); |
| 2940 // Some document entries don't map into files (i.e. sites). | 2837 // Some document entries don't map into files (i.e. sites). |
| 2941 if (!entry) | 2838 if (!entry) |
| (...skipping 1428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4370 pref_registrar_->Init(profile_->GetPrefs()); | 4267 pref_registrar_->Init(profile_->GetPrefs()); |
| 4371 pref_registrar_->Add(prefs::kDisableGDataHostedFiles, this); | 4268 pref_registrar_->Add(prefs::kDisableGDataHostedFiles, this); |
| 4372 } | 4269 } |
| 4373 | 4270 |
| 4374 void SetFreeDiskSpaceGetterForTesting(FreeDiskSpaceGetterInterface* getter) { | 4271 void SetFreeDiskSpaceGetterForTesting(FreeDiskSpaceGetterInterface* getter) { |
| 4375 delete global_free_disk_getter_for_testing; // Safe to delete NULL; | 4272 delete global_free_disk_getter_for_testing; // Safe to delete NULL; |
| 4376 global_free_disk_getter_for_testing = getter; | 4273 global_free_disk_getter_for_testing = getter; |
| 4377 } | 4274 } |
| 4378 | 4275 |
| 4379 } // namespace gdata | 4276 } // namespace gdata |
| OLD | NEW |