Chromium Code Reviews| 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,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->has_file_specific_info()) { |
|
satorux1
2012/11/19 01:24:24
The following would be a bit clearer:
entry_proto
|
| + // 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.has_file_specific_info())); |
|
satorux1
2012/11/19 01:24:24
ditto. please check other places too.
|
| +} |
| + |
| +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.has_file_specific_info()) { |
| + // 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.has_file_specific_info(), |
| + 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(); |