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