| 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 |