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