15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/isolated_file_system_backend.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/files/file_util_proxy.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/blob/file_stream_reader.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util_adapter.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/copy_or_move_file_validator.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/dragged_file_util.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_stream_writer.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_context.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation.h" 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_context.h" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/isolated_context.h" 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/native_file_util.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/transient_file_util.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/watcher_manager.h" 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_types.h" 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_util.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIsolatedFileSystemBackend::IsolatedFileSystemBackend() 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : isolated_file_util_(new AsyncFileUtilAdapter(new LocalFileUtil())), 34a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) dragged_file_util_(new AsyncFileUtilAdapter(new DraggedFileUtil())), 35a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) transient_file_util_(new AsyncFileUtilAdapter(new TransientFileUtil())) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIsolatedFileSystemBackend::~IsolatedFileSystemBackend() { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool IsolatedFileSystemBackend::CanHandleType(FileSystemType type) const { 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (type) { 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kFileSystemTypeIsolated: 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kFileSystemTypeDragged: 45a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case kFileSystemTypeForTransientFile: 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_CHROMEOS) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kFileSystemTypeNativeLocal: 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kFileSystemTypeNativeForPlatformApp: 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) default: 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid IsolatedFileSystemBackend::Initialize(FileSystemContext* context) { 58bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 59bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void IsolatedFileSystemBackend::ResolveURL( 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const FileSystemURL& url, 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OpenFileSystemMode mode, 63bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const OpenFileSystemCallback& callback) { 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // We never allow opening a new isolated FileSystem via usual ResolveURL. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::MessageLoopProxy::current()->PostTask( 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(callback, 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GURL(), 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string(), 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::FILE_ERROR_SECURITY)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochAsyncFileUtil* IsolatedFileSystemBackend::GetAsyncFileUtil( 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemType type) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kFileSystemTypeNativeLocal: 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return isolated_file_util_.get(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case kFileSystemTypeDragged: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dragged_file_util_.get(); 80a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) case kFileSystemTypeForTransientFile: 81a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return transient_file_util_.get(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciWatcherManager* IsolatedFileSystemBackend::GetWatcherManager( 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FileSystemType type) { 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)CopyOrMoveFileValidatorFactory* 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIsolatedFileSystemBackend::GetCopyOrMoveFileValidatorFactory( 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FileSystemType type, base::File::Error* error_code) { 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(error_code); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *error_code = base::File::FILE_OK; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochFileSystemOperation* IsolatedFileSystemBackend::CreateFileSystemOperation( 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemContext* context, 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error* error_code) const { 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return FileSystemOperation::Create( 106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) url, context, make_scoped_ptr(new FileSystemOperationContext(context))); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool IsolatedFileSystemBackend::SupportsStreaming( 11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url) const { 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool IsolatedFileSystemBackend::HasInplaceCopyImplementation( 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemType type) const { 11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(type == kFileSystemTypeNativeLocal || type == kFileSystemTypeDragged || 11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) type == kFileSystemTypeForTransientFile); 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return false; 11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)scoped_ptr<storage::FileStreamReader> 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIsolatedFileSystemBackend::CreateFileStreamReader( 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 offset, 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 max_bytes_to_read, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& expected_modification_time, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemContext* context) const { 12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return scoped_ptr<storage::FileStreamReader>( 12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileStreamReader::CreateForLocalFile( 130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) context->default_file_task_runner(), 13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) url.path(), 13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) offset, 13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expected_modification_time)); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochscoped_ptr<FileStreamWriter> IsolatedFileSystemBackend::CreateFileStreamWriter( 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 offset, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemContext* context) const { 14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return scoped_ptr<FileStreamWriter>( 14123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FileStreamWriter::CreateForLocalFile( 14223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) context->default_file_task_runner(), 14323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) url.path(), 14423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) offset, 14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FileStreamWriter::OPEN_EXISTING_FILE)); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochFileSystemQuotaUtil* IsolatedFileSystemBackend::GetQuotaUtil() { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No quota support. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst UpdateObserverList* IsolatedFileSystemBackend::GetUpdateObservers( 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FileSystemType type) const { 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst ChangeObserverList* IsolatedFileSystemBackend::GetChangeObservers( 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FileSystemType type) const { 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst AccessObserverList* IsolatedFileSystemBackend::GetAccessObservers( 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FileSystemType type) const { 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace storage 169