blob: 0a86393098f5d0ff7c39861e232435a17e73914c [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"
rvargas@chromium.orgb005b382014-01-07 19:06:58 +090010#include "base/files/file.h"
thestig@chromium.org98e70672012-04-24 06:23:04 +090011#include "base/location.h"
brettw@chromium.orgab2678f2013-06-11 05:56:28 +090012#include "base/message_loop/message_loop_proxy.h"
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090013#include "base/task_runner.h"
battre@chromium.org6d025972012-04-17 11:48:06 +090014#include "base/task_runner_util.h"
dumi@chromium.orgc980e402010-08-21 07:42:50 +090015
kinuko@chromium.org4f65c992011-10-19 16:21:57 +090016namespace base {
dumi@chromium.orgc980e402010-08-21 07:42:50 +090017
kinuko@chromium.org1a078042010-10-07 17:35:09 +090018namespace {
19
battre@chromium.org6d025972012-04-17 11:48:06 +090020void CallWithTranslatedParameter(const FileUtilProxy::StatusCallback& callback,
21 bool value) {
22 DCHECK(!callback.is_null());
rvargas@chromium.org9e469f62014-01-28 06:36:00 +090023 callback.Run(value ? File::FILE_OK : File::FILE_ERROR_FAILED);
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090024}
25
26// 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),
rvargas@chromium.org9e469f62014-01-28 06:36:00 +090035 error_(File::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_;
rvargas@chromium.org9e469f62014-01-28 06:36:00 +090059 File::Error error_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090060 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),
rvargas@chromium.org9e469f62014-01-28 06:36:00 +090068 error_(File::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.
davidben@chromium.org0b9b2932014-03-08 22:04:49 +090080 if (!base::CreateTemporaryFile(&file_path_)) {
81 // TODO(davidben): base::CreateTemporaryFile should preserve the error
82 // code.
83 error_ = File::FILE_ERROR_FAILED;
84 return;
85 }
dumi@chromium.orgc980e402010-08-21 07:42:50 +090086
dumi@chromium.orgc980e402010-08-21 07:42:50 +090087 int file_flags =
kinuko@chromium.org4f65c992011-10-19 16:21:57 +090088 PLATFORM_FILE_WRITE |
89 PLATFORM_FILE_TEMPORARY |
90 PLATFORM_FILE_CREATE_ALWAYS |
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090091 additional_file_flags;
noelutz@google.comf56dab22011-06-14 05:29:50 +090092
rvargas@chromium.orge55f2db2014-04-10 04:58:54 +090093 File file(file_path_, file_flags);
94 if (!file.IsValid()) {
davidben@chromium.org0b9b2932014-03-08 22:04:49 +090095 base::DeleteFile(file_path_, false);
96 file_path_.clear();
rvargas@chromium.orge55f2db2014-04-10 04:58:54 +090097 error_ = file.error_details();
98 return;
davidben@chromium.org0b9b2932014-03-08 22:04:49 +090099 }
rvargas@chromium.orge55f2db2014-04-10 04:58:54 +0900100 error_ = File::FILE_OK;
101 file_handle_ = file.TakePlatformFile();
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900102 }
103
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900104 void Reply(const FileUtilProxy::CreateTemporaryCallback& callback) {
105 DCHECK(!callback.is_null());
106 callback.Run(error_, PassPlatformFile(&file_handle_), file_path_);
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900107 }
108
109 private:
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900110 scoped_refptr<TaskRunner> task_runner_;
kinuko@chromium.org4f65c992011-10-19 16:21:57 +0900111 PlatformFile file_handle_;
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900112 FilePath file_path_;
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900113 File::Error error_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900114 DISALLOW_COPY_AND_ASSIGN(CreateTemporaryHelper);
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900115};
116
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900117class GetFileInfoHelper {
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900118 public:
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900119 GetFileInfoHelper()
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900120 : error_(File::FILE_OK) {}
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900121
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900122 void RunWorkForFilePath(const FilePath& file_path) {
brettw@chromium.org10b64122013-07-12 02:36:07 +0900123 if (!PathExists(file_path)) {
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900124 error_ = File::FILE_ERROR_NOT_FOUND;
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +0900125 return;
126 }
rvargas@chromium.orgb005b382014-01-07 19:06:58 +0900127 // TODO(rvargas): switch this file to base::File.
128 if (!GetFileInfo(file_path, reinterpret_cast<File::Info*>(&file_info_)))
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900129 error_ = File::FILE_ERROR_FAILED;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900130 }
131
132 void RunWorkForPlatformFile(PlatformFile file) {
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900133 if (!GetPlatformFileInfo(
134 file, reinterpret_cast<PlatformFileInfo*>(&file_info_))) {
135 error_ = File::FILE_ERROR_FAILED;
136 }
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900137 }
138
139 void Reply(const FileUtilProxy::GetFileInfoCallback& callback) {
140 if (!callback.is_null()) {
141 callback.Run(error_, file_info_);
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +0900142 }
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900143 }
144
145 private:
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900146 File::Error error_;
147 File::Info file_info_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900148 DISALLOW_COPY_AND_ASSIGN(GetFileInfoHelper);
jianli@chromium.org9ed1f9d2010-08-31 11:42:36 +0900149};
150
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900151class ReadHelper {
dumi@chromium.org23915982010-09-10 12:01:14 +0900152 public:
thestig@chromium.org98e70672012-04-24 06:23:04 +0900153 explicit ReadHelper(int bytes_to_read)
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900154 : buffer_(new char[bytes_to_read]),
dumi@chromium.org23915982010-09-10 12:01:14 +0900155 bytes_to_read_(bytes_to_read),
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900156 bytes_read_(0) {}
157
158 void RunWork(PlatformFile file, int64 offset) {
159 bytes_read_ = ReadPlatformFile(file, offset, buffer_.get(), bytes_to_read_);
dumi@chromium.org23915982010-09-10 12:01:14 +0900160 }
161
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900162 void Reply(const FileUtilProxy::ReadCallback& callback) {
163 if (!callback.is_null()) {
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900164 File::Error error =
165 (bytes_read_ < 0) ? File::FILE_ERROR_FAILED : File::FILE_OK;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900166 callback.Run(error, buffer_.get(), bytes_read_);
167 }
dumi@chromium.org23915982010-09-10 12:01:14 +0900168 }
169
170 private:
tfarina@chromium.org15bc41d2013-01-18 23:21:58 +0900171 scoped_ptr<char[]> buffer_;
dumi@chromium.org23915982010-09-10 12:01:14 +0900172 int bytes_to_read_;
dumi@chromium.org23915982010-09-10 12:01:14 +0900173 int bytes_read_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900174 DISALLOW_COPY_AND_ASSIGN(ReadHelper);
dumi@chromium.org23915982010-09-10 12:01:14 +0900175};
176
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900177class WriteHelper {
dumi@chromium.org23915982010-09-10 12:01:14 +0900178 public:
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900179 WriteHelper(const char* buffer, int bytes_to_write)
180 : buffer_(new char[bytes_to_write]),
dumi@chromium.org23915982010-09-10 12:01:14 +0900181 bytes_to_write_(bytes_to_write),
finnur@chromium.org899d4e02011-03-15 18:56:27 +0900182 bytes_written_(0) {
darin@chromium.org44a99732011-02-04 09:39:34 +0900183 memcpy(buffer_.get(), buffer, bytes_to_write);
dumi@chromium.org23915982010-09-10 12:01:14 +0900184 }
185
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900186 void RunWork(PlatformFile file, int64 offset) {
187 bytes_written_ = WritePlatformFile(file, offset, buffer_.get(),
188 bytes_to_write_);
dumi@chromium.org23915982010-09-10 12:01:14 +0900189 }
190
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900191 void Reply(const FileUtilProxy::WriteCallback& callback) {
192 if (!callback.is_null()) {
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900193 File::Error error =
194 (bytes_written_ < 0) ? File::FILE_ERROR_FAILED : File::FILE_OK;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900195 callback.Run(error, bytes_written_);
196 }
dumi@chromium.org23915982010-09-10 12:01:14 +0900197 }
198
199 private:
tfarina@chromium.org15bc41d2013-01-18 23:21:58 +0900200 scoped_ptr<char[]> buffer_;
dumi@chromium.org23915982010-09-10 12:01:14 +0900201 int bytes_to_write_;
dumi@chromium.org23915982010-09-10 12:01:14 +0900202 int bytes_written_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900203 DISALLOW_COPY_AND_ASSIGN(WriteHelper);
dumi@chromium.org23915982010-09-10 12:01:14 +0900204};
205
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900206File::Error CreateOrOpenAdapter(
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900207 const FilePath& file_path, int file_flags,
208 PlatformFile* file_handle, bool* created) {
209 DCHECK(file_handle);
210 DCHECK(created);
brettw@chromium.org5a112e72013-07-16 05:18:09 +0900211 if (!DirectoryExists(file_path.DirName())) {
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900212 // If its parent does not exist, should return NOT_FOUND error.
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900213 return File::FILE_ERROR_NOT_FOUND;
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900214 }
rvargas@chromium.orge55f2db2014-04-10 04:58:54 +0900215
216 File file(file_path, file_flags);
217 if (!file.IsValid())
218 return file.error_details();
219
220 *file_handle = file.TakePlatformFile();
221 *created = file.created();
222 return File::FILE_OK;
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900223}
224
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900225File::Error CloseAdapter(PlatformFile file_handle) {
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900226 if (!ClosePlatformFile(file_handle)) {
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900227 return File::FILE_ERROR_FAILED;
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900228 }
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900229 return File::FILE_OK;
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900230}
231
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900232File::Error DeleteAdapter(const FilePath& file_path, bool recursive) {
brettw@chromium.org10b64122013-07-12 02:36:07 +0900233 if (!PathExists(file_path)) {
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900234 return File::FILE_ERROR_NOT_FOUND;
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900235 }
brettw@chromium.org220b8de2013-07-17 04:10:23 +0900236 if (!base::DeleteFile(file_path, recursive)) {
brettw@chromium.org83c44c82013-12-03 03:55:49 +0900237 if (!recursive && !base::IsDirectoryEmpty(file_path)) {
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900238 return File::FILE_ERROR_NOT_EMPTY;
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900239 }
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900240 return File::FILE_ERROR_FAILED;
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900241 }
rvargas@chromium.org9e469f62014-01-28 06:36:00 +0900242 return File::FILE_OK;
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900243}
244
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900245} // namespace
246
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900247// static
dumi@chromium.org6dedd6d2010-08-25 05:26:23 +0900248bool FileUtilProxy::CreateOrOpen(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900249 TaskRunner* task_runner,
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900250 const FilePath& file_path, int file_flags,
jhawkins@chromium.org3a6573d2011-10-18 03:40:30 +0900251 const CreateOrOpenCallback& callback) {
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900252 return RelayCreateOrOpen(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900253 task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900254 base::Bind(&CreateOrOpenAdapter, file_path, file_flags),
255 base::Bind(&CloseAdapter),
256 callback);
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900257}
258
259// static
dumi@chromium.org6dedd6d2010-08-25 05:26:23 +0900260bool FileUtilProxy::CreateTemporary(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900261 TaskRunner* task_runner,
noelutz@google.comf56dab22011-06-14 05:29:50 +0900262 int additional_file_flags,
jhawkins@chromium.orgd90c4f52011-10-18 04:29:29 +0900263 const CreateTemporaryCallback& callback) {
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900264 CreateTemporaryHelper* helper = new CreateTemporaryHelper(task_runner);
265 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900266 FROM_HERE,
267 Bind(&CreateTemporaryHelper::RunWork, Unretained(helper),
268 additional_file_flags),
269 Bind(&CreateTemporaryHelper::Reply, Owned(helper), callback));
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900270}
271
272// static
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900273bool FileUtilProxy::Close(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900274 TaskRunner* task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900275 base::PlatformFile file_handle,
276 const StatusCallback& callback) {
277 return RelayClose(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900278 task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900279 base::Bind(&CloseAdapter),
280 file_handle, callback);
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900281}
282
erg@google.com37c078e2011-01-11 09:50:59 +0900283// Retrieves the information about a file. It is invalid to pass NULL for the
284// callback.
285bool FileUtilProxy::GetFileInfo(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900286 TaskRunner* task_runner,
erg@google.com37c078e2011-01-11 09:50:59 +0900287 const FilePath& file_path,
jhawkins@chromium.org56771f02011-10-18 05:12:05 +0900288 const GetFileInfoCallback& callback) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900289 GetFileInfoHelper* helper = new GetFileInfoHelper;
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900290 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900291 FROM_HERE,
292 Bind(&GetFileInfoHelper::RunWorkForFilePath,
293 Unretained(helper), file_path),
294 Bind(&GetFileInfoHelper::Reply, Owned(helper), callback));
erg@google.com37c078e2011-01-11 09:50:59 +0900295}
296
kinuko@chromium.org850eb6d2010-10-15 09:37:34 +0900297// static
erg@google.com37c078e2011-01-11 09:50:59 +0900298bool FileUtilProxy::GetFileInfoFromPlatformFile(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900299 TaskRunner* task_runner,
erg@google.com37c078e2011-01-11 09:50:59 +0900300 PlatformFile file,
jhawkins@chromium.org56771f02011-10-18 05:12:05 +0900301 const GetFileInfoCallback& callback) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900302 GetFileInfoHelper* helper = new GetFileInfoHelper;
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900303 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900304 FROM_HERE,
305 Bind(&GetFileInfoHelper::RunWorkForPlatformFile,
306 Unretained(helper), file),
307 Bind(&GetFileInfoHelper::Reply, Owned(helper), callback));
erg@google.com37c078e2011-01-11 09:50:59 +0900308}
309
310// static
brettw@chromium.org220b8de2013-07-17 04:10:23 +0900311bool FileUtilProxy::DeleteFile(TaskRunner* task_runner,
312 const FilePath& file_path,
313 bool recursive,
314 const StatusCallback& callback) {
kinuko@chromium.org81f6e032013-01-17 04:54:36 +0900315 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900316 task_runner, FROM_HERE,
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900317 Bind(&DeleteAdapter, file_path, recursive),
318 callback);
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +0900319}
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900320
dumi@chromium.org23915982010-09-10 12:01:14 +0900321// static
dumi@chromium.org23915982010-09-10 12:01:14 +0900322bool FileUtilProxy::Read(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900323 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900324 PlatformFile file,
325 int64 offset,
dumi@chromium.org23915982010-09-10 12:01:14 +0900326 int bytes_to_read,
jhawkins@chromium.orgd08a33e2011-10-18 05:44:47 +0900327 const ReadCallback& callback) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900328 if (bytes_to_read < 0) {
sanga@chromium.orgf5cff132011-08-18 01:16:27 +0900329 return false;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900330 }
331 ReadHelper* helper = new ReadHelper(bytes_to_read);
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900332 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900333 FROM_HERE,
334 Bind(&ReadHelper::RunWork, Unretained(helper), file, offset),
335 Bind(&ReadHelper::Reply, Owned(helper), callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900336}
337
338// static
339bool FileUtilProxy::Write(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900340 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900341 PlatformFile file,
342 int64 offset,
343 const char* buffer,
344 int bytes_to_write,
jhawkins@chromium.org553ef502011-10-18 05:56:52 +0900345 const WriteCallback& callback) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900346 if (bytes_to_write <= 0 || buffer == NULL) {
sanga@chromium.org21d251f2011-08-18 01:45:48 +0900347 return false;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900348 }
349 WriteHelper* helper = new WriteHelper(buffer, bytes_to_write);
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900350 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900351 FROM_HERE,
352 Bind(&WriteHelper::RunWork, Unretained(helper), file, offset),
353 Bind(&WriteHelper::Reply, Owned(helper), callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900354}
355
356// static
357bool FileUtilProxy::Touch(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900358 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900359 PlatformFile file,
kinuko@chromium.org4f65c992011-10-19 16:21:57 +0900360 const Time& last_access_time,
361 const Time& last_modified_time,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900362 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +0900363 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900364 task_runner,
battre@chromium.org6d025972012-04-17 11:48:06 +0900365 FROM_HERE,
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900366 Bind(&TouchPlatformFile, file,
battre@chromium.org6d025972012-04-17 11:48:06 +0900367 last_access_time, last_modified_time),
368 Bind(&CallWithTranslatedParameter, callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900369}
370
371// static
dumi@chromium.org12c2e2b2010-09-24 10:09:32 +0900372bool FileUtilProxy::Touch(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900373 TaskRunner* task_runner,
dumi@chromium.org12c2e2b2010-09-24 10:09:32 +0900374 const FilePath& file_path,
kinuko@chromium.org4f65c992011-10-19 16:21:57 +0900375 const Time& last_access_time,
376 const Time& last_modified_time,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900377 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +0900378 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900379 task_runner,
battre@chromium.org6d025972012-04-17 11:48:06 +0900380 FROM_HERE,
brettw@chromium.org458d1e32013-12-05 07:49:00 +0900381 Bind(&TouchFile, file_path, last_access_time, last_modified_time),
battre@chromium.org6d025972012-04-17 11:48:06 +0900382 Bind(&CallWithTranslatedParameter, callback));
dumi@chromium.org12c2e2b2010-09-24 10:09:32 +0900383}
384
385// static
dumi@chromium.org23915982010-09-10 12:01:14 +0900386bool FileUtilProxy::Truncate(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900387 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900388 PlatformFile file,
ericu@google.com6a652222010-10-05 11:26:47 +0900389 int64 length,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900390 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +0900391 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900392 task_runner,
battre@chromium.org6d025972012-04-17 11:48:06 +0900393 FROM_HERE,
394 Bind(&TruncatePlatformFile, file, length),
395 Bind(&CallWithTranslatedParameter, callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900396}
397
398// static
399bool FileUtilProxy::Flush(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900400 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900401 PlatformFile file,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900402 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +0900403 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900404 task_runner,
battre@chromium.org6d025972012-04-17 11:48:06 +0900405 FROM_HERE,
406 Bind(&FlushPlatformFile, file),
407 Bind(&CallWithTranslatedParameter, callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900408}
409
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900410// static
411bool FileUtilProxy::RelayCreateOrOpen(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900412 TaskRunner* task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900413 const CreateOrOpenTask& open_task,
414 const CloseTask& close_task,
415 const CreateOrOpenCallback& callback) {
416 CreateOrOpenHelper* helper = new CreateOrOpenHelper(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900417 task_runner, close_task);
418 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900419 FROM_HERE,
420 Bind(&CreateOrOpenHelper::RunWork, Unretained(helper), open_task),
421 Bind(&CreateOrOpenHelper::Reply, Owned(helper), callback));
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900422}
423
424// static
425bool FileUtilProxy::RelayClose(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900426 TaskRunner* task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900427 const CloseTask& close_task,
428 PlatformFile file_handle,
429 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +0900430 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900431 task_runner, FROM_HERE, Bind(close_task, file_handle), callback);
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900432}
433
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +0900434} // namespace base