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 "storage/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/sequenced_task_runner.h" 15#include "storage/browser/blob/file_stream_reader.h" 16#include "storage/browser/fileapi/async_file_util_adapter.h" 17#include "storage/browser/fileapi/copy_or_move_file_validator.h" 18#include "storage/browser/fileapi/dragged_file_util.h" 19#include "storage/browser/fileapi/file_stream_writer.h" 20#include "storage/browser/fileapi/file_system_context.h" 21#include "storage/browser/fileapi/file_system_operation.h" 22#include "storage/browser/fileapi/file_system_operation_context.h" 23#include "storage/browser/fileapi/isolated_context.h" 24#include "storage/browser/fileapi/native_file_util.h" 25#include "storage/browser/fileapi/transient_file_util.h" 26#include "storage/browser/fileapi/watcher_manager.h" 27#include "storage/common/fileapi/file_system_types.h" 28#include "storage/common/fileapi/file_system_util.h" 29 30namespace storage { 31 32IsolatedFileSystemBackend::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 38IsolatedFileSystemBackend::~IsolatedFileSystemBackend() { 39} 40 41bool 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 57void IsolatedFileSystemBackend::Initialize(FileSystemContext* context) { 58} 59 60void IsolatedFileSystemBackend::ResolveURL( 61 const FileSystemURL& url, 62 OpenFileSystemMode mode, 63 const OpenFileSystemCallback& callback) { 64 // We never allow opening a new isolated FileSystem via usual ResolveURL. 65 base::MessageLoopProxy::current()->PostTask( 66 FROM_HERE, 67 base::Bind(callback, 68 GURL(), 69 std::string(), 70 base::File::FILE_ERROR_SECURITY)); 71} 72 73AsyncFileUtil* IsolatedFileSystemBackend::GetAsyncFileUtil( 74 FileSystemType type) { 75 switch (type) { 76 case kFileSystemTypeNativeLocal: 77 return isolated_file_util_.get(); 78 case kFileSystemTypeDragged: 79 return dragged_file_util_.get(); 80 case kFileSystemTypeForTransientFile: 81 return transient_file_util_.get(); 82 default: 83 NOTREACHED(); 84 } 85 return NULL; 86} 87 88WatcherManager* IsolatedFileSystemBackend::GetWatcherManager( 89 FileSystemType type) { 90 return NULL; 91} 92 93CopyOrMoveFileValidatorFactory* 94IsolatedFileSystemBackend::GetCopyOrMoveFileValidatorFactory( 95 FileSystemType type, base::File::Error* error_code) { 96 DCHECK(error_code); 97 *error_code = base::File::FILE_OK; 98 return NULL; 99} 100 101FileSystemOperation* IsolatedFileSystemBackend::CreateFileSystemOperation( 102 const FileSystemURL& url, 103 FileSystemContext* context, 104 base::File::Error* error_code) const { 105 return FileSystemOperation::Create( 106 url, context, make_scoped_ptr(new FileSystemOperationContext(context))); 107} 108 109bool IsolatedFileSystemBackend::SupportsStreaming( 110 const storage::FileSystemURL& url) const { 111 return false; 112} 113 114bool IsolatedFileSystemBackend::HasInplaceCopyImplementation( 115 storage::FileSystemType type) const { 116 DCHECK(type == kFileSystemTypeNativeLocal || type == kFileSystemTypeDragged || 117 type == kFileSystemTypeForTransientFile); 118 return false; 119} 120 121scoped_ptr<storage::FileStreamReader> 122IsolatedFileSystemBackend::CreateFileStreamReader( 123 const FileSystemURL& url, 124 int64 offset, 125 int64 max_bytes_to_read, 126 const base::Time& expected_modification_time, 127 FileSystemContext* context) const { 128 return scoped_ptr<storage::FileStreamReader>( 129 storage::FileStreamReader::CreateForLocalFile( 130 context->default_file_task_runner(), 131 url.path(), 132 offset, 133 expected_modification_time)); 134} 135 136scoped_ptr<FileStreamWriter> IsolatedFileSystemBackend::CreateFileStreamWriter( 137 const FileSystemURL& url, 138 int64 offset, 139 FileSystemContext* context) const { 140 return scoped_ptr<FileStreamWriter>( 141 FileStreamWriter::CreateForLocalFile( 142 context->default_file_task_runner(), 143 url.path(), 144 offset, 145 FileStreamWriter::OPEN_EXISTING_FILE)); 146} 147 148FileSystemQuotaUtil* IsolatedFileSystemBackend::GetQuotaUtil() { 149 // No quota support. 150 return NULL; 151} 152 153const UpdateObserverList* IsolatedFileSystemBackend::GetUpdateObservers( 154 FileSystemType type) const { 155 return NULL; 156} 157 158const ChangeObserverList* IsolatedFileSystemBackend::GetChangeObservers( 159 FileSystemType type) const { 160 return NULL; 161} 162 163const AccessObserverList* IsolatedFileSystemBackend::GetAccessObservers( 164 FileSystemType type) const { 165 return NULL; 166} 167 168} // namespace storage 169