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