OLD | NEW |
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/logging.h" | 8 #include "base/logging.h" |
9 #include "base/threading/sequenced_worker_pool.h" | 9 #include "base/threading/sequenced_worker_pool.h" |
| 10 #include "chrome/browser/media_galleries/fileapi/itunes_data_provider.h" |
10 #include "chrome/browser/media_galleries/fileapi/picasa/picasa_data_provider.h" | 11 #include "chrome/browser/media_galleries/fileapi/picasa/picasa_data_provider.h" |
11 #include "chrome/common/extensions/extension_constants.h" | 12 #include "chrome/common/extensions/extension_constants.h" |
12 #include "content/public/browser/browser_thread.h" | 13 #include "content/public/browser/browser_thread.h" |
13 #include "webkit/browser/fileapi/file_system_task_runners.h" | 14 #include "webkit/browser/fileapi/file_system_task_runners.h" |
14 #include "webkit/browser/fileapi/isolated_context.h" | 15 #include "webkit/browser/fileapi/isolated_context.h" |
15 | 16 |
16 using base::Bind; | 17 using base::Bind; |
17 | 18 |
18 namespace chrome { | 19 namespace chrome { |
19 | 20 |
(...skipping 19 matching lines...) Expand all Loading... |
39 static base::LazyInstance<ImportedMediaGalleryRegistry>::Leaky | 40 static base::LazyInstance<ImportedMediaGalleryRegistry>::Leaky |
40 g_imported_media_gallery_registry = LAZY_INSTANCE_INITIALIZER; | 41 g_imported_media_gallery_registry = LAZY_INSTANCE_INITIALIZER; |
41 | 42 |
42 } | 43 } |
43 | 44 |
44 // static | 45 // static |
45 ImportedMediaGalleryRegistry* ImportedMediaGalleryRegistry::GetInstance() { | 46 ImportedMediaGalleryRegistry* ImportedMediaGalleryRegistry::GetInstance() { |
46 return g_imported_media_gallery_registry.Pointer(); | 47 return g_imported_media_gallery_registry.Pointer(); |
47 } | 48 } |
48 | 49 |
49 // static | |
50 std::string ImportedMediaGalleryRegistry::RegisterPicasaFilesystemOnUIThread( | 50 std::string ImportedMediaGalleryRegistry::RegisterPicasaFilesystemOnUIThread( |
51 const base::FilePath& database_path) { | 51 const base::FilePath& database_path) { |
52 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 52 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 53 DCHECK(!database_path.empty()); |
53 | 54 |
54 std::string fsid = | 55 std::string fsid = |
55 fileapi::IsolatedContext::GetInstance()->RegisterFileSystemForVirtualPath( | 56 fileapi::IsolatedContext::GetInstance()->RegisterFileSystemForVirtualPath( |
56 fileapi::kFileSystemTypePicasa, | 57 fileapi::kFileSystemTypePicasa, |
57 extension_misc::kMediaFileSystemPathPart, | 58 extension_misc::kMediaFileSystemPathPart, |
58 base::FilePath()); | 59 base::FilePath()); |
59 | 60 |
60 if (fsid.empty()) | 61 if (fsid.empty()) |
61 return ""; | 62 return ""; |
62 | 63 |
63 MediaTaskRunner()->PostTask( | 64 picasa_fsids_.insert(fsid); |
64 FROM_HERE, | 65 |
65 Bind(&ImportedMediaGalleryRegistry::RegisterPicasaFileSystem, | 66 if (picasa_fsids_.size() == 1) { |
66 base::Unretained(GetInstance()), database_path)); | 67 MediaTaskRunner()->PostTask( |
| 68 FROM_HERE, |
| 69 Bind(&ImportedMediaGalleryRegistry::RegisterPicasaFileSystem, |
| 70 base::Unretained(this), database_path)); |
| 71 #ifndef NDEBUG |
| 72 picasa_database_path_ = database_path; |
| 73 } else { |
| 74 DCHECK_EQ(picasa_database_path_.value(), database_path.value()); |
| 75 #endif |
| 76 } |
67 | 77 |
68 return fsid; | 78 return fsid; |
69 } | 79 } |
70 | 80 |
71 // static | 81 std::string ImportedMediaGalleryRegistry::RegisterITunesFilesystemOnUIThread( |
72 bool ImportedMediaGalleryRegistry::RevokePicasaFilesystemOnUIThread( | 82 const base::FilePath& library_xml_path) { |
| 83 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 84 DCHECK(!library_xml_path.empty()); |
| 85 |
| 86 std::string fsid = |
| 87 fileapi::IsolatedContext::GetInstance()->RegisterFileSystemForVirtualPath( |
| 88 fileapi::kFileSystemTypeItunes, |
| 89 extension_misc::kMediaFileSystemPathPart, |
| 90 base::FilePath()); |
| 91 |
| 92 if (fsid.empty()) |
| 93 return std::string(); |
| 94 |
| 95 itunes_fsids_.insert(fsid); |
| 96 |
| 97 if (itunes_fsids_.size() == 1) { |
| 98 MediaTaskRunner()->PostTask( |
| 99 FROM_HERE, |
| 100 Bind(&ImportedMediaGalleryRegistry::RegisterITunesFileSystem, |
| 101 base::Unretained(this), library_xml_path)); |
| 102 #ifndef NDEBUG |
| 103 itunes_xml_library_path_ = library_xml_path; |
| 104 } else { |
| 105 DCHECK_EQ(itunes_xml_library_path_.value(), library_xml_path.value()); |
| 106 #endif |
| 107 } |
| 108 |
| 109 return fsid; |
| 110 } |
| 111 |
| 112 bool ImportedMediaGalleryRegistry::RevokeImportedFilesystemOnUIThread( |
73 const std::string& fsid) { | 113 const std::string& fsid) { |
74 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 114 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
75 | 115 |
76 if (!fileapi::IsolatedContext::GetInstance()->RevokeFileSystem(fsid)) | 116 if (picasa_fsids_.erase(fsid)) { |
77 return false; | 117 if (picasa_fsids_.empty()) { |
| 118 MediaTaskRunner()->PostTask( |
| 119 FROM_HERE, |
| 120 Bind(&ImportedMediaGalleryRegistry::RevokePicasaFileSystem, |
| 121 base::Unretained(this))); |
| 122 } |
| 123 return fileapi::IsolatedContext::GetInstance()->RevokeFileSystem(fsid); |
| 124 } |
78 | 125 |
79 MediaTaskRunner()->PostTask( | 126 if (itunes_fsids_.erase(fsid)) { |
80 FROM_HERE, | 127 if (itunes_fsids_.empty()) { |
81 Bind(&ImportedMediaGalleryRegistry::RevokePicasaFileSystem, | 128 MediaTaskRunner()->PostTask( |
82 base::Unretained(GetInstance()))); | 129 FROM_HERE, |
| 130 Bind(&ImportedMediaGalleryRegistry::RevokeITunesFileSystem, |
| 131 base::Unretained(this))); |
| 132 } |
| 133 return fileapi::IsolatedContext::GetInstance()->RevokeFileSystem(fsid); |
| 134 } |
83 | 135 |
84 return true; | 136 return false; |
85 } | 137 } |
86 | 138 |
87 // static | 139 // static |
88 picasa::PicasaDataProvider* | 140 picasa::PicasaDataProvider* |
89 ImportedMediaGalleryRegistry::picasa_data_provider() { | 141 ImportedMediaGalleryRegistry::PicasaDataProvider() { |
90 DCHECK(CurrentlyOnMediaTaskRunnerThread()); | 142 DCHECK(CurrentlyOnMediaTaskRunnerThread()); |
91 DCHECK(GetInstance()->picasa_data_provider_); | 143 DCHECK(GetInstance()->picasa_data_provider_); |
92 return GetInstance()->picasa_data_provider_.get(); | 144 return GetInstance()->picasa_data_provider_.get(); |
93 } | 145 } |
94 | 146 |
95 ImportedMediaGalleryRegistry::ImportedMediaGalleryRegistry() | 147 // static |
96 : picasa_filesystems_count_(0) { | 148 itunes::ITunesDataProvider* |
| 149 ImportedMediaGalleryRegistry::ITunesDataProvider() { |
| 150 DCHECK(CurrentlyOnMediaTaskRunnerThread()); |
| 151 DCHECK(GetInstance()->itunes_data_provider_); |
| 152 return GetInstance()->itunes_data_provider_.get(); |
97 } | 153 } |
98 | 154 |
| 155 ImportedMediaGalleryRegistry::ImportedMediaGalleryRegistry() {} |
| 156 |
99 ImportedMediaGalleryRegistry::~ImportedMediaGalleryRegistry() { | 157 ImportedMediaGalleryRegistry::~ImportedMediaGalleryRegistry() { |
100 DCHECK_EQ(0, picasa_filesystems_count_); | 158 DCHECK_EQ(0U, picasa_fsids_.size()); |
| 159 DCHECK_EQ(0U, itunes_fsids_.size()); |
101 } | 160 } |
102 | 161 |
103 void ImportedMediaGalleryRegistry::RegisterPicasaFileSystem( | 162 void ImportedMediaGalleryRegistry::RegisterPicasaFileSystem( |
104 const base::FilePath& database_path) { | 163 const base::FilePath& database_path) { |
105 DCHECK(CurrentlyOnMediaTaskRunnerThread()); | 164 DCHECK(CurrentlyOnMediaTaskRunnerThread()); |
106 | 165 DCHECK(!picasa_data_provider_); |
107 if (++picasa_filesystems_count_ == 1) { | 166 picasa_data_provider_.reset(new picasa::PicasaDataProvider(database_path)); |
108 DCHECK(!picasa_data_provider_); | |
109 picasa_data_provider_.reset(new picasa::PicasaDataProvider(database_path)); | |
110 } | |
111 } | 167 } |
112 | 168 |
113 void ImportedMediaGalleryRegistry::RevokePicasaFileSystem() { | 169 void ImportedMediaGalleryRegistry::RevokePicasaFileSystem() { |
114 DCHECK(CurrentlyOnMediaTaskRunnerThread()); | 170 DCHECK(CurrentlyOnMediaTaskRunnerThread()); |
| 171 DCHECK(picasa_data_provider_); |
| 172 picasa_data_provider_.reset(); |
| 173 } |
115 | 174 |
116 if (--picasa_filesystems_count_ == 0) { | 175 void ImportedMediaGalleryRegistry::RegisterITunesFileSystem( |
117 DCHECK(picasa_data_provider_); | 176 const base::FilePath& xml_library_path) { |
118 picasa_data_provider_.reset(NULL); | 177 DCHECK(CurrentlyOnMediaTaskRunnerThread()); |
119 } | 178 DCHECK(!itunes_data_provider_); |
| 179 itunes_data_provider_.reset(new itunes::ITunesDataProvider(xml_library_path)); |
| 180 } |
| 181 |
| 182 void ImportedMediaGalleryRegistry::RevokeITunesFileSystem() { |
| 183 DCHECK(CurrentlyOnMediaTaskRunnerThread()); |
| 184 DCHECK(itunes_data_provider_); |
| 185 itunes_data_provider_.reset(); |
120 } | 186 } |
121 | 187 |
122 } // namespace chrome | 188 } // namespace chrome |
OLD | NEW |