Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / storage / browser / fileapi / sandbox_file_system_backend.cc
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/sandbox_file_system_backend.h"
6
7 #include "base/bind.h"
8 #include "base/files/file_util.h"
9 #include "base/logging.h"
10 #include "base/metrics/histogram.h"
11 #include "base/task_runner_util.h"
12 #include "storage/browser/blob/file_stream_reader.h"
13 #include "storage/browser/fileapi/async_file_util_adapter.h"
14 #include "storage/browser/fileapi/copy_or_move_file_validator.h"
15 #include "storage/browser/fileapi/file_stream_writer.h"
16 #include "storage/browser/fileapi/file_system_context.h"
17 #include "storage/browser/fileapi/file_system_operation.h"
18 #include "storage/browser/fileapi/file_system_operation_context.h"
19 #include "storage/browser/fileapi/file_system_options.h"
20 #include "storage/browser/fileapi/file_system_usage_cache.h"
21 #include "storage/browser/fileapi/obfuscated_file_util.h"
22 #include "storage/browser/fileapi/sandbox_file_system_backend_delegate.h"
23 #include "storage/browser/fileapi/sandbox_quota_observer.h"
24 #include "storage/browser/quota/quota_manager.h"
25 #include "storage/common/fileapi/file_system_types.h"
26 #include "storage/common/fileapi/file_system_util.h"
27 #include "url/gurl.h"
28
29 using storage::QuotaManagerProxy;
30 using storage::SpecialStoragePolicy;
31
32 namespace storage {
33
34 SandboxFileSystemBackend::SandboxFileSystemBackend(
35     SandboxFileSystemBackendDelegate* delegate)
36     : delegate_(delegate),
37       enable_temporary_file_system_in_incognito_(false) {
38 }
39
40 SandboxFileSystemBackend::~SandboxFileSystemBackend() {
41 }
42
43 bool SandboxFileSystemBackend::CanHandleType(FileSystemType type) const {
44   return type == kFileSystemTypeTemporary ||
45          type == kFileSystemTypePersistent;
46 }
47
48 void SandboxFileSystemBackend::Initialize(FileSystemContext* context) {
49   DCHECK(delegate_);
50
51   // Set quota observers.
52   delegate_->RegisterQuotaUpdateObserver(storage::kFileSystemTypeTemporary);
53   delegate_->AddFileAccessObserver(
54       storage::kFileSystemTypeTemporary, delegate_->quota_observer(), NULL);
55
56   delegate_->RegisterQuotaUpdateObserver(storage::kFileSystemTypePersistent);
57   delegate_->AddFileAccessObserver(
58       storage::kFileSystemTypePersistent, delegate_->quota_observer(), NULL);
59 }
60
61 void SandboxFileSystemBackend::ResolveURL(
62     const FileSystemURL& url,
63     OpenFileSystemMode mode,
64     const OpenFileSystemCallback& callback) {
65   DCHECK(CanHandleType(url.type()));
66   DCHECK(delegate_);
67   if (delegate_->file_system_options().is_incognito() &&
68       !(url.type() == kFileSystemTypeTemporary &&
69         enable_temporary_file_system_in_incognito_)) {
70     // TODO(kinuko): return an isolated temporary directory.
71     callback.Run(GURL(), std::string(), base::File::FILE_ERROR_SECURITY);
72     return;
73   }
74
75   delegate_->OpenFileSystem(url.origin(),
76                             url.type(),
77                             mode,
78                             callback,
79                             GetFileSystemRootURI(url.origin(), url.type()));
80 }
81
82 AsyncFileUtil* SandboxFileSystemBackend::GetAsyncFileUtil(
83     FileSystemType type) {
84   DCHECK(delegate_);
85   return delegate_->file_util();
86 }
87
88 WatcherManager* SandboxFileSystemBackend::GetWatcherManager(
89     FileSystemType type) {
90   return NULL;
91 }
92
93 CopyOrMoveFileValidatorFactory*
94 SandboxFileSystemBackend::GetCopyOrMoveFileValidatorFactory(
95     FileSystemType type,
96     base::File::Error* error_code) {
97   DCHECK(error_code);
98   *error_code = base::File::FILE_OK;
99   return NULL;
100 }
101
102 FileSystemOperation* SandboxFileSystemBackend::CreateFileSystemOperation(
103     const FileSystemURL& url,
104     FileSystemContext* context,
105     base::File::Error* error_code) const {
106   DCHECK(CanHandleType(url.type()));
107   DCHECK(error_code);
108
109   DCHECK(delegate_);
110   scoped_ptr<FileSystemOperationContext> operation_context =
111       delegate_->CreateFileSystemOperationContext(url, context, error_code);
112   if (!operation_context)
113     return NULL;
114
115   SpecialStoragePolicy* policy = delegate_->special_storage_policy();
116   if (policy && policy->IsStorageUnlimited(url.origin()))
117     operation_context->set_quota_limit_type(storage::kQuotaLimitTypeUnlimited);
118   else
119     operation_context->set_quota_limit_type(storage::kQuotaLimitTypeLimited);
120
121   return FileSystemOperation::Create(url, context, operation_context.Pass());
122 }
123
124 bool SandboxFileSystemBackend::SupportsStreaming(
125     const storage::FileSystemURL& url) const {
126   return false;
127 }
128
129 bool SandboxFileSystemBackend::HasInplaceCopyImplementation(
130     storage::FileSystemType type) const {
131   return false;
132 }
133
134 scoped_ptr<storage::FileStreamReader>
135 SandboxFileSystemBackend::CreateFileStreamReader(
136     const FileSystemURL& url,
137     int64 offset,
138     int64 max_bytes_to_read,
139     const base::Time& expected_modification_time,
140     FileSystemContext* context) const {
141   DCHECK(CanHandleType(url.type()));
142   DCHECK(delegate_);
143   return delegate_->CreateFileStreamReader(
144       url, offset, expected_modification_time, context);
145 }
146
147 scoped_ptr<storage::FileStreamWriter>
148 SandboxFileSystemBackend::CreateFileStreamWriter(
149     const FileSystemURL& url,
150     int64 offset,
151     FileSystemContext* context) const {
152   DCHECK(CanHandleType(url.type()));
153   DCHECK(delegate_);
154   return delegate_->CreateFileStreamWriter(url, offset, context, url.type());
155 }
156
157 FileSystemQuotaUtil* SandboxFileSystemBackend::GetQuotaUtil() {
158   return delegate_;
159 }
160
161 const UpdateObserverList* SandboxFileSystemBackend::GetUpdateObservers(
162     FileSystemType type) const {
163   return delegate_->GetUpdateObservers(type);
164 }
165
166 const ChangeObserverList* SandboxFileSystemBackend::GetChangeObservers(
167     FileSystemType type) const {
168   return delegate_->GetChangeObservers(type);
169 }
170
171 const AccessObserverList* SandboxFileSystemBackend::GetAccessObservers(
172     FileSystemType type) const {
173   return delegate_->GetAccessObservers(type);
174 }
175
176 SandboxFileSystemBackendDelegate::OriginEnumerator*
177 SandboxFileSystemBackend::CreateOriginEnumerator() {
178   DCHECK(delegate_);
179   return delegate_->CreateOriginEnumerator();
180 }
181
182 }  // namespace storage