Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(983)

Unified Diff: chrome/browser/chromeos/drive/drive_feed_processor.cc

Issue 11293247: Make DriveFeedProcessor asynchronous. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: merge conflicts + feedback Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/drive/drive_feed_processor.cc
===================================================================
--- chrome/browser/chromeos/drive/drive_feed_processor.cc (revision 168559)
+++ chrome/browser/chromeos/drive/drive_feed_processor.cc (working copy)
@@ -101,7 +101,6 @@
FROM_HERE,
base::Bind(&DriveFeedProcessor::ApplyNextEntryProto,
weak_ptr_factory_.GetWeakPtr()));
-
}
void DriveFeedProcessor::ApplyNextEntryProto() {
@@ -139,45 +138,171 @@
}
void DriveFeedProcessor::ApplyEntryProto(const DriveEntryProto& entry_proto) {
- scoped_ptr<DriveEntry> entry =
- resource_metadata_->CreateDriveEntryFromProto(entry_proto);
- DCHECK(entry.get());
- DriveEntry* old_entry =
- resource_metadata_->GetEntryByResourceId(entry->resource_id());
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (entry->is_deleted()) {
- // Deleted file/directory.
- DVLOG(1) << "Removing file " << entry->base_name();
- if (old_entry)
- RemoveEntryFromParent(old_entry);
- } else if (old_entry) {
- // Change or move of existing entry.
- // Please note that entry rename is just a special case of change here
- // since name is just one of the properties that can change.
- DVLOG(1) << "Changed file " << entry->base_name();
+ // Lookup the entry.
+ resource_metadata_->GetEntryInfoByResourceId(
+ entry_proto.resource_id(),
+ base::Bind(&DriveFeedProcessor::ContinueApplyEntryProto,
+ weak_ptr_factory_.GetWeakPtr(),
+ entry_proto));
+}
- // Move children files over if we are dealing with directories.
- if (old_entry->AsDriveDirectory() && entry->AsDriveDirectory()) {
- entry->AsDriveDirectory()->TakeOverEntries(
- old_entry->AsDriveDirectory());
+void DriveFeedProcessor::ContinueApplyEntryProto(
+ const DriveEntryProto& entry_proto,
+ DriveFileError error,
+ const FilePath& file_path,
+ scoped_ptr<DriveEntryProto> old_entry_proto) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ if (error == DRIVE_FILE_OK) {
+ if (entry_proto.deleted()) {
+ // Deleted file/directory.
+ RemoveEntryFromParent(entry_proto, file_path);
+ } else {
+ // Entry exists and needs to be refreshed.
+ RefreshEntryProto(entry_proto, file_path);
}
+ } else if (error == DRIVE_FILE_ERROR_NOT_FOUND && !entry_proto.deleted()) {
+ // Adding a new entry.
+ AddEntryToParent(entry_proto);
+ } else {
+ // Continue.
+ ApplyNextEntryProtoAsync();
+ }
+}
- // Remove the old instance of this entry.
- RemoveEntryFromParent(old_entry);
+void DriveFeedProcessor::RefreshEntryProto(const DriveEntryProto& entry_proto,
+ const FilePath& file_path) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- // Add to parent.
- AddEntryToParent(entry.release());
+ resource_metadata_->RefreshEntryProto(
+ entry_proto,
+ base::Bind(&DriveFeedProcessor::NotifyForRefreshEntryProto,
+ weak_ptr_factory_.GetWeakPtr(),
+ file_path));
+}
+
+void DriveFeedProcessor::NotifyForRefreshEntryProto(
+ const FilePath& old_file_path,
+ DriveFileError error,
+ const FilePath& file_path,
+ scoped_ptr<DriveEntryProto> entry_proto) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ DVLOG(1) << "NotifyForRefreshEntryProto " << file_path.value();
+ if (error == DRIVE_FILE_OK) {
+ // Notify old parent.
+ changed_dirs_.insert(old_file_path.DirName());
+
+ // Notify new parent.
+ changed_dirs_.insert(file_path.DirName());
+
+ // Notify self if entry is a directory.
+ if (entry_proto->file_info().is_directory()) {
+ // Notify new self.
+ changed_dirs_.insert(file_path);
+ // Notify old self.
+ changed_dirs_.insert(old_file_path);
+ }
+ }
+
+ ApplyNextEntryProtoAsync();
+}
+
+void DriveFeedProcessor::AddEntryToParent(const DriveEntryProto& entry_proto) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ resource_metadata_->AddEntryToParent(entry_proto,
+ base::Bind(&DriveFeedProcessor::NotifyForAddEntryToParent,
+ weak_ptr_factory_.GetWeakPtr(),
+ entry_proto.file_info().is_directory()));
+}
+
+void DriveFeedProcessor::NotifyForAddEntryToParent(bool is_directory,
+ DriveFileError error,
+ const FilePath& file_path) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ DVLOG(1) << "NotifyForAddEntryToParent " << file_path.value();
+ if (error == DRIVE_FILE_OK) {
+ // Notify if a directory has been created.
+ if (is_directory)
+ changed_dirs_.insert(file_path);
+
+ // Notify parent.
+ changed_dirs_.insert(file_path.DirName());
+ }
+
+ ApplyNextEntryProtoAsync();
+}
+
+
+void DriveFeedProcessor::RemoveEntryFromParent(
+ const DriveEntryProto& entry_proto,
+ const FilePath& file_path) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(!file_path.empty());
+
+ if (!entry_proto.file_info().is_directory()) {
+ // No children if entry is a file.
+ OnGetChildrenForRemove(entry_proto,
+ file_path,
+ std::set<FilePath>());
} else {
- // Adding a new file.
- AddEntryToParent(entry.release());
+ // If entry is a directory, notify its children.
+ resource_metadata_->GetChildDirectories(
+ entry_proto.resource_id(),
+ base::Bind(&DriveFeedProcessor::OnGetChildrenForRemove,
+ weak_ptr_factory_.GetWeakPtr(),
+ entry_proto,
+ file_path));
}
+}
- // Process the next DriveEntryProto from the map.
+void DriveFeedProcessor::OnGetChildrenForRemove(
+ const DriveEntryProto& entry_proto,
+ const FilePath& file_path,
+ const std::set<FilePath>& changed_directories) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(!file_path.empty());
+
+ resource_metadata_->RemoveEntryFromParent(
+ entry_proto.resource_id(),
+ base::Bind(&DriveFeedProcessor::NotifyForRemoveEntryFromParent,
+ weak_ptr_factory_.GetWeakPtr(),
+ entry_proto.file_info().is_directory(),
+ file_path,
+ changed_directories));
+}
+
+void DriveFeedProcessor::NotifyForRemoveEntryFromParent(
+ bool is_directory,
+ const FilePath& file_path,
+ const std::set<FilePath>& changed_directories,
+ DriveFileError error,
+ const FilePath& parent_path) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ DVLOG(1) << "NotifyForRemoveEntryFromParent " << file_path.value();
+ if (error == DRIVE_FILE_OK) {
+ // Notify parent.
+ changed_dirs_.insert(parent_path);
+
+ // Notify children, if any.
+ changed_dirs_.insert(changed_directories.begin(),
+ changed_directories.end());
+
+ // If entry is a directory, notify self.
+ if (is_directory)
+ changed_dirs_.insert(file_path);
+ }
+
+ // Continue.
ApplyNextEntryProtoAsync();
}
-void DriveFeedProcessor::AddEntryToParent(
- DriveEntry* entry) {
+void DriveFeedProcessor::AddEntryToParentDeprecated(DriveEntry* entry) {
DriveDirectory* parent = ResolveParent(entry);
if (!parent) { // Orphan.
@@ -197,8 +322,7 @@
changed_dirs_.insert(parent->GetFilePath());
}
-void DriveFeedProcessor::RemoveEntryFromParent(
- DriveEntry* entry) {
+void DriveFeedProcessor::RemoveEntryFromParent(DriveEntry* entry) {
DriveDirectory* parent = entry->parent();
if (!parent) {
NOTREACHED();
@@ -206,12 +330,9 @@
}
DriveDirectory* dir = entry->AsDriveDirectory();
- if (dir) {
- // We need to notify all children of entry if entry is a directory.
+ // Notify all children of entry, if entry is a directory.
+ if (dir)
dir->GetChildDirectoryPaths(&changed_dirs_);
- // Besides children, notify this removed directory too.
- changed_dirs_.insert(dir->GetFilePath());
- }
parent->RemoveEntry(entry);
@@ -219,8 +340,7 @@
changed_dirs_.insert(parent->GetFilePath());
}
-DriveDirectory* DriveFeedProcessor::ResolveParent(
- DriveEntry* new_entry) {
+DriveDirectory* DriveFeedProcessor::ResolveParent(DriveEntry* new_entry) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
const std::string& parent_resource_id = new_entry->parent_resource_id();
@@ -267,7 +387,7 @@
continue;
// Count the number of files.
- if (uma_stats && entry_proto.has_file_specific_info()) {
+ if (uma_stats && !entry_proto.file_info().is_directory()) {
uma_stats->IncrementNumFiles(
entry_proto.file_specific_info().is_hosted_document());
}
« no previous file with comments | « chrome/browser/chromeos/drive/drive_feed_processor.h ('k') | chrome/browser/chromeos/drive/drive_resource_metadata.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698