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 670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
681 if (!net::GetMimeTypeFromExtension(local_file.Extension(), | 681 if (!net::GetMimeTypeFromExtension(local_file.Extension(), |
682 &upload_file_info->content_type)) { | 682 &upload_file_info->content_type)) { |
683 upload_file_info->content_type= kMimeTypeOctetStream; | 683 upload_file_info->content_type= kMimeTypeOctetStream; |
684 } | 684 } |
685 | 685 |
686 *error = base::PLATFORM_FILE_OK; | 686 *error = base::PLATFORM_FILE_OK; |
687 } | 687 } |
688 | 688 |
689 } // namespace | 689 } // namespace |
690 | 690 |
691 // FindEntryDelegate class implementation. | |
692 | |
693 FindEntryDelegate::~FindEntryDelegate() { | |
694 } | |
695 | |
696 // FindEntryCallbackRelayDelegate class implementation. | |
697 // This class is used to relay calls between sync and async versions | |
698 // of FindFileByPath(Sync|Async) calls. | |
699 class FindEntryCallbackRelayDelegate : public FindEntryDelegate { | |
700 public: | |
701 explicit FindEntryCallbackRelayDelegate(const FindEntryCallback& callback); | |
702 virtual ~FindEntryCallbackRelayDelegate(); | |
703 | |
704 private: | |
705 // FindEntryDelegate overrides. | |
706 virtual void OnDone(base::PlatformFileError error, | |
707 const FilePath& directory_path, | |
708 GDataEntry* entry) OVERRIDE; | |
709 | |
710 const FindEntryCallback callback_; | |
711 }; | |
712 | |
713 FindEntryCallbackRelayDelegate::FindEntryCallbackRelayDelegate( | |
714 const FindEntryCallback& callback) : callback_(callback) { | |
715 } | |
716 | |
717 FindEntryCallbackRelayDelegate::~FindEntryCallbackRelayDelegate() { | |
718 } | |
719 | |
720 void FindEntryCallbackRelayDelegate::OnDone(base::PlatformFileError error, | |
721 const FilePath& directory_path, | |
722 GDataEntry* entry) { | |
723 if (!callback_.is_null()) { | |
724 callback_.Run(error, directory_path, entry); | |
725 } | |
726 } | |
727 | |
728 // ReadOnlyFindEntryDelegate class implementation. | |
729 | |
730 ReadOnlyFindEntryDelegate::ReadOnlyFindEntryDelegate() : entry_(NULL) { | |
731 } | |
732 | |
733 void ReadOnlyFindEntryDelegate::OnDone(base::PlatformFileError error, | |
734 const FilePath& directory_path, | |
735 GDataEntry* entry) { | |
736 DCHECK(!entry_); | |
737 if (error == base::PLATFORM_FILE_OK) | |
738 entry_ = entry; | |
739 else | |
740 entry_ = NULL; | |
741 } | |
742 | |
743 // GDataFileProperties struct implementation. | 691 // GDataFileProperties struct implementation. |
744 | 692 |
745 GDataFileProperties::GDataFileProperties() : is_hosted_document(false) { | 693 GDataFileProperties::GDataFileProperties() : is_hosted_document(false) { |
746 } | 694 } |
747 | 695 |
748 GDataFileProperties::~GDataFileProperties() { | 696 GDataFileProperties::~GDataFileProperties() { |
749 } | 697 } |
750 | 698 |
751 // GDataFileSystem::GetDocumentsParams struct implementation. | 699 // GDataFileSystem::GetDocumentsParams struct implementation. |
752 | 700 |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
937 // TokenFetcher, used in DocumentsService, must be run on UI thread. | 885 // TokenFetcher, used in DocumentsService, must be run on UI thread. |
938 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 886 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
939 | 887 |
940 documents_service_->Authenticate(callback); | 888 documents_service_->Authenticate(callback); |
941 } | 889 } |
942 | 890 |
943 void GDataFileSystem::FindEntryByPathSync( | 891 void GDataFileSystem::FindEntryByPathSync( |
944 const FilePath& search_file_path, | 892 const FilePath& search_file_path, |
945 FindEntryDelegate* delegate) { | 893 FindEntryDelegate* delegate) { |
946 base::AutoLock lock(lock_); | 894 base::AutoLock lock(lock_); |
947 UnsafeFindEntryByPath(search_file_path, delegate); | 895 root_->FindEntryByPath(search_file_path, delegate); |
948 } | 896 } |
949 | 897 |
950 void GDataFileSystem::FindEntryByResourceIdSync( | 898 void GDataFileSystem::FindEntryByResourceIdSync( |
951 const std::string& resource_id, | 899 const std::string& resource_id, |
952 FindEntryDelegate* delegate) { | 900 FindEntryDelegate* delegate) { |
953 base::AutoLock lock(lock_); // To access the cache map. | 901 base::AutoLock lock(lock_); // To access the cache map. |
954 | 902 |
955 GDataFile* file = NULL; | 903 GDataFile* file = NULL; |
956 GDataEntry* entry = root_->GetEntryByResourceId(resource_id); | 904 GDataEntry* entry = root_->GetEntryByResourceId(resource_id); |
957 if (entry) | 905 if (entry) |
(...skipping 985 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1943 scoped_refptr<base::MessageLoopProxy> message_loop_proxy, | 1891 scoped_refptr<base::MessageLoopProxy> message_loop_proxy, |
1944 const ResumeFileUploadCallback& callback, | 1892 const ResumeFileUploadCallback& callback, |
1945 const ResumeUploadResponse& response, | 1893 const ResumeUploadResponse& response, |
1946 scoped_ptr<DocumentEntry> new_entry) { | 1894 scoped_ptr<DocumentEntry> new_entry) { |
1947 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1895 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
1948 if (!callback.is_null()) | 1896 if (!callback.is_null()) |
1949 message_loop_proxy->PostTask(FROM_HERE, | 1897 message_loop_proxy->PostTask(FROM_HERE, |
1950 base::Bind(callback, response, base::Passed(&new_entry))); | 1898 base::Bind(callback, response, base::Passed(&new_entry))); |
1951 } | 1899 } |
1952 | 1900 |
1953 void GDataFileSystem::UnsafeFindEntryByPath( | |
1954 const FilePath& file_path, | |
1955 FindEntryDelegate* delegate) { | |
1956 DCHECK(delegate); | |
1957 lock_.AssertAcquired(); | |
1958 | |
1959 std::vector<FilePath::StringType> components; | |
1960 file_path.GetComponents(&components); | |
1961 | |
1962 GDataDirectory* current_dir = root_.get(); | |
1963 FilePath directory_path; | |
1964 for (size_t i = 0; i < components.size() && current_dir; i++) { | |
1965 directory_path = directory_path.Append(current_dir->file_name()); | |
1966 | |
1967 // Last element must match, if not last then it must be a directory. | |
1968 if (i == components.size() - 1) { | |
1969 if (current_dir->file_name() == components[i]) | |
1970 delegate->OnDone(base::PLATFORM_FILE_OK, directory_path, current_dir); | |
1971 else | |
1972 delegate->OnDone(base::PLATFORM_FILE_ERROR_NOT_FOUND, FilePath(), NULL); | |
1973 | |
1974 return; | |
1975 } | |
1976 | |
1977 // Not the last part of the path, search for the next segment. | |
1978 GDataFileCollection::const_iterator file_iter = | |
1979 current_dir->children().find(components[i + 1]); | |
1980 if (file_iter == current_dir->children().end()) { | |
1981 delegate->OnDone(base::PLATFORM_FILE_ERROR_NOT_FOUND, FilePath(), NULL); | |
1982 return; | |
1983 } | |
1984 | |
1985 // Found file, must be the last segment. | |
1986 if (file_iter->second->file_info().is_directory) { | |
1987 // Found directory, continue traversal. | |
1988 current_dir = file_iter->second->AsGDataDirectory(); | |
1989 } else { | |
1990 if ((i + 1) == (components.size() - 1)) { | |
1991 delegate->OnDone(base::PLATFORM_FILE_OK, | |
1992 directory_path, | |
1993 file_iter->second); | |
1994 } else { | |
1995 delegate->OnDone(base::PLATFORM_FILE_ERROR_NOT_FOUND, FilePath(), NULL); | |
1996 } | |
1997 | |
1998 return; | |
1999 } | |
2000 } | |
2001 delegate->OnDone(base::PLATFORM_FILE_ERROR_NOT_FOUND, FilePath(), NULL); | |
2002 } | |
2003 | |
2004 bool GDataFileSystem::GetFileInfoByPath( | 1901 bool GDataFileSystem::GetFileInfoByPath( |
2005 const FilePath& file_path, GDataFileProperties* properties) { | 1902 const FilePath& file_path, GDataFileProperties* properties) { |
2006 DCHECK(properties); | 1903 DCHECK(properties); |
2007 base::AutoLock lock(lock_); | 1904 base::AutoLock lock(lock_); |
2008 GDataEntry* entry = GetGDataEntryByPath(file_path); | 1905 GDataEntry* entry = GetGDataEntryByPath(file_path); |
2009 if (!entry) | 1906 if (!entry) |
2010 return false; | 1907 return false; |
2011 | 1908 |
2012 properties->file_info = entry->file_info(); | 1909 properties->file_info = entry->file_info(); |
2013 properties->resource_id = entry->resource_id(); | 1910 properties->resource_id = entry->resource_id(); |
(...skipping 23 matching lines...) Expand all Loading... |
2037 NOTREACHED() << "Called on an unexpected thread: " | 1934 NOTREACHED() << "Called on an unexpected thread: " |
2038 << base::PlatformThread::CurrentId(); | 1935 << base::PlatformThread::CurrentId(); |
2039 return ui_weak_ptr_factory_->GetWeakPtr(); | 1936 return ui_weak_ptr_factory_->GetWeakPtr(); |
2040 } | 1937 } |
2041 | 1938 |
2042 GDataEntry* GDataFileSystem::GetGDataEntryByPath( | 1939 GDataEntry* GDataFileSystem::GetGDataEntryByPath( |
2043 const FilePath& file_path) { | 1940 const FilePath& file_path) { |
2044 lock_.AssertAcquired(); | 1941 lock_.AssertAcquired(); |
2045 // Find directory element within the cached file system snapshot. | 1942 // Find directory element within the cached file system snapshot. |
2046 ReadOnlyFindEntryDelegate find_delegate; | 1943 ReadOnlyFindEntryDelegate find_delegate; |
2047 UnsafeFindEntryByPath(file_path, &find_delegate); | 1944 root_->FindEntryByPath(file_path, &find_delegate); |
2048 return find_delegate.entry(); | 1945 return find_delegate.entry(); |
2049 } | 1946 } |
2050 | 1947 |
2051 void GDataFileSystem::GetCacheState(const std::string& resource_id, | 1948 void GDataFileSystem::GetCacheState(const std::string& resource_id, |
2052 const std::string& md5, | 1949 const std::string& md5, |
2053 const GetCacheStateCallback& callback) { | 1950 const GetCacheStateCallback& callback) { |
2054 // This method originates from GDataFile::GetCacheState, which already locks, | 1951 // This method originates from GDataFile::GetCacheState, which already locks, |
2055 // so we shouldn't lock here. | 1952 // so we shouldn't lock here. |
2056 UnsafeInitializeCacheIfNecessary(); | 1953 UnsafeInitializeCacheIfNecessary(); |
2057 | 1954 |
(...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2758 RemoveFromCache(resource_id, CacheOperationCallback()); | 2655 RemoveFromCache(resource_id, CacheOperationCallback()); |
2759 | 2656 |
2760 return base::PLATFORM_FILE_OK; | 2657 return base::PLATFORM_FILE_OK; |
2761 } | 2658 } |
2762 | 2659 |
2763 base::PlatformFileError GDataFileSystem::UpdateFromFeed( | 2660 base::PlatformFileError GDataFileSystem::UpdateFromFeed( |
2764 const std::vector<DocumentFeed*>& feed_list, | 2661 const std::vector<DocumentFeed*>& feed_list, |
2765 ContentOrigin origin, | 2662 ContentOrigin origin, |
2766 int start_changestamp, | 2663 int start_changestamp, |
2767 int root_feed_changestamp) { | 2664 int root_feed_changestamp) { |
2768 DVLOG(1) << "Updating directory with a feed"; | 2665 DVLOG(1) << "Updating directory with a feed"; |
2769 | 2666 |
2770 bool is_delta_feed = start_changestamp != 0; | 2667 bool is_delta_feed = start_changestamp != 0; |
2771 // We need to lock here as well (despite FindEntryByPath lock) since directory | 2668 // We need to lock here as well (despite FindEntryByPath lock) since directory |
2772 // instance below is a 'live' object. | 2669 // instance below is a 'live' object. |
2773 base::AutoLock lock(lock_); | 2670 base::AutoLock lock(lock_); |
2774 bool should_notify_initial_load = root_->origin() == INITIALIZING; | 2671 bool should_notify_initial_load = root_->origin() == INITIALIZING; |
2775 | 2672 |
2776 root_->set_origin(origin); | 2673 root_->set_origin(origin); |
2777 root_->set_refresh_time(base::Time::Now()); | 2674 root_->set_refresh_time(base::Time::Now()); |
2778 | 2675 |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2948 const DocumentFeed* feed = feed_list[i]; | 2845 const DocumentFeed* feed = feed_list[i]; |
2949 | 2846 |
2950 // Get upload url from the root feed. Links for all other collections will | 2847 // Get upload url from the root feed. Links for all other collections will |
2951 // be handled in GDatadirectory::FromDocumentEntry(); | 2848 // be handled in GDatadirectory::FromDocumentEntry(); |
2952 if (i == 0) { | 2849 if (i == 0) { |
2953 const Link* root_feed_upload_link = | 2850 const Link* root_feed_upload_link = |
2954 feed->GetLinkByType(Link::RESUMABLE_CREATE_MEDIA); | 2851 feed->GetLinkByType(Link::RESUMABLE_CREATE_MEDIA); |
2955 if (root_feed_upload_link) | 2852 if (root_feed_upload_link) |
2956 root_->set_upload_url(root_feed_upload_link->href()); | 2853 root_->set_upload_url(root_feed_upload_link->href()); |
2957 *feed_changestamp = feed->largest_changestamp(); | 2854 *feed_changestamp = feed->largest_changestamp(); |
2958 DCHECK(*feed_changestamp >= 0); | 2855 DCHECK_GE(*feed_changestamp, 0); |
2959 } | 2856 } |
2960 | 2857 |
2961 for (ScopedVector<DocumentEntry>::const_iterator iter = | 2858 for (ScopedVector<DocumentEntry>::const_iterator iter = |
2962 feed->entries().begin(); | 2859 feed->entries().begin(); |
2963 iter != feed->entries().end(); ++iter) { | 2860 iter != feed->entries().end(); ++iter) { |
2964 DocumentEntry* doc = *iter; | 2861 DocumentEntry* doc = *iter; |
2965 GDataEntry* entry = GDataEntry::FromDocumentEntry(NULL, doc, | 2862 GDataEntry* entry = GDataEntry::FromDocumentEntry(NULL, doc, |
2966 root_.get()); | 2863 root_.get()); |
2967 // Some document entries don't map into files (i.e. sites). | 2864 // Some document entries don't map into files (i.e. sites). |
2968 if (!entry) | 2865 if (!entry) |
(...skipping 1428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4397 pref_registrar_->Init(profile_->GetPrefs()); | 4294 pref_registrar_->Init(profile_->GetPrefs()); |
4398 pref_registrar_->Add(prefs::kDisableGDataHostedFiles, this); | 4295 pref_registrar_->Add(prefs::kDisableGDataHostedFiles, this); |
4399 } | 4296 } |
4400 | 4297 |
4401 void SetFreeDiskSpaceGetterForTesting(FreeDiskSpaceGetterInterface* getter) { | 4298 void SetFreeDiskSpaceGetterForTesting(FreeDiskSpaceGetterInterface* getter) { |
4402 delete global_free_disk_getter_for_testing; // Safe to delete NULL; | 4299 delete global_free_disk_getter_for_testing; // Safe to delete NULL; |
4403 global_free_disk_getter_for_testing = getter; | 4300 global_free_disk_getter_for_testing = getter; |
4404 } | 4301 } |
4405 | 4302 |
4406 } // namespace gdata | 4303 } // namespace gdata |
OLD | NEW |