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

Unified Diff: chrome/browser/chromeos/drive/sync/entry_revert_performer.cc

Issue 102133008: drive: Call OnDirectoryChanged from EntryRevertPerformer (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix test Created 7 years 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/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

Powered by Google App Engine
This is Rietveld 408576698