Index: chrome/browser/chromeos/gdata/gdata_file_system.cc |
diff --git a/chrome/browser/chromeos/gdata/gdata_file_system.cc b/chrome/browser/chromeos/gdata/gdata_file_system.cc |
index 48b3d12a4a28c3ad061c9bc48164ead19bcd7432..d2d5c9a40b772453413c1faff5b1da338f89c940 100644 |
--- a/chrome/browser/chromeos/gdata/gdata_file_system.cc |
+++ b/chrome/browser/chromeos/gdata/gdata_file_system.cc |
@@ -2551,6 +2551,110 @@ void GDataFileSystem::OnReadDirectory(const ReadDirectoryCallback& callback, |
callback.Run(base::PLATFORM_FILE_OK, directory_proto.Pass()); |
} |
+void GDataFileSystem::RequestDirectoryRefresh( |
+ const FilePath& file_path) { |
+ if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ const bool posted = BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&GDataFileSystem::RequestDirectoryRefreshOnUIThread, |
+ ui_weak_ptr_, |
+ file_path)); |
+ DCHECK(posted); |
+ return; |
+ } |
+ |
+ RequestDirectoryRefreshOnUIThread(file_path); |
+} |
+ |
+void GDataFileSystem::RequestDirectoryRefreshOnUIThread( |
+ const FilePath& file_path) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ base::AutoLock lock(lock_); // To use GetGDataEntryByPath() and root_. |
+ GDataEntry* entry = GetGDataEntryByPath(file_path); |
+ if (!entry || !entry->AsGDataDirectory()) { |
+ LOG(ERROR) << "Directory entry not found: " << file_path.value(); |
+ return; |
+ } |
+ |
+ if (entry->resource_id().empty()) { |
+ // This can happen if the directory is a virtual directory for search. |
+ LOG(ERROR) << "Resource ID not found: " << file_path.value(); |
+ return; |
+ } |
+ |
+ LoadFeedFromServer(root_->origin(), |
+ 0, // Not delta feed. |
+ 0, // Not used. |
+ true, // multiple feeds |
+ file_path, |
+ std::string(), // No search query |
+ entry->resource_id(), |
+ FindEntryCallback(), // Not used. |
+ base::Bind(&GDataFileSystem::OnRequestDirectoryRefresh, |
+ ui_weak_ptr_)); |
+} |
+ |
+void GDataFileSystem::OnRequestDirectoryRefresh( |
+ GetDocumentsParams* params, |
+ base::PlatformFileError error) { |
+ DCHECK(params); |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ const FilePath& directory_path = params->search_file_path; |
+ if (error != base::PLATFORM_FILE_OK) { |
+ LOG(ERROR) << "Failed to refresh directory: " << directory_path.value() |
+ << ": " << error; |
+ return; |
+ } |
+ |
+ base::AutoLock lock(lock_); // To use FeedToFileResourceMap() and root_. |
+ |
+ int unused_delta_feed_changestamp = 0; |
+ int unused_num_regular_files = 0; |
+ int unused_num_hosted_documents = 0; |
+ FileResourceIdMap file_map; |
+ error = FeedToFileResourceMap(*params->feed_list, |
+ &file_map, |
+ &unused_delta_feed_changestamp, |
+ &unused_num_regular_files, |
+ &unused_num_hosted_documents); |
+ if (error != base::PLATFORM_FILE_OK) { |
+ LOG(ERROR) << "Failed to convert feed: " << directory_path.value() |
+ << ": " << error; |
+ return; |
+ } |
+ |
+ GDataEntry* directory_entry = root_->GetEntryByResourceId( |
+ params->directory_resource_id); |
+ if (!directory_entry || !directory_entry->AsGDataDirectory()) { |
+ LOG(ERROR) << "Directory entry is gone: " << directory_path.value() |
+ << ": " << params->directory_resource_id; |
+ return; |
+ } |
+ GDataDirectory* directory = directory_entry->AsGDataDirectory(); |
+ |
+ // Remove the existing files. |
+ directory->RemoveChildFiles(); |
+ // Go through all entires generated by the feed and add files. |
+ for (FileResourceIdMap::const_iterator it = file_map.begin(); |
+ it != file_map.end(); ++it) { |
+ scoped_ptr<GDataEntry> entry(it->second); |
+ // Skip if it's not a file (i.e. directory). |
+ if (!entry->AsGDataFile()) |
+ continue; |
+ directory->AddEntry(entry.release()); |
+ } |
+ |
+ // Note that there may be no change in the directory, but it's expensive to |
+ // check if the new metadata matches the existing one, so we just always |
+ // notify that the directory is changed. |
+ NotifyDirectoryChanged(directory_path); |
+ DVLOG(1) << "Directory refreshed: " << directory_path.value(); |
+} |
+ |
bool GDataFileSystem::GetFileInfoByPath( |
const FilePath& file_path, GDataFileProperties* properties) { |
DCHECK(properties); |