Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/files/file_util_proxy.h" | 5 #include "base/files/file_proxy.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/files/file.h" | 10 #include "base/files/file.h" |
| 11 #include "base/location.h" | 11 #include "base/location.h" |
| 12 #include "base/message_loop/message_loop_proxy.h" | 12 #include "base/message_loop/message_loop_proxy.h" |
| 13 #include "base/task_runner.h" | 13 #include "base/task_runner.h" |
| 14 #include "base/task_runner_util.h" | 14 #include "base/task_runner_util.h" |
| 15 | 15 |
| 16 namespace base { | 16 namespace base { |
| 17 | 17 |
| 18 class FileHelper { | |
| 19 public: | |
| 20 FileHelper(FileProxy* proxy, File file) | |
| 21 : file_(file.Pass()), | |
| 22 proxy_(AsWeakPtr(proxy)), | |
| 23 error_(File::FILE_ERROR_FAILED) { | |
| 24 } | |
| 25 | |
| 26 void PassFile() { | |
| 27 if (proxy_) | |
| 28 proxy_->SetFile(file_.Pass()); | |
| 29 } | |
| 30 | |
| 31 protected: | |
| 32 File file_; | |
| 33 WeakPtr<FileProxy> proxy_; | |
| 34 File::Error error_; | |
| 35 | |
| 36 private: | |
| 37 DISALLOW_COPY_AND_ASSIGN(FileHelper); | |
| 38 }; | |
| 39 | |
| 18 namespace { | 40 namespace { |
| 19 | 41 |
| 20 void CallWithTranslatedParameter(const FileUtilProxy::StatusCallback& callback, | 42 class GenericFileHelper : public FileHelper { |
| 21 bool value) { | |
| 22 DCHECK(!callback.is_null()); | |
| 23 callback.Run(value ? File::FILE_OK : File::FILE_ERROR_FAILED); | |
| 24 } | |
| 25 | |
| 26 // Helper classes or routines for individual methods. | |
| 27 class CreateOrOpenHelper { | |
| 28 public: | 43 public: |
| 29 CreateOrOpenHelper(TaskRunner* task_runner, | 44 GenericFileHelper(FileProxy* proxy, File file) |
| 30 const FileUtilProxy::CloseTask& close_task) | 45 : FileHelper(proxy, file.Pass()) { |
| 31 : task_runner_(task_runner), | |
| 32 close_task_(close_task), | |
| 33 file_handle_(kInvalidPlatformFileValue), | |
| 34 created_(false), | |
| 35 error_(File::FILE_OK) {} | |
| 36 | |
| 37 ~CreateOrOpenHelper() { | |
| 38 if (file_handle_ != kInvalidPlatformFileValue) { | |
| 39 task_runner_->PostTask( | |
| 40 FROM_HERE, | |
| 41 base::Bind(base::IgnoreResult(close_task_), file_handle_)); | |
| 42 } | |
| 43 } | 46 } |
| 44 | 47 |
| 45 void RunWork(const FileUtilProxy::CreateOrOpenTask& task) { | 48 void Close() { |
| 46 error_ = task.Run(&file_handle_, &created_); | 49 file_.Close(); |
| 50 error_ = File::FILE_OK; | |
| 47 } | 51 } |
| 48 | 52 |
| 49 void Reply(const FileUtilProxy::CreateOrOpenCallback& callback) { | 53 void SetTimes(Time last_access_time, Time last_modified_time) { |
| 50 DCHECK(!callback.is_null()); | 54 bool rv = file_.SetTimes(last_access_time, last_modified_time); |
| 51 callback.Run(error_, PassPlatformFile(&file_handle_), created_); | 55 error_ = rv ? File::FILE_OK : File::FILE_ERROR_FAILED; |
| 56 } | |
| 57 | |
| 58 void SetLength(int64 length) { | |
| 59 if (file_.SetLength(length)) | |
| 60 error_ = File::FILE_OK; | |
| 61 } | |
| 62 | |
| 63 void Flush() { | |
| 64 if (file_.Flush()) | |
| 65 error_ = File::FILE_OK; | |
| 66 } | |
| 67 | |
| 68 void Reply(const FileProxy::StatusCallback& callback) { | |
| 69 PassFile(); | |
| 70 if (!callback.is_null()) | |
| 71 callback.Run(error_); | |
| 52 } | 72 } |
| 53 | 73 |
| 54 private: | 74 private: |
| 55 scoped_refptr<TaskRunner> task_runner_; | 75 DISALLOW_COPY_AND_ASSIGN(GenericFileHelper); |
| 56 FileUtilProxy::CloseTask close_task_; | 76 }; |
| 57 PlatformFile file_handle_; | 77 |
| 58 bool created_; | 78 class CreateOrOpenHelper : public FileHelper { |
| 59 File::Error error_; | 79 public: |
| 80 CreateOrOpenHelper(FileProxy* proxy, File file) | |
| 81 : FileHelper(proxy, file.Pass()) { | |
| 82 } | |
| 83 | |
| 84 void RunWork(const FilePath& file_path, int file_flags) { | |
| 85 file_.Initialize(file_path, file_flags); | |
| 86 error_ = file_.IsValid() ? File::FILE_OK : file_.error_details(); | |
| 87 } | |
| 88 | |
| 89 void Reply(const FileProxy::StatusCallback& callback) { | |
| 90 DCHECK(!callback.is_null()); | |
| 91 PassFile(); | |
| 92 callback.Run(error_); | |
| 93 } | |
| 94 | |
| 95 private: | |
| 60 DISALLOW_COPY_AND_ASSIGN(CreateOrOpenHelper); | 96 DISALLOW_COPY_AND_ASSIGN(CreateOrOpenHelper); |
| 61 }; | 97 }; |
| 62 | 98 |
| 63 class CreateTemporaryHelper { | 99 class CreateTemporaryHelper : public FileHelper { |
| 64 public: | 100 public: |
| 65 explicit CreateTemporaryHelper(TaskRunner* task_runner) | 101 CreateTemporaryHelper(FileProxy* proxy, File file) |
| 66 : task_runner_(task_runner), | 102 : FileHelper(proxy, file.Pass()) { |
| 67 file_handle_(kInvalidPlatformFileValue), | |
| 68 error_(File::FILE_OK) {} | |
| 69 | |
| 70 ~CreateTemporaryHelper() { | |
| 71 if (file_handle_ != kInvalidPlatformFileValue) { | |
| 72 FileUtilProxy::Close( | |
| 73 task_runner_.get(), file_handle_, FileUtilProxy::StatusCallback()); | |
| 74 } | |
| 75 } | 103 } |
| 76 | 104 |
| 77 void RunWork(int additional_file_flags) { | 105 void RunWork(uint32 additional_file_flags) { |
| 78 // TODO(darin): file_util should have a variant of CreateTemporaryFile | 106 // TODO(darin): file_util should have a variant of CreateTemporaryFile |
| 79 // that returns a FilePath and a PlatformFile. | 107 // that returns a FilePath and a File. |
| 80 base::CreateTemporaryFile(&file_path_); | 108 CreateTemporaryFile(&file_path_); |
| 81 | 109 |
| 82 int file_flags = | 110 uint32 file_flags = File::FLAG_WRITE | |
| 83 PLATFORM_FILE_WRITE | | 111 File::FLAG_TEMPORARY | |
| 84 PLATFORM_FILE_TEMPORARY | | 112 File::FLAG_CREATE_ALWAYS | |
| 85 PLATFORM_FILE_CREATE_ALWAYS | | 113 additional_file_flags; |
| 86 additional_file_flags; | |
| 87 | 114 |
| 88 error_ = File::FILE_OK; | 115 file_.Initialize(file_path_, file_flags); |
| 89 // TODO(rvargas): Convert this code to use File. | 116 error_ = file_.IsValid() ? File::FILE_OK : file_.error_details(); |
| 90 file_handle_ = | |
| 91 CreatePlatformFile(file_path_, file_flags, NULL, | |
| 92 reinterpret_cast<PlatformFileError*>(&error_)); | |
| 93 } | 117 } |
| 94 | 118 |
| 95 void Reply(const FileUtilProxy::CreateTemporaryCallback& callback) { | 119 void Reply(const FileProxy::CreateTemporaryCallback& callback) { |
| 96 DCHECK(!callback.is_null()); | 120 DCHECK(!callback.is_null()); |
| 97 callback.Run(error_, PassPlatformFile(&file_handle_), file_path_); | 121 PassFile(); |
| 122 callback.Run(error_, file_path_); | |
| 98 } | 123 } |
| 99 | 124 |
| 100 private: | 125 private: |
| 101 scoped_refptr<TaskRunner> task_runner_; | |
| 102 PlatformFile file_handle_; | |
| 103 FilePath file_path_; | 126 FilePath file_path_; |
| 104 File::Error error_; | |
| 105 DISALLOW_COPY_AND_ASSIGN(CreateTemporaryHelper); | 127 DISALLOW_COPY_AND_ASSIGN(CreateTemporaryHelper); |
| 106 }; | 128 }; |
| 107 | 129 |
| 108 class GetFileInfoHelper { | 130 class GetInfoHelper : public FileHelper { |
| 109 public: | 131 public: |
| 110 GetFileInfoHelper() | 132 GetInfoHelper(FileProxy* proxy, File file) |
| 111 : error_(File::FILE_OK) {} | 133 : FileHelper(proxy, file.Pass()) { |
| 112 | |
| 113 void RunWorkForFilePath(const FilePath& file_path) { | |
| 114 if (!PathExists(file_path)) { | |
| 115 error_ = File::FILE_ERROR_NOT_FOUND; | |
| 116 return; | |
| 117 } | |
| 118 // TODO(rvargas): switch this file to base::File. | |
| 119 if (!GetFileInfo(file_path, reinterpret_cast<File::Info*>(&file_info_))) | |
| 120 error_ = File::FILE_ERROR_FAILED; | |
| 121 } | 134 } |
| 122 | 135 |
| 123 void RunWorkForPlatformFile(PlatformFile file) { | 136 void RunWork() { |
| 124 if (!GetPlatformFileInfo( | 137 if (file_.GetInfo(&file_info_)) |
| 125 file, reinterpret_cast<PlatformFileInfo*>(&file_info_))) { | 138 error_ = File::FILE_OK; |
| 126 error_ = File::FILE_ERROR_FAILED; | |
| 127 } | |
| 128 } | 139 } |
| 129 | 140 |
| 130 void Reply(const FileUtilProxy::GetFileInfoCallback& callback) { | 141 void Reply(const FileProxy::GetFileInfoCallback& callback) { |
| 131 if (!callback.is_null()) { | 142 PassFile(); |
| 132 callback.Run(error_, file_info_); | 143 DCHECK(!callback.is_null()); |
| 133 } | 144 callback.Run(error_, file_info_); |
| 134 } | 145 } |
| 135 | 146 |
| 136 private: | 147 private: |
| 137 File::Error error_; | |
| 138 File::Info file_info_; | 148 File::Info file_info_; |
| 139 DISALLOW_COPY_AND_ASSIGN(GetFileInfoHelper); | 149 DISALLOW_COPY_AND_ASSIGN(GetInfoHelper); |
| 140 }; | 150 }; |
| 141 | 151 |
| 142 class ReadHelper { | 152 class ReadHelper : public FileHelper { |
| 143 public: | 153 public: |
| 144 explicit ReadHelper(int bytes_to_read) | 154 ReadHelper(FileProxy* proxy, File file, int bytes_to_read) |
| 145 : buffer_(new char[bytes_to_read]), | 155 : FileHelper(proxy, file.Pass()), |
| 156 buffer_(new char[bytes_to_read]), | |
| 146 bytes_to_read_(bytes_to_read), | 157 bytes_to_read_(bytes_to_read), |
| 147 bytes_read_(0) {} | 158 bytes_read_(0) { |
| 148 | |
| 149 void RunWork(PlatformFile file, int64 offset) { | |
| 150 bytes_read_ = ReadPlatformFile(file, offset, buffer_.get(), bytes_to_read_); | |
| 151 } | 159 } |
| 152 | 160 |
| 153 void Reply(const FileUtilProxy::ReadCallback& callback) { | 161 void RunWork(int64 offset) { |
| 154 if (!callback.is_null()) { | 162 bytes_read_ = file_.Read(offset, buffer_.get(), bytes_to_read_); |
| 155 File::Error error = | 163 error_ = (bytes_read_ < 0) ? File::FILE_ERROR_FAILED : File::FILE_OK; |
| 156 (bytes_read_ < 0) ? File::FILE_ERROR_FAILED : File::FILE_OK; | 164 } |
| 157 callback.Run(error, buffer_.get(), bytes_read_); | 165 |
| 158 } | 166 void Reply(const FileProxy::ReadCallback& callback) { |
| 167 PassFile(); | |
| 168 DCHECK(!callback.is_null()); | |
| 169 callback.Run(error_, buffer_.get(), bytes_read_); | |
| 159 } | 170 } |
| 160 | 171 |
| 161 private: | 172 private: |
| 162 scoped_ptr<char[]> buffer_; | 173 scoped_ptr<char[]> buffer_; |
| 163 int bytes_to_read_; | 174 int bytes_to_read_; |
| 164 int bytes_read_; | 175 int bytes_read_; |
| 165 DISALLOW_COPY_AND_ASSIGN(ReadHelper); | 176 DISALLOW_COPY_AND_ASSIGN(ReadHelper); |
| 166 }; | 177 }; |
| 167 | 178 |
| 168 class WriteHelper { | 179 class WriteHelper : public FileHelper { |
| 169 public: | 180 public: |
| 170 WriteHelper(const char* buffer, int bytes_to_write) | 181 WriteHelper(FileProxy* proxy, |
| 171 : buffer_(new char[bytes_to_write]), | 182 File file, |
| 183 const char* buffer, int bytes_to_write) | |
| 184 : FileHelper(proxy, file.Pass()), | |
| 185 buffer_(new char[bytes_to_write]), | |
| 172 bytes_to_write_(bytes_to_write), | 186 bytes_to_write_(bytes_to_write), |
| 173 bytes_written_(0) { | 187 bytes_written_(0) { |
| 174 memcpy(buffer_.get(), buffer, bytes_to_write); | 188 memcpy(buffer_.get(), buffer, bytes_to_write); |
| 175 } | 189 } |
| 176 | 190 |
| 177 void RunWork(PlatformFile file, int64 offset) { | 191 void RunWork(int64 offset) { |
| 178 bytes_written_ = WritePlatformFile(file, offset, buffer_.get(), | 192 bytes_written_ = file_.Write(offset, buffer_.get(), bytes_to_write_); |
| 179 bytes_to_write_); | 193 error_ = (bytes_written_ < 0) ? File::FILE_ERROR_FAILED : File::FILE_OK; |
| 180 } | 194 } |
| 181 | 195 |
| 182 void Reply(const FileUtilProxy::WriteCallback& callback) { | 196 void Reply(const FileProxy::WriteCallback& callback) { |
| 183 if (!callback.is_null()) { | 197 PassFile(); |
| 184 File::Error error = | 198 if (!callback.is_null()) |
| 185 (bytes_written_ < 0) ? File::FILE_ERROR_FAILED : File::FILE_OK; | 199 callback.Run(error_, bytes_written_); |
| 186 callback.Run(error, bytes_written_); | |
| 187 } | |
| 188 } | 200 } |
| 189 | 201 |
| 190 private: | 202 private: |
| 191 scoped_ptr<char[]> buffer_; | 203 scoped_ptr<char[]> buffer_; |
| 192 int bytes_to_write_; | 204 int bytes_to_write_; |
| 193 int bytes_written_; | 205 int bytes_written_; |
| 194 DISALLOW_COPY_AND_ASSIGN(WriteHelper); | 206 DISALLOW_COPY_AND_ASSIGN(WriteHelper); |
| 195 }; | 207 }; |
| 196 | 208 |
| 197 File::Error CreateOrOpenAdapter( | 209 } // namespace |
| 198 const FilePath& file_path, int file_flags, | 210 |
| 199 PlatformFile* file_handle, bool* created) { | 211 FileProxy::FileProxy() : task_runner_(NULL) { |
| 200 DCHECK(file_handle); | |
| 201 DCHECK(created); | |
| 202 if (!DirectoryExists(file_path.DirName())) { | |
| 203 // If its parent does not exist, should return NOT_FOUND error. | |
| 204 return File::FILE_ERROR_NOT_FOUND; | |
| 205 } | |
| 206 File::Error error = File::FILE_OK; | |
| 207 *file_handle = | |
| 208 CreatePlatformFile(file_path, file_flags, created, | |
| 209 reinterpret_cast<PlatformFileError*>(&error)); | |
| 210 return error; | |
| 211 } | 212 } |
| 212 | 213 |
| 213 File::Error CloseAdapter(PlatformFile file_handle) { | 214 FileProxy::FileProxy(TaskRunner* task_runner) : task_runner_(task_runner) { |
| 214 if (!ClosePlatformFile(file_handle)) { | |
| 215 return File::FILE_ERROR_FAILED; | |
| 216 } | |
| 217 return File::FILE_OK; | |
| 218 } | 215 } |
| 219 | 216 |
| 220 File::Error DeleteAdapter(const FilePath& file_path, bool recursive) { | 217 FileProxy::~FileProxy() { |
|
kinuko
2014/03/03 05:58:58
This may lead to close a file on non-blocking thre
rvargas (doing something else)
2014/03/03 20:38:34
Correct. I think that would be an error that would
kinuko
2014/03/04 04:07:45
Ok... not performing Close automatically in dtor a
rvargas (doing something else)
2014/03/04 23:53:53
I added a comment to the class description.
| |
| 221 if (!PathExists(file_path)) { | |
| 222 return File::FILE_ERROR_NOT_FOUND; | |
| 223 } | |
| 224 if (!base::DeleteFile(file_path, recursive)) { | |
| 225 if (!recursive && !base::IsDirectoryEmpty(file_path)) { | |
| 226 return File::FILE_ERROR_NOT_EMPTY; | |
| 227 } | |
| 228 return File::FILE_ERROR_FAILED; | |
| 229 } | |
| 230 return File::FILE_OK; | |
| 231 } | 218 } |
| 232 | 219 |
| 233 } // namespace | 220 bool FileProxy::CreateOrOpen(const FilePath& file_path, |
| 234 | 221 uint32 file_flags, |
| 235 // static | 222 const StatusCallback& callback) { |
| 236 bool FileUtilProxy::CreateOrOpen( | 223 CreateOrOpenHelper* helper = new CreateOrOpenHelper(this, File()); |
| 237 TaskRunner* task_runner, | 224 return task_runner_->PostTaskAndReply( |
| 238 const FilePath& file_path, int file_flags, | 225 FROM_HERE, |
| 239 const CreateOrOpenCallback& callback) { | 226 Bind(&CreateOrOpenHelper::RunWork, Unretained(helper), file_path, |
| 240 return RelayCreateOrOpen( | 227 file_flags), |
| 241 task_runner, | 228 Bind(&CreateOrOpenHelper::Reply, Owned(helper), callback)); |
| 242 base::Bind(&CreateOrOpenAdapter, file_path, file_flags), | |
| 243 base::Bind(&CloseAdapter), | |
| 244 callback); | |
| 245 } | 229 } |
| 246 | 230 |
| 247 // static | 231 bool FileProxy::CreateTemporary(uint32 additional_file_flags, |
| 248 bool FileUtilProxy::CreateTemporary( | 232 const CreateTemporaryCallback& callback) { |
| 249 TaskRunner* task_runner, | 233 CreateTemporaryHelper* helper = new CreateTemporaryHelper(this, File()); |
| 250 int additional_file_flags, | 234 return task_runner_->PostTaskAndReply( |
| 251 const CreateTemporaryCallback& callback) { | |
| 252 CreateTemporaryHelper* helper = new CreateTemporaryHelper(task_runner); | |
| 253 return task_runner->PostTaskAndReply( | |
| 254 FROM_HERE, | 235 FROM_HERE, |
| 255 Bind(&CreateTemporaryHelper::RunWork, Unretained(helper), | 236 Bind(&CreateTemporaryHelper::RunWork, Unretained(helper), |
| 256 additional_file_flags), | 237 additional_file_flags), |
| 257 Bind(&CreateTemporaryHelper::Reply, Owned(helper), callback)); | 238 Bind(&CreateTemporaryHelper::Reply, Owned(helper), callback)); |
| 258 } | 239 } |
| 259 | 240 |
| 260 // static | 241 bool FileProxy::IsValid() const { |
| 261 bool FileUtilProxy::Close( | 242 return file_.IsValid(); |
| 262 TaskRunner* task_runner, | |
| 263 base::PlatformFile file_handle, | |
| 264 const StatusCallback& callback) { | |
| 265 return RelayClose( | |
| 266 task_runner, | |
| 267 base::Bind(&CloseAdapter), | |
| 268 file_handle, callback); | |
| 269 } | 243 } |
| 270 | 244 |
| 271 // Retrieves the information about a file. It is invalid to pass NULL for the | 245 File FileProxy::TakeFile() { |
| 272 // callback. | 246 return file_.Pass(); |
| 273 bool FileUtilProxy::GetFileInfo( | |
| 274 TaskRunner* task_runner, | |
| 275 const FilePath& file_path, | |
| 276 const GetFileInfoCallback& callback) { | |
| 277 GetFileInfoHelper* helper = new GetFileInfoHelper; | |
| 278 return task_runner->PostTaskAndReply( | |
| 279 FROM_HERE, | |
| 280 Bind(&GetFileInfoHelper::RunWorkForFilePath, | |
| 281 Unretained(helper), file_path), | |
| 282 Bind(&GetFileInfoHelper::Reply, Owned(helper), callback)); | |
| 283 } | 247 } |
| 284 | 248 |
| 285 // static | 249 bool FileProxy::Close(const StatusCallback& callback) { |
| 286 bool FileUtilProxy::GetFileInfoFromPlatformFile( | 250 GenericFileHelper* helper = new GenericFileHelper(this, file_.Pass()); |
| 287 TaskRunner* task_runner, | 251 return task_runner_->PostTaskAndReply( |
| 288 PlatformFile file, | |
| 289 const GetFileInfoCallback& callback) { | |
| 290 GetFileInfoHelper* helper = new GetFileInfoHelper; | |
| 291 return task_runner->PostTaskAndReply( | |
| 292 FROM_HERE, | 252 FROM_HERE, |
| 293 Bind(&GetFileInfoHelper::RunWorkForPlatformFile, | 253 Bind(&GenericFileHelper::Close, Unretained(helper)), |
| 294 Unretained(helper), file), | 254 Bind(&GenericFileHelper::Reply, Owned(helper), callback)); |
| 295 Bind(&GetFileInfoHelper::Reply, Owned(helper), callback)); | |
| 296 } | 255 } |
| 297 | 256 |
| 298 // static | 257 bool FileProxy::GetInfo(const GetFileInfoCallback& callback) { |
| 299 bool FileUtilProxy::DeleteFile(TaskRunner* task_runner, | 258 GetInfoHelper* helper = new GetInfoHelper(this, file_.Pass()); |
| 300 const FilePath& file_path, | 259 return task_runner_->PostTaskAndReply( |
| 301 bool recursive, | 260 FROM_HERE, |
| 302 const StatusCallback& callback) { | 261 Bind(&GetInfoHelper::RunWork, Unretained(helper)), |
| 303 return base::PostTaskAndReplyWithResult( | 262 Bind(&GetInfoHelper::Reply, Owned(helper), callback)); |
| 304 task_runner, FROM_HERE, | |
| 305 Bind(&DeleteAdapter, file_path, recursive), | |
| 306 callback); | |
| 307 } | 263 } |
| 308 | 264 |
| 309 // static | 265 bool FileProxy::Read(int64 offset, |
| 310 bool FileUtilProxy::Read( | 266 int bytes_to_read, |
| 311 TaskRunner* task_runner, | 267 const ReadCallback& callback) { |
| 312 PlatformFile file, | 268 if (bytes_to_read < 0) |
| 313 int64 offset, | |
| 314 int bytes_to_read, | |
| 315 const ReadCallback& callback) { | |
| 316 if (bytes_to_read < 0) { | |
| 317 return false; | 269 return false; |
| 318 } | 270 |
| 319 ReadHelper* helper = new ReadHelper(bytes_to_read); | 271 ReadHelper* helper = new ReadHelper(this, file_.Pass(), bytes_to_read); |
| 320 return task_runner->PostTaskAndReply( | 272 return task_runner_->PostTaskAndReply( |
| 321 FROM_HERE, | 273 FROM_HERE, |
| 322 Bind(&ReadHelper::RunWork, Unretained(helper), file, offset), | 274 Bind(&ReadHelper::RunWork, Unretained(helper), offset), |
| 323 Bind(&ReadHelper::Reply, Owned(helper), callback)); | 275 Bind(&ReadHelper::Reply, Owned(helper), callback)); |
| 324 } | 276 } |
| 325 | 277 |
| 326 // static | 278 bool FileProxy::Write(int64 offset, |
| 327 bool FileUtilProxy::Write( | 279 const char* buffer, |
| 328 TaskRunner* task_runner, | 280 int bytes_to_write, |
| 329 PlatformFile file, | 281 const WriteCallback& callback) { |
| 330 int64 offset, | 282 if (bytes_to_write <= 0 || buffer == NULL) |
| 331 const char* buffer, | |
| 332 int bytes_to_write, | |
| 333 const WriteCallback& callback) { | |
| 334 if (bytes_to_write <= 0 || buffer == NULL) { | |
| 335 return false; | 283 return false; |
| 336 } | 284 |
| 337 WriteHelper* helper = new WriteHelper(buffer, bytes_to_write); | 285 WriteHelper* helper = |
| 338 return task_runner->PostTaskAndReply( | 286 new WriteHelper(this, file_.Pass(), buffer, bytes_to_write); |
| 287 return task_runner_->PostTaskAndReply( | |
| 339 FROM_HERE, | 288 FROM_HERE, |
| 340 Bind(&WriteHelper::RunWork, Unretained(helper), file, offset), | 289 Bind(&WriteHelper::RunWork, Unretained(helper), offset), |
| 341 Bind(&WriteHelper::Reply, Owned(helper), callback)); | 290 Bind(&WriteHelper::Reply, Owned(helper), callback)); |
| 342 } | 291 } |
| 343 | 292 |
| 344 // static | 293 bool FileProxy::SetTimes(Time last_access_time, |
| 345 bool FileUtilProxy::Touch( | 294 Time last_modified_time, |
| 346 TaskRunner* task_runner, | 295 const StatusCallback& callback) { |
| 347 PlatformFile file, | 296 GenericFileHelper* helper = new GenericFileHelper(this, file_.Pass()); |
| 348 const Time& last_access_time, | 297 return task_runner_->PostTaskAndReply( |
| 349 const Time& last_modified_time, | |
| 350 const StatusCallback& callback) { | |
| 351 return base::PostTaskAndReplyWithResult( | |
| 352 task_runner, | |
| 353 FROM_HERE, | 298 FROM_HERE, |
| 354 Bind(&TouchPlatformFile, file, | 299 Bind(&GenericFileHelper::SetTimes, Unretained(helper), last_access_time, |
| 355 last_access_time, last_modified_time), | 300 last_modified_time), |
| 356 Bind(&CallWithTranslatedParameter, callback)); | 301 Bind(&GenericFileHelper::Reply, Owned(helper), callback)); |
| 357 } | 302 } |
| 358 | 303 |
| 359 // static | 304 bool FileProxy::SetLength(int64 length, const StatusCallback& callback) { |
| 360 bool FileUtilProxy::Touch( | 305 GenericFileHelper* helper = new GenericFileHelper(this, file_.Pass()); |
| 361 TaskRunner* task_runner, | 306 return task_runner_->PostTaskAndReply( |
| 362 const FilePath& file_path, | |
| 363 const Time& last_access_time, | |
| 364 const Time& last_modified_time, | |
| 365 const StatusCallback& callback) { | |
| 366 return base::PostTaskAndReplyWithResult( | |
| 367 task_runner, | |
| 368 FROM_HERE, | 307 FROM_HERE, |
| 369 Bind(&TouchFile, file_path, last_access_time, last_modified_time), | 308 Bind(&GenericFileHelper::SetLength, Unretained(helper), length), |
| 370 Bind(&CallWithTranslatedParameter, callback)); | 309 Bind(&GenericFileHelper::Reply, Owned(helper), callback)); |
| 371 } | 310 } |
| 372 | 311 |
| 373 // static | 312 bool FileProxy::Flush(const StatusCallback& callback) { |
| 374 bool FileUtilProxy::Truncate( | 313 GenericFileHelper* helper = new GenericFileHelper(this, file_.Pass()); |
| 375 TaskRunner* task_runner, | 314 return task_runner_->PostTaskAndReply( |
| 376 PlatformFile file, | |
| 377 int64 length, | |
| 378 const StatusCallback& callback) { | |
| 379 return base::PostTaskAndReplyWithResult( | |
| 380 task_runner, | |
| 381 FROM_HERE, | 315 FROM_HERE, |
| 382 Bind(&TruncatePlatformFile, file, length), | 316 Bind(&GenericFileHelper::Flush, Unretained(helper)), |
| 383 Bind(&CallWithTranslatedParameter, callback)); | 317 Bind(&GenericFileHelper::Reply, Owned(helper), callback)); |
| 384 } | 318 } |
| 385 | 319 |
| 386 // static | 320 void FileProxy::SetFile(File file) { |
| 387 bool FileUtilProxy::Flush( | 321 DCHECK(!file_.IsValid()); |
| 388 TaskRunner* task_runner, | 322 file_ = file.Pass(); |
| 389 PlatformFile file, | |
| 390 const StatusCallback& callback) { | |
| 391 return base::PostTaskAndReplyWithResult( | |
| 392 task_runner, | |
| 393 FROM_HERE, | |
| 394 Bind(&FlushPlatformFile, file), | |
| 395 Bind(&CallWithTranslatedParameter, callback)); | |
| 396 } | |
| 397 | |
| 398 // static | |
| 399 bool FileUtilProxy::RelayCreateOrOpen( | |
| 400 TaskRunner* task_runner, | |
| 401 const CreateOrOpenTask& open_task, | |
| 402 const CloseTask& close_task, | |
| 403 const CreateOrOpenCallback& callback) { | |
| 404 CreateOrOpenHelper* helper = new CreateOrOpenHelper( | |
| 405 task_runner, close_task); | |
| 406 return task_runner->PostTaskAndReply( | |
| 407 FROM_HERE, | |
| 408 Bind(&CreateOrOpenHelper::RunWork, Unretained(helper), open_task), | |
| 409 Bind(&CreateOrOpenHelper::Reply, Owned(helper), callback)); | |
| 410 } | |
| 411 | |
| 412 // static | |
| 413 bool FileUtilProxy::RelayClose( | |
| 414 TaskRunner* task_runner, | |
| 415 const CloseTask& close_task, | |
| 416 PlatformFile file_handle, | |
| 417 const StatusCallback& callback) { | |
| 418 return base::PostTaskAndReplyWithResult( | |
| 419 task_runner, FROM_HERE, Bind(close_task, file_handle), callback); | |
| 420 } | 323 } |
| 421 | 324 |
| 422 } // namespace base | 325 } // namespace base |
| OLD | NEW |