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

Unified Diff: chrome/browser/chromeos/file_system_provider/provided_file_system.cc

Issue 625463002: [fsp] Add support for observing entries and notifying about changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months 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/file_system_provider/provided_file_system.cc
diff --git a/chrome/browser/chromeos/file_system_provider/provided_file_system.cc b/chrome/browser/chromeos/file_system_provider/provided_file_system.cc
index 1c8a6526aafa867c7e2e983628227b9095a8e562..b35d1d1afa7e7c0433d2525ca02e3ec40cea70c7 100644
--- a/chrome/browser/chromeos/file_system_provider/provided_file_system.cc
+++ b/chrome/browser/chromeos/file_system_provider/provided_file_system.cc
@@ -17,11 +17,13 @@
#include "chrome/browser/chromeos/file_system_provider/operations/delete_entry.h"
#include "chrome/browser/chromeos/file_system_provider/operations/get_metadata.h"
#include "chrome/browser/chromeos/file_system_provider/operations/move_entry.h"
+#include "chrome/browser/chromeos/file_system_provider/operations/observe_directory.h"
#include "chrome/browser/chromeos/file_system_provider/operations/open_file.h"
#include "chrome/browser/chromeos/file_system_provider/operations/read_directory.h"
#include "chrome/browser/chromeos/file_system_provider/operations/read_file.h"
#include "chrome/browser/chromeos/file_system_provider/operations/truncate.h"
#include "chrome/browser/chromeos/file_system_provider/operations/unmount.h"
+#include "chrome/browser/chromeos/file_system_provider/operations/unobserve_entry.h"
#include "chrome/browser/chromeos/file_system_provider/operations/write_file.h"
#include "chrome/browser/chromeos/file_system_provider/request_manager.h"
#include "chrome/browser/profiles/profile.h"
@@ -40,6 +42,8 @@ namespace {
void EmptyStatusCallback(base::File::Error /* result */) {
}
+// Handles
+
} // namespace
ProvidedFileSystem::ProvidedFileSystem(
@@ -317,6 +321,66 @@ ProvidedFileSystem::AbortCallback ProvidedFileSystem::Truncate(
&ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
}
+ProvidedFileSystem::AbortCallback ProvidedFileSystem::ObserveDirectory(
+ const base::FilePath& directory_path,
+ bool recursive,
+ const storage::AsyncFileUtil::StatusCallback& callback) {
+ // TODO(mtomasz): Wrap with an asynchronous queue.
+ const int request_id = request_manager_.CreateRequest(
+ OBSERVE_DIRECTORY,
+ scoped_ptr<RequestManager::HandlerInterface>(
+ new operations::ObserveDirectory(
+ event_router_,
+ file_system_info_,
+ directory_path,
+ recursive,
+ base::Bind(&ProvidedFileSystem::OnObserveDirectoryCompleted,
+ weak_ptr_factory_.GetWeakPtr(),
+ directory_path,
+ recursive,
+ callback))));
+ if (!request_id) {
+ callback.Run(base::File::FILE_ERROR_SECURITY);
+ return AbortCallback();
+ }
+
+ return base::Bind(
+ &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
+}
+
+ProvidedFileSystem::AbortCallback ProvidedFileSystem::UnobserveEntry(
+ const base::FilePath& entry_path,
+ const storage::AsyncFileUtil::StatusCallback& callback) {
+ // TODO(mtomasz): Wrap with an asynchronous queue.
+ const ObservedEntries::const_iterator it = observed_entries_.find(entry_path);
+ if (it != observed_entries_.end()) {
+ callback.Run(base::File::FILE_ERROR_NOT_FOUND);
+ return AbortCallback();
+ }
+
+ // Delete the watcher in advance since the list of observed entries is owned
+ // by the C++ layer, not by the extension.
+ observed_entries_.erase(it);
+
+ FOR_EACH_OBSERVER(Observer, observers_, OnObservedEntriesListChanged());
+
+ // TODO(mtomasz): Consider returning always an OK error code, since for the
+ // callers it's important that the entry is not watched anymore. The watcher
+ // is removed even if the extension returns an error.
+ const int request_id = request_manager_.CreateRequest(
+ UNOBSERVE_ENTRY,
+ scoped_ptr<RequestManager::HandlerInterface>(
+ new operations::UnobserveEntry(
+ event_router_, file_system_info_, entry_path, callback)));
+ if (!request_id) {
+ callback.Run(base::File::FILE_ERROR_SECURITY);
+ return AbortCallback();
+ }
+
+ return base::Bind(
+ &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
+}
+
const ProvidedFileSystemInfo& ProvidedFileSystem::GetFileSystemInfo() const {
return file_system_info_;
}
@@ -325,6 +389,25 @@ RequestManager* ProvidedFileSystem::GetRequestManager() {
return &request_manager_;
}
+ProvidedFileSystem::ObservedEntries* ProvidedFileSystem::GetObservedEntries() {
+ return &observed_entries_;
+}
+
+void ProvidedFileSystem::AddObserver(Observer* observer) {
+ DCHECK(observer);
+ observers_.AddObserver(observer);
+}
+
+void ProvidedFileSystem::RemoveObserver(Observer* observer) {
+ DCHECK(observer);
+ observers_.RemoveObserver(observer);
+}
+
+ObserverList<ProvidedFileSystemInterface::Observer>*
+ProvidedFileSystem::GetObservers() {
+ return &observers_;
+}
+
base::WeakPtr<ProvidedFileSystemInterface> ProvidedFileSystem::GetWeakPtr() {
return weak_ptr_factory_.GetWeakPtr();
}
@@ -346,5 +429,23 @@ void ProvidedFileSystem::Abort(
}
}
+void ProvidedFileSystem::OnObserveDirectoryCompleted(
+ const base::FilePath& directory_path,
+ bool recursive,
+ const storage::AsyncFileUtil::StatusCallback& callback,
+ base::File::Error result) {
+ if (result != base::File::FILE_OK) {
+ callback.Run(result);
+ return;
+ }
+
+ observed_entries_[directory_path].entry_path = directory_path;
+ observed_entries_[directory_path].recursive |= recursive;
+
+ FOR_EACH_OBSERVER(Observer, observers_, OnObservedEntriesListChanged());
+
+ callback.Run(result);
+}
+
} // namespace file_system_provider
} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698