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..1e67e3489e5e731e3e2de3b8695e90e5b914ca46 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,40 +20,60 @@ namespace { |
FileError FinishRevert(ResourceMetadata* metadata, |
const std::string& local_id, |
google_apis::GDataErrorCode status, |
- scoped_ptr<google_apis::ResourceEntry> resource_entry) { |
- FileError error = GDataToFileError(status); |
- if (error == FILE_ERROR_NOT_FOUND) |
- return metadata->RemoveEntry(local_id); |
- |
- if (error != FILE_ERROR_OK) |
- return error; |
- |
+ scoped_ptr<google_apis::ResourceEntry> resource_entry, |
+ std::set<base::FilePath>* changed_directories) { |
ResourceEntry entry; |
std::string parent_resource_id; |
- if (!ConvertToResourceEntry(*resource_entry, &entry, &parent_resource_id)) |
- return FILE_ERROR_NOT_A_FILE; |
+ FileError error = GDataToFileError(status); |
+ switch (error) { |
+ case FILE_ERROR_OK: |
+ if (!ConvertToResourceEntry(*resource_entry, &entry, &parent_resource_id)) |
+ return FILE_ERROR_NOT_A_FILE; |
+ break; |
+ |
+ case FILE_ERROR_NOT_FOUND: |
+ entry.set_deleted(true); |
+ break; |
+ |
+ default: |
+ return error; |
+ } |
- if (entry.deleted()) |
- return metadata->RemoveEntry(local_id); |
+ const base::FilePath original_path = metadata->GetFilePath(local_id); |
- std::string parent_local_id; |
- error = metadata->GetIdByResourceId(parent_resource_id, &parent_local_id); |
- if (error != FILE_ERROR_OK) |
- return error; |
+ if (entry.deleted()) { |
+ error = metadata->RemoveEntry(local_id); |
+ if (error != FILE_ERROR_OK) |
+ return error; |
- entry.set_local_id(local_id); |
- entry.set_parent_local_id(parent_local_id); |
+ changed_directories->insert(original_path.DirName()); |
+ } else { |
+ std::string parent_local_id; |
+ error = metadata->GetIdByResourceId(parent_resource_id, &parent_local_id); |
+ if (error != FILE_ERROR_OK) |
+ return error; |
- return metadata->RefreshEntry(entry); |
+ entry.set_local_id(local_id); |
+ entry.set_parent_local_id(parent_local_id); |
+ error = metadata->RefreshEntry(entry); |
+ if (error != FILE_ERROR_OK) |
+ return error; |
+ |
+ changed_directories->insert(metadata->GetFilePath(entry.parent_local_id())); |
+ changed_directories->insert(original_path.DirName()); |
+ } |
+ 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 +126,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::set<base::FilePath>* changed_directories = new std::set<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::set<base::FilePath>* changed_directories, |
+ FileError error) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(!callback.is_null()); |
+ |
+ for (std::set<base::FilePath>::const_iterator it = |
+ changed_directories->begin(); it != changed_directories->end(); ++it) |
+ observer_->OnDirectoryChangedByOperation(*it); |
+ |
+ callback.Run(error); |
} |
} // namespace internal |