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