media_file_system_backend.cc revision a36e5920737c6adbddd3e43b760e5de8431db6e0
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/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" 27#include "webkit/browser/fileapi/file_system_operation_impl.h" 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" 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" 34 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 40using fileapi::FileSystemContext; 41using fileapi::FileSystemURL; 42 43namespace chrome { 44 45const char MediaFileSystemBackend::kMediaTaskRunnerName[] = 46 "media-task-runner"; 47const char MediaFileSystemBackend::kMediaPathFilterKey[] = 48 "MediaPathFilterKey"; 49const char MediaFileSystemBackend::kMTPDeviceDelegateURLKey[] = 50 "MTPDeviceDelegateKey"; 51 52MediaFileSystemBackend::MediaFileSystemBackend( 53 const base::FilePath& profile_path, 54 base::SequencedTaskRunner* media_task_runner) 55 : profile_path_(profile_path), 56 media_task_runner_(media_task_runner), 57 media_path_filter_(new MediaPathFilter), 58 media_copy_or_move_file_validator_factory_(new MediaFileValidatorFactory), 59 native_media_file_util_(new NativeMediaFileUtil()), 60 device_media_async_file_util_( 61 DeviceMediaAsyncFileUtil::Create(profile_path_)) 62#if defined(OS_WIN) || defined(OS_MACOSX) 63 , 64 picasa_file_util_(new picasa::PicasaFileUtil()), 65 itunes_file_util_(new itunes::ItunesFileUtil()) 66#endif // defined(OS_WIN) || 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 return true; 100 default: 101 return false; 102 } 103} 104 105void MediaFileSystemBackend::Initialize(fileapi::FileSystemContext* context) { 106} 107 108void MediaFileSystemBackend::OpenFileSystem( 109 const GURL& origin_url, 110 fileapi::FileSystemType type, 111 fileapi::OpenFileSystemMode mode, 112 const OpenFileSystemCallback& callback) { 113 // We never allow opening a new isolated FileSystem via usual OpenFileSystem. 114 base::MessageLoopProxy::current()->PostTask( 115 FROM_HERE, 116 base::Bind(callback, 117 GetFileSystemRootURI(origin_url, type), 118 GetFileSystemName(origin_url, type), 119 base::PLATFORM_FILE_ERROR_SECURITY)); 120} 121 122fileapi::FileSystemFileUtil* MediaFileSystemBackend::GetFileUtil( 123 fileapi::FileSystemType type) { 124 NOTREACHED(); 125 return NULL; 126} 127 128fileapi::AsyncFileUtil* MediaFileSystemBackend::GetAsyncFileUtil( 129 fileapi::FileSystemType type) { 130 switch (type) { 131 case fileapi::kFileSystemTypeNativeMedia: 132 return native_media_file_util_.get(); 133 case fileapi::kFileSystemTypeDeviceMedia: 134 return device_media_async_file_util_.get(); 135#if defined(OS_WIN) || defined(OS_MACOSX) 136 case fileapi::kFileSystemTypeItunes: 137 return itunes_file_util_.get(); 138 case fileapi::kFileSystemTypePicasa: 139 return picasa_file_util_.get(); 140#endif // defined(OS_WIN) || defined(OS_MACOSX) 141 default: 142 NOTREACHED(); 143 } 144 return NULL; 145} 146 147fileapi::CopyOrMoveFileValidatorFactory* 148MediaFileSystemBackend::GetCopyOrMoveFileValidatorFactory( 149 fileapi::FileSystemType type, base::PlatformFileError* error_code) { 150 DCHECK(error_code); 151 *error_code = base::PLATFORM_FILE_OK; 152 switch (type) { 153 case fileapi::kFileSystemTypeNativeMedia: 154 case fileapi::kFileSystemTypeDeviceMedia: 155 case fileapi::kFileSystemTypeItunes: 156 if (!media_copy_or_move_file_validator_factory_) { 157 *error_code = base::PLATFORM_FILE_ERROR_SECURITY; 158 return NULL; 159 } 160 return media_copy_or_move_file_validator_factory_.get(); 161 default: 162 NOTREACHED(); 163 } 164 return NULL; 165} 166 167fileapi::FileSystemOperation* 168MediaFileSystemBackend::CreateFileSystemOperation( 169 const FileSystemURL& url, 170 FileSystemContext* context, 171 base::PlatformFileError* error_code) const { 172 scoped_ptr<fileapi::FileSystemOperationContext> operation_context( 173 new fileapi::FileSystemOperationContext( 174 context, media_task_runner_.get())); 175 176 operation_context->SetUserValue(kMediaPathFilterKey, 177 media_path_filter_.get()); 178 if (url.type() == fileapi::kFileSystemTypeDeviceMedia) { 179 operation_context->SetUserValue(kMTPDeviceDelegateURLKey, 180 url.filesystem_id()); 181 } 182 183 return new fileapi::FileSystemOperationImpl(url, context, 184 operation_context.Pass()); 185} 186 187scoped_ptr<webkit_blob::FileStreamReader> 188MediaFileSystemBackend::CreateFileStreamReader( 189 const FileSystemURL& url, 190 int64 offset, 191 const base::Time& expected_modification_time, 192 FileSystemContext* context) const { 193 return scoped_ptr<webkit_blob::FileStreamReader>( 194 new webkit_blob::LocalFileStreamReader( 195 context->default_file_task_runner(), 196 url.path(), offset, expected_modification_time)); 197} 198 199scoped_ptr<fileapi::FileStreamWriter> 200MediaFileSystemBackend::CreateFileStreamWriter( 201 const FileSystemURL& url, 202 int64 offset, 203 FileSystemContext* context) const { 204 return scoped_ptr<fileapi::FileStreamWriter>( 205 new fileapi::LocalFileStreamWriter( 206 context->default_file_task_runner(), 207 url.path(), offset)); 208} 209 210fileapi::FileSystemQuotaUtil* 211MediaFileSystemBackend::GetQuotaUtil() { 212 // No quota support. 213 return NULL; 214} 215 216} // namespace chrome 217