blob: 721f67139573b48aed001c5382a0055bb3b4e2cd [file] [log] [blame]
battre@chromium.org6d025972012-04-17 11:48:06 +09001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
dumi@chromium.orgc980e402010-08-21 07:42:50 +09002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
brettw@chromium.org06a553b2013-01-26 09:21:58 +09005#include "base/files/file_util_proxy.h"
dumi@chromium.orgc980e402010-08-21 07:42:50 +09006
jhawkins@chromium.orgc14280a2011-10-18 07:39:51 +09007#include "base/bind.h"
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +09008#include "base/bind_helpers.h"
9#include "base/file_util.h"
thestig@chromium.org98e70672012-04-24 06:23:04 +090010#include "base/location.h"
brettw@chromium.orgab2678f2013-06-11 05:56:28 +090011#include "base/message_loop/message_loop_proxy.h"
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090012#include "base/task_runner.h"
battre@chromium.org6d025972012-04-17 11:48:06 +090013#include "base/task_runner_util.h"
dumi@chromium.orgc980e402010-08-21 07:42:50 +090014
kinuko@chromium.org4f65c992011-10-19 16:21:57 +090015namespace base {
dumi@chromium.orgc980e402010-08-21 07:42:50 +090016
kinuko@chromium.org1a078042010-10-07 17:35:09 +090017namespace {
18
battre@chromium.org6d025972012-04-17 11:48:06 +090019void CallWithTranslatedParameter(const FileUtilProxy::StatusCallback& callback,
20 bool value) {
21 DCHECK(!callback.is_null());
22 callback.Run(value ? PLATFORM_FILE_OK : PLATFORM_FILE_ERROR_FAILED);
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090023}
24
bbudge@chromium.org0224eb12013-07-12 09:53:57 +090025#if !defined(OS_NACL)
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090026// Helper classes or routines for individual methods.
27class CreateOrOpenHelper {
dumi@chromium.orgc980e402010-08-21 07:42:50 +090028 public:
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090029 CreateOrOpenHelper(TaskRunner* task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +090030 const FileUtilProxy::CloseTask& close_task)
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090031 : task_runner_(task_runner),
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +090032 close_task_(close_task),
kinuko@chromium.org4f65c992011-10-19 16:21:57 +090033 file_handle_(kInvalidPlatformFileValue),
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090034 created_(false),
35 error_(PLATFORM_FILE_OK) {}
dumi@chromium.orgc980e402010-08-21 07:42:50 +090036
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090037 ~CreateOrOpenHelper() {
38 if (file_handle_ != kInvalidPlatformFileValue) {
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090039 task_runner_->PostTask(
ajwong@chromium.orgc9c79af2011-11-22 04:23:44 +090040 FROM_HERE,
41 base::Bind(base::IgnoreResult(close_task_), file_handle_));
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090042 }
dumi@chromium.orgc980e402010-08-21 07:42:50 +090043 }
44
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +090045 void RunWork(const FileUtilProxy::CreateOrOpenTask& task) {
46 error_ = task.Run(&file_handle_, &created_);
dumi@chromium.orgc980e402010-08-21 07:42:50 +090047 }
48
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090049 void Reply(const FileUtilProxy::CreateOrOpenCallback& callback) {
50 DCHECK(!callback.is_null());
51 callback.Run(error_, PassPlatformFile(&file_handle_), created_);
dumi@chromium.orgc980e402010-08-21 07:42:50 +090052 }
53
54 private:
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090055 scoped_refptr<TaskRunner> task_runner_;
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +090056 FileUtilProxy::CloseTask close_task_;
kinuko@chromium.org4f65c992011-10-19 16:21:57 +090057 PlatformFile file_handle_;
dumi@chromium.orgc980e402010-08-21 07:42:50 +090058 bool created_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090059 PlatformFileError error_;
60 DISALLOW_COPY_AND_ASSIGN(CreateOrOpenHelper);
dumi@chromium.orgc980e402010-08-21 07:42:50 +090061};
62
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090063class CreateTemporaryHelper {
dumi@chromium.orgc980e402010-08-21 07:42:50 +090064 public:
thestig@chromium.org98e70672012-04-24 06:23:04 +090065 explicit CreateTemporaryHelper(TaskRunner* task_runner)
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090066 : task_runner_(task_runner),
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090067 file_handle_(kInvalidPlatformFileValue),
68 error_(PLATFORM_FILE_OK) {}
dumi@chromium.orgc980e402010-08-21 07:42:50 +090069
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090070 ~CreateTemporaryHelper() {
71 if (file_handle_ != kInvalidPlatformFileValue) {
rsleevi@chromium.org7501b032013-06-01 06:37:53 +090072 FileUtilProxy::Close(
73 task_runner_.get(), file_handle_, FileUtilProxy::StatusCallback());
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090074 }
dumi@chromium.orgc980e402010-08-21 07:42:50 +090075 }
76
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090077 void RunWork(int additional_file_flags) {
dumi@chromium.orgc980e402010-08-21 07:42:50 +090078 // TODO(darin): file_util should have a variant of CreateTemporaryFile
79 // that returns a FilePath and a PlatformFile.
80 file_util::CreateTemporaryFile(&file_path_);
81
dumi@chromium.orgc980e402010-08-21 07:42:50 +090082 int file_flags =
kinuko@chromium.org4f65c992011-10-19 16:21:57 +090083 PLATFORM_FILE_WRITE |
84 PLATFORM_FILE_TEMPORARY |
85 PLATFORM_FILE_CREATE_ALWAYS |
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090086 additional_file_flags;
noelutz@google.comf56dab22011-06-14 05:29:50 +090087
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090088 error_ = PLATFORM_FILE_OK;
89 file_handle_ = CreatePlatformFile(file_path_, file_flags, NULL, &error_);
dumi@chromium.orgc980e402010-08-21 07:42:50 +090090 }
91
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090092 void Reply(const FileUtilProxy::CreateTemporaryCallback& callback) {
93 DCHECK(!callback.is_null());
94 callback.Run(error_, PassPlatformFile(&file_handle_), file_path_);
dumi@chromium.orgc980e402010-08-21 07:42:50 +090095 }
96
97 private:
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090098 scoped_refptr<TaskRunner> task_runner_;
kinuko@chromium.org4f65c992011-10-19 16:21:57 +090099 PlatformFile file_handle_;
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900100 FilePath file_path_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900101 PlatformFileError error_;
102 DISALLOW_COPY_AND_ASSIGN(CreateTemporaryHelper);
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900103};
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900104#endif // !defined(OS_NACL)
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900105
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900106class GetFileInfoHelper {
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900107 public:
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900108 GetFileInfoHelper()
109 : error_(PLATFORM_FILE_OK) {}
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900110
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900111#if !defined(OS_NACL)
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900112 void RunWorkForFilePath(const FilePath& file_path) {
brettw@chromium.org10b64122013-07-12 02:36:07 +0900113 if (!PathExists(file_path)) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900114 error_ = PLATFORM_FILE_ERROR_NOT_FOUND;
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +0900115 return;
116 }
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900117 if (!file_util::GetFileInfo(file_path, &file_info_))
118 error_ = PLATFORM_FILE_ERROR_FAILED;
119 }
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900120#endif // !defined(OS_NACL)
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900121
122 void RunWorkForPlatformFile(PlatformFile file) {
123 if (!GetPlatformFileInfo(file, &file_info_))
124 error_ = PLATFORM_FILE_ERROR_FAILED;
125 }
126
127 void Reply(const FileUtilProxy::GetFileInfoCallback& callback) {
128 if (!callback.is_null()) {
129 callback.Run(error_, file_info_);
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +0900130 }
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900131 }
132
133 private:
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900134 PlatformFileError error_;
kinuko@chromium.org4f65c992011-10-19 16:21:57 +0900135 PlatformFileInfo file_info_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900136 DISALLOW_COPY_AND_ASSIGN(GetFileInfoHelper);
jianli@chromium.org9ed1f9d2010-08-31 11:42:36 +0900137};
138
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900139class ReadHelper {
dumi@chromium.org23915982010-09-10 12:01:14 +0900140 public:
thestig@chromium.org98e70672012-04-24 06:23:04 +0900141 explicit ReadHelper(int bytes_to_read)
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900142 : buffer_(new char[bytes_to_read]),
dumi@chromium.org23915982010-09-10 12:01:14 +0900143 bytes_to_read_(bytes_to_read),
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900144 bytes_read_(0) {}
145
146 void RunWork(PlatformFile file, int64 offset) {
147 bytes_read_ = ReadPlatformFile(file, offset, buffer_.get(), bytes_to_read_);
dumi@chromium.org23915982010-09-10 12:01:14 +0900148 }
149
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900150 void Reply(const FileUtilProxy::ReadCallback& callback) {
151 if (!callback.is_null()) {
152 PlatformFileError error =
153 (bytes_read_ < 0) ? PLATFORM_FILE_ERROR_FAILED : PLATFORM_FILE_OK;
154 callback.Run(error, buffer_.get(), bytes_read_);
155 }
dumi@chromium.org23915982010-09-10 12:01:14 +0900156 }
157
158 private:
tfarina@chromium.org15bc41d2013-01-18 23:21:58 +0900159 scoped_ptr<char[]> buffer_;
dumi@chromium.org23915982010-09-10 12:01:14 +0900160 int bytes_to_read_;
dumi@chromium.org23915982010-09-10 12:01:14 +0900161 int bytes_read_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900162 DISALLOW_COPY_AND_ASSIGN(ReadHelper);
dumi@chromium.org23915982010-09-10 12:01:14 +0900163};
164
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900165class WriteHelper {
dumi@chromium.org23915982010-09-10 12:01:14 +0900166 public:
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900167 WriteHelper(const char* buffer, int bytes_to_write)
168 : buffer_(new char[bytes_to_write]),
dumi@chromium.org23915982010-09-10 12:01:14 +0900169 bytes_to_write_(bytes_to_write),
finnur@chromium.org899d4e02011-03-15 18:56:27 +0900170 bytes_written_(0) {
darin@chromium.org44a99732011-02-04 09:39:34 +0900171 memcpy(buffer_.get(), buffer, bytes_to_write);
dumi@chromium.org23915982010-09-10 12:01:14 +0900172 }
173
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900174 void RunWork(PlatformFile file, int64 offset) {
175 bytes_written_ = WritePlatformFile(file, offset, buffer_.get(),
176 bytes_to_write_);
dumi@chromium.org23915982010-09-10 12:01:14 +0900177 }
178
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900179 void Reply(const FileUtilProxy::WriteCallback& callback) {
180 if (!callback.is_null()) {
181 PlatformFileError error =
182 (bytes_written_ < 0) ? PLATFORM_FILE_ERROR_FAILED : PLATFORM_FILE_OK;
183 callback.Run(error, bytes_written_);
184 }
dumi@chromium.org23915982010-09-10 12:01:14 +0900185 }
186
187 private:
tfarina@chromium.org15bc41d2013-01-18 23:21:58 +0900188 scoped_ptr<char[]> buffer_;
dumi@chromium.org23915982010-09-10 12:01:14 +0900189 int bytes_to_write_;
dumi@chromium.org23915982010-09-10 12:01:14 +0900190 int bytes_written_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900191 DISALLOW_COPY_AND_ASSIGN(WriteHelper);
dumi@chromium.org23915982010-09-10 12:01:14 +0900192};
193
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900194#if !defined(OS_NACL)
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900195PlatformFileError CreateOrOpenAdapter(
196 const FilePath& file_path, int file_flags,
197 PlatformFile* file_handle, bool* created) {
198 DCHECK(file_handle);
199 DCHECK(created);
200 if (!file_util::DirectoryExists(file_path.DirName())) {
201 // If its parent does not exist, should return NOT_FOUND error.
202 return PLATFORM_FILE_ERROR_NOT_FOUND;
203 }
204 PlatformFileError error = PLATFORM_FILE_OK;
205 *file_handle = CreatePlatformFile(file_path, file_flags, created, &error);
206 return error;
207}
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900208#endif // !defined(OS_NACL)
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900209
210PlatformFileError CloseAdapter(PlatformFile file_handle) {
211 if (!ClosePlatformFile(file_handle)) {
212 return PLATFORM_FILE_ERROR_FAILED;
213 }
214 return PLATFORM_FILE_OK;
215}
216
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900217#if !defined(OS_NACL)
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900218PlatformFileError DeleteAdapter(const FilePath& file_path, bool recursive) {
brettw@chromium.org10b64122013-07-12 02:36:07 +0900219 if (!PathExists(file_path)) {
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900220 return PLATFORM_FILE_ERROR_NOT_FOUND;
221 }
brettw@chromium.orge9f99482013-07-02 04:41:02 +0900222 if (!base::Delete(file_path, recursive)) {
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900223 if (!recursive && !file_util::IsDirectoryEmpty(file_path)) {
224 return PLATFORM_FILE_ERROR_NOT_EMPTY;
225 }
226 return PLATFORM_FILE_ERROR_FAILED;
227 }
228 return PLATFORM_FILE_OK;
229}
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900230#endif // !defined(OS_NACL)
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900231
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900232} // namespace
233
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900234#if !defined(OS_NACL)
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900235// static
dumi@chromium.org6dedd6d2010-08-25 05:26:23 +0900236bool FileUtilProxy::CreateOrOpen(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900237 TaskRunner* task_runner,
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900238 const FilePath& file_path, int file_flags,
jhawkins@chromium.org3a6573d2011-10-18 03:40:30 +0900239 const CreateOrOpenCallback& callback) {
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900240 return RelayCreateOrOpen(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900241 task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900242 base::Bind(&CreateOrOpenAdapter, file_path, file_flags),
243 base::Bind(&CloseAdapter),
244 callback);
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900245}
246
247// static
dumi@chromium.org6dedd6d2010-08-25 05:26:23 +0900248bool FileUtilProxy::CreateTemporary(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900249 TaskRunner* task_runner,
noelutz@google.comf56dab22011-06-14 05:29:50 +0900250 int additional_file_flags,
jhawkins@chromium.orgd90c4f52011-10-18 04:29:29 +0900251 const CreateTemporaryCallback& callback) {
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900252 CreateTemporaryHelper* helper = new CreateTemporaryHelper(task_runner);
253 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900254 FROM_HERE,
255 Bind(&CreateTemporaryHelper::RunWork, Unretained(helper),
256 additional_file_flags),
257 Bind(&CreateTemporaryHelper::Reply, Owned(helper), callback));
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900258}
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900259#endif // !defined(OS_NACL)
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900260
261// static
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900262bool FileUtilProxy::Close(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900263 TaskRunner* task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900264 base::PlatformFile file_handle,
265 const StatusCallback& callback) {
266 return RelayClose(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900267 task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900268 base::Bind(&CloseAdapter),
269 file_handle, callback);
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900270}
271
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900272#if !defined(OS_NACL)
erg@google.com37c078e2011-01-11 09:50:59 +0900273// Retrieves the information about a file. It is invalid to pass NULL for the
274// callback.
275bool FileUtilProxy::GetFileInfo(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900276 TaskRunner* task_runner,
erg@google.com37c078e2011-01-11 09:50:59 +0900277 const FilePath& file_path,
jhawkins@chromium.org56771f02011-10-18 05:12:05 +0900278 const GetFileInfoCallback& callback) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900279 GetFileInfoHelper* helper = new GetFileInfoHelper;
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900280 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900281 FROM_HERE,
282 Bind(&GetFileInfoHelper::RunWorkForFilePath,
283 Unretained(helper), file_path),
284 Bind(&GetFileInfoHelper::Reply, Owned(helper), callback));
erg@google.com37c078e2011-01-11 09:50:59 +0900285}
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900286#endif // !defined(OS_NACL)
erg@google.com37c078e2011-01-11 09:50:59 +0900287
kinuko@chromium.org850eb6d2010-10-15 09:37:34 +0900288// static
erg@google.com37c078e2011-01-11 09:50:59 +0900289bool FileUtilProxy::GetFileInfoFromPlatformFile(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900290 TaskRunner* task_runner,
erg@google.com37c078e2011-01-11 09:50:59 +0900291 PlatformFile file,
jhawkins@chromium.org56771f02011-10-18 05:12:05 +0900292 const GetFileInfoCallback& callback) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900293 GetFileInfoHelper* helper = new GetFileInfoHelper;
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900294 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900295 FROM_HERE,
296 Bind(&GetFileInfoHelper::RunWorkForPlatformFile,
297 Unretained(helper), file),
298 Bind(&GetFileInfoHelper::Reply, Owned(helper), callback));
erg@google.com37c078e2011-01-11 09:50:59 +0900299}
300
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900301#if !defined(OS_NACL)
erg@google.com37c078e2011-01-11 09:50:59 +0900302// static
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900303bool FileUtilProxy::Delete(TaskRunner* task_runner,
erg@google.com37c078e2011-01-11 09:50:59 +0900304 const FilePath& file_path,
305 bool recursive,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900306 const StatusCallback& callback) {
kinuko@chromium.org81f6e032013-01-17 04:54:36 +0900307 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900308 task_runner, FROM_HERE,
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900309 Bind(&DeleteAdapter, file_path, recursive),
310 callback);
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +0900311}
312
313// static
dumi@chromium.org6dedd6d2010-08-25 05:26:23 +0900314bool FileUtilProxy::RecursiveDelete(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900315 TaskRunner* task_runner,
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900316 const FilePath& file_path,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900317 const StatusCallback& callback) {
kinuko@chromium.org81f6e032013-01-17 04:54:36 +0900318 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900319 task_runner, FROM_HERE,
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900320 Bind(&DeleteAdapter, file_path, true /* recursive */),
321 callback);
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900322}
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900323#endif // !defined(OS_NACL)
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900324
dumi@chromium.org23915982010-09-10 12:01:14 +0900325// static
dumi@chromium.org23915982010-09-10 12:01:14 +0900326bool FileUtilProxy::Read(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900327 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900328 PlatformFile file,
329 int64 offset,
dumi@chromium.org23915982010-09-10 12:01:14 +0900330 int bytes_to_read,
jhawkins@chromium.orgd08a33e2011-10-18 05:44:47 +0900331 const ReadCallback& callback) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900332 if (bytes_to_read < 0) {
sanga@chromium.orgf5cff132011-08-18 01:16:27 +0900333 return false;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900334 }
335 ReadHelper* helper = new ReadHelper(bytes_to_read);
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900336 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900337 FROM_HERE,
338 Bind(&ReadHelper::RunWork, Unretained(helper), file, offset),
339 Bind(&ReadHelper::Reply, Owned(helper), callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900340}
341
342// static
343bool FileUtilProxy::Write(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900344 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900345 PlatformFile file,
346 int64 offset,
347 const char* buffer,
348 int bytes_to_write,
jhawkins@chromium.org553ef502011-10-18 05:56:52 +0900349 const WriteCallback& callback) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900350 if (bytes_to_write <= 0 || buffer == NULL) {
sanga@chromium.org21d251f2011-08-18 01:45:48 +0900351 return false;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900352 }
353 WriteHelper* helper = new WriteHelper(buffer, bytes_to_write);
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900354 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900355 FROM_HERE,
356 Bind(&WriteHelper::RunWork, Unretained(helper), file, offset),
357 Bind(&WriteHelper::Reply, Owned(helper), callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900358}
359
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900360#if !defined(OS_NACL)
dumi@chromium.org23915982010-09-10 12:01:14 +0900361// static
362bool FileUtilProxy::Touch(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900363 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900364 PlatformFile file,
kinuko@chromium.org4f65c992011-10-19 16:21:57 +0900365 const Time& last_access_time,
366 const Time& last_modified_time,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900367 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +0900368 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900369 task_runner,
battre@chromium.org6d025972012-04-17 11:48:06 +0900370 FROM_HERE,
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900371 Bind(&TouchPlatformFile, file,
battre@chromium.org6d025972012-04-17 11:48:06 +0900372 last_access_time, last_modified_time),
373 Bind(&CallWithTranslatedParameter, callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900374}
375
376// static
dumi@chromium.org12c2e2b2010-09-24 10:09:32 +0900377bool FileUtilProxy::Touch(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900378 TaskRunner* task_runner,
dumi@chromium.org12c2e2b2010-09-24 10:09:32 +0900379 const FilePath& file_path,
kinuko@chromium.org4f65c992011-10-19 16:21:57 +0900380 const Time& last_access_time,
381 const Time& last_modified_time,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900382 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +0900383 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900384 task_runner,
battre@chromium.org6d025972012-04-17 11:48:06 +0900385 FROM_HERE,
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900386 Bind(&file_util::TouchFile, file_path,
387 last_access_time, last_modified_time),
battre@chromium.org6d025972012-04-17 11:48:06 +0900388 Bind(&CallWithTranslatedParameter, callback));
dumi@chromium.org12c2e2b2010-09-24 10:09:32 +0900389}
390
391// static
dumi@chromium.org23915982010-09-10 12:01:14 +0900392bool FileUtilProxy::Truncate(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900393 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900394 PlatformFile file,
ericu@google.com6a652222010-10-05 11:26:47 +0900395 int64 length,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900396 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +0900397 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900398 task_runner,
battre@chromium.org6d025972012-04-17 11:48:06 +0900399 FROM_HERE,
400 Bind(&TruncatePlatformFile, file, length),
401 Bind(&CallWithTranslatedParameter, callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900402}
403
404// static
405bool FileUtilProxy::Flush(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900406 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900407 PlatformFile file,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900408 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +0900409 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900410 task_runner,
battre@chromium.org6d025972012-04-17 11:48:06 +0900411 FROM_HERE,
412 Bind(&FlushPlatformFile, file),
413 Bind(&CallWithTranslatedParameter, callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900414}
415
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900416// static
417bool FileUtilProxy::RelayCreateOrOpen(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900418 TaskRunner* task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900419 const CreateOrOpenTask& open_task,
420 const CloseTask& close_task,
421 const CreateOrOpenCallback& callback) {
422 CreateOrOpenHelper* helper = new CreateOrOpenHelper(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900423 task_runner, close_task);
424 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900425 FROM_HERE,
426 Bind(&CreateOrOpenHelper::RunWork, Unretained(helper), open_task),
427 Bind(&CreateOrOpenHelper::Reply, Owned(helper), callback));
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900428}
bbudge@chromium.org0224eb12013-07-12 09:53:57 +0900429#endif // !defined(OS_NACL)
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900430
431// static
432bool FileUtilProxy::RelayClose(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900433 TaskRunner* task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900434 const CloseTask& close_task,
435 PlatformFile file_handle,
436 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +0900437 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900438 task_runner, FROM_HERE, Bind(close_task, file_handle), callback);
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900439}
440
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +0900441} // namespace base