media_file_system_backend.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
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 37using fileapi::FileSystemContext; 38using fileapi::FileSystemURL; 39 40const char MediaFileSystemBackend::kMediaTaskRunnerName[] = 41 "media-task-runner"; 42 43MediaFileSystemBackend::MediaFileSystemBackend( 44 const base::FilePath& profile_path, 45 base::SequencedTaskRunner* media_task_runner) 46 : profile_path_(profile_path), 47 media_task_runner_(media_task_runner), 48 media_path_filter_(new MediaPathFilter), 49 media_copy_or_move_file_validator_factory_(new MediaFileValidatorFactory), 50 native_media_file_util_( 51 new NativeMediaFileUtil(media_path_filter_.get())), 52 device_media_async_file_util_( 53 DeviceMediaAsyncFileUtil::Create(profile_path_)) 54#if defined(OS_WIN) || defined(OS_MACOSX) 55 , 56 picasa_file_util_(new picasa::PicasaFileUtil(media_path_filter_.get())), 57 itunes_file_util_(new itunes::ITunesFileUtil(media_path_filter_.get())) 58#endif // defined(OS_WIN) || defined(OS_MACOSX) 59{ 60} 61 62MediaFileSystemBackend::~MediaFileSystemBackend() { 63} 64 65// static 66bool MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread() { 67 base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); 68 base::SequencedWorkerPool::SequenceToken media_sequence_token = 69 pool->GetNamedSequenceToken(kMediaTaskRunnerName); 70 return pool->IsRunningSequenceOnCurrentThread(media_sequence_token); 71} 72 73// static 74scoped_refptr<base::SequencedTaskRunner> 75MediaFileSystemBackend::MediaTaskRunner() { 76 base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); 77 base::SequencedWorkerPool::SequenceToken media_sequence_token = 78 pool->GetNamedSequenceToken(kMediaTaskRunnerName); 79 return pool->GetSequencedTaskRunner(media_sequence_token); 80} 81 82bool MediaFileSystemBackend::CanHandleType( 83 fileapi::FileSystemType type) const { 84 switch (type) { 85 case fileapi::kFileSystemTypeNativeMedia: 86 case fileapi::kFileSystemTypeDeviceMedia: 87#if defined(OS_WIN) || defined(OS_MACOSX) 88 case fileapi::kFileSystemTypePicasa: 89 case fileapi::kFileSystemTypeItunes: 90#endif // defined(OS_WIN) || defined(OS_MACOSX) 91 return true; 92 default: 93 return false; 94 } 95} 96 97void MediaFileSystemBackend::Initialize(fileapi::FileSystemContext* context) { 98} 99 100void MediaFileSystemBackend::OpenFileSystem( 101 const GURL& origin_url, 102 fileapi::FileSystemType type, 103 fileapi::OpenFileSystemMode mode, 104 const OpenFileSystemCallback& callback) { 105 // We never allow opening a new isolated FileSystem via usual OpenFileSystem. 106 base::MessageLoopProxy::current()->PostTask( 107 FROM_HERE, 108 base::Bind(callback, 109 GetFileSystemRootURI(origin_url, type), 110 GetFileSystemName(origin_url, type), 111 base::PLATFORM_FILE_ERROR_SECURITY)); 112} 113 114fileapi::AsyncFileUtil* MediaFileSystemBackend::GetAsyncFileUtil( 115 fileapi::FileSystemType type) { 116 switch (type) { 117 case fileapi::kFileSystemTypeNativeMedia: 118 return native_media_file_util_.get(); 119 case fileapi::kFileSystemTypeDeviceMedia: 120 return device_media_async_file_util_.get(); 121#if defined(OS_WIN) || defined(OS_MACOSX) 122 case fileapi::kFileSystemTypeItunes: 123 return itunes_file_util_.get(); 124 case fileapi::kFileSystemTypePicasa: 125 return picasa_file_util_.get(); 126#endif // defined(OS_WIN) || defined(OS_MACOSX) 127 default: 128 NOTREACHED(); 129 } 130 return NULL; 131} 132 133fileapi::CopyOrMoveFileValidatorFactory* 134MediaFileSystemBackend::GetCopyOrMoveFileValidatorFactory( 135 fileapi::FileSystemType type, base::PlatformFileError* error_code) { 136 DCHECK(error_code); 137 *error_code = base::PLATFORM_FILE_OK; 138 switch (type) { 139 case fileapi::kFileSystemTypeNativeMedia: 140 case fileapi::kFileSystemTypeDeviceMedia: 141 case fileapi::kFileSystemTypeItunes: 142 if (!media_copy_or_move_file_validator_factory_) { 143 *error_code = base::PLATFORM_FILE_ERROR_SECURITY; 144 return NULL; 145 } 146 return media_copy_or_move_file_validator_factory_.get(); 147 default: 148 NOTREACHED(); 149 } 150 return NULL; 151} 152 153fileapi::FileSystemOperation* 154MediaFileSystemBackend::CreateFileSystemOperation( 155 const FileSystemURL& url, 156 FileSystemContext* context, 157 base::PlatformFileError* error_code) const { 158 scoped_ptr<fileapi::FileSystemOperationContext> operation_context( 159 new fileapi::FileSystemOperationContext( 160 context, media_task_runner_.get())); 161 return fileapi::FileSystemOperation::Create( 162 url, context, operation_context.Pass()); 163} 164 165scoped_ptr<webkit_blob::FileStreamReader> 166MediaFileSystemBackend::CreateFileStreamReader( 167 const FileSystemURL& url, 168 int64 offset, 169 const base::Time& expected_modification_time, 170 FileSystemContext* context) const { 171 return scoped_ptr<webkit_blob::FileStreamReader>( 172 webkit_blob::FileStreamReader::CreateForLocalFile( 173 context->default_file_task_runner(), 174 url.path(), offset, expected_modification_time)); 175} 176 177scoped_ptr<fileapi::FileStreamWriter> 178MediaFileSystemBackend::CreateFileStreamWriter( 179 const FileSystemURL& url, 180 int64 offset, 181 FileSystemContext* context) const { 182 return scoped_ptr<fileapi::FileStreamWriter>( 183 fileapi::FileStreamWriter::CreateForLocalFile( 184 context->default_file_task_runner(), 185 url.path(), offset)); 186} 187 188fileapi::FileSystemQuotaUtil* 189MediaFileSystemBackend::GetQuotaUtil() { 190 // No quota support. 191 return NULL; 192} 193