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