| 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
|
|
|