OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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/fileapi/media_file_system_backend.h" | 5 #include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/message_loop/message_loop_proxy.h" | 12 #include "base/message_loop/message_loop_proxy.h" |
13 #include "base/platform_file.h" | 13 #include "base/platform_file.h" |
14 #include "base/sequenced_task_runner.h" | 14 #include "base/sequenced_task_runner.h" |
| 15 #include "base/strings/string_number_conversions.h" |
| 16 #include "base/strings/string_util.h" |
15 #include "base/threading/sequenced_worker_pool.h" | 17 #include "base/threading/sequenced_worker_pool.h" |
| 18 #include "chrome/browser/browser_process.h" |
| 19 #include "chrome/browser/extensions/extension_service.h" |
16 #include "chrome/browser/media_galleries/fileapi/device_media_async_file_util.h" | 20 #include "chrome/browser/media_galleries/fileapi/device_media_async_file_util.h" |
17 #include "chrome/browser/media_galleries/fileapi/media_file_validator_factory.h" | 21 #include "chrome/browser/media_galleries/fileapi/media_file_validator_factory.h" |
18 #include "chrome/browser/media_galleries/fileapi/media_path_filter.h" | 22 #include "chrome/browser/media_galleries/fileapi/media_path_filter.h" |
19 #include "chrome/browser/media_galleries/fileapi/native_media_file_util.h" | 23 #include "chrome/browser/media_galleries/fileapi/native_media_file_util.h" |
| 24 #include "chrome/browser/media_galleries/media_file_system_registry.h" |
| 25 #include "chrome/browser/profiles/profile.h" |
20 #include "content/public/browser/browser_thread.h" | 26 #include "content/public/browser/browser_thread.h" |
| 27 #include "content/public/browser/render_process_host.h" |
| 28 #include "content/public/browser/render_view_host.h" |
| 29 #include "content/public/browser/resource_request_info.h" |
| 30 #include "extensions/browser/extension_system.h" |
| 31 #include "net/url_request/url_request.h" |
21 #include "webkit/browser/blob/file_stream_reader.h" | 32 #include "webkit/browser/blob/file_stream_reader.h" |
22 #include "webkit/browser/fileapi/copy_or_move_file_validator.h" | 33 #include "webkit/browser/fileapi/copy_or_move_file_validator.h" |
23 #include "webkit/browser/fileapi/file_stream_writer.h" | 34 #include "webkit/browser/fileapi/file_stream_writer.h" |
24 #include "webkit/browser/fileapi/file_system_context.h" | 35 #include "webkit/browser/fileapi/file_system_context.h" |
25 #include "webkit/browser/fileapi/file_system_operation.h" | 36 #include "webkit/browser/fileapi/file_system_operation.h" |
26 #include "webkit/browser/fileapi/file_system_operation_context.h" | 37 #include "webkit/browser/fileapi/file_system_operation_context.h" |
27 #include "webkit/browser/fileapi/isolated_context.h" | 38 #include "webkit/browser/fileapi/file_system_url.h" |
28 #include "webkit/browser/fileapi/native_file_util.h" | 39 #include "webkit/browser/fileapi/native_file_util.h" |
29 #include "webkit/common/fileapi/file_system_types.h" | 40 #include "webkit/common/fileapi/file_system_types.h" |
30 #include "webkit/common/fileapi/file_system_util.h" | 41 #include "webkit/common/fileapi/file_system_util.h" |
31 | 42 |
32 #if defined(OS_WIN) || defined(OS_MACOSX) | 43 #if defined(OS_WIN) || defined(OS_MACOSX) |
33 #include "chrome/browser/media_galleries/fileapi/itunes_file_util.h" | 44 #include "chrome/browser/media_galleries/fileapi/itunes_file_util.h" |
34 #include "chrome/browser/media_galleries/fileapi/picasa_file_util.h" | 45 #include "chrome/browser/media_galleries/fileapi/picasa_file_util.h" |
35 #endif // defined(OS_WIN) || defined(OS_MACOSX) | 46 #endif // defined(OS_WIN) || defined(OS_MACOSX) |
36 | 47 |
37 #if defined(OS_MACOSX) | 48 #if defined(OS_MACOSX) |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 | 91 |
81 // static | 92 // static |
82 scoped_refptr<base::SequencedTaskRunner> | 93 scoped_refptr<base::SequencedTaskRunner> |
83 MediaFileSystemBackend::MediaTaskRunner() { | 94 MediaFileSystemBackend::MediaTaskRunner() { |
84 base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); | 95 base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); |
85 base::SequencedWorkerPool::SequenceToken media_sequence_token = | 96 base::SequencedWorkerPool::SequenceToken media_sequence_token = |
86 pool->GetNamedSequenceToken(kMediaTaskRunnerName); | 97 pool->GetNamedSequenceToken(kMediaTaskRunnerName); |
87 return pool->GetSequencedTaskRunner(media_sequence_token); | 98 return pool->GetSequencedTaskRunner(media_sequence_token); |
88 } | 99 } |
89 | 100 |
| 101 //static |
| 102 std::string MediaFileSystemBackend::ConstructMountName( |
| 103 Profile* profile, |
| 104 const std::string& extension_id, |
| 105 MediaGalleryPrefId pref_id) { |
| 106 std::string name = "media_galleries-"; |
| 107 name.append(profile->GetPath().BaseName().MaybeAsASCII()); |
| 108 name.append("-"); |
| 109 name.append(extension_id); |
| 110 name.append("-"); |
| 111 if (pref_id != kInvalidMediaGalleryPrefId) |
| 112 name.append(base::Uint64ToString(pref_id)); |
| 113 base::ReplaceChars(name, " /", "_", &name); |
| 114 return name; |
| 115 } |
| 116 |
| 117 void OnFileSystems( |
| 118 MediaGalleryPrefId pref_id, |
| 119 const base::Callback<void(base::File::Error result)>& callback, |
| 120 const std::vector<MediaFileSystemInfo>& filesystems) { |
| 121 for (size_t i = 0; i < filesystems.size(); i++) { |
| 122 if (filesystems[i].pref_id == pref_id) { |
| 123 callback.Run(base::File::FILE_OK); |
| 124 return; |
| 125 } |
| 126 } |
| 127 callback.Run(base::File::FILE_ERROR_NOT_FOUND); |
| 128 } |
| 129 |
| 130 //static |
| 131 bool MediaFileSystemBackend::AttemptAutoMountForURLRequest( |
| 132 const net::URLRequest* url_request, |
| 133 const fileapi::FileSystemURL& filesystem_url, |
| 134 const std::string& storage_domain, |
| 135 const base::Callback<void(base::File::Error result)>& callback) { |
| 136 if (storage_domain.empty()) |
| 137 return false; |
| 138 |
| 139 if (filesystem_url.type() != fileapi::kFileSystemTypeExternal) |
| 140 return false; |
| 141 |
| 142 const base::FilePath& virtual_path = filesystem_url.path(); |
| 143 if (virtual_path.ReferencesParent()) |
| 144 return false; |
| 145 std::vector<base::FilePath::StringType> components; |
| 146 virtual_path.GetComponents(&components); |
| 147 if (components.size() < 1) |
| 148 return false; |
| 149 |
| 150 const content::ResourceRequestInfo* request_info = |
| 151 content::ResourceRequestInfo::ForRequest(url_request); |
| 152 if (!request_info) |
| 153 return false; |
| 154 content::RenderViewHost* rvh = |
| 155 content::RenderViewHost::FromID(request_info->GetChildID(), |
| 156 request_info->GetRouteID()); |
| 157 if (!rvh) |
| 158 return false; |
| 159 Profile* profile = |
| 160 Profile::FromBrowserContext(rvh->GetProcess()->GetBrowserContext()); |
| 161 |
| 162 ExtensionService* extension_service = |
| 163 extensions::ExtensionSystem::Get(profile)->extension_service(); |
| 164 const extensions::Extension* extension = |
| 165 extension_service->GetExtensionById(storage_domain, |
| 166 false /*include disabled*/); |
| 167 if (!extension) |
| 168 return false; |
| 169 |
| 170 std::string expected_name_prefix = |
| 171 ConstructMountName(profile, extension->id(), kInvalidMediaGalleryPrefId); |
| 172 // TODO - handle wstring case |
| 173 if (components[0].compare(0, expected_name_prefix.size(), |
| 174 expected_name_prefix) != 0) { |
| 175 return false; |
| 176 } |
| 177 MediaGalleryPrefId pref_id = kInvalidMediaGalleryPrefId; |
| 178 // TODO - handle wstring case |
| 179 if (!base::StringToUint64( |
| 180 components[0].substr(expected_name_prefix.size()), |
| 181 &pref_id) || pref_id == kInvalidMediaGalleryPrefId) { |
| 182 return false; |
| 183 } |
| 184 |
| 185 // TODO(vandebo) add a call to get just this file system. No unretained. |
| 186 base::Closure check_fs_callback = |
| 187 base::Bind(&MediaFileSystemRegistry::GetMediaFileSystemsForExtension, |
| 188 base::Unretained(g_browser_process->media_file_system_registry(
)), |
| 189 rvh, |
| 190 extension, |
| 191 base::Bind(&OnFileSystems, pref_id, callback)); |
| 192 |
| 193 MediaGalleriesPreferences* preferences = |
| 194 g_browser_process->media_file_system_registry()->GetPreferences(profile); |
| 195 preferences->EnsureInitialized(check_fs_callback); |
| 196 return true; |
| 197 } |
| 198 |
90 bool MediaFileSystemBackend::CanHandleType( | 199 bool MediaFileSystemBackend::CanHandleType( |
91 fileapi::FileSystemType type) const { | 200 fileapi::FileSystemType type) const { |
92 switch (type) { | 201 switch (type) { |
93 case fileapi::kFileSystemTypeNativeMedia: | 202 case fileapi::kFileSystemTypeNativeMedia: |
94 case fileapi::kFileSystemTypeDeviceMedia: | 203 case fileapi::kFileSystemTypeDeviceMedia: |
95 #if defined(OS_WIN) || defined(OS_MACOSX) | 204 #if defined(OS_WIN) || defined(OS_MACOSX) |
96 case fileapi::kFileSystemTypePicasa: | 205 case fileapi::kFileSystemTypePicasa: |
97 case fileapi::kFileSystemTypeItunes: | 206 case fileapi::kFileSystemTypeItunes: |
98 #endif // defined(OS_WIN) || defined(OS_MACOSX) | 207 #endif // defined(OS_WIN) || defined(OS_MACOSX) |
99 #if defined(OS_MACOSX) | 208 #if defined(OS_MACOSX) |
100 case fileapi::kFileSystemTypeIphoto: | 209 case fileapi::kFileSystemTypeIphoto: |
101 #endif // defined(OS_MACOSX) | 210 #endif // defined(OS_MACOSX) |
102 return true; | 211 return true; |
103 default: | 212 default: |
104 return false; | 213 return false; |
105 } | 214 } |
106 } | 215 } |
107 | 216 |
108 void MediaFileSystemBackend::Initialize(fileapi::FileSystemContext* context) { | 217 void MediaFileSystemBackend::Initialize(fileapi::FileSystemContext* context) { |
109 } | 218 } |
110 | 219 |
111 void MediaFileSystemBackend::ResolveURL( | 220 void MediaFileSystemBackend::ResolveURL( |
112 const FileSystemURL& url, | 221 const FileSystemURL& url, |
113 fileapi::OpenFileSystemMode mode, | 222 fileapi::OpenFileSystemMode mode, |
114 const OpenFileSystemCallback& callback) { | 223 const OpenFileSystemCallback& callback) { |
115 // We never allow opening a new isolated FileSystem via usual ResolveURL. | 224 // We never allow opening a new FileSystem via usual ResolveURL. |
116 base::MessageLoopProxy::current()->PostTask( | 225 base::MessageLoopProxy::current()->PostTask( |
117 FROM_HERE, | 226 FROM_HERE, |
118 base::Bind(callback, | 227 base::Bind(callback, |
119 GURL(), | 228 GURL(), |
120 std::string(), | 229 std::string(), |
121 base::File::FILE_ERROR_SECURITY)); | 230 base::File::FILE_ERROR_SECURITY)); |
122 } | 231 } |
123 | 232 |
124 fileapi::AsyncFileUtil* MediaFileSystemBackend::GetAsyncFileUtil( | 233 fileapi::AsyncFileUtil* MediaFileSystemBackend::GetAsyncFileUtil( |
125 fileapi::FileSystemType type) { | 234 fileapi::FileSystemType type) { |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 fileapi::FileStreamWriter::CreateForLocalFile( | 326 fileapi::FileStreamWriter::CreateForLocalFile( |
218 context->default_file_task_runner(), | 327 context->default_file_task_runner(), |
219 url.path(), offset)); | 328 url.path(), offset)); |
220 } | 329 } |
221 | 330 |
222 fileapi::FileSystemQuotaUtil* | 331 fileapi::FileSystemQuotaUtil* |
223 MediaFileSystemBackend::GetQuotaUtil() { | 332 MediaFileSystemBackend::GetQuotaUtil() { |
224 // No quota support. | 333 // No quota support. |
225 return NULL; | 334 return NULL; |
226 } | 335 } |
OLD | NEW |