Chromium Code Reviews| Index: chrome/browser/chromeos/drive/sync/entry_revert_performer.cc |
| diff --git a/chrome/browser/chromeos/drive/sync/entry_revert_performer.cc b/chrome/browser/chromeos/drive/sync/entry_revert_performer.cc |
| index e9cd6e5dd48e5d4893af605034eddd05445d8975..50a84ef104d56429e353ea8fb3b62cd24a7bf746 100644 |
| --- a/chrome/browser/chromeos/drive/sync/entry_revert_performer.cc |
| +++ b/chrome/browser/chromeos/drive/sync/entry_revert_performer.cc |
| @@ -5,6 +5,7 @@ |
| #include "chrome/browser/chromeos/drive/sync/entry_revert_performer.h" |
| #include "chrome/browser/chromeos/drive/drive.pb.h" |
| +#include "chrome/browser/chromeos/drive/file_system/operation_observer.h" |
| #include "chrome/browser/chromeos/drive/job_scheduler.h" |
| #include "chrome/browser/chromeos/drive/resource_entry_conversion.h" |
| #include "chrome/browser/chromeos/drive/resource_metadata.h" |
| @@ -19,7 +20,8 @@ namespace { |
| FileError FinishRevert(ResourceMetadata* metadata, |
| const std::string& local_id, |
| google_apis::GDataErrorCode status, |
| - scoped_ptr<google_apis::ResourceEntry> resource_entry) { |
| + scoped_ptr<google_apis::ResourceEntry> resource_entry, |
| + std::vector<base::FilePath>* changed_directories) { |
| FileError error = GDataToFileError(status); |
| if (error == FILE_ERROR_NOT_FOUND) |
| return metadata->RemoveEntry(local_id); |
| @@ -40,19 +42,30 @@ FileError FinishRevert(ResourceMetadata* metadata, |
| if (error != FILE_ERROR_OK) |
| return error; |
| + const base::FilePath original_path = metadata->GetFilePath(local_id); |
| + |
| entry.set_local_id(local_id); |
| entry.set_parent_local_id(parent_local_id); |
| - return metadata->RefreshEntry(entry); |
| + error = metadata->RefreshEntry(entry); |
| + if (error != FILE_ERROR_OK) |
| + return error; |
| + |
| + changed_directories->push_back(original_path.DirName()); |
| + changed_directories->push_back(metadata->GetFilePath(parent_local_id)); |
| + |
| + return FILE_ERROR_OK; |
| } |
| } // namespace |
| EntryRevertPerformer::EntryRevertPerformer( |
| base::SequencedTaskRunner* blocking_task_runner, |
| + file_system::OperationObserver* observer, |
| JobScheduler* scheduler, |
| ResourceMetadata* metadata) |
| : blocking_task_runner_(blocking_task_runner), |
| + observer_(observer), |
| scheduler_(scheduler), |
| metadata_(metadata), |
| weak_ptr_factory_(this) { |
| @@ -105,14 +118,31 @@ void EntryRevertPerformer::RevertEntryAfterGetResourceEntry( |
| google_apis::GDataErrorCode status, |
| scoped_ptr<google_apis::ResourceEntry> resource_entry) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + DCHECK(!callback.is_null()); |
| - // TODO(hashimoto): Notify OnDirectoryChanged event for affected directories. |
| + std::vector<base::FilePath>* changed_directories = |
|
kinaba
2013/12/06 07:04:05
Wouldn't it better be std::set? otherwise duplicat
hashimoto
2013/12/06 07:36:20
Done.
We should also fix MoveOperation?
kinaba
2013/12/06 07:41:40
Sounds good to do so.
|
| + new std::vector<base::FilePath>; |
| base::PostTaskAndReplyWithResult( |
| blocking_task_runner_.get(), |
| FROM_HERE, |
| base::Bind(&FinishRevert, metadata_, local_id, status, |
| - base::Passed(&resource_entry)), |
| - callback); |
| + base::Passed(&resource_entry), changed_directories), |
| + base::Bind(&EntryRevertPerformer::RevertEntryAfterFinishRevert, |
| + weak_ptr_factory_.GetWeakPtr(), callback, |
| + base::Owned(changed_directories))); |
| +} |
| + |
| +void EntryRevertPerformer::RevertEntryAfterFinishRevert( |
| + const FileOperationCallback& callback, |
| + const std::vector<base::FilePath>* changed_directories, |
| + FileError error) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + DCHECK(!callback.is_null()); |
| + |
| + for (size_t i = 0; i < changed_directories->size(); ++i) |
| + observer_->OnDirectoryChangedByOperation((*changed_directories)[i]); |
| + |
| + callback.Run(error); |
| } |
| } // namespace internal |