media_file_system_backend.cc revision 3551c9c881056c480085172ff9840cab31610854
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/local_file_stream_reader.h" 22#include "webkit/browser/fileapi/copy_or_move_file_validator.h" 23#include "webkit/browser/fileapi/file_system_context.h" 24#include "webkit/browser/fileapi/file_system_file_stream_reader.h" 25#include "webkit/browser/fileapi/file_system_operation_context.h" 26#include "webkit/browser/fileapi/file_system_operation_impl.h" 27#include "webkit/browser/fileapi/isolated_context.h" 28#include "webkit/browser/fileapi/isolated_file_util.h" 29#include "webkit/browser/fileapi/local_file_stream_writer.h" 30#include "webkit/browser/fileapi/native_file_util.h" 31#include "webkit/common/fileapi/file_system_types.h" 32#include "webkit/common/fileapi/file_system_util.h" 33 34#if defined(OS_WIN) || defined(OS_MACOSX) 35#include "chrome/browser/media_galleries/fileapi/itunes_file_util.h" 36#include "chrome/browser/media_galleries/fileapi/picasa/picasa_file_util.h" 37#endif // defined(OS_WIN) || defined(OS_MACOSX) 38 39using fileapi::FileSystemContext; 40using fileapi::FileSystemURL; 41 42namespace chrome { 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{ 64} 65 66MediaFileSystemBackend::~MediaFileSystemBackend() { 67} 68 69// static 70bool MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread() { 71 base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); 72 base::SequencedWorkerPool::SequenceToken media_sequence_token = 73 pool->GetNamedSequenceToken(kMediaTaskRunnerName); 74 return pool->IsRunningSequenceOnCurrentThread(media_sequence_token); 75} 76 77// static 78scoped_refptr<base::SequencedTaskRunner> 79MediaFileSystemBackend::MediaTaskRunner() { 80 base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); 81 base::SequencedWorkerPool::SequenceToken media_sequence_token = 82 pool->GetNamedSequenceToken(kMediaTaskRunnerName); 83 return pool->GetSequencedTaskRunner(media_sequence_token); 84} 85 86bool MediaFileSystemBackend::CanHandleType( 87 fileapi::FileSystemType type) const { 88 switch (type) { 89 case fileapi::kFileSystemTypeNativeMedia: 90 case fileapi::kFileSystemTypeDeviceMedia: 91#if defined(OS_WIN) || defined(OS_MACOSX) 92 case fileapi::kFileSystemTypePicasa: 93 case fileapi::kFileSystemTypeItunes: 94#endif // defined(OS_WIN) || defined(OS_MACOSX) 95 return true; 96 default: 97 return false; 98 } 99} 100 101void MediaFileSystemBackend::Initialize(fileapi::FileSystemContext* context) { 102} 103 104void MediaFileSystemBackend::OpenFileSystem( 105 const GURL& origin_url, 106 fileapi::FileSystemType type, 107 fileapi::OpenFileSystemMode mode, 108 const OpenFileSystemCallback& callback) { 109 // We never allow opening a new isolated FileSystem via usual OpenFileSystem. 110 base::MessageLoopProxy::current()->PostTask( 111 FROM_HERE, 112 base::Bind(callback, 113 GetFileSystemRootURI(origin_url, type), 114 GetFileSystemName(origin_url, type), 115 base::PLATFORM_FILE_ERROR_SECURITY)); 116} 117 118fileapi::FileSystemFileUtil* MediaFileSystemBackend::GetFileUtil( 119 fileapi::FileSystemType type) { 120 NOTREACHED(); 121 return NULL; 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 default: 138 NOTREACHED(); 139 } 140 return NULL; 141} 142 143fileapi::CopyOrMoveFileValidatorFactory* 144MediaFileSystemBackend::GetCopyOrMoveFileValidatorFactory( 145 fileapi::FileSystemType type, base::PlatformFileError* error_code) { 146 DCHECK(error_code); 147 *error_code = base::PLATFORM_FILE_OK; 148 switch (type) { 149 case fileapi::kFileSystemTypeNativeMedia: 150 case fileapi::kFileSystemTypeDeviceMedia: 151 case fileapi::kFileSystemTypeItunes: 152 if (!media_copy_or_move_file_validator_factory_) { 153 *error_code = base::PLATFORM_FILE_ERROR_SECURITY; 154 return NULL; 155 } 156 return media_copy_or_move_file_validator_factory_.get(); 157 default: 158 NOTREACHED(); 159 } 160 return NULL; 161} 162 163fileapi::FileSystemOperation* 164MediaFileSystemBackend::CreateFileSystemOperation( 165 const FileSystemURL& url, 166 FileSystemContext* context, 167 base::PlatformFileError* error_code) const { 168 scoped_ptr<fileapi::FileSystemOperationContext> operation_context( 169 new fileapi::FileSystemOperationContext( 170 context, media_task_runner_.get())); 171 return new fileapi::FileSystemOperationImpl(url, context, 172 operation_context.Pass()); 173} 174 175scoped_ptr<webkit_blob::FileStreamReader> 176MediaFileSystemBackend::CreateFileStreamReader( 177 const FileSystemURL& url, 178 int64 offset, 179 const base::Time& expected_modification_time, 180 FileSystemContext* context) const { 181 return scoped_ptr<webkit_blob::FileStreamReader>( 182 new webkit_blob::LocalFileStreamReader( 183 context->default_file_task_runner(), 184 url.path(), offset, expected_modification_time)); 185} 186 187scoped_ptr<fileapi::FileStreamWriter> 188MediaFileSystemBackend::CreateFileStreamWriter( 189 const FileSystemURL& url, 190 int64 offset, 191 FileSystemContext* context) const { 192 return scoped_ptr<fileapi::FileStreamWriter>( 193 new fileapi::LocalFileStreamWriter( 194 context->default_file_task_runner(), 195 url.path(), offset)); 196} 197 198fileapi::FileSystemQuotaUtil* 199MediaFileSystemBackend::GetQuotaUtil() { 200 // No quota support. 201 return NULL; 202} 203 204} // namespace chrome 205