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/file_system/isolated_file_system_backend.h"
6 
7 #include <stdint.h>
8 
9 #include <memory>
10 #include <string>
11 #include <utility>
12 
13 #include "base/bind.h"
14 #include "base/check.h"
15 #include "base/files/file_path.h"
16 #include "base/notreached.h"
17 #include "base/sequenced_task_runner.h"
18 #include "base/threading/thread_task_runner_handle.h"
19 #include "storage/browser/file_system/async_file_util_adapter.h"
20 #include "storage/browser/file_system/copy_or_move_file_validator.h"
21 #include "storage/browser/file_system/dragged_file_util.h"
22 #include "storage/browser/file_system/file_stream_reader.h"
23 #include "storage/browser/file_system/file_stream_writer.h"
24 #include "storage/browser/file_system/file_system_context.h"
25 #include "storage/browser/file_system/file_system_operation.h"
26 #include "storage/browser/file_system/file_system_operation_context.h"
27 #include "storage/browser/file_system/isolated_context.h"
28 #include "storage/browser/file_system/native_file_util.h"
29 #include "storage/browser/file_system/transient_file_util.h"
30 #include "storage/browser/file_system/watcher_manager.h"
31 #include "storage/common/file_system/file_system_types.h"
32 #include "storage/common/file_system/file_system_util.h"
33 
34 namespace storage {
35 
IsolatedFileSystemBackend(bool use_for_type_native_local,bool use_for_type_platform_app)36 IsolatedFileSystemBackend::IsolatedFileSystemBackend(
37     bool use_for_type_native_local,
38     bool use_for_type_platform_app)
39     : use_for_type_native_local_(use_for_type_native_local),
40       use_for_type_platform_app_(use_for_type_platform_app),
41       isolated_file_util_(new AsyncFileUtilAdapter(new LocalFileUtil())),
42       dragged_file_util_(new AsyncFileUtilAdapter(new DraggedFileUtil())),
43       transient_file_util_(new AsyncFileUtilAdapter(new TransientFileUtil())) {}
44 
45 IsolatedFileSystemBackend::~IsolatedFileSystemBackend() = default;
46 
CanHandleType(FileSystemType type) const47 bool IsolatedFileSystemBackend::CanHandleType(FileSystemType type) const {
48   switch (type) {
49     case kFileSystemTypeIsolated:
50     case kFileSystemTypeDragged:
51     case kFileSystemTypeForTransientFile:
52       return true;
53     case kFileSystemTypeNativeLocal:
54       return use_for_type_native_local_;
55     case kFileSystemTypeNativeForPlatformApp:
56       return use_for_type_platform_app_;
57     default:
58       return false;
59   }
60 }
61 
Initialize(FileSystemContext * context)62 void IsolatedFileSystemBackend::Initialize(FileSystemContext* context) {}
63 
ResolveURL(const FileSystemURL & url,OpenFileSystemMode mode,OpenFileSystemCallback callback)64 void IsolatedFileSystemBackend::ResolveURL(const FileSystemURL& url,
65                                            OpenFileSystemMode mode,
66                                            OpenFileSystemCallback callback) {
67   // We never allow opening a new isolated FileSystem via usual ResolveURL.
68   base::ThreadTaskRunnerHandle::Get()->PostTask(
69       FROM_HERE, base::BindOnce(std::move(callback), GURL(), std::string(),
70                                 base::File::FILE_ERROR_SECURITY));
71 }
72 
GetAsyncFileUtil(FileSystemType type)73 AsyncFileUtil* 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 nullptr;
86 }
87 
GetWatcherManager(FileSystemType type)88 WatcherManager* IsolatedFileSystemBackend::GetWatcherManager(
89     FileSystemType type) {
90   return nullptr;
91 }
92 
93 CopyOrMoveFileValidatorFactory*
GetCopyOrMoveFileValidatorFactory(FileSystemType type,base::File::Error * error_code)94 IsolatedFileSystemBackend::GetCopyOrMoveFileValidatorFactory(
95     FileSystemType type,
96     base::File::Error* error_code) {
97   DCHECK(error_code);
98   *error_code = base::File::FILE_OK;
99   return nullptr;
100 }
101 
CreateFileSystemOperation(const FileSystemURL & url,FileSystemContext * context,base::File::Error * error_code) const102 FileSystemOperation* IsolatedFileSystemBackend::CreateFileSystemOperation(
103     const FileSystemURL& url,
104     FileSystemContext* context,
105     base::File::Error* error_code) const {
106   return FileSystemOperation::Create(
107       url, context, std::make_unique<FileSystemOperationContext>(context));
108 }
109 
SupportsStreaming(const FileSystemURL & url) const110 bool IsolatedFileSystemBackend::SupportsStreaming(
111     const FileSystemURL& url) const {
112   return false;
113 }
114 
HasInplaceCopyImplementation(FileSystemType type) const115 bool IsolatedFileSystemBackend::HasInplaceCopyImplementation(
116     FileSystemType type) const {
117   DCHECK(type == kFileSystemTypeNativeLocal || type == kFileSystemTypeDragged ||
118          type == kFileSystemTypeForTransientFile);
119   return false;
120 }
121 
122 std::unique_ptr<FileStreamReader>
CreateFileStreamReader(const FileSystemURL & url,int64_t offset,int64_t max_bytes_to_read,const base::Time & expected_modification_time,FileSystemContext * context) const123 IsolatedFileSystemBackend::CreateFileStreamReader(
124     const FileSystemURL& url,
125     int64_t offset,
126     int64_t max_bytes_to_read,
127     const base::Time& expected_modification_time,
128     FileSystemContext* context) const {
129   return FileStreamReader::CreateForLocalFile(
130       context->default_file_task_runner(), url.path(), offset,
131       expected_modification_time);
132 }
133 
134 std::unique_ptr<FileStreamWriter>
CreateFileStreamWriter(const FileSystemURL & url,int64_t offset,FileSystemContext * context) const135 IsolatedFileSystemBackend::CreateFileStreamWriter(
136     const FileSystemURL& url,
137     int64_t offset,
138     FileSystemContext* context) const {
139   return FileStreamWriter::CreateForLocalFile(
140       context->default_file_task_runner(), url.path(), offset,
141       FileStreamWriter::OPEN_EXISTING_FILE);
142 }
143 
GetQuotaUtil()144 FileSystemQuotaUtil* IsolatedFileSystemBackend::GetQuotaUtil() {
145   // No quota support.
146   return nullptr;
147 }
148 
GetUpdateObservers(FileSystemType type) const149 const UpdateObserverList* IsolatedFileSystemBackend::GetUpdateObservers(
150     FileSystemType type) const {
151   return nullptr;
152 }
153 
GetChangeObservers(FileSystemType type) const154 const ChangeObserverList* IsolatedFileSystemBackend::GetChangeObservers(
155     FileSystemType type) const {
156   return nullptr;
157 }
158 
GetAccessObservers(FileSystemType type) const159 const AccessObserverList* IsolatedFileSystemBackend::GetAccessObservers(
160     FileSystemType type) const {
161   return nullptr;
162 }
163 
164 }  // namespace storage
165