Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(113)

Side by Side Diff: chrome/browser/media_galleries/imported_media_gallery_registry.cc

Issue 185393012: Change media galleries to external file system type to add toURL support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Mac/Win compile Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/media_galleries/imported_media_gallery_registry.h" 5 #include "chrome/browser/media_galleries/imported_media_gallery_registry.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/file_util.h"
8 #include "base/logging.h" 9 #include "base/logging.h"
9 #include "chrome/browser/media_galleries/fileapi/iphoto_data_provider.h" 10 #include "chrome/browser/media_galleries/fileapi/iphoto_data_provider.h"
10 #include "chrome/browser/media_galleries/fileapi/itunes_data_provider.h" 11 #include "chrome/browser/media_galleries/fileapi/itunes_data_provider.h"
11 #include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h" 12 #include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
12 #include "chrome/browser/media_galleries/fileapi/picasa_data_provider.h" 13 #include "chrome/browser/media_galleries/fileapi/picasa_data_provider.h"
13 #include "chrome/common/extensions/extension_constants.h" 14 #include "chrome/common/extensions/extension_constants.h"
14 #include "content/public/browser/browser_thread.h" 15 #include "content/public/browser/browser_thread.h"
15 #include "webkit/browser/fileapi/isolated_context.h" 16 #include "webkit/browser/fileapi/external_mount_points.h"
16 17
17 using base::Bind; 18 using base::Bind;
18 using fileapi::IsolatedContext; 19 using fileapi::ExternalMountPoints;
19 20
20 namespace { 21 namespace {
21 22
22 static base::LazyInstance<ImportedMediaGalleryRegistry>::Leaky 23 static base::LazyInstance<ImportedMediaGalleryRegistry>::Leaky
23 g_imported_media_gallery_registry = LAZY_INSTANCE_INITIALIZER; 24 g_imported_media_gallery_registry = LAZY_INSTANCE_INITIALIZER;
24 25
25 } // namespace 26 } // namespace
26 27
27 // static 28 // static
28 ImportedMediaGalleryRegistry* ImportedMediaGalleryRegistry::GetInstance() { 29 ImportedMediaGalleryRegistry* ImportedMediaGalleryRegistry::GetInstance() {
29 return g_imported_media_gallery_registry.Pointer(); 30 return g_imported_media_gallery_registry.Pointer();
30 } 31 }
31 32
32 std::string ImportedMediaGalleryRegistry::RegisterPicasaFilesystemOnUIThread( 33 bool ImportedMediaGalleryRegistry::RegisterPicasaFilesystemOnUIThread(
33 const base::FilePath& database_path) { 34 const std::string& fs_name, const base::FilePath& database_path) {
34 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 35 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
36 DCHECK(!fs_name.empty());
35 DCHECK(!database_path.empty()); 37 DCHECK(!database_path.empty());
36 38
37 std::string fsid; 39 bool result = false;
38 40
39 #if defined(OS_WIN) || defined(OS_MACOSX) 41 #if defined(OS_WIN) || defined(OS_MACOSX)
40 fsid = IsolatedContext::GetInstance()->RegisterFileSystemForVirtualPath( 42 base::FilePath root = ImportedRoot();
41 fileapi::kFileSystemTypePicasa, 43 if (root.empty())
42 extension_misc::kMediaFileSystemPathPart, 44 return false;
43 base::FilePath()); 45 result = ExternalMountPoints::GetSystemInstance()->RegisterFileSystem(
46 fs_name, fileapi::kFileSystemTypePicasa, root.AppendASCII("picasa"));
47 if (!result)
48 return result;
44 49
45 if (fsid.empty()) 50 picasa_fs_names_.insert(fs_name);
46 return fsid;
47 51
48 picasa_fsids_.insert(fsid); 52 if (picasa_fs_names_.size() == 1) {
49
50 if (picasa_fsids_.size() == 1) {
51 MediaFileSystemBackend::MediaTaskRunner()->PostTask( 53 MediaFileSystemBackend::MediaTaskRunner()->PostTask(
52 FROM_HERE, 54 FROM_HERE,
53 Bind(&ImportedMediaGalleryRegistry::RegisterPicasaFileSystem, 55 Bind(&ImportedMediaGalleryRegistry::RegisterPicasaFileSystem,
54 base::Unretained(this), database_path)); 56 base::Unretained(this), database_path));
55 #ifndef NDEBUG 57 #ifndef NDEBUG
56 picasa_database_path_ = database_path; 58 picasa_database_path_ = database_path;
57 } else { 59 } else {
58 DCHECK_EQ(picasa_database_path_.value(), database_path.value()); 60 DCHECK_EQ(picasa_database_path_.value(), database_path.value());
59 #endif 61 #endif
60 } 62 }
61 #endif // defined(OS_WIN) || defined(OS_MACOSX) 63 #endif // defined(OS_WIN) || defined(OS_MACOSX)
62 64
63 return fsid; 65 return result;
64 } 66 }
65 67
66 std::string ImportedMediaGalleryRegistry::RegisterITunesFilesystemOnUIThread( 68 bool ImportedMediaGalleryRegistry::RegisterITunesFilesystemOnUIThread(
67 const base::FilePath& library_xml_path) { 69 const std::string& fs_name, const base::FilePath& library_xml_path) {
68 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 70 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
69 DCHECK(!library_xml_path.empty()); 71 DCHECK(!library_xml_path.empty());
70 72
71 std::string fsid; 73 bool result = false;
72 74
73 #if defined(OS_WIN) || defined(OS_MACOSX) 75 #if defined(OS_WIN) || defined(OS_MACOSX)
74 fsid = IsolatedContext::GetInstance()->RegisterFileSystemForVirtualPath( 76 base::FilePath root = ImportedRoot();
75 fileapi::kFileSystemTypeItunes, 77 if (root.empty())
76 extension_misc::kMediaFileSystemPathPart, 78 return false;
77 base::FilePath()); 79 result = ExternalMountPoints::GetSystemInstance()->RegisterFileSystem(
80 fs_name, fileapi::kFileSystemTypeItunes, root.AppendASCII("itunes"));
81 if (!result)
82 return result;
78 83
79 if (fsid.empty()) 84 itunes_fs_names_.insert(fs_name);
80 return fsid;
81 85
82 itunes_fsids_.insert(fsid); 86 if (itunes_fs_names_.size() == 1) {
83
84 if (itunes_fsids_.size() == 1) {
85 MediaFileSystemBackend::MediaTaskRunner()->PostTask( 87 MediaFileSystemBackend::MediaTaskRunner()->PostTask(
86 FROM_HERE, 88 FROM_HERE,
87 Bind(&ImportedMediaGalleryRegistry::RegisterITunesFileSystem, 89 Bind(&ImportedMediaGalleryRegistry::RegisterITunesFileSystem,
88 base::Unretained(this), library_xml_path)); 90 base::Unretained(this), library_xml_path));
89 #ifndef NDEBUG 91 #ifndef NDEBUG
90 itunes_xml_library_path_ = library_xml_path; 92 itunes_xml_library_path_ = library_xml_path;
91 } else { 93 } else {
92 DCHECK_EQ(itunes_xml_library_path_.value(), library_xml_path.value()); 94 DCHECK_EQ(itunes_xml_library_path_.value(), library_xml_path.value());
93 #endif 95 #endif
94 } 96 }
95 #endif // defined(OS_WIN) || defined(OS_MACOSX) 97 #endif // defined(OS_WIN) || defined(OS_MACOSX)
96 98
97 return fsid; 99 return result;
98 } 100 }
99 101
100 std::string ImportedMediaGalleryRegistry::RegisterIPhotoFilesystemOnUIThread( 102 bool ImportedMediaGalleryRegistry::RegisterIPhotoFilesystemOnUIThread(
101 const base::FilePath& library_xml_path) { 103 const std::string& fs_name, const base::FilePath& library_xml_path) {
102 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 104 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
103 DCHECK(!library_xml_path.empty()); 105 DCHECK(!library_xml_path.empty());
104 106
105 std::string fsid; 107 bool result = false;
106 108
107 // TODO(gbillock): Investigate how to refactor this to reduce duplicated 109 // TODO(gbillock): Investigate how to refactor this to reduce duplicated
108 // code. 110 // code.
109 #if defined(OS_MACOSX) 111 #if defined(OS_MACOSX)
110 fsid = IsolatedContext::GetInstance()->RegisterFileSystemForVirtualPath( 112 base::FilePath root = ImportedRoot();
111 fileapi::kFileSystemTypeIphoto, 113 if (root.empty())
112 extension_misc::kMediaFileSystemPathPart, 114 return false;
113 base::FilePath()); 115 result = ExternalMountPoints::GetSystemInstance()->RegisterFileSystem(
116 fs_name, fileapi::kFileSystemTypeIphoto, root.AppendASCII("iphoto"));
117 if (!result)
118 return result;
114 119
115 if (fsid.empty()) 120 iphoto_fs_names_.insert(fs_name);
116 return fsid;
117 121
118 iphoto_fsids_.insert(fsid); 122 if (iphoto_fs_names_.size() == 1) {
119
120 if (iphoto_fsids_.size() == 1) {
121 MediaFileSystemBackend::MediaTaskRunner()->PostTask( 123 MediaFileSystemBackend::MediaTaskRunner()->PostTask(
122 FROM_HERE, 124 FROM_HERE,
123 Bind(&ImportedMediaGalleryRegistry::RegisterIPhotoFileSystem, 125 Bind(&ImportedMediaGalleryRegistry::RegisterIPhotoFileSystem,
124 base::Unretained(this), library_xml_path)); 126 base::Unretained(this), library_xml_path));
125 #ifndef NDEBUG 127 #ifndef NDEBUG
126 iphoto_xml_library_path_ = library_xml_path; 128 iphoto_xml_library_path_ = library_xml_path;
127 } else { 129 } else {
128 DCHECK_EQ(iphoto_xml_library_path_.value(), library_xml_path.value()); 130 DCHECK_EQ(iphoto_xml_library_path_.value(), library_xml_path.value());
129 #endif 131 #endif
130 } 132 }
131 #endif // defined(OS_MACOSX) 133 #endif // defined(OS_MACOSX)
132 134
133 return fsid; 135 return result;
134 } 136 }
135 137
136 bool ImportedMediaGalleryRegistry::RevokeImportedFilesystemOnUIThread( 138 bool ImportedMediaGalleryRegistry::RevokeImportedFilesystemOnUIThread(
137 const std::string& fsid) { 139 const std::string& fs_name) {
138 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 140 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
139 141
140 #if defined(OS_WIN) || defined(OS_MACOSX) 142 #if defined(OS_WIN) || defined(OS_MACOSX)
141 if (picasa_fsids_.erase(fsid)) { 143 if (picasa_fs_names_.erase(fs_name)) {
142 if (picasa_fsids_.empty()) { 144 if (picasa_fs_names_.empty()) {
143 MediaFileSystemBackend::MediaTaskRunner()->PostTask( 145 MediaFileSystemBackend::MediaTaskRunner()->PostTask(
144 FROM_HERE, 146 FROM_HERE,
145 Bind(&ImportedMediaGalleryRegistry::RevokePicasaFileSystem, 147 Bind(&ImportedMediaGalleryRegistry::RevokePicasaFileSystem,
146 base::Unretained(this))); 148 base::Unretained(this)));
147 } 149 }
148 return IsolatedContext::GetInstance()->RevokeFileSystem(fsid); 150 return ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(fs_name);
149 } 151 }
150 152
151 if (itunes_fsids_.erase(fsid)) { 153 if (itunes_fs_names_.erase(fs_name)) {
152 if (itunes_fsids_.empty()) { 154 if (itunes_fs_names_.empty()) {
153 MediaFileSystemBackend::MediaTaskRunner()->PostTask( 155 MediaFileSystemBackend::MediaTaskRunner()->PostTask(
154 FROM_HERE, 156 FROM_HERE,
155 Bind(&ImportedMediaGalleryRegistry::RevokeITunesFileSystem, 157 Bind(&ImportedMediaGalleryRegistry::RevokeITunesFileSystem,
156 base::Unretained(this))); 158 base::Unretained(this)));
157 } 159 }
158 return IsolatedContext::GetInstance()->RevokeFileSystem(fsid); 160 return ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(fs_name);
159 } 161 }
160 #endif // defined(OS_WIN) || defined(OS_MACOSX) 162 #endif // defined(OS_WIN) || defined(OS_MACOSX)
161 163
162 #if defined(OS_MACOSX) 164 #if defined(OS_MACOSX)
163 if (iphoto_fsids_.erase(fsid)) { 165 if (iphoto_fs_names_.erase(fs_name)) {
164 if (iphoto_fsids_.empty()) { 166 if (iphoto_fs_names_.empty()) {
165 MediaFileSystemBackend::MediaTaskRunner()->PostTask( 167 MediaFileSystemBackend::MediaTaskRunner()->PostTask(
166 FROM_HERE, 168 FROM_HERE,
167 Bind(&ImportedMediaGalleryRegistry::RevokeIPhotoFileSystem, 169 Bind(&ImportedMediaGalleryRegistry::RevokeIPhotoFileSystem,
168 base::Unretained(this))); 170 base::Unretained(this)));
169 } 171 }
170 return IsolatedContext::GetInstance()->RevokeFileSystem(fsid); 172 return ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(fs_name);
171 } 173 }
172 #endif // defined(OS_MACOSX) 174 #endif // defined(OS_MACOSX)
173 175
174 return false; 176 return false;
175 } 177 }
176 178
177 #if defined(OS_WIN) || defined(OS_MACOSX) 179 #if defined(OS_WIN) || defined(OS_MACOSX)
178 // static 180 // static
179 picasa::PicasaDataProvider* 181 picasa::PicasaDataProvider*
180 ImportedMediaGalleryRegistry::PicasaDataProvider() { 182 ImportedMediaGalleryRegistry::PicasaDataProvider() {
(...skipping 26 matching lines...) Expand all
207 ImportedMediaGalleryRegistry::~ImportedMediaGalleryRegistry() { 209 ImportedMediaGalleryRegistry::~ImportedMediaGalleryRegistry() {
208 #if defined(OS_WIN) || defined(OS_MACOSX) 210 #if defined(OS_WIN) || defined(OS_MACOSX)
209 DCHECK_EQ(0U, picasa_fsids_.size()); 211 DCHECK_EQ(0U, picasa_fsids_.size());
210 DCHECK_EQ(0U, itunes_fsids_.size()); 212 DCHECK_EQ(0U, itunes_fsids_.size());
211 #endif // defined(OS_WIN) || defined(OS_MACOSX) 213 #endif // defined(OS_WIN) || defined(OS_MACOSX)
212 #if defined(OS_MACOSX) 214 #if defined(OS_MACOSX)
213 DCHECK_EQ(0U, iphoto_fsids_.size()); 215 DCHECK_EQ(0U, iphoto_fsids_.size());
214 #endif // defined(OS_MACOSX) 216 #endif // defined(OS_MACOSX)
215 } 217 }
216 218
219 base::FilePath ImportedMediaGalleryRegistry::ImportedRoot() {
220 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
221 if (imported_root_.empty()) {
222 if (!base::CreateTemporaryFile(&imported_root_))
223 imported_root_ = base::FilePath();
224 // TODO(vandebo) Setting the permissions of |imported_root_| in CPSP to
225 // zero would be an extra step to ensure permissions are correctly
226 // enforced.
227 }
228 return imported_root_;
229 }
230
217 #if defined(OS_WIN) || defined(OS_MACOSX) 231 #if defined(OS_WIN) || defined(OS_MACOSX)
218 void ImportedMediaGalleryRegistry::RegisterPicasaFileSystem( 232 void ImportedMediaGalleryRegistry::RegisterPicasaFileSystem(
219 const base::FilePath& database_path) { 233 const base::FilePath& database_path) {
220 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); 234 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
221 DCHECK(!picasa_data_provider_); 235 DCHECK(!picasa_data_provider_);
222 picasa_data_provider_.reset(new picasa::PicasaDataProvider(database_path)); 236 picasa_data_provider_.reset(new picasa::PicasaDataProvider(database_path));
223 } 237 }
224 238
225 void ImportedMediaGalleryRegistry::RevokePicasaFileSystem() { 239 void ImportedMediaGalleryRegistry::RevokePicasaFileSystem() {
226 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); 240 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
(...skipping 22 matching lines...) Expand all
249 DCHECK(!iphoto_data_provider_); 263 DCHECK(!iphoto_data_provider_);
250 iphoto_data_provider_.reset(new iphoto::IPhotoDataProvider(xml_library_path)); 264 iphoto_data_provider_.reset(new iphoto::IPhotoDataProvider(xml_library_path));
251 } 265 }
252 266
253 void ImportedMediaGalleryRegistry::RevokeIPhotoFileSystem() { 267 void ImportedMediaGalleryRegistry::RevokeIPhotoFileSystem() {
254 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); 268 DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
255 DCHECK(iphoto_data_provider_); 269 DCHECK(iphoto_data_provider_);
256 iphoto_data_provider_.reset(); 270 iphoto_data_provider_.reset();
257 } 271 }
258 #endif // defined(OS_MACOSX) 272 #endif // defined(OS_MACOSX)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698