1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// MediaFileSystemRegistry registers pictures directories and media devices as 6// File API filesystems and keeps track of the path to filesystem ID mappings. 7 8#ifndef CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_FILE_SYSTEM_REGISTRY_H_ 9#define CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_FILE_SYSTEM_REGISTRY_H_ 10 11#include <map> 12#include <string> 13#include <utility> 14#include <vector> 15 16#include "base/basictypes.h" 17#include "base/files/file.h" 18#include "base/files/file_path.h" 19#include "base/memory/ref_counted.h" 20#include "base/memory/scoped_ptr.h" 21#include "chrome/browser/media_galleries/media_galleries_preferences.h" 22#include "components/storage_monitor/removable_storage_observer.h" 23 24class ExtensionGalleriesHost; 25class GalleryWatchManager; 26class MediaFileSystemContext; 27class MediaGalleriesPreferences; 28class MediaScanManager; 29class Profile; 30 31namespace content { 32class RenderViewHost; 33} 34 35namespace extensions { 36class Extension; 37} 38 39namespace storage { 40class IsolatedContext; 41} 42 43// Contains information about a particular filesystem being provided to a 44// client, including metadata like the name and ID, and API handles like the 45// fsid (filesystem ID) used to hook up the API objects. 46struct MediaFileSystemInfo { 47 MediaFileSystemInfo(const base::string16& fs_name, 48 const base::FilePath& fs_path, 49 const std::string& filesystem_id, 50 MediaGalleryPrefId pref_id, 51 const std::string& transient_device_id, 52 bool removable, 53 bool media_device); 54 MediaFileSystemInfo(); 55 ~MediaFileSystemInfo(); 56 57 base::string16 name; 58 base::FilePath path; 59 std::string fsid; 60 MediaGalleryPrefId pref_id; 61 std::string transient_device_id; 62 bool removable; 63 bool media_device; 64}; 65 66typedef base::Callback<void(const std::vector<MediaFileSystemInfo>&)> 67 MediaFileSystemsCallback; 68 69// Tracks usage of filesystems by extensions. 70// This object lives on the UI thread. 71class MediaFileSystemRegistry 72 : public storage_monitor::RemovableStorageObserver, 73 public MediaGalleriesPreferences::GalleryChangeObserver { 74 public: 75 MediaFileSystemRegistry(); 76 virtual ~MediaFileSystemRegistry(); 77 78 // Passes to |callback| the list of media filesystem IDs and paths for a 79 // given RVH. 80 void GetMediaFileSystemsForExtension( 81 const content::RenderViewHost* rvh, 82 const extensions::Extension* extension, 83 const MediaFileSystemsCallback& callback); 84 85 // Attempt to register the file system for |pref_id|. If |extension| does not 86 // have permission to |pref_id|, sends |callback| FILE_ERROR_NOT_FOUND. 87 void RegisterMediaFileSystemForExtension( 88 const content::RenderViewHost* rvh, 89 const extensions::Extension* extension, 90 MediaGalleryPrefId pref_id, 91 const base::Callback<void(base::File::Error result)>& callback); 92 93 // Returns the media galleries preferences for the specified |profile|. 94 // Caller is responsible for ensuring that the preferences are initialized 95 // before use. 96 MediaGalleriesPreferences* GetPreferences(Profile* profile); 97 98 MediaScanManager* media_scan_manager(); 99 GalleryWatchManager* gallery_watch_manager(); 100 101 // RemovableStorageObserver implementation. 102 virtual void OnRemovableStorageDetached( 103 const storage_monitor::StorageInfo& info) OVERRIDE; 104 105 private: 106 class MediaFileSystemContextImpl; 107 108 friend class MediaFileSystemContextImpl; 109 friend class MediaFileSystemRegistryTest; 110 friend class TestMediaFileSystemContext; 111 112 // Map an extension to the ExtensionGalleriesHost. 113 typedef std::map<std::string /*extension_id*/, 114 scoped_refptr<ExtensionGalleriesHost> > ExtensionHostMap; 115 // Map a profile and extension to the ExtensionGalleriesHost. 116 typedef std::map<Profile*, ExtensionHostMap> ExtensionGalleriesHostMap; 117 118 virtual void OnPermissionRemoved(MediaGalleriesPreferences* pref, 119 const std::string& extension_id, 120 MediaGalleryPrefId pref_id) OVERRIDE; 121 virtual void OnGalleryRemoved(MediaGalleriesPreferences* pref, 122 MediaGalleryPrefId pref_id) OVERRIDE; 123 124 // Look up or create the extension gallery host. 125 ExtensionGalleriesHost* GetExtensionGalleryHost( 126 Profile* profile, 127 MediaGalleriesPreferences* preferences, 128 const std::string& extension_id); 129 130 void OnExtensionGalleriesHostEmpty(Profile* profile, 131 const std::string& extension_id); 132 133 // This map owns all the ExtensionGalleriesHost objects created. 134 ExtensionGalleriesHostMap extension_hosts_map_; 135 136 scoped_ptr<MediaFileSystemContext> file_system_context_; 137 138 scoped_ptr<MediaScanManager> media_scan_manager_; 139 scoped_ptr<GalleryWatchManager> gallery_watch_manager_; 140 141 DISALLOW_COPY_AND_ASSIGN(MediaFileSystemRegistry); 142}; 143 144#endif // CHROME_BROWSER_MEDIA_GALLERIES_MEDIA_FILE_SYSTEM_REGISTRY_H_ 145