Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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 |
| 3 | // found in the LICENSE file. |
| 4 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 5 | #include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h" |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 6 | |
| 7 | #include <string> |
| 8 | |
| 9 | #include "base/bind.h" |
| 10 | #include "base/files/file_path.h" |
| 11 | #include "base/logging.h" |
Torne (Richard Coles) | b2df76e | 2013-05-13 16:52:09 +0100 | [diff] [blame] | 12 | #include "base/message_loop/message_loop_proxy.h" |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 13 | #include "base/platform_file.h" |
| 14 | #include "base/sequenced_task_runner.h" |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 15 | #include "base/threading/sequenced_worker_pool.h" |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 16 | #include "chrome/browser/media_galleries/fileapi/device_media_async_file_util.h" |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 17 | #include "chrome/browser/media_galleries/fileapi/media_file_validator_factory.h" |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 18 | #include "chrome/browser/media_galleries/fileapi/media_path_filter.h" |
| 19 | #include "chrome/browser/media_galleries/fileapi/native_media_file_util.h" |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 20 | #include "content/public/browser/browser_thread.h" |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 21 | #include "webkit/browser/blob/local_file_stream_reader.h" |
| 22 | #include "webkit/browser/fileapi/async_file_util_adapter.h" |
| 23 | #include "webkit/browser/fileapi/copy_or_move_file_validator.h" |
| 24 | #include "webkit/browser/fileapi/file_system_context.h" |
| 25 | #include "webkit/browser/fileapi/file_system_file_stream_reader.h" |
| 26 | #include "webkit/browser/fileapi/file_system_operation_context.h" |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 27 | #include "webkit/browser/fileapi/file_system_operation_impl.h" |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 28 | #include "webkit/browser/fileapi/isolated_context.h" |
| 29 | #include "webkit/browser/fileapi/isolated_file_util.h" |
| 30 | #include "webkit/browser/fileapi/local_file_stream_writer.h" |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 31 | #include "webkit/browser/fileapi/native_file_util.h" |
| 32 | #include "webkit/common/fileapi/file_system_types.h" |
| 33 | #include "webkit/common/fileapi/file_system_util.h" |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 34 | |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 35 | #if defined(OS_WIN) || defined(OS_MACOSX) |
| 36 | #include "chrome/browser/media_galleries/fileapi/itunes_file_util.h" |
| 37 | #include "chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.h" |
| 38 | #endif // defined(OS_WIN) || defined(OS_MACOSX) |
| 39 | |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 40 | using fileapi::FileSystemContext; |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 41 | using fileapi::FileSystemURL; |
| 42 | |
| 43 | namespace chrome { |
| 44 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 45 | const char MediaFileSystemBackend::kMediaTaskRunnerName[] = |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 46 | "media-task-runner"; |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 47 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 48 | MediaFileSystemBackend::MediaFileSystemBackend( |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 49 | const base::FilePath& profile_path, |
| 50 | base::SequencedTaskRunner* media_task_runner) |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 51 | : profile_path_(profile_path), |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 52 | media_task_runner_(media_task_runner), |
| 53 | media_path_filter_(new MediaPathFilter), |
| 54 | media_copy_or_move_file_validator_factory_(new MediaFileValidatorFactory), |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 55 | native_media_file_util_( |
| 56 | new NativeMediaFileUtil(media_path_filter_.get())), |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 57 | device_media_async_file_util_( |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 58 | DeviceMediaAsyncFileUtil::Create(profile_path_)) |
| 59 | #if defined(OS_WIN) || defined(OS_MACOSX) |
| 60 | , |
Ben Murdoch | bb1529c | 2013-08-08 10:24:53 +0100 | [diff] [blame^] | 61 | picasa_file_util_(new picasa::PicasaFileUtil(media_path_filter_.get())), |
| 62 | itunes_file_util_(new itunes::ItunesFileUtil(media_path_filter_.get())) |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 63 | #endif // defined(OS_WIN) || defined(OS_MACOSX) |
| 64 | { |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 65 | } |
| 66 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 67 | MediaFileSystemBackend::~MediaFileSystemBackend() { |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 68 | } |
| 69 | |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 70 | // static |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 71 | bool MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread() { |
Torne (Richard Coles) | 7d4cd47 | 2013-06-19 11:58:07 +0100 | [diff] [blame] | 72 | base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); |
| 73 | base::SequencedWorkerPool::SequenceToken media_sequence_token = |
| 74 | pool->GetNamedSequenceToken(kMediaTaskRunnerName); |
| 75 | return pool->IsRunningSequenceOnCurrentThread(media_sequence_token); |
| 76 | } |
| 77 | |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 78 | // static |
| 79 | scoped_refptr<base::SequencedTaskRunner> |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 80 | MediaFileSystemBackend::MediaTaskRunner() { |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 81 | base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); |
| 82 | base::SequencedWorkerPool::SequenceToken media_sequence_token = |
| 83 | pool->GetNamedSequenceToken(kMediaTaskRunnerName); |
| 84 | return pool->GetSequencedTaskRunner(media_sequence_token); |
| 85 | } |
| 86 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 87 | bool MediaFileSystemBackend::CanHandleType( |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 88 | fileapi::FileSystemType type) const { |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 89 | switch (type) { |
| 90 | case fileapi::kFileSystemTypeNativeMedia: |
| 91 | case fileapi::kFileSystemTypeDeviceMedia: |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 92 | #if defined(OS_WIN) || defined(OS_MACOSX) |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 93 | case fileapi::kFileSystemTypePicasa: |
Torne (Richard Coles) | b2df76e | 2013-05-13 16:52:09 +0100 | [diff] [blame] | 94 | case fileapi::kFileSystemTypeItunes: |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 95 | #endif // defined(OS_WIN) || defined(OS_MACOSX) |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 96 | return true; |
| 97 | default: |
| 98 | return false; |
| 99 | } |
| 100 | } |
| 101 | |
Ben Murdoch | bbcdd45 | 2013-07-25 10:06:34 +0100 | [diff] [blame] | 102 | void MediaFileSystemBackend::Initialize(fileapi::FileSystemContext* context) { |
| 103 | } |
| 104 | |
| 105 | void MediaFileSystemBackend::OpenFileSystem( |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 106 | const GURL& origin_url, |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 107 | fileapi::FileSystemType type, |
| 108 | fileapi::OpenFileSystemMode mode, |
Ben Murdoch | bbcdd45 | 2013-07-25 10:06:34 +0100 | [diff] [blame] | 109 | const OpenFileSystemCallback& callback) { |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 110 | // We never allow opening a new isolated FileSystem via usual OpenFileSystem. |
| 111 | base::MessageLoopProxy::current()->PostTask( |
| 112 | FROM_HERE, |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 113 | base::Bind(callback, |
| 114 | GetFileSystemRootURI(origin_url, type), |
| 115 | GetFileSystemName(origin_url, type), |
| 116 | base::PLATFORM_FILE_ERROR_SECURITY)); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 117 | } |
| 118 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 119 | fileapi::FileSystemFileUtil* MediaFileSystemBackend::GetFileUtil( |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 120 | fileapi::FileSystemType type) { |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 121 | NOTREACHED(); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 122 | return NULL; |
| 123 | } |
| 124 | |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 125 | fileapi::AsyncFileUtil* MediaFileSystemBackend::GetAsyncFileUtil( |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 126 | fileapi::FileSystemType type) { |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 127 | switch (type) { |
| 128 | case fileapi::kFileSystemTypeNativeMedia: |
| 129 | return native_media_file_util_.get(); |
| 130 | case fileapi::kFileSystemTypeDeviceMedia: |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 131 | return device_media_async_file_util_.get(); |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 132 | #if defined(OS_WIN) || defined(OS_MACOSX) |
Torne (Richard Coles) | b2df76e | 2013-05-13 16:52:09 +0100 | [diff] [blame] | 133 | case fileapi::kFileSystemTypeItunes: |
| 134 | return itunes_file_util_.get(); |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 135 | case fileapi::kFileSystemTypePicasa: |
| 136 | return picasa_file_util_.get(); |
| 137 | #endif // defined(OS_WIN) || defined(OS_MACOSX) |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 138 | default: |
| 139 | NOTREACHED(); |
| 140 | } |
| 141 | return NULL; |
| 142 | } |
| 143 | |
| 144 | fileapi::CopyOrMoveFileValidatorFactory* |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 145 | MediaFileSystemBackend::GetCopyOrMoveFileValidatorFactory( |
Torne (Richard Coles) | 90dce4d | 2013-05-29 14:40:03 +0100 | [diff] [blame] | 146 | fileapi::FileSystemType type, base::PlatformFileError* error_code) { |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 147 | DCHECK(error_code); |
| 148 | *error_code = base::PLATFORM_FILE_OK; |
| 149 | switch (type) { |
| 150 | case fileapi::kFileSystemTypeNativeMedia: |
| 151 | case fileapi::kFileSystemTypeDeviceMedia: |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 152 | case fileapi::kFileSystemTypeItunes: |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 153 | if (!media_copy_or_move_file_validator_factory_) { |
| 154 | *error_code = base::PLATFORM_FILE_ERROR_SECURITY; |
| 155 | return NULL; |
| 156 | } |
| 157 | return media_copy_or_move_file_validator_factory_.get(); |
| 158 | default: |
| 159 | NOTREACHED(); |
| 160 | } |
| 161 | return NULL; |
| 162 | } |
| 163 | |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 164 | fileapi::FileSystemOperation* |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 165 | MediaFileSystemBackend::CreateFileSystemOperation( |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 166 | const FileSystemURL& url, |
| 167 | FileSystemContext* context, |
| 168 | base::PlatformFileError* error_code) const { |
| 169 | scoped_ptr<fileapi::FileSystemOperationContext> operation_context( |
| 170 | new fileapi::FileSystemOperationContext( |
Torne (Richard Coles) | 868fa2f | 2013-06-11 10:57:03 +0100 | [diff] [blame] | 171 | context, media_task_runner_.get())); |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 172 | return new fileapi::FileSystemOperationImpl(url, context, |
| 173 | operation_context.Pass()); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 174 | } |
| 175 | |
| 176 | scoped_ptr<webkit_blob::FileStreamReader> |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 177 | MediaFileSystemBackend::CreateFileStreamReader( |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 178 | const FileSystemURL& url, |
| 179 | int64 offset, |
| 180 | const base::Time& expected_modification_time, |
| 181 | FileSystemContext* context) const { |
| 182 | return scoped_ptr<webkit_blob::FileStreamReader>( |
| 183 | new webkit_blob::LocalFileStreamReader( |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 184 | context->default_file_task_runner(), |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 185 | url.path(), offset, expected_modification_time)); |
| 186 | } |
| 187 | |
| 188 | scoped_ptr<fileapi::FileStreamWriter> |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 189 | MediaFileSystemBackend::CreateFileStreamWriter( |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 190 | const FileSystemURL& url, |
| 191 | int64 offset, |
| 192 | FileSystemContext* context) const { |
| 193 | return scoped_ptr<fileapi::FileStreamWriter>( |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 194 | new fileapi::LocalFileStreamWriter( |
Torne (Richard Coles) | a36e592 | 2013-08-05 13:57:33 +0100 | [diff] [blame] | 195 | context->default_file_task_runner(), |
Ben Murdoch | eb525c5 | 2013-07-10 11:40:50 +0100 | [diff] [blame] | 196 | url.path(), offset)); |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 197 | } |
| 198 | |
| 199 | fileapi::FileSystemQuotaUtil* |
Ben Murdoch | 7dbb3d5 | 2013-07-17 14:55:54 +0100 | [diff] [blame] | 200 | MediaFileSystemBackend::GetQuotaUtil() { |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 201 | // No quota support. |
| 202 | return NULL; |
| 203 | } |
| 204 | |
Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 205 | } // namespace chrome |