16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Copyright (c) 2012 The Chromium Authors. All rights reserved.
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Use of this source code is governed by a BSD-style license that can be
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// found in the LICENSE file.
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// MediaFileSystemRegistry registers pictures directories and media devices as
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// File API filesystems and keeps track of the path to filesystem ID mappings.
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_FILE_SYSTEM_REGISTRY_H_
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_FILE_SYSTEM_REGISTRY_H_
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <map>
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string>
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <utility>
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <vector>
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/basictypes.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/files/file.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/files/file_path.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/memory/ref_counted.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/memory/scoped_ptr.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/media_galleries/media_galleries_preferences.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "components/storage_monitor/removable_storage_observer.h"
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ExtensionGalleriesHost;
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass GalleryWatchManager;
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass MediaFileSystemContext;
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass MediaGalleriesPreferences;
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass MediaScanManager;
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass Profile;
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnamespace content {
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass RenderViewHost;
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnamespace extensions {
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass Extension;
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgnamespace storage {
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass IsolatedContext;
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Contains information about a particular filesystem being provided to a
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// client, including metadata like the name and ID, and API handles like the
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// fsid (filesystem ID) used to hook up the API objects.
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct MediaFileSystemInfo {
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  MediaFileSystemInfo(const base::string16& fs_name,
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      const base::FilePath& fs_path,
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      const std::string& filesystem_id,
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      MediaGalleryPrefId pref_id,
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      const std::string& transient_device_id,
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      bool removable,
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      bool media_device);
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  MediaFileSystemInfo();
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  ~MediaFileSystemInfo();
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  base::string16 name;
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  base::FilePath path;
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  std::string fsid;
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  MediaGalleryPrefId pref_id;
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  std::string transient_device_id;
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  bool removable;
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  bool media_device;
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef base::Callback<void(const std::vector<MediaFileSystemInfo>&)>
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    MediaFileSystemsCallback;
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Tracks usage of filesystems by extensions.
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// This object lives on the UI thread.
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass MediaFileSystemRegistry
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    : public storage_monitor::RemovableStorageObserver,
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      public MediaGalleriesPreferences::GalleryChangeObserver {
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public:
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  MediaFileSystemRegistry();
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual ~MediaFileSystemRegistry();
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Passes to |callback| the list of media filesystem IDs and paths for a
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // given RVH.
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void GetMediaFileSystemsForExtension(
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      const content::RenderViewHost* rvh,
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      const extensions::Extension* extension,
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      const MediaFileSystemsCallback& callback);
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Attempt to register the file system for |pref_id|. If |extension| does not
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // have permission to |pref_id|, sends |callback| FILE_ERROR_NOT_FOUND.
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void RegisterMediaFileSystemForExtension(
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      const content::RenderViewHost* rvh,
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      const extensions::Extension* extension,
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      MediaGalleryPrefId pref_id,
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      const base::Callback<void(base::File::Error result)>& callback);
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Returns the media galleries preferences for the specified |profile|.
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Caller is responsible for ensuring that the preferences are initialized
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // before use.
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  MediaGalleriesPreferences* GetPreferences(Profile* profile);
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  MediaScanManager* media_scan_manager();
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  GalleryWatchManager* gallery_watch_manager();
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // RemovableStorageObserver implementation.
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual void OnRemovableStorageDetached(
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      const storage_monitor::StorageInfo& info) OVERRIDE;
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private:
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  class MediaFileSystemContextImpl;
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  friend class MediaFileSystemContextImpl;
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  friend class MediaFileSystemRegistryTest;
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  friend class TestMediaFileSystemContext;
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Map an extension to the ExtensionGalleriesHost.
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  typedef std::map<std::string /*extension_id*/,
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   scoped_refptr<ExtensionGalleriesHost> > ExtensionHostMap;
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Map a profile and extension to the ExtensionGalleriesHost.
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  typedef std::map<Profile*, ExtensionHostMap> ExtensionGalleriesHostMap;
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual void OnPermissionRemoved(MediaGalleriesPreferences* pref,
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                   const std::string& extension_id,
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                   MediaGalleryPrefId pref_id) OVERRIDE;
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual void OnGalleryRemoved(MediaGalleriesPreferences* pref,
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                MediaGalleryPrefId pref_id) OVERRIDE;
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Look up or create the extension gallery host.
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  ExtensionGalleriesHost* GetExtensionGalleryHost(
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      Profile* profile,
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      MediaGalleriesPreferences* preferences,
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      const std::string& extension_id);
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void OnExtensionGalleriesHostEmpty(Profile* profile,
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     const std::string& extension_id);
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // This map owns all the ExtensionGalleriesHost objects created.
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  ExtensionGalleriesHostMap extension_hosts_map_;
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  scoped_ptr<MediaFileSystemContext> file_system_context_;
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  scoped_ptr<MediaScanManager> media_scan_manager_;
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  scoped_ptr<GalleryWatchManager> gallery_watch_manager_;
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  DISALLOW_COPY_AND_ASSIGN(MediaFileSystemRegistry);
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  // CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_FILE_SYSTEM_REGISTRY_H_
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org