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 |