1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef CHROME_BROWSER_MEDIA_GALLERIES_GALLERY_WATCH_MANAGER_H_ 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define CHROME_BROWSER_MEDIA_GALLERIES_GALLERY_WATCH_MANAGER_H_ 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <map> 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string> 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/basictypes.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/callback_forward.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/files/file_path.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/files/file_path_watcher.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/linked_ptr.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/weak_ptr.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/time/time.h" 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/media_galleries/media_galleries_preferences.h" 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/storage_monitor/removable_storage_observer.h" 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass GalleryWatchManagerObserver; 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace content { 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass BrowserContext; 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace extensions { 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass Extension; 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// The GalleryWatchManager is owned by MediaFileSystemRegistry, which is global. 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This class manages all watches on media galleries, regardless of profile. 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// It tracks outstanding watch requests and creates one FilePathWatcher per 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// watched directory. This class lives and is called on the UI thread. 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass GalleryWatchManager 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : public MediaGalleriesPreferences::GalleryChangeObserver, 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public storage_monitor::RemovableStorageObserver { 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // On success, |error| is empty. 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef base::Callback<void(const std::string& /* error */)> ResultCallback; 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static const char kInvalidGalleryIDError[]; 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static const char kNoPermissionError[]; 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static const char kCouldNotWatchGalleryError[]; 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GalleryWatchManager(); 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~GalleryWatchManager(); 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Add or remove observer of change events - this is the only way to 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // get the result of the file watches. There can only be one observer per 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // browser context. 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void AddObserver(content::BrowserContext* browser_context, 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GalleryWatchManagerObserver* observer); 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void RemoveObserver(content::BrowserContext* browser_context); 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Must be called when |browser_context| is shut down. 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void ShutdownBrowserContext(content::BrowserContext* browser_context); 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Add a watch for |gallery_id|. 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void AddWatch(content::BrowserContext* browser_context, 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const extensions::Extension* extension, 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MediaGalleryPrefId gallery_id, 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ResultCallback& callback); 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Remove the watch for |gallery_id|. It is valid to call this method on 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // non-existent watches. 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void RemoveWatch(content::BrowserContext* browser_context, 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& extension_id, 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MediaGalleryPrefId gallery_id); 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Remove all the watches for |extension_id|. 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void RemoveAllWatches(content::BrowserContext* browser_context, 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& extension_id); 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Return the set of galleries being watched for |extension_id|. 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MediaGalleryPrefIdSet GetWatchSet(content::BrowserContext* browser_context, 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& extension_id); 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class FileWatchManager; 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Used to track the gallery watches connected to a specific path. 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch struct WatchOwner { 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WatchOwner(content::BrowserContext* browser_context, 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& extension_id, 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MediaGalleryPrefId gallery_id); 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserContext* browser_context; 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string extension_id; 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MediaGalleryPrefId gallery_id; 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Needed to support storage in STL set, as well as usage as map key. 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool operator<(const WatchOwner& other) const; 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch struct NotificationInfo { 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NotificationInfo(); 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ~NotificationInfo(); 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::set<WatchOwner> owners; 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Time last_notify_time; 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool delayed_notification_pending; 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef std::map<WatchOwner, base::FilePath> WatchesMap; 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef std::map<base::FilePath, NotificationInfo> WatchedPaths; 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef std::map<content::BrowserContext*, GalleryWatchManagerObserver*> 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ObserverMap; 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Stop the FilePathWatcher for |path|. Updates |watched_paths_| but not 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |registered_watches_|. 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void DeactivateFileWatch(const WatchOwner& owner, const base::FilePath& path); 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Called by FilePathWatcher on the UI thread to respond to a request to 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // watch the path. 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnFileWatchActivated(const WatchOwner& owner, 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::FilePath& path, 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ResultCallback& callback, 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool success); 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Called by FilePathWatcher on the UI thread on a change event for |path|. 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnFilePathChanged(const base::FilePath& path, bool error); 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // MediaGalleriesPreferences::GalleryChangeObserver implementation. 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnPermissionRemoved(MediaGalleriesPreferences* pref, 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& extension_id, 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MediaGalleryPrefId pref_id) OVERRIDE; 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnGalleryRemoved(MediaGalleriesPreferences* pref, 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MediaGalleryPrefId pref_id) OVERRIDE; 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // storage_monitor::RemovableStorageObserver implementation. 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnRemovableStorageDetached( 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const storage_monitor::StorageInfo& info) OVERRIDE; 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // True if the we are already observing the storage monitor. 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool storage_monitor_observed_; 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // MediaGalleriesPreferences we are currently observing. 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::set<MediaGalleriesPreferences*> observed_preferences_; 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // All registered watches, keyed by WatchOwner. 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WatchesMap watches_; 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Reverse mapping of watched paths to the set of owning WatchOwners. 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WatchedPaths watched_paths_; 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Things that want to hear about gallery changes. 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ObserverMap observers_; 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Helper that does the watches on the FILE thread. 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<FileWatchManager> watch_manager_; 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::WeakPtrFactory<GalleryWatchManager> weak_factory_; 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(GalleryWatchManager); 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // CHROME_BROWSER_MEDIA_GALLERIES_GALLERY_WATCH_MANAGER_H_ 160