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

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: remove drive_files.h from unittest 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 167238)
+++ 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,149 @@
}
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();
+ // Deleted file/directory.
+ if (entry_proto.deleted()) {
+ DVLOG(1) << "RemoveEntryFromParent " << entry_proto.base_name();
+ RemoveEntryFromParent(entry_proto.resource_id());
+ return;
+ }
- // Move children files over if we are dealing with directories.
- if (old_entry->AsDriveDirectory() && entry->AsDriveDirectory()) {
- entry->AsDriveDirectory()->TakeOverEntries(
- old_entry->AsDriveDirectory());
- }
+ resource_metadata_->GetEntryInfoByResourceId(entry_proto.resource_id(),
+ base::Bind(&DriveFeedProcessor::ContinueApplyEntryProto,
+ weak_ptr_factory_.GetWeakPtr(),
+ entry_proto));
+}
- // Remove the old instance of this entry.
- RemoveEntryFromParent(old_entry);
+void DriveFeedProcessor::ContinueApplyEntryProto(
+ const DriveEntryProto& entry_proto,
+ DriveFileError error,
+ const FilePath& drive_file_path,
+ scoped_ptr<DriveEntryProto> old_entry_proto) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- // Add to parent.
- AddEntryToParent(entry.release());
+ if (error == DRIVE_FILE_OK) {
+ // Entry exists and needs to be refreshed.
+ RefreshEntryProto(entry_proto);
} else {
- // Adding a new file.
- AddEntryToParent(entry.release());
+ // Adding a new entry.
+ AddEntryToParent(entry_proto);
}
+}
- // Process the next DriveEntryProto from the map.
+void DriveFeedProcessor::RefreshEntryProto(const DriveEntryProto& entry_proto) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ // Get all directories to be notified.
+ resource_metadata_->GetChangedDirectories(
+ entry_proto.resource_id(),
+ base::Bind(&DriveFeedProcessor::ContinueRefreshEntryProto,
+ weak_ptr_factory_.GetWeakPtr(),
+ entry_proto));
+}
+
+void DriveFeedProcessor::ContinueRefreshEntryProto(
+ const DriveEntryProto& entry_proto,
+ const std::set<FilePath>& changed_directories) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ resource_metadata_->RefreshEntryProto(
+ entry_proto,
+ base::Bind(&DriveFeedProcessor::NotifyForRefreshEntryProto,
+ weak_ptr_factory_.GetWeakPtr(),
+ changed_directories));
+}
+
+void DriveFeedProcessor::NotifyForRefreshEntryProto(
+ const std::set<FilePath>& changed_directories,
+ 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 children, old self and parent of old self.
+ changed_dirs_.insert(changed_directories.begin(),
+ changed_directories.end());
+
+ // Notify new parent.
+ changed_dirs_.insert(file_path.DirName());
+
+ // Notify new self.
+ if (!entry_proto->has_file_specific_info())
+ changed_dirs_.insert(file_path);
+ }
+
ApplyNextEntryProtoAsync();
}
-void DriveFeedProcessor::AddEntryToParent(
- DriveEntry* entry) {
+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.has_file_specific_info()));
+}
+
+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 std::string& resource_id) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ // We need to notify all children of entry if entry is a directory.
+ resource_metadata_->GetChangedDirectories(
+ resource_id,
+ base::Bind(&DriveFeedProcessor::ContinueRemoveEntryFromParent,
+ weak_ptr_factory_.GetWeakPtr(),
+ resource_id));
+}
+
+void DriveFeedProcessor::ContinueRemoveEntryFromParent(
+ const std::string& resource_id,
+ const std::set<FilePath>& changed_directories) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ resource_metadata_->RemoveEntryFromParent(
+ resource_id,
+ base::Bind(&DriveFeedProcessor::NotifyForRemoveEntryFromParent,
+ weak_ptr_factory_.GetWeakPtr(),
+ changed_directories));
+}
+
+void DriveFeedProcessor::NotifyForRemoveEntryFromParent(
+ const std::set<FilePath>& changed_directories,
+ DriveFileError error,
+ const FilePath& file_path) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ if (error == DRIVE_FILE_OK) {
+ changed_dirs_.insert(changed_directories.begin(),
+ changed_directories.end());
+ }
+ ApplyNextEntryProtoAsync();
+}
+
+void DriveFeedProcessor::AddEntryToParentDeprecated(DriveEntry* entry) {
DriveDirectory* parent = ResolveParent(entry);
if (!parent) { // Orphan.
@@ -197,8 +300,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 +308,9 @@
}
DriveDirectory* dir = entry->AsDriveDirectory();
- if (dir) {
+ if (dir)
satorux1 2012/11/15 01:49:10 nit: please add back {}. The body is not one line.
achuithb 2012/11/15 23:39:54 Made it one line; moved the comment. Removed the p
// We need to notify all children of entry if entry is a directory.
dir->GetChildDirectoryPaths(&changed_dirs_);
- // Besides children, notify this removed directory too.
- changed_dirs_.insert(dir->GetFilePath());
- }
parent->RemoveEntry(entry);
@@ -219,8 +318,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();

Powered by Google App Engine
This is Rietveld 408576698