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