blob: 5eb9fe51b4382540021c9a8fd29d68b671224ab0 [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
25// Helper classes or routines for individual methods.
26class CreateOrOpenHelper {
dumi@chromium.orgc980e402010-08-21 07:42:50 +090027 public:
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090028 CreateOrOpenHelper(TaskRunner* task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +090029 const FileUtilProxy::CloseTask& close_task)
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090030 : task_runner_(task_runner),
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +090031 close_task_(close_task),
kinuko@chromium.org4f65c992011-10-19 16:21:57 +090032 file_handle_(kInvalidPlatformFileValue),
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090033 created_(false),
34 error_(PLATFORM_FILE_OK) {}
dumi@chromium.orgc980e402010-08-21 07:42:50 +090035
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090036 ~CreateOrOpenHelper() {
37 if (file_handle_ != kInvalidPlatformFileValue) {
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090038 task_runner_->PostTask(
ajwong@chromium.orgc9c79af2011-11-22 04:23:44 +090039 FROM_HERE,
40 base::Bind(base::IgnoreResult(close_task_), file_handle_));
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090041 }
dumi@chromium.orgc980e402010-08-21 07:42:50 +090042 }
43
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +090044 void RunWork(const FileUtilProxy::CreateOrOpenTask& task) {
45 error_ = task.Run(&file_handle_, &created_);
dumi@chromium.orgc980e402010-08-21 07:42:50 +090046 }
47
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090048 void Reply(const FileUtilProxy::CreateOrOpenCallback& callback) {
49 DCHECK(!callback.is_null());
50 callback.Run(error_, PassPlatformFile(&file_handle_), created_);
dumi@chromium.orgc980e402010-08-21 07:42:50 +090051 }
52
53 private:
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090054 scoped_refptr<TaskRunner> task_runner_;
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +090055 FileUtilProxy::CloseTask close_task_;
kinuko@chromium.org4f65c992011-10-19 16:21:57 +090056 PlatformFile file_handle_;
dumi@chromium.orgc980e402010-08-21 07:42:50 +090057 bool created_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090058 PlatformFileError error_;
59 DISALLOW_COPY_AND_ASSIGN(CreateOrOpenHelper);
dumi@chromium.orgc980e402010-08-21 07:42:50 +090060};
61
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090062class CreateTemporaryHelper {
dumi@chromium.orgc980e402010-08-21 07:42:50 +090063 public:
thestig@chromium.org98e70672012-04-24 06:23:04 +090064 explicit CreateTemporaryHelper(TaskRunner* task_runner)
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090065 : task_runner_(task_runner),
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090066 file_handle_(kInvalidPlatformFileValue),
67 error_(PLATFORM_FILE_OK) {}
dumi@chromium.orgc980e402010-08-21 07:42:50 +090068
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090069 ~CreateTemporaryHelper() {
70 if (file_handle_ != kInvalidPlatformFileValue) {
rsleevi@chromium.org7501b032013-06-01 06:37:53 +090071 FileUtilProxy::Close(
72 task_runner_.get(), file_handle_, FileUtilProxy::StatusCallback());
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090073 }
dumi@chromium.orgc980e402010-08-21 07:42:50 +090074 }
75
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090076 void RunWork(int additional_file_flags) {
dumi@chromium.orgc980e402010-08-21 07:42:50 +090077 // TODO(darin): file_util should have a variant of CreateTemporaryFile
78 // that returns a FilePath and a PlatformFile.
79 file_util::CreateTemporaryFile(&file_path_);
80
dumi@chromium.orgc980e402010-08-21 07:42:50 +090081 int file_flags =
kinuko@chromium.org4f65c992011-10-19 16:21:57 +090082 PLATFORM_FILE_WRITE |
83 PLATFORM_FILE_TEMPORARY |
84 PLATFORM_FILE_CREATE_ALWAYS |
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090085 additional_file_flags;
noelutz@google.comf56dab22011-06-14 05:29:50 +090086
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090087 error_ = PLATFORM_FILE_OK;
88 file_handle_ = CreatePlatformFile(file_path_, file_flags, NULL, &error_);
dumi@chromium.orgc980e402010-08-21 07:42:50 +090089 }
90
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090091 void Reply(const FileUtilProxy::CreateTemporaryCallback& callback) {
92 DCHECK(!callback.is_null());
93 callback.Run(error_, PassPlatformFile(&file_handle_), file_path_);
dumi@chromium.orgc980e402010-08-21 07:42:50 +090094 }
95
96 private:
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090097 scoped_refptr<TaskRunner> task_runner_;
kinuko@chromium.org4f65c992011-10-19 16:21:57 +090098 PlatformFile file_handle_;
dumi@chromium.orgc980e402010-08-21 07:42:50 +090099 FilePath file_path_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900100 PlatformFileError error_;
101 DISALLOW_COPY_AND_ASSIGN(CreateTemporaryHelper);
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900102};
103
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900104class GetFileInfoHelper {
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900105 public:
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900106 GetFileInfoHelper()
107 : error_(PLATFORM_FILE_OK) {}
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900108
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900109 void RunWorkForFilePath(const FilePath& file_path) {
brettw@chromium.org10b64122013-07-12 02:36:07 +0900110 if (!PathExists(file_path)) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900111 error_ = PLATFORM_FILE_ERROR_NOT_FOUND;
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +0900112 return;
113 }
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900114 if (!file_util::GetFileInfo(file_path, &file_info_))
115 error_ = PLATFORM_FILE_ERROR_FAILED;
116 }
117
118 void RunWorkForPlatformFile(PlatformFile file) {
119 if (!GetPlatformFileInfo(file, &file_info_))
120 error_ = PLATFORM_FILE_ERROR_FAILED;
121 }
122
123 void Reply(const FileUtilProxy::GetFileInfoCallback& callback) {
124 if (!callback.is_null()) {
125 callback.Run(error_, file_info_);
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +0900126 }
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900127 }
128
129 private:
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900130 PlatformFileError error_;
kinuko@chromium.org4f65c992011-10-19 16:21:57 +0900131 PlatformFileInfo file_info_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900132 DISALLOW_COPY_AND_ASSIGN(GetFileInfoHelper);
jianli@chromium.org9ed1f9d2010-08-31 11:42:36 +0900133};
134
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900135class ReadHelper {
dumi@chromium.org23915982010-09-10 12:01:14 +0900136 public:
thestig@chromium.org98e70672012-04-24 06:23:04 +0900137 explicit ReadHelper(int bytes_to_read)
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900138 : buffer_(new char[bytes_to_read]),
dumi@chromium.org23915982010-09-10 12:01:14 +0900139 bytes_to_read_(bytes_to_read),
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900140 bytes_read_(0) {}
141
142 void RunWork(PlatformFile file, int64 offset) {
143 bytes_read_ = ReadPlatformFile(file, offset, buffer_.get(), bytes_to_read_);
dumi@chromium.org23915982010-09-10 12:01:14 +0900144 }
145
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900146 void Reply(const FileUtilProxy::ReadCallback& callback) {
147 if (!callback.is_null()) {
148 PlatformFileError error =
149 (bytes_read_ < 0) ? PLATFORM_FILE_ERROR_FAILED : PLATFORM_FILE_OK;
150 callback.Run(error, buffer_.get(), bytes_read_);
151 }
dumi@chromium.org23915982010-09-10 12:01:14 +0900152 }
153
154 private:
tfarina@chromium.org15bc41d2013-01-18 23:21:58 +0900155 scoped_ptr<char[]> buffer_;
dumi@chromium.org23915982010-09-10 12:01:14 +0900156 int bytes_to_read_;
dumi@chromium.org23915982010-09-10 12:01:14 +0900157 int bytes_read_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900158 DISALLOW_COPY_AND_ASSIGN(ReadHelper);
dumi@chromium.org23915982010-09-10 12:01:14 +0900159};
160
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900161class WriteHelper {
dumi@chromium.org23915982010-09-10 12:01:14 +0900162 public:
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900163 WriteHelper(const char* buffer, int bytes_to_write)
164 : buffer_(new char[bytes_to_write]),
dumi@chromium.org23915982010-09-10 12:01:14 +0900165 bytes_to_write_(bytes_to_write),
finnur@chromium.org899d4e02011-03-15 18:56:27 +0900166 bytes_written_(0) {
darin@chromium.org44a99732011-02-04 09:39:34 +0900167 memcpy(buffer_.get(), buffer, bytes_to_write);
dumi@chromium.org23915982010-09-10 12:01:14 +0900168 }
169
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900170 void RunWork(PlatformFile file, int64 offset) {
171 bytes_written_ = WritePlatformFile(file, offset, buffer_.get(),
172 bytes_to_write_);
dumi@chromium.org23915982010-09-10 12:01:14 +0900173 }
174
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900175 void Reply(const FileUtilProxy::WriteCallback& callback) {
176 if (!callback.is_null()) {
177 PlatformFileError error =
178 (bytes_written_ < 0) ? PLATFORM_FILE_ERROR_FAILED : PLATFORM_FILE_OK;
179 callback.Run(error, bytes_written_);
180 }
dumi@chromium.org23915982010-09-10 12:01:14 +0900181 }
182
183 private:
tfarina@chromium.org15bc41d2013-01-18 23:21:58 +0900184 scoped_ptr<char[]> buffer_;
dumi@chromium.org23915982010-09-10 12:01:14 +0900185 int bytes_to_write_;
dumi@chromium.org23915982010-09-10 12:01:14 +0900186 int bytes_written_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900187 DISALLOW_COPY_AND_ASSIGN(WriteHelper);
dumi@chromium.org23915982010-09-10 12:01:14 +0900188};
189
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900190
191PlatformFileError CreateOrOpenAdapter(
192 const FilePath& file_path, int file_flags,
193 PlatformFile* file_handle, bool* created) {
194 DCHECK(file_handle);
195 DCHECK(created);
196 if (!file_util::DirectoryExists(file_path.DirName())) {
197 // If its parent does not exist, should return NOT_FOUND error.
198 return PLATFORM_FILE_ERROR_NOT_FOUND;
199 }
200 PlatformFileError error = PLATFORM_FILE_OK;
201 *file_handle = CreatePlatformFile(file_path, file_flags, created, &error);
202 return error;
203}
204
205PlatformFileError CloseAdapter(PlatformFile file_handle) {
206 if (!ClosePlatformFile(file_handle)) {
207 return PLATFORM_FILE_ERROR_FAILED;
208 }
209 return PLATFORM_FILE_OK;
210}
211
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900212PlatformFileError DeleteAdapter(const FilePath& file_path, bool recursive) {
brettw@chromium.org10b64122013-07-12 02:36:07 +0900213 if (!PathExists(file_path)) {
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900214 return PLATFORM_FILE_ERROR_NOT_FOUND;
215 }
brettw@chromium.orge9f99482013-07-02 04:41:02 +0900216 if (!base::Delete(file_path, recursive)) {
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900217 if (!recursive && !file_util::IsDirectoryEmpty(file_path)) {
218 return PLATFORM_FILE_ERROR_NOT_EMPTY;
219 }
220 return PLATFORM_FILE_ERROR_FAILED;
221 }
222 return PLATFORM_FILE_OK;
223}
224
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900225} // namespace
226
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900227// static
dumi@chromium.org6dedd6d2010-08-25 05:26:23 +0900228bool FileUtilProxy::CreateOrOpen(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900229 TaskRunner* task_runner,
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900230 const FilePath& file_path, int file_flags,
jhawkins@chromium.org3a6573d2011-10-18 03:40:30 +0900231 const CreateOrOpenCallback& callback) {
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900232 return RelayCreateOrOpen(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900233 task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900234 base::Bind(&CreateOrOpenAdapter, file_path, file_flags),
235 base::Bind(&CloseAdapter),
236 callback);
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900237}
238
239// static
dumi@chromium.org6dedd6d2010-08-25 05:26:23 +0900240bool FileUtilProxy::CreateTemporary(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900241 TaskRunner* task_runner,
noelutz@google.comf56dab22011-06-14 05:29:50 +0900242 int additional_file_flags,
jhawkins@chromium.orgd90c4f52011-10-18 04:29:29 +0900243 const CreateTemporaryCallback& callback) {
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900244 CreateTemporaryHelper* helper = new CreateTemporaryHelper(task_runner);
245 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900246 FROM_HERE,
247 Bind(&CreateTemporaryHelper::RunWork, Unretained(helper),
248 additional_file_flags),
249 Bind(&CreateTemporaryHelper::Reply, Owned(helper), callback));
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900250}
251
252// static
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900253bool FileUtilProxy::Close(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900254 TaskRunner* task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900255 base::PlatformFile file_handle,
256 const StatusCallback& callback) {
257 return RelayClose(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900258 task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900259 base::Bind(&CloseAdapter),
260 file_handle, callback);
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900261}
262
erg@google.com37c078e2011-01-11 09:50:59 +0900263// Retrieves the information about a file. It is invalid to pass NULL for the
264// callback.
265bool FileUtilProxy::GetFileInfo(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900266 TaskRunner* task_runner,
erg@google.com37c078e2011-01-11 09:50:59 +0900267 const FilePath& file_path,
jhawkins@chromium.org56771f02011-10-18 05:12:05 +0900268 const GetFileInfoCallback& callback) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900269 GetFileInfoHelper* helper = new GetFileInfoHelper;
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900270 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900271 FROM_HERE,
272 Bind(&GetFileInfoHelper::RunWorkForFilePath,
273 Unretained(helper), file_path),
274 Bind(&GetFileInfoHelper::Reply, Owned(helper), callback));
erg@google.com37c078e2011-01-11 09:50:59 +0900275}
276
kinuko@chromium.org850eb6d2010-10-15 09:37:34 +0900277// static
erg@google.com37c078e2011-01-11 09:50:59 +0900278bool FileUtilProxy::GetFileInfoFromPlatformFile(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900279 TaskRunner* task_runner,
erg@google.com37c078e2011-01-11 09:50:59 +0900280 PlatformFile file,
jhawkins@chromium.org56771f02011-10-18 05:12:05 +0900281 const GetFileInfoCallback& callback) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900282 GetFileInfoHelper* helper = new GetFileInfoHelper;
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900283 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900284 FROM_HERE,
285 Bind(&GetFileInfoHelper::RunWorkForPlatformFile,
286 Unretained(helper), file),
287 Bind(&GetFileInfoHelper::Reply, Owned(helper), callback));
erg@google.com37c078e2011-01-11 09:50:59 +0900288}
289
290// static
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900291bool FileUtilProxy::Delete(TaskRunner* task_runner,
erg@google.com37c078e2011-01-11 09:50:59 +0900292 const FilePath& file_path,
293 bool recursive,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900294 const StatusCallback& callback) {
kinuko@chromium.org81f6e032013-01-17 04:54:36 +0900295 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900296 task_runner, FROM_HERE,
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900297 Bind(&DeleteAdapter, file_path, recursive),
298 callback);
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +0900299}
300
301// static
dumi@chromium.org6dedd6d2010-08-25 05:26:23 +0900302bool FileUtilProxy::RecursiveDelete(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900303 TaskRunner* task_runner,
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900304 const FilePath& file_path,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900305 const StatusCallback& callback) {
kinuko@chromium.org81f6e032013-01-17 04:54:36 +0900306 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900307 task_runner, FROM_HERE,
kinuko@chromium.org9c033e22011-11-09 15:46:39 +0900308 Bind(&DeleteAdapter, file_path, true /* recursive */),
309 callback);
dumi@chromium.orgc980e402010-08-21 07:42:50 +0900310}
311
dumi@chromium.org23915982010-09-10 12:01:14 +0900312// static
dumi@chromium.org23915982010-09-10 12:01:14 +0900313bool FileUtilProxy::Read(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900314 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900315 PlatformFile file,
316 int64 offset,
dumi@chromium.org23915982010-09-10 12:01:14 +0900317 int bytes_to_read,
jhawkins@chromium.orgd08a33e2011-10-18 05:44:47 +0900318 const ReadCallback& callback) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900319 if (bytes_to_read < 0) {
sanga@chromium.orgf5cff132011-08-18 01:16:27 +0900320 return false;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900321 }
322 ReadHelper* helper = new ReadHelper(bytes_to_read);
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900323 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900324 FROM_HERE,
325 Bind(&ReadHelper::RunWork, Unretained(helper), file, offset),
326 Bind(&ReadHelper::Reply, Owned(helper), callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900327}
328
329// static
330bool FileUtilProxy::Write(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900331 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900332 PlatformFile file,
333 int64 offset,
334 const char* buffer,
335 int bytes_to_write,
jhawkins@chromium.org553ef502011-10-18 05:56:52 +0900336 const WriteCallback& callback) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900337 if (bytes_to_write <= 0 || buffer == NULL) {
sanga@chromium.org21d251f2011-08-18 01:45:48 +0900338 return false;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900339 }
340 WriteHelper* helper = new WriteHelper(buffer, bytes_to_write);
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900341 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900342 FROM_HERE,
343 Bind(&WriteHelper::RunWork, Unretained(helper), file, offset),
344 Bind(&WriteHelper::Reply, Owned(helper), callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900345}
346
347// static
348bool FileUtilProxy::Touch(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900349 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900350 PlatformFile file,
kinuko@chromium.org4f65c992011-10-19 16:21:57 +0900351 const Time& last_access_time,
352 const Time& last_modified_time,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900353 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +0900354 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900355 task_runner,
battre@chromium.org6d025972012-04-17 11:48:06 +0900356 FROM_HERE,
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900357 Bind(&TouchPlatformFile, file,
battre@chromium.org6d025972012-04-17 11:48:06 +0900358 last_access_time, last_modified_time),
359 Bind(&CallWithTranslatedParameter, callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900360}
361
362// static
dumi@chromium.org12c2e2b2010-09-24 10:09:32 +0900363bool FileUtilProxy::Touch(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900364 TaskRunner* task_runner,
dumi@chromium.org12c2e2b2010-09-24 10:09:32 +0900365 const FilePath& file_path,
kinuko@chromium.org4f65c992011-10-19 16:21:57 +0900366 const Time& last_access_time,
367 const Time& last_modified_time,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900368 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +0900369 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900370 task_runner,
battre@chromium.org6d025972012-04-17 11:48:06 +0900371 FROM_HERE,
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +0900372 Bind(&file_util::TouchFile, file_path,
373 last_access_time, last_modified_time),
battre@chromium.org6d025972012-04-17 11:48:06 +0900374 Bind(&CallWithTranslatedParameter, callback));
dumi@chromium.org12c2e2b2010-09-24 10:09:32 +0900375}
376
377// static
dumi@chromium.org23915982010-09-10 12:01:14 +0900378bool FileUtilProxy::Truncate(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900379 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900380 PlatformFile file,
ericu@google.com6a652222010-10-05 11:26:47 +0900381 int64 length,
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,
386 Bind(&TruncatePlatformFile, file, length),
387 Bind(&CallWithTranslatedParameter, callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900388}
389
390// static
391bool FileUtilProxy::Flush(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900392 TaskRunner* task_runner,
dumi@chromium.org23915982010-09-10 12:01:14 +0900393 PlatformFile file,
jhawkins@chromium.org162de392011-10-18 06:33:35 +0900394 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +0900395 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900396 task_runner,
battre@chromium.org6d025972012-04-17 11:48:06 +0900397 FROM_HERE,
398 Bind(&FlushPlatformFile, file),
399 Bind(&CallWithTranslatedParameter, callback));
dumi@chromium.org23915982010-09-10 12:01:14 +0900400}
401
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900402// static
403bool FileUtilProxy::RelayCreateOrOpen(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900404 TaskRunner* task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900405 const CreateOrOpenTask& open_task,
406 const CloseTask& close_task,
407 const CreateOrOpenCallback& callback) {
408 CreateOrOpenHelper* helper = new CreateOrOpenHelper(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900409 task_runner, close_task);
410 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +0900411 FROM_HERE,
412 Bind(&CreateOrOpenHelper::RunWork, Unretained(helper), open_task),
413 Bind(&CreateOrOpenHelper::Reply, Owned(helper), callback));
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900414}
415
416// static
417bool FileUtilProxy::RelayClose(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900418 TaskRunner* task_runner,
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900419 const CloseTask& close_task,
420 PlatformFile file_handle,
421 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +0900422 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +0900423 task_runner, FROM_HERE, Bind(close_task, file_handle), callback);
kinuko@chromium.org42e9d8c2011-11-08 18:04:16 +0900424}
425
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +0900426} // namespace base