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