media_file_system_backend.cc revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
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 5#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h" 6 7#include <string> 8 9#include "base/bind.h" 10#include "base/files/file_path.h" 11#include "base/logging.h" 12#include "base/message_loop/message_loop_proxy.h" 13#include "base/platform_file.h" 14#include "base/sequenced_task_runner.h" 15#include "base/threading/sequenced_worker_pool.h" 16#include "chrome/browser/media_galleries/fileapi/device_media_async_file_util.h" 17#include "chrome/browser/media_galleries/fileapi/media_file_validator_factory.h" 18#include "chrome/browser/media_galleries/fileapi/media_path_filter.h" 19#include "chrome/browser/media_galleries/fileapi/native_media_file_util.h" 20#include "content/public/browser/browser_thread.h" 21#include "webkit/browser/blob/file_stream_reader.h" 22#include "webkit/browser/fileapi/copy_or_move_file_validator.h" 23#include "webkit/browser/fileapi/file_stream_writer.h" 24#include "webkit/browser/fileapi/file_system_context.h" 25#include "webkit/browser/fileapi/file_system_operation.h" 26#include "webkit/browser/fileapi/file_system_operation_context.h" 27#include "webkit/browser/fileapi/isolated_context.h" 28#include "webkit/browser/fileapi/native_file_util.h" 29#include "webkit/common/fileapi/file_system_types.h" 30#include "webkit/common/fileapi/file_system_util.h" 31 32#if defined(OS_WIN) || defined(OS_MACOSX) 33#include "chrome/browser/media_galleries/fileapi/itunes_file_util.h" 34#include "chrome/browser/media_galleries/fileapi/picasa_file_util.h" 35#endif // defined(OS_WIN) || defined(OS_MACOSX) 36 37#if defined(OS_MACOSX) 38#include "chrome/browser/media_galleries/fileapi/iphoto_file_util.h" 39#endif // defined(OS_MACOSX) 40 41using fileapi::FileSystemContext; 42using fileapi::FileSystemURL; 43 44const char MediaFileSystemBackend::kMediaTaskRunnerName[] = 45 "media-task-runner"; 46 47MediaFileSystemBackend::MediaFileSystemBackend( 48 const base::FilePath& profile_path, 49 base::SequencedTaskRunner* media_task_runner) 50 : profile_path_(profile_path), 51 media_task_runner_(media_task_runner), 52 media_path_filter_(new MediaPathFilter), 53 media_copy_or_move_file_validator_factory_(new MediaFileValidatorFactory), 54 native_media_file_util_( 55 new NativeMediaFileUtil(media_path_filter_.get())), 56 device_media_async_file_util_( 57 DeviceMediaAsyncFileUtil::Create(profile_path_)) 58#if defined(OS_WIN) || defined(OS_MACOSX) 59 , 60 picasa_file_util_(new picasa::PicasaFileUtil(media_path_filter_.get())), 61 itunes_file_util_(new itunes::ITunesFileUtil(media_path_filter_.get())) 62#endif // defined(OS_WIN) || defined(OS_MACOSX) 63#if defined(OS_MACOSX) 64 , 65 iphoto_file_util_(new iphoto::IPhotoFileUtil(media_path_filter_.get())) 66#endif // defined(OS_MACOSX) 67{ 68} 69 70MediaFileSystemBackend::~MediaFileSystemBackend() { 71} 72 73// static 74bool MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread() { 75 base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); 76 base::SequencedWorkerPool::SequenceToken media_sequence_token = 77 pool->GetNamedSequenceToken(kMediaTaskRunnerName); 78 return pool->IsRunningSequenceOnCurrentThread(media_sequence_token); 79} 80 81// static 82scoped_refptr<base::SequencedTaskRunner> 83MediaFileSystemBackend::MediaTaskRunner() { 84 base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); 85 base::SequencedWorkerPool::SequenceToken media_sequence_token = 86 pool->GetNamedSequenceToken(kMediaTaskRunnerName); 87 return pool->GetSequencedTaskRunner(media_sequence_token); 88} 89 90bool MediaFileSystemBackend::CanHandleType( 91 fileapi::FileSystemType type) const { 92 switch (type) { 93 case fileapi::kFileSystemTypeNativeMedia: 94 case fileapi::kFileSystemTypeDeviceMedia: 95#if defined(OS_WIN) || defined(OS_MACOSX) 96 case fileapi::kFileSystemTypePicasa: 97 case fileapi::kFileSystemTypeItunes: 98#endif // defined(OS_WIN) || defined(OS_MACOSX) 99#if defined(OS_MACOSX) 100 case fileapi::kFileSystemTypeIphoto: 101#endif // defined(OS_MACOSX) 102 return true; 103 default: 104 return false; 105 } 106} 107 108void MediaFileSystemBackend::Initialize(fileapi::FileSystemContext* context) { 109} 110 111void MediaFileSystemBackend::ResolveURL( 112 const FileSystemURL& url, 113 fileapi::OpenFileSystemMode mode, 114 const OpenFileSystemCallback& callback) { 115 // We never allow opening a new isolated FileSystem via usual ResolveURL. 116 base::MessageLoopProxy::current()->PostTask( 117 FROM_HERE, 118 base::Bind(callback, 119 GURL(), 120 std::string(), 121 base::File::FILE_ERROR_SECURITY)); 122} 123 124fileapi::AsyncFileUtil* MediaFileSystemBackend::GetAsyncFileUtil( 125 fileapi::FileSystemType type) { 126 switch (type) { 127 case fileapi::kFileSystemTypeNativeMedia: 128 return native_media_file_util_.get(); 129 case fileapi::kFileSystemTypeDeviceMedia: 130 return device_media_async_file_util_.get(); 131#if defined(OS_WIN) || defined(OS_MACOSX) 132 case fileapi::kFileSystemTypeItunes: 133 return itunes_file_util_.get(); 134 case fileapi::kFileSystemTypePicasa: 135 return picasa_file_util_.get(); 136#endif // defined(OS_WIN) || defined(OS_MACOSX) 137#if defined(OS_MACOSX) 138 case fileapi::kFileSystemTypeIphoto: 139 return iphoto_file_util_.get(); 140#endif // defined(OS_MACOSX) 141 default: 142 NOTREACHED(); 143 } 144 return NULL; 145} 146 147fileapi::CopyOrMoveFileValidatorFactory* 148MediaFileSystemBackend::GetCopyOrMoveFileValidatorFactory( 149 fileapi::FileSystemType type, base::File::Error* error_code) { 150 DCHECK(error_code); 151 *error_code = base::File::FILE_OK; 152 switch (type) { 153 case fileapi::kFileSystemTypeNativeMedia: 154 case fileapi::kFileSystemTypeDeviceMedia: 155 case fileapi::kFileSystemTypeIphoto: 156 case fileapi::kFileSystemTypeItunes: 157 if (!media_copy_or_move_file_validator_factory_) { 158 *error_code = base::File::FILE_ERROR_SECURITY; 159 return NULL; 160 } 161 return media_copy_or_move_file_validator_factory_.get(); 162 default: 163 NOTREACHED(); 164 } 165 return NULL; 166} 167 168fileapi::FileSystemOperation* 169MediaFileSystemBackend::CreateFileSystemOperation( 170 const FileSystemURL& url, 171 FileSystemContext* context, 172 base::File::Error* error_code) const { 173 scoped_ptr<fileapi::FileSystemOperationContext> operation_context( 174 new fileapi::FileSystemOperationContext( 175 context, media_task_runner_.get())); 176 return fileapi::FileSystemOperation::Create( 177 url, context, operation_context.Pass()); 178} 179 180bool MediaFileSystemBackend::SupportsStreaming( 181 const fileapi::FileSystemURL& url) const { 182 if (url.type() == fileapi::kFileSystemTypeDeviceMedia) { 183 DCHECK(device_media_async_file_util_); 184 return device_media_async_file_util_->SupportsStreaming(url); 185 } 186 187 return false; 188} 189 190scoped_ptr<webkit_blob::FileStreamReader> 191MediaFileSystemBackend::CreateFileStreamReader( 192 const FileSystemURL& url, 193 int64 offset, 194 const base::Time& expected_modification_time, 195 FileSystemContext* context) const { 196 if (url.type() == fileapi::kFileSystemTypeDeviceMedia) { 197 DCHECK(device_media_async_file_util_); 198 scoped_ptr<webkit_blob::FileStreamReader> reader = 199 device_media_async_file_util_->GetFileStreamReader( 200 url, offset, expected_modification_time, context); 201 DCHECK(reader); 202 return reader.Pass(); 203 } 204 205 return scoped_ptr<webkit_blob::FileStreamReader>( 206 webkit_blob::FileStreamReader::CreateForLocalFile( 207 context->default_file_task_runner(), 208 url.path(), offset, expected_modification_time)); 209} 210 211scoped_ptr<fileapi::FileStreamWriter> 212MediaFileSystemBackend::CreateFileStreamWriter( 213 const FileSystemURL& url, 214 int64 offset, 215 FileSystemContext* context) const { 216 return scoped_ptr<fileapi::FileStreamWriter>( 217 fileapi::FileStreamWriter::CreateForLocalFile( 218 context->default_file_task_runner(), 219 url.path(), 220 offset, 221 fileapi::FileStreamWriter::OPEN_EXISTING_FILE)); 222} 223 224fileapi::FileSystemQuotaUtil* 225MediaFileSystemBackend::GetQuotaUtil() { 226 // No quota support. 227 return NULL; 228} 229