// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "webkit/browser/fileapi/isolated_file_system_backend.h" #include #include "base/bind.h" #include "base/files/file_path.h" #include "base/files/file_util_proxy.h" #include "base/logging.h" #include "base/message_loop/message_loop_proxy.h" #include "base/platform_file.h" #include "base/sequenced_task_runner.h" #include "webkit/browser/blob/file_stream_reader.h" #include "webkit/browser/fileapi/async_file_util_adapter.h" #include "webkit/browser/fileapi/copy_or_move_file_validator.h" #include "webkit/browser/fileapi/dragged_file_util.h" #include "webkit/browser/fileapi/file_stream_writer.h" #include "webkit/browser/fileapi/file_system_context.h" #include "webkit/browser/fileapi/file_system_operation.h" #include "webkit/browser/fileapi/file_system_operation_context.h" #include "webkit/browser/fileapi/isolated_context.h" #include "webkit/browser/fileapi/native_file_util.h" #include "webkit/browser/fileapi/transient_file_util.h" #include "webkit/common/fileapi/file_system_types.h" #include "webkit/common/fileapi/file_system_util.h" namespace fileapi { IsolatedFileSystemBackend::IsolatedFileSystemBackend() : isolated_file_util_(new AsyncFileUtilAdapter(new LocalFileUtil())), dragged_file_util_(new AsyncFileUtilAdapter(new DraggedFileUtil())), transient_file_util_(new AsyncFileUtilAdapter(new TransientFileUtil())) { } IsolatedFileSystemBackend::~IsolatedFileSystemBackend() { } bool IsolatedFileSystemBackend::CanHandleType(FileSystemType type) const { switch (type) { case kFileSystemTypeIsolated: case kFileSystemTypeDragged: case kFileSystemTypeForTransientFile: return true; #if !defined(OS_CHROMEOS) case kFileSystemTypeNativeLocal: case kFileSystemTypeNativeForPlatformApp: return true; #endif default: return false; } } void IsolatedFileSystemBackend::Initialize(FileSystemContext* context) { } void IsolatedFileSystemBackend::OpenFileSystem( const GURL& origin_url, FileSystemType type, OpenFileSystemMode mode, const OpenFileSystemCallback& callback) { // We never allow opening a new isolated FileSystem via usual OpenFileSystem. base::MessageLoopProxy::current()->PostTask( FROM_HERE, base::Bind(callback, GetFileSystemRootURI(origin_url, type), GetFileSystemName(origin_url, type), base::PLATFORM_FILE_ERROR_SECURITY)); } AsyncFileUtil* IsolatedFileSystemBackend::GetAsyncFileUtil( FileSystemType type) { switch (type) { case kFileSystemTypeNativeLocal: return isolated_file_util_.get(); case kFileSystemTypeDragged: return dragged_file_util_.get(); case kFileSystemTypeForTransientFile: return transient_file_util_.get(); default: NOTREACHED(); } return NULL; } CopyOrMoveFileValidatorFactory* IsolatedFileSystemBackend::GetCopyOrMoveFileValidatorFactory( FileSystemType type, base::PlatformFileError* error_code) { DCHECK(error_code); *error_code = base::PLATFORM_FILE_OK; return NULL; } FileSystemOperation* IsolatedFileSystemBackend::CreateFileSystemOperation( const FileSystemURL& url, FileSystemContext* context, base::PlatformFileError* error_code) const { return FileSystemOperation::Create( url, context, make_scoped_ptr(new FileSystemOperationContext(context))); } scoped_ptr IsolatedFileSystemBackend::CreateFileStreamReader( const FileSystemURL& url, int64 offset, const base::Time& expected_modification_time, FileSystemContext* context) const { return scoped_ptr( webkit_blob::FileStreamReader::CreateForLocalFile( context->default_file_task_runner(), url.path(), offset, expected_modification_time)); } scoped_ptr IsolatedFileSystemBackend::CreateFileStreamWriter( const FileSystemURL& url, int64 offset, FileSystemContext* context) const { return scoped_ptr(FileStreamWriter::CreateForLocalFile( context->default_file_task_runner(), url.path(), offset)); } FileSystemQuotaUtil* IsolatedFileSystemBackend::GetQuotaUtil() { // No quota support. return NULL; } } // namespace fileapi