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" |
rvargas@chromium.org | b005b38 | 2014-01-07 19:06:58 +0900 | [diff] [blame] | 10 | #include "base/files/file.h" |
thestig@chromium.org | 98e7067 | 2012-04-24 06:23:04 +0900 | [diff] [blame] | 11 | #include "base/location.h" |
brettw@chromium.org | ab2678f | 2013-06-11 05:56:28 +0900 | [diff] [blame] | 12 | #include "base/message_loop/message_loop_proxy.h" |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 13 | #include "base/task_runner.h" |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 14 | #include "base/task_runner_util.h" |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 15 | |
kinuko@chromium.org | 4f65c99 | 2011-10-19 16:21:57 +0900 | [diff] [blame] | 16 | namespace base { |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 17 | |
kinuko@chromium.org | 1a07804 | 2010-10-07 17:35:09 +0900 | [diff] [blame] | 18 | namespace { |
| 19 | |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 20 | void CallWithTranslatedParameter(const FileUtilProxy::StatusCallback& callback, |
| 21 | bool value) { |
| 22 | DCHECK(!callback.is_null()); |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 23 | callback.Run(value ? File::FILE_OK : File::FILE_ERROR_FAILED); |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 24 | } |
| 25 | |
| 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), |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 35 | error_(File::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_; |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 59 | File::Error error_; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 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), |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 68 | error_(File::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. |
davidben@chromium.org | 0b9b293 | 2014-03-08 22:04:49 +0900 | [diff] [blame] | 80 | if (!base::CreateTemporaryFile(&file_path_)) { |
| 81 | // TODO(davidben): base::CreateTemporaryFile should preserve the error |
| 82 | // code. |
| 83 | error_ = File::FILE_ERROR_FAILED; |
| 84 | return; |
| 85 | } |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 86 | |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 87 | int file_flags = |
kinuko@chromium.org | 4f65c99 | 2011-10-19 16:21:57 +0900 | [diff] [blame] | 88 | PLATFORM_FILE_WRITE | |
| 89 | PLATFORM_FILE_TEMPORARY | |
| 90 | PLATFORM_FILE_CREATE_ALWAYS | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 91 | additional_file_flags; |
noelutz@google.com | f56dab2 | 2011-06-14 05:29:50 +0900 | [diff] [blame] | 92 | |
rvargas@chromium.org | e55f2db | 2014-04-10 04:58:54 +0900 | [diff] [blame] | 93 | File file(file_path_, file_flags); |
| 94 | if (!file.IsValid()) { |
davidben@chromium.org | 0b9b293 | 2014-03-08 22:04:49 +0900 | [diff] [blame] | 95 | base::DeleteFile(file_path_, false); |
| 96 | file_path_.clear(); |
rvargas@chromium.org | e55f2db | 2014-04-10 04:58:54 +0900 | [diff] [blame] | 97 | error_ = file.error_details(); |
| 98 | return; |
davidben@chromium.org | 0b9b293 | 2014-03-08 22:04:49 +0900 | [diff] [blame] | 99 | } |
rvargas@chromium.org | e55f2db | 2014-04-10 04:58:54 +0900 | [diff] [blame] | 100 | error_ = File::FILE_OK; |
| 101 | file_handle_ = file.TakePlatformFile(); |
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 | void Reply(const FileUtilProxy::CreateTemporaryCallback& callback) { |
| 105 | DCHECK(!callback.is_null()); |
| 106 | callback.Run(error_, PassPlatformFile(&file_handle_), file_path_); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 107 | } |
| 108 | |
| 109 | private: |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 110 | scoped_refptr<TaskRunner> task_runner_; |
kinuko@chromium.org | 4f65c99 | 2011-10-19 16:21:57 +0900 | [diff] [blame] | 111 | PlatformFile file_handle_; |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 112 | FilePath file_path_; |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 113 | File::Error error_; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 114 | DISALLOW_COPY_AND_ASSIGN(CreateTemporaryHelper); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 115 | }; |
| 116 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 117 | class GetFileInfoHelper { |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 118 | public: |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 119 | GetFileInfoHelper() |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 120 | : error_(File::FILE_OK) {} |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 121 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 122 | void RunWorkForFilePath(const FilePath& file_path) { |
brettw@chromium.org | 10b6412 | 2013-07-12 02:36:07 +0900 | [diff] [blame] | 123 | if (!PathExists(file_path)) { |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 124 | error_ = File::FILE_ERROR_NOT_FOUND; |
kkanetkar@chromium.org | 3a3bdea | 2010-09-02 12:43:36 +0900 | [diff] [blame] | 125 | return; |
| 126 | } |
rvargas@chromium.org | b005b38 | 2014-01-07 19:06:58 +0900 | [diff] [blame] | 127 | // TODO(rvargas): switch this file to base::File. |
| 128 | if (!GetFileInfo(file_path, reinterpret_cast<File::Info*>(&file_info_))) |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 129 | error_ = File::FILE_ERROR_FAILED; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 130 | } |
| 131 | |
| 132 | void RunWorkForPlatformFile(PlatformFile file) { |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 133 | if (!GetPlatformFileInfo( |
| 134 | file, reinterpret_cast<PlatformFileInfo*>(&file_info_))) { |
| 135 | error_ = File::FILE_ERROR_FAILED; |
| 136 | } |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 137 | } |
| 138 | |
| 139 | void Reply(const FileUtilProxy::GetFileInfoCallback& callback) { |
| 140 | if (!callback.is_null()) { |
| 141 | callback.Run(error_, file_info_); |
kkanetkar@chromium.org | 3a3bdea | 2010-09-02 12:43:36 +0900 | [diff] [blame] | 142 | } |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 143 | } |
| 144 | |
| 145 | private: |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 146 | File::Error error_; |
| 147 | File::Info file_info_; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 148 | DISALLOW_COPY_AND_ASSIGN(GetFileInfoHelper); |
jianli@chromium.org | 9ed1f9d | 2010-08-31 11:42:36 +0900 | [diff] [blame] | 149 | }; |
| 150 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 151 | class ReadHelper { |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 152 | public: |
thestig@chromium.org | 98e7067 | 2012-04-24 06:23:04 +0900 | [diff] [blame] | 153 | explicit ReadHelper(int bytes_to_read) |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 154 | : buffer_(new char[bytes_to_read]), |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 155 | bytes_to_read_(bytes_to_read), |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 156 | bytes_read_(0) {} |
| 157 | |
| 158 | void RunWork(PlatformFile file, int64 offset) { |
| 159 | bytes_read_ = ReadPlatformFile(file, offset, buffer_.get(), bytes_to_read_); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 160 | } |
| 161 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 162 | void Reply(const FileUtilProxy::ReadCallback& callback) { |
| 163 | if (!callback.is_null()) { |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 164 | File::Error error = |
| 165 | (bytes_read_ < 0) ? File::FILE_ERROR_FAILED : File::FILE_OK; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 166 | callback.Run(error, buffer_.get(), bytes_read_); |
| 167 | } |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 168 | } |
| 169 | |
| 170 | private: |
tfarina@chromium.org | 15bc41d | 2013-01-18 23:21:58 +0900 | [diff] [blame] | 171 | scoped_ptr<char[]> buffer_; |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 172 | int bytes_to_read_; |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 173 | int bytes_read_; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 174 | DISALLOW_COPY_AND_ASSIGN(ReadHelper); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 175 | }; |
| 176 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 177 | class WriteHelper { |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 178 | public: |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 179 | WriteHelper(const char* buffer, int bytes_to_write) |
| 180 | : buffer_(new char[bytes_to_write]), |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 181 | bytes_to_write_(bytes_to_write), |
finnur@chromium.org | 899d4e0 | 2011-03-15 18:56:27 +0900 | [diff] [blame] | 182 | bytes_written_(0) { |
darin@chromium.org | 44a9973 | 2011-02-04 09:39:34 +0900 | [diff] [blame] | 183 | memcpy(buffer_.get(), buffer, bytes_to_write); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 184 | } |
| 185 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 186 | void RunWork(PlatformFile file, int64 offset) { |
| 187 | bytes_written_ = WritePlatformFile(file, offset, buffer_.get(), |
| 188 | bytes_to_write_); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 189 | } |
| 190 | |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 191 | void Reply(const FileUtilProxy::WriteCallback& callback) { |
| 192 | if (!callback.is_null()) { |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 193 | File::Error error = |
| 194 | (bytes_written_ < 0) ? File::FILE_ERROR_FAILED : File::FILE_OK; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 195 | callback.Run(error, bytes_written_); |
| 196 | } |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 197 | } |
| 198 | |
| 199 | private: |
tfarina@chromium.org | 15bc41d | 2013-01-18 23:21:58 +0900 | [diff] [blame] | 200 | scoped_ptr<char[]> buffer_; |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 201 | int bytes_to_write_; |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 202 | int bytes_written_; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 203 | DISALLOW_COPY_AND_ASSIGN(WriteHelper); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 204 | }; |
| 205 | |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 206 | File::Error CreateOrOpenAdapter( |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 207 | const FilePath& file_path, int file_flags, |
| 208 | PlatformFile* file_handle, bool* created) { |
| 209 | DCHECK(file_handle); |
| 210 | DCHECK(created); |
brettw@chromium.org | 5a112e7 | 2013-07-16 05:18:09 +0900 | [diff] [blame] | 211 | if (!DirectoryExists(file_path.DirName())) { |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 212 | // If its parent does not exist, should return NOT_FOUND error. |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 213 | return File::FILE_ERROR_NOT_FOUND; |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 214 | } |
rvargas@chromium.org | e55f2db | 2014-04-10 04:58:54 +0900 | [diff] [blame] | 215 | |
| 216 | File file(file_path, file_flags); |
| 217 | if (!file.IsValid()) |
| 218 | return file.error_details(); |
| 219 | |
| 220 | *file_handle = file.TakePlatformFile(); |
| 221 | *created = file.created(); |
| 222 | return File::FILE_OK; |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 223 | } |
| 224 | |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 225 | File::Error CloseAdapter(PlatformFile file_handle) { |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 226 | if (!ClosePlatformFile(file_handle)) { |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 227 | return File::FILE_ERROR_FAILED; |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 228 | } |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 229 | return File::FILE_OK; |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 230 | } |
| 231 | |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 232 | File::Error DeleteAdapter(const FilePath& file_path, bool recursive) { |
brettw@chromium.org | 10b6412 | 2013-07-12 02:36:07 +0900 | [diff] [blame] | 233 | if (!PathExists(file_path)) { |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 234 | return File::FILE_ERROR_NOT_FOUND; |
kinuko@chromium.org | 9c033e2 | 2011-11-09 15:46:39 +0900 | [diff] [blame] | 235 | } |
brettw@chromium.org | 220b8de | 2013-07-17 04:10:23 +0900 | [diff] [blame] | 236 | if (!base::DeleteFile(file_path, recursive)) { |
brettw@chromium.org | 83c44c8 | 2013-12-03 03:55:49 +0900 | [diff] [blame] | 237 | if (!recursive && !base::IsDirectoryEmpty(file_path)) { |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 238 | return File::FILE_ERROR_NOT_EMPTY; |
kinuko@chromium.org | 9c033e2 | 2011-11-09 15:46:39 +0900 | [diff] [blame] | 239 | } |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 240 | return File::FILE_ERROR_FAILED; |
kinuko@chromium.org | 9c033e2 | 2011-11-09 15:46:39 +0900 | [diff] [blame] | 241 | } |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 242 | return File::FILE_OK; |
kinuko@chromium.org | 9c033e2 | 2011-11-09 15:46:39 +0900 | [diff] [blame] | 243 | } |
| 244 | |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 245 | } // namespace |
| 246 | |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 247 | // static |
dumi@chromium.org | 6dedd6d | 2010-08-25 05:26:23 +0900 | [diff] [blame] | 248 | bool FileUtilProxy::CreateOrOpen( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 249 | TaskRunner* task_runner, |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 250 | const FilePath& file_path, int file_flags, |
jhawkins@chromium.org | 3a6573d | 2011-10-18 03:40:30 +0900 | [diff] [blame] | 251 | const CreateOrOpenCallback& callback) { |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 252 | return RelayCreateOrOpen( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 253 | task_runner, |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 254 | base::Bind(&CreateOrOpenAdapter, file_path, file_flags), |
| 255 | base::Bind(&CloseAdapter), |
| 256 | callback); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 257 | } |
| 258 | |
| 259 | // static |
dumi@chromium.org | 6dedd6d | 2010-08-25 05:26:23 +0900 | [diff] [blame] | 260 | bool FileUtilProxy::CreateTemporary( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 261 | TaskRunner* task_runner, |
noelutz@google.com | f56dab2 | 2011-06-14 05:29:50 +0900 | [diff] [blame] | 262 | int additional_file_flags, |
jhawkins@chromium.org | d90c4f5 | 2011-10-18 04:29:29 +0900 | [diff] [blame] | 263 | const CreateTemporaryCallback& callback) { |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 264 | CreateTemporaryHelper* helper = new CreateTemporaryHelper(task_runner); |
| 265 | return task_runner->PostTaskAndReply( |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 266 | FROM_HERE, |
| 267 | Bind(&CreateTemporaryHelper::RunWork, Unretained(helper), |
| 268 | additional_file_flags), |
| 269 | Bind(&CreateTemporaryHelper::Reply, Owned(helper), callback)); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 270 | } |
| 271 | |
| 272 | // static |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 273 | bool FileUtilProxy::Close( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 274 | TaskRunner* task_runner, |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 275 | base::PlatformFile file_handle, |
| 276 | const StatusCallback& callback) { |
| 277 | return RelayClose( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 278 | task_runner, |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 279 | base::Bind(&CloseAdapter), |
| 280 | file_handle, callback); |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 281 | } |
| 282 | |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 283 | // Retrieves the information about a file. It is invalid to pass NULL for the |
| 284 | // callback. |
| 285 | bool FileUtilProxy::GetFileInfo( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 286 | TaskRunner* task_runner, |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 287 | const FilePath& file_path, |
jhawkins@chromium.org | 56771f0 | 2011-10-18 05:12:05 +0900 | [diff] [blame] | 288 | const GetFileInfoCallback& callback) { |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 289 | GetFileInfoHelper* helper = new GetFileInfoHelper; |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 290 | return task_runner->PostTaskAndReply( |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 291 | FROM_HERE, |
| 292 | Bind(&GetFileInfoHelper::RunWorkForFilePath, |
| 293 | Unretained(helper), file_path), |
| 294 | Bind(&GetFileInfoHelper::Reply, Owned(helper), callback)); |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 295 | } |
| 296 | |
kinuko@chromium.org | 850eb6d | 2010-10-15 09:37:34 +0900 | [diff] [blame] | 297 | // static |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 298 | bool FileUtilProxy::GetFileInfoFromPlatformFile( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 299 | TaskRunner* task_runner, |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 300 | PlatformFile file, |
jhawkins@chromium.org | 56771f0 | 2011-10-18 05:12:05 +0900 | [diff] [blame] | 301 | const GetFileInfoCallback& callback) { |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 302 | GetFileInfoHelper* helper = new GetFileInfoHelper; |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 303 | return task_runner->PostTaskAndReply( |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 304 | FROM_HERE, |
| 305 | Bind(&GetFileInfoHelper::RunWorkForPlatformFile, |
| 306 | Unretained(helper), file), |
| 307 | Bind(&GetFileInfoHelper::Reply, Owned(helper), callback)); |
erg@google.com | 37c078e | 2011-01-11 09:50:59 +0900 | [diff] [blame] | 308 | } |
| 309 | |
| 310 | // static |
brettw@chromium.org | 220b8de | 2013-07-17 04:10:23 +0900 | [diff] [blame] | 311 | bool FileUtilProxy::DeleteFile(TaskRunner* task_runner, |
| 312 | const FilePath& file_path, |
| 313 | bool recursive, |
| 314 | const StatusCallback& callback) { |
kinuko@chromium.org | 81f6e03 | 2013-01-17 04:54:36 +0900 | [diff] [blame] | 315 | return base::PostTaskAndReplyWithResult( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 316 | task_runner, FROM_HERE, |
kinuko@chromium.org | 9c033e2 | 2011-11-09 15:46:39 +0900 | [diff] [blame] | 317 | Bind(&DeleteAdapter, file_path, recursive), |
| 318 | callback); |
kkanetkar@chromium.org | 3a3bdea | 2010-09-02 12:43:36 +0900 | [diff] [blame] | 319 | } |
dumi@chromium.org | c980e40 | 2010-08-21 07:42:50 +0900 | [diff] [blame] | 320 | |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 321 | // static |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 322 | bool FileUtilProxy::Read( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 323 | TaskRunner* task_runner, |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 324 | PlatformFile file, |
| 325 | int64 offset, |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 326 | int bytes_to_read, |
jhawkins@chromium.org | d08a33e | 2011-10-18 05:44:47 +0900 | [diff] [blame] | 327 | const ReadCallback& callback) { |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 328 | if (bytes_to_read < 0) { |
sanga@chromium.org | f5cff13 | 2011-08-18 01:16:27 +0900 | [diff] [blame] | 329 | return false; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 330 | } |
| 331 | ReadHelper* helper = new ReadHelper(bytes_to_read); |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 332 | return task_runner->PostTaskAndReply( |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 333 | FROM_HERE, |
| 334 | Bind(&ReadHelper::RunWork, Unretained(helper), file, offset), |
| 335 | Bind(&ReadHelper::Reply, Owned(helper), callback)); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 336 | } |
| 337 | |
| 338 | // static |
| 339 | bool FileUtilProxy::Write( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 340 | TaskRunner* task_runner, |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 341 | PlatformFile file, |
| 342 | int64 offset, |
| 343 | const char* buffer, |
| 344 | int bytes_to_write, |
jhawkins@chromium.org | 553ef50 | 2011-10-18 05:56:52 +0900 | [diff] [blame] | 345 | const WriteCallback& callback) { |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 346 | if (bytes_to_write <= 0 || buffer == NULL) { |
sanga@chromium.org | 21d251f | 2011-08-18 01:45:48 +0900 | [diff] [blame] | 347 | return false; |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 348 | } |
| 349 | WriteHelper* helper = new WriteHelper(buffer, bytes_to_write); |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 350 | return task_runner->PostTaskAndReply( |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 351 | FROM_HERE, |
| 352 | Bind(&WriteHelper::RunWork, Unretained(helper), file, offset), |
| 353 | Bind(&WriteHelper::Reply, Owned(helper), callback)); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 354 | } |
| 355 | |
| 356 | // static |
| 357 | bool FileUtilProxy::Touch( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 358 | TaskRunner* task_runner, |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 359 | PlatformFile file, |
kinuko@chromium.org | 4f65c99 | 2011-10-19 16:21:57 +0900 | [diff] [blame] | 360 | const Time& last_access_time, |
| 361 | const Time& last_modified_time, |
jhawkins@chromium.org | 162de39 | 2011-10-18 06:33:35 +0900 | [diff] [blame] | 362 | const StatusCallback& callback) { |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 363 | return base::PostTaskAndReplyWithResult( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 364 | task_runner, |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 365 | FROM_HERE, |
kinuko@chromium.org | ccadc2e | 2011-10-25 18:37:19 +0900 | [diff] [blame] | 366 | Bind(&TouchPlatformFile, file, |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 367 | last_access_time, last_modified_time), |
| 368 | Bind(&CallWithTranslatedParameter, callback)); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 369 | } |
| 370 | |
| 371 | // static |
dumi@chromium.org | 12c2e2b | 2010-09-24 10:09:32 +0900 | [diff] [blame] | 372 | bool FileUtilProxy::Touch( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 373 | TaskRunner* task_runner, |
dumi@chromium.org | 12c2e2b | 2010-09-24 10:09:32 +0900 | [diff] [blame] | 374 | const FilePath& file_path, |
kinuko@chromium.org | 4f65c99 | 2011-10-19 16:21:57 +0900 | [diff] [blame] | 375 | const Time& last_access_time, |
| 376 | const Time& last_modified_time, |
jhawkins@chromium.org | 162de39 | 2011-10-18 06:33:35 +0900 | [diff] [blame] | 377 | const StatusCallback& callback) { |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 378 | return base::PostTaskAndReplyWithResult( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 379 | task_runner, |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 380 | FROM_HERE, |
brettw@chromium.org | 458d1e3 | 2013-12-05 07:49:00 +0900 | [diff] [blame] | 381 | Bind(&TouchFile, file_path, last_access_time, last_modified_time), |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 382 | Bind(&CallWithTranslatedParameter, callback)); |
dumi@chromium.org | 12c2e2b | 2010-09-24 10:09:32 +0900 | [diff] [blame] | 383 | } |
| 384 | |
| 385 | // static |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 386 | bool FileUtilProxy::Truncate( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 387 | TaskRunner* task_runner, |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 388 | PlatformFile file, |
ericu@google.com | 6a65222 | 2010-10-05 11:26:47 +0900 | [diff] [blame] | 389 | int64 length, |
jhawkins@chromium.org | 162de39 | 2011-10-18 06:33:35 +0900 | [diff] [blame] | 390 | const StatusCallback& callback) { |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 391 | return base::PostTaskAndReplyWithResult( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 392 | task_runner, |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 393 | FROM_HERE, |
| 394 | Bind(&TruncatePlatformFile, file, length), |
| 395 | Bind(&CallWithTranslatedParameter, callback)); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 396 | } |
| 397 | |
| 398 | // static |
| 399 | bool FileUtilProxy::Flush( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 400 | TaskRunner* task_runner, |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 401 | PlatformFile file, |
jhawkins@chromium.org | 162de39 | 2011-10-18 06:33:35 +0900 | [diff] [blame] | 402 | const StatusCallback& callback) { |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 403 | return base::PostTaskAndReplyWithResult( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 404 | task_runner, |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 405 | FROM_HERE, |
| 406 | Bind(&FlushPlatformFile, file), |
| 407 | Bind(&CallWithTranslatedParameter, callback)); |
dumi@chromium.org | 2391598 | 2010-09-10 12:01:14 +0900 | [diff] [blame] | 408 | } |
| 409 | |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 410 | // static |
| 411 | bool FileUtilProxy::RelayCreateOrOpen( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 412 | TaskRunner* task_runner, |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 413 | const CreateOrOpenTask& open_task, |
| 414 | const CloseTask& close_task, |
| 415 | const CreateOrOpenCallback& callback) { |
| 416 | CreateOrOpenHelper* helper = new CreateOrOpenHelper( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 417 | task_runner, close_task); |
| 418 | return task_runner->PostTaskAndReply( |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 419 | FROM_HERE, |
| 420 | Bind(&CreateOrOpenHelper::RunWork, Unretained(helper), open_task), |
| 421 | Bind(&CreateOrOpenHelper::Reply, Owned(helper), callback)); |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 422 | } |
| 423 | |
| 424 | // static |
| 425 | bool FileUtilProxy::RelayClose( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 426 | TaskRunner* task_runner, |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 427 | const CloseTask& close_task, |
| 428 | PlatformFile file_handle, |
| 429 | const StatusCallback& callback) { |
battre@chromium.org | 6d02597 | 2012-04-17 11:48:06 +0900 | [diff] [blame] | 430 | return base::PostTaskAndReplyWithResult( |
kinuko@chromium.org | 20e2efc | 2012-04-24 03:40:57 +0900 | [diff] [blame] | 431 | task_runner, FROM_HERE, Bind(close_task, file_handle), callback); |
kinuko@chromium.org | 42e9d8c | 2011-11-08 18:04:16 +0900 | [diff] [blame] | 432 | } |
| 433 | |
kkanetkar@chromium.org | 3a3bdea | 2010-09-02 12:43:36 +0900 | [diff] [blame] | 434 | } // namespace base |