battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
brettw@chromium.org | 06a553b | 2013-01-26 09:21:58 +0900 | [diff] [blame] | 5 | #include "base/files/file_util_proxy.h" |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 6 | |
jhawkins@chromium.org | c14280a | 2011-10-18 07:39:51 +0900 | [diff] [blame] | 7 | #include "base/bind.h" |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 8 | #include "base/bind_helpers.h" |
| 9 | #include "base/file_util.h" |
thestig@chromium.org | 98e7067 | 2012-04-24 06:23:04 +0900 | [diff] [blame] | 10 | #include "base/location.h" |
brettw@chromium.org | ab2678f | 2013-06-11 05:56:28 +0900 | [diff] [blame] | 11 | #include "base/message_loop/message_loop_proxy.h" |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 12 | #include "base/task_runner.h" |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 13 | #include "base/task_runner_util.h" |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 14 | |
kinuko@chromium.org | 4f65c99 | 2011-10-19 16:21:57 +0900 | [diff] [blame] | 15 | namespace base { |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 16 | |
kinuko@chromium.org | 1a07804 | 2010-10-07 17:35:09 +0900 | [diff] [blame] | 17 | namespace { |
| 18 | |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 19 | void 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.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 23 | } |
| 24 | |
bbudge@chromium.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 25 | #if !defined(OS_NACL) |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 26 | // Helper classes or routines for individual methods. |
| 27 | class CreateOrOpenHelper { |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 28 | public: |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 29 | CreateOrOpenHelper(TaskRunner* task_runner, |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 30 | const FileUtilProxy::CloseTask& close_task) |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 31 | : task_runner_(task_runner), |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 32 | close_task_(close_task), |
kinuko@chromium.org | 4f65c99 | 2011-10-19 16:21:57 +0900 | [diff] [blame] | 33 | file_handle_(kInvalidPlatformFileValue), |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 34 | created_(false), |
| 35 | error_(PLATFORM_FILE_OK) {} |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 36 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 37 | ~CreateOrOpenHelper() { |
| 38 | if (file_handle_ != kInvalidPlatformFileValue) { |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 39 | task_runner_->PostTask( |
ajwong@chromium.org | c9c79af | 2011-11-22 04:23:44 +0900 | [diff] [blame] | 40 | FROM_HERE, |
| 41 | base::Bind(base::IgnoreResult(close_task_), file_handle_)); |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 42 | } |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 43 | } |
| 44 | |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 45 | void RunWork(const FileUtilProxy::CreateOrOpenTask& task) { |
| 46 | error_ = task.Run(&file_handle_, &created_); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 47 | } |
| 48 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 49 | void Reply(const FileUtilProxy::CreateOrOpenCallback& callback) { |
| 50 | DCHECK(!callback.is_null()); |
| 51 | callback.Run(error_, PassPlatformFile(&file_handle_), created_); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 52 | } |
| 53 | |
| 54 | private: |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 55 | scoped_refptr<TaskRunner> task_runner_; |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 56 | FileUtilProxy::CloseTask close_task_; |
kinuko@chromium.org | 4f65c99 | 2011-10-19 16:21:57 +0900 | [diff] [blame] | 57 | PlatformFile file_handle_; |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 58 | bool created_; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 59 | PlatformFileError error_; |
| 60 | DISALLOW_COPY_AND_ASSIGN(CreateOrOpenHelper); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 61 | }; |
| 62 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 63 | class CreateTemporaryHelper { |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 64 | public: |
thestig@chromium.org | 98e7067 | 2012-04-24 06:23:04 +0900 | [diff] [blame] | 65 | explicit CreateTemporaryHelper(TaskRunner* task_runner) |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 66 | : task_runner_(task_runner), |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 67 | file_handle_(kInvalidPlatformFileValue), |
| 68 | error_(PLATFORM_FILE_OK) {} |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 69 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 70 | ~CreateTemporaryHelper() { |
| 71 | if (file_handle_ != kInvalidPlatformFileValue) { |
rsleevi@chromium.org | 7501b03 | 2013-06-01 06:37:53 +0900 | [diff] [blame] | 72 | FileUtilProxy::Close( |
| 73 | task_runner_.get(), file_handle_, FileUtilProxy::StatusCallback()); |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 74 | } |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 75 | } |
| 76 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 77 | void RunWork(int additional_file_flags) { |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 78 | // 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.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 82 | int file_flags = |
kinuko@chromium.org | 4f65c99 | 2011-10-19 16:21:57 +0900 | [diff] [blame] | 83 | PLATFORM_FILE_WRITE | |
| 84 | PLATFORM_FILE_TEMPORARY | |
| 85 | PLATFORM_FILE_CREATE_ALWAYS | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 86 | additional_file_flags; |
noelutz@google.com | f56dab2 | 2011-06-14 05:29:50 +0900 | [diff] [blame] | 87 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 88 | error_ = PLATFORM_FILE_OK; |
| 89 | file_handle_ = CreatePlatformFile(file_path_, file_flags, NULL, &error_); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 90 | } |
| 91 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 92 | void Reply(const FileUtilProxy::CreateTemporaryCallback& callback) { |
| 93 | DCHECK(!callback.is_null()); |
| 94 | callback.Run(error_, PassPlatformFile(&file_handle_), file_path_); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 95 | } |
| 96 | |
| 97 | private: |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 98 | scoped_refptr<TaskRunner> task_runner_; |
kinuko@chromium.org | 4f65c99 | 2011-10-19 16:21:57 +0900 | [diff] [blame] | 99 | PlatformFile file_handle_; |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 100 | FilePath file_path_; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 101 | PlatformFileError error_; |
| 102 | DISALLOW_COPY_AND_ASSIGN(CreateTemporaryHelper); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 103 | }; |
bbudge@chromium.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 104 | #endif // !defined(OS_NACL) |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 105 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 106 | class GetFileInfoHelper { |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 107 | public: |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 108 | GetFileInfoHelper() |
| 109 | : error_(PLATFORM_FILE_OK) {} |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 110 | |
bbudge@chromium.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 111 | #if !defined(OS_NACL) |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 112 | void RunWorkForFilePath(const FilePath& file_path) { |
brettw@chromium.org | 10b6412 | 2013-07-12 02:36:07 +0900 | [diff] [blame] | 113 | if (!PathExists(file_path)) { |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 114 | error_ = PLATFORM_FILE_ERROR_NOT_FOUND; |
kkanetkar@chromium.org | 3a3bdea | 2010-09-02 12:43:36 +0900 | [diff] [blame] | 115 | return; |
| 116 | } |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 117 | if (!file_util::GetFileInfo(file_path, &file_info_)) |
| 118 | error_ = PLATFORM_FILE_ERROR_FAILED; |
| 119 | } |
bbudge@chromium.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 120 | #endif // !defined(OS_NACL) |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 121 | |
| 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.org | 3a3bdea | 2010-09-02 12:43:36 +0900 | [diff] [blame] | 130 | } |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 131 | } |
| 132 | |
| 133 | private: |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 134 | PlatformFileError error_; |
kinuko@chromium.org | 4f65c99 | 2011-10-19 16:21:57 +0900 | [diff] [blame] | 135 | PlatformFileInfo file_info_; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 136 | DISALLOW_COPY_AND_ASSIGN(GetFileInfoHelper); |
jianli@chromium.org | 9ed1f9d | 2010-08-31 11:42:36 +0900 | [diff] [blame] | 137 | }; |
| 138 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 139 | class ReadHelper { |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 140 | public: |
thestig@chromium.org | 98e7067 | 2012-04-24 06:23:04 +0900 | [diff] [blame] | 141 | explicit ReadHelper(int bytes_to_read) |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 142 | : buffer_(new char[bytes_to_read]), |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 143 | bytes_to_read_(bytes_to_read), |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 144 | bytes_read_(0) {} |
| 145 | |
| 146 | void RunWork(PlatformFile file, int64 offset) { |
| 147 | bytes_read_ = ReadPlatformFile(file, offset, buffer_.get(), bytes_to_read_); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 148 | } |
| 149 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 150 | 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.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 156 | } |
| 157 | |
| 158 | private: |
tfarina@chromium.org | 15bc41d | 2013-01-18 23:21:58 +0900 | [diff] [blame] | 159 | scoped_ptr<char[]> buffer_; |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 160 | int bytes_to_read_; |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 161 | int bytes_read_; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 162 | DISALLOW_COPY_AND_ASSIGN(ReadHelper); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 163 | }; |
| 164 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 165 | class WriteHelper { |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 166 | public: |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 167 | WriteHelper(const char* buffer, int bytes_to_write) |
| 168 | : buffer_(new char[bytes_to_write]), |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 169 | bytes_to_write_(bytes_to_write), |
finnur@chromium.org | 899d4e0 | 2011-03-15 18:56:27 +0900 | [diff] [blame] | 170 | bytes_written_(0) { |
darin@chromium.org | 44a9973 | 2011-02-04 09:39:34 +0900 | [diff] [blame] | 171 | memcpy(buffer_.get(), buffer, bytes_to_write); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 172 | } |
| 173 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 174 | void RunWork(PlatformFile file, int64 offset) { |
| 175 | bytes_written_ = WritePlatformFile(file, offset, buffer_.get(), |
| 176 | bytes_to_write_); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 177 | } |
| 178 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 179 | 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.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 185 | } |
| 186 | |
| 187 | private: |
tfarina@chromium.org | 15bc41d | 2013-01-18 23:21:58 +0900 | [diff] [blame] | 188 | scoped_ptr<char[]> buffer_; |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 189 | int bytes_to_write_; |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 190 | int bytes_written_; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 191 | DISALLOW_COPY_AND_ASSIGN(WriteHelper); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 192 | }; |
| 193 | |
bbudge@chromium.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 194 | #if !defined(OS_NACL) |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 195 | PlatformFileError CreateOrOpenAdapter( |
| 196 | const FilePath& file_path, int file_flags, |
| 197 | PlatformFile* file_handle, bool* created) { |
| 198 | DCHECK(file_handle); |
| 199 | DCHECK(created); |
brettw@chromium.org | 5a112e7 | 2013-07-16 05:18:09 +0900 | [diff] [blame^] | 200 | if (!DirectoryExists(file_path.DirName())) { |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 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.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 208 | #endif // !defined(OS_NACL) |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 209 | |
| 210 | PlatformFileError 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.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 217 | #if !defined(OS_NACL) |
kinuko@chromium.org | 9c033e2 | 2011-11-09 15:46:39 +0900 | [diff] [blame] | 218 | PlatformFileError DeleteAdapter(const FilePath& file_path, bool recursive) { |
brettw@chromium.org | 10b6412 | 2013-07-12 02:36:07 +0900 | [diff] [blame] | 219 | if (!PathExists(file_path)) { |
kinuko@chromium.org | 9c033e2 | 2011-11-09 15:46:39 +0900 | [diff] [blame] | 220 | return PLATFORM_FILE_ERROR_NOT_FOUND; |
| 221 | } |
brettw@chromium.org | e9f9948 | 2013-07-02 04:41:02 +0900 | [diff] [blame] | 222 | if (!base::Delete(file_path, recursive)) { |
kinuko@chromium.org | 9c033e2 | 2011-11-09 15:46:39 +0900 | [diff] [blame] | 223 | 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.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 230 | #endif // !defined(OS_NACL) |
kinuko@chromium.org | 9c033e2 | 2011-11-09 15:46:39 +0900 | [diff] [blame] | 231 | |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 232 | } // namespace |
| 233 | |
bbudge@chromium.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 234 | #if !defined(OS_NACL) |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 235 | // static |
dumi@chromium.org | 6dedd6d | 2010-08-25 05:26:23 +0900 | [diff] [blame] | 236 | bool FileUtilProxy::CreateOrOpen( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 237 | TaskRunner* task_runner, |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 238 | const FilePath& file_path, int file_flags, |
jhawkins@chromium.org | 3a6573d | 2011-10-18 03:40:30 +0900 | [diff] [blame] | 239 | const CreateOrOpenCallback& callback) { |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 240 | return RelayCreateOrOpen( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 241 | task_runner, |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 242 | base::Bind(&CreateOrOpenAdapter, file_path, file_flags), |
| 243 | base::Bind(&CloseAdapter), |
| 244 | callback); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 245 | } |
| 246 | |
| 247 | // static |
dumi@chromium.org | 6dedd6d | 2010-08-25 05:26:23 +0900 | [diff] [blame] | 248 | bool FileUtilProxy::CreateTemporary( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 249 | TaskRunner* task_runner, |
noelutz@google.com | f56dab2 | 2011-06-14 05:29:50 +0900 | [diff] [blame] | 250 | int additional_file_flags, |
jhawkins@chromium.org | d90c4f5 | 2011-10-18 04:29:29 +0900 | [diff] [blame] | 251 | const CreateTemporaryCallback& callback) { |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 252 | CreateTemporaryHelper* helper = new CreateTemporaryHelper(task_runner); |
| 253 | return task_runner->PostTaskAndReply( |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 254 | FROM_HERE, |
| 255 | Bind(&CreateTemporaryHelper::RunWork, Unretained(helper), |
| 256 | additional_file_flags), |
| 257 | Bind(&CreateTemporaryHelper::Reply, Owned(helper), callback)); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 258 | } |
bbudge@chromium.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 259 | #endif // !defined(OS_NACL) |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 260 | |
| 261 | // static |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 262 | bool FileUtilProxy::Close( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 263 | TaskRunner* task_runner, |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 264 | base::PlatformFile file_handle, |
| 265 | const StatusCallback& callback) { |
| 266 | return RelayClose( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 267 | task_runner, |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 268 | base::Bind(&CloseAdapter), |
| 269 | file_handle, callback); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 270 | } |
| 271 | |
bbudge@chromium.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 272 | #if !defined(OS_NACL) |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 273 | // Retrieves the information about a file. It is invalid to pass NULL for the |
| 274 | // callback. |
| 275 | bool FileUtilProxy::GetFileInfo( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 276 | TaskRunner* task_runner, |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 277 | const FilePath& file_path, |
jhawkins@chromium.org | 56771f0 | 2011-10-18 05:12:05 +0900 | [diff] [blame] | 278 | const GetFileInfoCallback& callback) { |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 279 | GetFileInfoHelper* helper = new GetFileInfoHelper; |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 280 | return task_runner->PostTaskAndReply( |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 281 | FROM_HERE, |
| 282 | Bind(&GetFileInfoHelper::RunWorkForFilePath, |
| 283 | Unretained(helper), file_path), |
| 284 | Bind(&GetFileInfoHelper::Reply, Owned(helper), callback)); |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 285 | } |
bbudge@chromium.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 286 | #endif // !defined(OS_NACL) |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 287 | |
kinuko@chromium.org | 850eb6d | 2010-10-15 09:37:34 +0900 | [diff] [blame] | 288 | // static |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 289 | bool FileUtilProxy::GetFileInfoFromPlatformFile( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 290 | TaskRunner* task_runner, |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 291 | PlatformFile file, |
jhawkins@chromium.org | 56771f0 | 2011-10-18 05:12:05 +0900 | [diff] [blame] | 292 | const GetFileInfoCallback& callback) { |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 293 | GetFileInfoHelper* helper = new GetFileInfoHelper; |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 294 | return task_runner->PostTaskAndReply( |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 295 | FROM_HERE, |
| 296 | Bind(&GetFileInfoHelper::RunWorkForPlatformFile, |
| 297 | Unretained(helper), file), |
| 298 | Bind(&GetFileInfoHelper::Reply, Owned(helper), callback)); |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 299 | } |
| 300 | |
bbudge@chromium.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 301 | #if !defined(OS_NACL) |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 302 | // static |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 303 | bool FileUtilProxy::Delete(TaskRunner* task_runner, |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 304 | const FilePath& file_path, |
| 305 | bool recursive, |
jhawkins@chromium.org | 162de39 | 2011-10-18 06:33:35 +0900 | [diff] [blame] | 306 | const StatusCallback& callback) { |
kinuko@chromium.org | 81f6e03 | 2013-01-17 04:54:36 +0900 | [diff] [blame] | 307 | return base::PostTaskAndReplyWithResult( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 308 | task_runner, FROM_HERE, |
kinuko@chromium.org | 9c033e2 | 2011-11-09 15:46:39 +0900 | [diff] [blame] | 309 | Bind(&DeleteAdapter, file_path, recursive), |
| 310 | callback); |
kkanetkar@chromium.org | 3a3bdea | 2010-09-02 12:43:36 +0900 | [diff] [blame] | 311 | } |
| 312 | |
| 313 | // static |
dumi@chromium.org | 6dedd6d | 2010-08-25 05:26:23 +0900 | [diff] [blame] | 314 | bool FileUtilProxy::RecursiveDelete( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 315 | TaskRunner* task_runner, |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 316 | const FilePath& file_path, |
jhawkins@chromium.org | 162de39 | 2011-10-18 06:33:35 +0900 | [diff] [blame] | 317 | const StatusCallback& callback) { |
kinuko@chromium.org | 81f6e03 | 2013-01-17 04:54:36 +0900 | [diff] [blame] | 318 | return base::PostTaskAndReplyWithResult( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 319 | task_runner, FROM_HERE, |
kinuko@chromium.org | 9c033e2 | 2011-11-09 15:46:39 +0900 | [diff] [blame] | 320 | Bind(&DeleteAdapter, file_path, true /* recursive */), |
| 321 | callback); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 322 | } |
bbudge@chromium.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 323 | #endif // !defined(OS_NACL) |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 324 | |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 325 | // static |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 326 | bool FileUtilProxy::Read( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 327 | TaskRunner* task_runner, |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 328 | PlatformFile file, |
| 329 | int64 offset, |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 330 | int bytes_to_read, |
jhawkins@chromium.org | d08a33e | 2011-10-18 05:44:47 +0900 | [diff] [blame] | 331 | const ReadCallback& callback) { |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 332 | if (bytes_to_read < 0) { |
sanga@chromium.org | f5cff13 | 2011-08-18 01:16:27 +0900 | [diff] [blame] | 333 | return false; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 334 | } |
| 335 | ReadHelper* helper = new ReadHelper(bytes_to_read); |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 336 | return task_runner->PostTaskAndReply( |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 337 | FROM_HERE, |
| 338 | Bind(&ReadHelper::RunWork, Unretained(helper), file, offset), |
| 339 | Bind(&ReadHelper::Reply, Owned(helper), callback)); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 340 | } |
| 341 | |
| 342 | // static |
| 343 | bool FileUtilProxy::Write( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 344 | TaskRunner* task_runner, |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 345 | PlatformFile file, |
| 346 | int64 offset, |
| 347 | const char* buffer, |
| 348 | int bytes_to_write, |
jhawkins@chromium.org | 553ef50 | 2011-10-18 05:56:52 +0900 | [diff] [blame] | 349 | const WriteCallback& callback) { |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 350 | if (bytes_to_write <= 0 || buffer == NULL) { |
sanga@chromium.org | 21d251f | 2011-08-18 01:45:48 +0900 | [diff] [blame] | 351 | return false; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 352 | } |
| 353 | WriteHelper* helper = new WriteHelper(buffer, bytes_to_write); |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 354 | return task_runner->PostTaskAndReply( |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 355 | FROM_HERE, |
| 356 | Bind(&WriteHelper::RunWork, Unretained(helper), file, offset), |
| 357 | Bind(&WriteHelper::Reply, Owned(helper), callback)); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 358 | } |
| 359 | |
bbudge@chromium.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 360 | #if !defined(OS_NACL) |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 361 | // static |
| 362 | bool FileUtilProxy::Touch( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 363 | TaskRunner* task_runner, |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 364 | PlatformFile file, |
kinuko@chromium.org | 4f65c99 | 2011-10-19 16:21:57 +0900 | [diff] [blame] | 365 | const Time& last_access_time, |
| 366 | const Time& last_modified_time, |
jhawkins@chromium.org | 162de39 | 2011-10-18 06:33:35 +0900 | [diff] [blame] | 367 | const StatusCallback& callback) { |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 368 | return base::PostTaskAndReplyWithResult( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 369 | task_runner, |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 370 | FROM_HERE, |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 371 | Bind(&TouchPlatformFile, file, |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 372 | last_access_time, last_modified_time), |
| 373 | Bind(&CallWithTranslatedParameter, callback)); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 374 | } |
| 375 | |
| 376 | // static |
dumi@chromium.org | 12c2e2b | 2010-09-24 10:09:32 +0900 | [diff] [blame] | 377 | bool FileUtilProxy::Touch( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 378 | TaskRunner* task_runner, |
dumi@chromium.org | 12c2e2b | 2010-09-24 10:09:32 +0900 | [diff] [blame] | 379 | const FilePath& file_path, |
kinuko@chromium.org | 4f65c99 | 2011-10-19 16:21:57 +0900 | [diff] [blame] | 380 | const Time& last_access_time, |
| 381 | const Time& last_modified_time, |
jhawkins@chromium.org | 162de39 | 2011-10-18 06:33:35 +0900 | [diff] [blame] | 382 | const StatusCallback& callback) { |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 383 | return base::PostTaskAndReplyWithResult( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 384 | task_runner, |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 385 | FROM_HERE, |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 386 | Bind(&file_util::TouchFile, file_path, |
| 387 | last_access_time, last_modified_time), |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 388 | Bind(&CallWithTranslatedParameter, callback)); |
dumi@chromium.org | 12c2e2b | 2010-09-24 10:09:32 +0900 | [diff] [blame] | 389 | } |
| 390 | |
| 391 | // static |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 392 | bool FileUtilProxy::Truncate( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 393 | TaskRunner* task_runner, |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 394 | PlatformFile file, |
ericu@google.com | 6a65222 | 2010-10-05 11:26:47 +0900 | [diff] [blame] | 395 | int64 length, |
jhawkins@chromium.org | 162de39 | 2011-10-18 06:33:35 +0900 | [diff] [blame] | 396 | const StatusCallback& callback) { |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 397 | return base::PostTaskAndReplyWithResult( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 398 | task_runner, |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 399 | FROM_HERE, |
| 400 | Bind(&TruncatePlatformFile, file, length), |
| 401 | Bind(&CallWithTranslatedParameter, callback)); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 402 | } |
| 403 | |
| 404 | // static |
| 405 | bool FileUtilProxy::Flush( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 406 | TaskRunner* task_runner, |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 407 | PlatformFile file, |
jhawkins@chromium.org | 162de39 | 2011-10-18 06:33:35 +0900 | [diff] [blame] | 408 | const StatusCallback& callback) { |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 409 | return base::PostTaskAndReplyWithResult( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 410 | task_runner, |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 411 | FROM_HERE, |
| 412 | Bind(&FlushPlatformFile, file), |
| 413 | Bind(&CallWithTranslatedParameter, callback)); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 414 | } |
| 415 | |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 416 | // static |
| 417 | bool FileUtilProxy::RelayCreateOrOpen( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 418 | TaskRunner* task_runner, |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 419 | const CreateOrOpenTask& open_task, |
| 420 | const CloseTask& close_task, |
| 421 | const CreateOrOpenCallback& callback) { |
| 422 | CreateOrOpenHelper* helper = new CreateOrOpenHelper( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 423 | task_runner, close_task); |
| 424 | return task_runner->PostTaskAndReply( |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 425 | FROM_HERE, |
| 426 | Bind(&CreateOrOpenHelper::RunWork, Unretained(helper), open_task), |
| 427 | Bind(&CreateOrOpenHelper::Reply, Owned(helper), callback)); |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 428 | } |
bbudge@chromium.org | 0224eb1 | 2013-07-12 09:53:57 +0900 | [diff] [blame] | 429 | #endif // !defined(OS_NACL) |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 430 | |
| 431 | // static |
| 432 | bool FileUtilProxy::RelayClose( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 433 | TaskRunner* task_runner, |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 434 | const CloseTask& close_task, |
| 435 | PlatformFile file_handle, |
| 436 | const StatusCallback& callback) { |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 437 | return base::PostTaskAndReplyWithResult( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 438 | task_runner, FROM_HERE, Bind(close_task, file_handle), callback); |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 439 | } |
| 440 | |
kkanetkar@chromium.org | 3a3bdea | 2010-09-02 12:43:36 +0900 | [diff] [blame] | 441 | } // namespace base |