1 // Copyright (c) 2012 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 "webkit/browser/fileapi/isolated_file_system_backend.h" 6 7 #include <string> 8 9 #include "base/bind.h" 10 #include "base/files/file_path.h" 11 #include "base/files/file_util_proxy.h" 12 #include "base/logging.h" 13 #include "base/message_loop/message_loop_proxy.h" 14 #include "base/platform_file.h" 15 #include "base/sequenced_task_runner.h" 16 #include "webkit/browser/blob/file_stream_reader.h" 17 #include "webkit/browser/fileapi/async_file_util_adapter.h" 18 #include "webkit/browser/fileapi/copy_or_move_file_validator.h" 19 #include "webkit/browser/fileapi/dragged_file_util.h" 20 #include "webkit/browser/fileapi/file_stream_writer.h" 21 #include "webkit/browser/fileapi/file_system_context.h" 22 #include "webkit/browser/fileapi/file_system_operation.h" 23 #include "webkit/browser/fileapi/file_system_operation_context.h" 24 #include "webkit/browser/fileapi/isolated_context.h" 25 #include "webkit/browser/fileapi/native_file_util.h" 26 #include "webkit/browser/fileapi/transient_file_util.h" 27 #include "webkit/common/fileapi/file_system_types.h" 28 #include "webkit/common/fileapi/file_system_util.h" 29 30 namespace fileapi { 31 32 IsolatedFileSystemBackend::IsolatedFileSystemBackend() 33 : isolated_file_util_(new AsyncFileUtilAdapter(new LocalFileUtil())), 34 dragged_file_util_(new AsyncFileUtilAdapter(new DraggedFileUtil())), 35 transient_file_util_(new AsyncFileUtilAdapter(new TransientFileUtil())) { 36 } 37 38 IsolatedFileSystemBackend::~IsolatedFileSystemBackend() { 39 } 40 41 bool IsolatedFileSystemBackend::CanHandleType(FileSystemType type) const { 42 switch (type) { 43 case kFileSystemTypeIsolated: 44 case kFileSystemTypeDragged: 45 case kFileSystemTypeForTransientFile: 46 return true; 47 #if !defined(OS_CHROMEOS) 48 case kFileSystemTypeNativeLocal: 49 case kFileSystemTypeNativeForPlatformApp: 50 return true; 51 #endif 52 default: 53 return false; 54 } 55 } 56 57 void IsolatedFileSystemBackend::Initialize(FileSystemContext* context) { 58 } 59 60 void IsolatedFileSystemBackend::OpenFileSystem( 61 const GURL& origin_url, 62 FileSystemType type, 63 OpenFileSystemMode mode, 64 const OpenFileSystemCallback& callback) { 65 // We never allow opening a new isolated FileSystem via usual OpenFileSystem. 66 base::MessageLoopProxy::current()->PostTask( 67 FROM_HERE, 68 base::Bind(callback, 69 GetFileSystemRootURI(origin_url, type), 70 GetFileSystemName(origin_url, type), 71 base::PLATFORM_FILE_ERROR_SECURITY)); 72 } 73 74 AsyncFileUtil* IsolatedFileSystemBackend::GetAsyncFileUtil( 75 FileSystemType type) { 76 switch (type) { 77 case kFileSystemTypeNativeLocal: 78 return isolated_file_util_.get(); 79 case kFileSystemTypeDragged: 80 return dragged_file_util_.get(); 81 case kFileSystemTypeForTransientFile: 82 return transient_file_util_.get(); 83 default: 84 NOTREACHED(); 85 } 86 return NULL; 87 } 88 89 CopyOrMoveFileValidatorFactory* 90 IsolatedFileSystemBackend::GetCopyOrMoveFileValidatorFactory( 91 FileSystemType type, base::PlatformFileError* error_code) { 92 DCHECK(error_code); 93 *error_code = base::PLATFORM_FILE_OK; 94 return NULL; 95 } 96 97 FileSystemOperation* IsolatedFileSystemBackend::CreateFileSystemOperation( 98 const FileSystemURL& url, 99 FileSystemContext* context, 100 base::PlatformFileError* error_code) const { 101 return FileSystemOperation::Create( 102 url, context, make_scoped_ptr(new FileSystemOperationContext(context))); 103 } 104 105 scoped_ptr<webkit_blob::FileStreamReader> 106 IsolatedFileSystemBackend::CreateFileStreamReader( 107 const FileSystemURL& url, 108 int64 offset, 109 const base::Time& expected_modification_time, 110 FileSystemContext* context) const { 111 return scoped_ptr<webkit_blob::FileStreamReader>( 112 webkit_blob::FileStreamReader::CreateForLocalFile( 113 context->default_file_task_runner(), 114 url.path(), offset, expected_modification_time)); 115 } 116 117 scoped_ptr<FileStreamWriter> IsolatedFileSystemBackend::CreateFileStreamWriter( 118 const FileSystemURL& url, 119 int64 offset, 120 FileSystemContext* context) const { 121 return scoped_ptr<FileStreamWriter>(FileStreamWriter::CreateForLocalFile( 122 context->default_file_task_runner(), url.path(), offset)); 123 } 124 125 FileSystemQuotaUtil* IsolatedFileSystemBackend::GetQuotaUtil() { 126 // No quota support. 127 return NULL; 128 } 129 130 } // namespace fileapi 131