Index: chrome/browser/chromeos/file_system_provider/provided_file_system.h |
diff --git a/chrome/browser/chromeos/file_system_provider/provided_file_system.h b/chrome/browser/chromeos/file_system_provider/provided_file_system.h |
index f2e6f4644c24b3649777583f4b6910950f3fd6d8..d421668d78825c27045e111f6e546b8af78f4d41 100644 |
--- a/chrome/browser/chromeos/file_system_provider/provided_file_system.h |
+++ b/chrome/browser/chromeos/file_system_provider/provided_file_system.h |
@@ -5,9 +5,14 @@ |
#ifndef CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_PROVIDED_FILE_SYSTEM_H_ |
#define CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_PROVIDED_FILE_SYSTEM_H_ |
+#include <string> |
+ |
+#include "base/memory/ref_counted.h" |
#include "base/memory/weak_ptr.h" |
+#include "base/observer_list.h" |
#include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h" |
#include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h" |
+#include "chrome/browser/chromeos/file_system_provider/provided_file_system_observer.h" |
#include "chrome/browser/chromeos/file_system_provider/request_manager.h" |
#include "storage/browser/fileapi/async_file_util.h" |
@@ -30,6 +35,37 @@ namespace file_system_provider { |
class NotificationManagerInterface; |
+// Automatically calls the |update_callback| after all of the callbacks created |
+// with |CreateCallback| are called. |
+// |
+// It's used to update tags of observed entries once a notification about a |
+// change are fully handles. It is to make sure that the change notification is |
+// fully handled before remembering the new tag. |
+// |
+// It is necessary to update the tag after all observers handle it fully, so |
+// in case of shutdown or a crash we get the notifications again. |
+class AutoUpdater : public base::RefCounted<AutoUpdater> { |
+ public: |
+ explicit AutoUpdater(const base::Closure& update_callback); |
+ |
+ // Creates a new callback which needs to be called before the update callback |
+ // is called. |
+ base::Closure CreateCallback(); |
+ |
+ private: |
+ friend class base::RefCounted<AutoUpdater>; |
+ |
+ // Called once the callback created with |CreateCallback| is executed. Once |
+ // all of such callbacks are called, then the update callback is invoked. |
+ void OnPendingCallback(); |
+ |
+ virtual ~AutoUpdater(); |
+ |
+ base::Closure update_callback_; |
+ int created_callbacks_; |
+ int pending_callbacks_; |
+}; |
+ |
// Provided file system implementation. Forwards requests between providers and |
// clients. |
class ProvidedFileSystem : public ProvidedFileSystemInterface { |
@@ -38,6 +74,16 @@ class ProvidedFileSystem : public ProvidedFileSystemInterface { |
const ProvidedFileSystemInfo& file_system_info); |
virtual ~ProvidedFileSystem(); |
+ // Sets a custom event router. Used in unit tests to mock out the real |
+ // extension. |
+ void SetEventRouterForTesting(extensions::EventRouter* event_router); |
+ |
+ // Sets a custom notification manager. It will recreate the request manager, |
+ // so is must be called just after creating ProvideFileSystem instance. |
+ // Used by unit tests. |
+ void SetNotificationManagerForTesting( |
+ scoped_ptr<NotificationManagerInterface> notification_manager); |
+ |
// ProvidedFileSystemInterface overrides. |
virtual AbortCallback RequestUnmount( |
const storage::AsyncFileUtil::StatusCallback& callback) override; |
@@ -89,8 +135,23 @@ class ProvidedFileSystem : public ProvidedFileSystemInterface { |
int64 offset, |
int length, |
const storage::AsyncFileUtil::StatusCallback& callback) override; |
+ virtual AbortCallback ObserveDirectory( |
+ const base::FilePath& directory_path, |
+ bool recursive, |
+ const storage::AsyncFileUtil::StatusCallback& callback) override; |
+ virtual void UnobserveEntry( |
+ const base::FilePath& entry_path, |
+ const storage::AsyncFileUtil::StatusCallback& callback) override; |
virtual const ProvidedFileSystemInfo& GetFileSystemInfo() const override; |
virtual RequestManager* GetRequestManager() override; |
+ virtual ObservedEntries* GetObservedEntries() override; |
+ virtual void AddObserver(ProvidedFileSystemObserver* observer) override; |
+ virtual void RemoveObserver(ProvidedFileSystemObserver* observer) override; |
+ virtual bool Notify( |
+ const base::FilePath& observed_path, |
+ ProvidedFileSystemObserver::ChangeType change_type, |
+ const ProvidedFileSystemObserver::ChildChanges& child_changes, |
+ const std::string& tag) override; |
virtual base::WeakPtr<ProvidedFileSystemInterface> GetWeakPtr() override; |
private: |
@@ -100,11 +161,27 @@ class ProvidedFileSystem : public ProvidedFileSystemInterface { |
void Abort(int operation_request_id, |
const storage::AsyncFileUtil::StatusCallback& callback); |
+ // Called when a directory becomes watched successfully. |
+ void OnObserveDirectoryCompleted( |
+ const base::FilePath& directory_path, |
+ bool recursive, |
+ const storage::AsyncFileUtil::StatusCallback& callback, |
+ base::File::Error result); |
+ |
+ // Called when all observers finished handling the change notification. It |
+ // updates the tag from |last_tag| to |tag| for the entry at |observed_path|. |
+ void OnNotifyCompleted(const base::FilePath& observed_path, |
+ ProvidedFileSystemObserver::ChangeType change_type, |
+ const std::string& last_tag, |
+ const std::string& tag); |
+ |
Profile* profile_; // Not owned. |
extensions::EventRouter* event_router_; // Not owned. May be NULL. |
ProvidedFileSystemInfo file_system_info_; |
scoped_ptr<NotificationManagerInterface> notification_manager_; |
- RequestManager request_manager_; |
+ scoped_ptr<RequestManager> request_manager_; |
+ ObservedEntries observed_entries_; |
+ ObserverList<ProvidedFileSystemObserver> observers_; |
base::WeakPtrFactory<ProvidedFileSystem> weak_ptr_factory_; |
DISALLOW_COPY_AND_ASSIGN(ProvidedFileSystem); |