Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/file_util_proxy.h" | 5 #include "base/file_util_proxy.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/message_loop_proxy.h" | 8 #include "base/message_loop_proxy.h" |
| 9 | 9 |
| 10 // TODO(jianli): Move the code from anonymous namespace to base namespace so | 10 namespace base { |
| 11 // that all of the base:: prefixes would be unnecessary. | |
| 12 namespace { | |
| 13 | 11 |
| 14 namespace { | 12 namespace { |
| 15 | 13 |
| 16 // Performs common checks for move and copy. | |
| 17 // This also removes the destination directory if it's non-empty and all other | |
| 18 // checks are passed (so that the copy/move correctly overwrites the | |
| 19 // destination). | |
| 20 static base::PlatformFileError PerformCommonCheckAndPreparationForMoveAndCopy( | |
| 21 const FilePath& src_file_path, | |
| 22 const FilePath& dest_file_path) { | |
| 23 // Exits earlier if the source path does not exist. | |
| 24 if (!file_util::PathExists(src_file_path)) | |
| 25 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | |
| 26 | |
| 27 // The parent of the |dest_file_path| does not exist. | |
| 28 if (!file_util::DirectoryExists(dest_file_path.DirName())) | |
| 29 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | |
| 30 | |
| 31 // It is an error to try to copy/move an entry into its child. | |
| 32 if (src_file_path.IsParent(dest_file_path)) | |
| 33 return base::PLATFORM_FILE_ERROR_INVALID_OPERATION; | |
| 34 | |
| 35 // Now it is ok to return if the |dest_file_path| does not exist. | |
| 36 if (!file_util::PathExists(dest_file_path)) | |
| 37 return base::PLATFORM_FILE_OK; | |
| 38 | |
| 39 // |src_file_path| exists and is a directory. | |
| 40 // |dest_file_path| exists and is a file. | |
| 41 bool src_is_directory = file_util::DirectoryExists(src_file_path); | |
| 42 bool dest_is_directory = file_util::DirectoryExists(dest_file_path); | |
| 43 if (src_is_directory && !dest_is_directory) | |
| 44 return base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY; | |
| 45 | |
| 46 // |src_file_path| exists and is a file. | |
| 47 // |dest_file_path| exists and is a directory. | |
| 48 if (!src_is_directory && dest_is_directory) | |
| 49 return base::PLATFORM_FILE_ERROR_NOT_A_FILE; | |
| 50 | |
| 51 // It is an error to copy/move an entry into the same path. | |
| 52 if (src_file_path.value() == dest_file_path.value()) | |
| 53 return base::PLATFORM_FILE_ERROR_EXISTS; | |
| 54 | |
| 55 if (dest_is_directory) { | |
| 56 // It is an error to copy/move an entry to a non-empty directory. | |
| 57 // Otherwise the copy/move attempt must overwrite the destination, but | |
| 58 // the file_util's Copy or Move method doesn't perform overwrite | |
| 59 // on all platforms, so we delete the destination directory here. | |
| 60 // TODO(kinuko): may be better to change the file_util::{Copy,Move}. | |
| 61 if (!file_util::Delete(dest_file_path, false /* recursive */)) { | |
| 62 if (!file_util::IsDirectoryEmpty(dest_file_path)) | |
| 63 return base::PLATFORM_FILE_ERROR_NOT_EMPTY; | |
| 64 return base::PLATFORM_FILE_ERROR_FAILED; | |
| 65 } | |
| 66 } | |
| 67 return base::PLATFORM_FILE_OK; | |
| 68 } | |
| 69 | |
| 70 } // anonymous namespace | |
| 71 | |
| 72 class MessageLoopRelay | 14 class MessageLoopRelay |
| 73 : public base::RefCountedThreadSafe<MessageLoopRelay> { | 15 : public RefCountedThreadSafe<MessageLoopRelay> { |
| 74 public: | 16 public: |
| 75 MessageLoopRelay() | 17 MessageLoopRelay() |
| 76 : origin_message_loop_proxy_( | 18 : origin_message_loop_proxy_( |
| 77 base::MessageLoopProxy::current()), | 19 MessageLoopProxy::current()), |
| 78 error_code_(base::PLATFORM_FILE_OK) { | 20 error_code_(PLATFORM_FILE_OK) { |
| 79 } | 21 } |
| 80 | 22 |
| 81 bool Start(scoped_refptr<base::MessageLoopProxy> message_loop_proxy, | 23 bool Start(scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| 82 const tracked_objects::Location& from_here) { | 24 const tracked_objects::Location& from_here) { |
| 83 return message_loop_proxy->PostTask( | 25 return message_loop_proxy->PostTask( |
| 84 from_here, base::Bind(&MessageLoopRelay::ProcessOnTargetThread, this)); | 26 from_here, Bind(&MessageLoopRelay::ProcessOnTargetThread, this)); |
| 85 } | 27 } |
| 86 | 28 |
| 87 protected: | 29 protected: |
| 88 friend class base::RefCountedThreadSafe<MessageLoopRelay>; | 30 friend class RefCountedThreadSafe<MessageLoopRelay>; |
| 89 virtual ~MessageLoopRelay() {} | 31 virtual ~MessageLoopRelay() {} |
| 90 | 32 |
| 91 // Called to perform work on the FILE thread. | 33 // Called to perform work on the FILE thread. |
| 92 virtual void RunWork() = 0; | 34 virtual void RunWork() = 0; |
| 93 | 35 |
| 94 // Called to notify the callback on the origin thread. | 36 // Called to notify the callback on the origin thread. |
| 95 virtual void RunCallback() = 0; | 37 virtual void RunCallback() = 0; |
| 96 | 38 |
| 97 void set_error_code(base::PlatformFileError error_code) { | 39 void set_error_code(PlatformFileError error_code) { |
| 98 error_code_ = error_code; | 40 error_code_ = error_code; |
| 99 } | 41 } |
| 100 | 42 |
| 101 base::PlatformFileError error_code() const { | 43 PlatformFileError error_code() const { |
| 102 return error_code_; | 44 return error_code_; |
| 103 } | 45 } |
| 104 | 46 |
| 105 private: | 47 private: |
| 106 void ProcessOnTargetThread() { | 48 void ProcessOnTargetThread() { |
| 107 RunWork(); | 49 RunWork(); |
| 108 origin_message_loop_proxy_->PostTask( | 50 origin_message_loop_proxy_->PostTask( |
| 109 FROM_HERE, base::Bind(&MessageLoopRelay::RunCallback, this)); | 51 FROM_HERE, Bind(&MessageLoopRelay::RunCallback, this)); |
| 110 } | 52 } |
| 111 | 53 |
| 112 scoped_refptr<base::MessageLoopProxy> origin_message_loop_proxy_; | 54 scoped_refptr<MessageLoopProxy> origin_message_loop_proxy_; |
| 113 base::PlatformFileError error_code_; | 55 PlatformFileError error_code_; |
| 114 }; | 56 }; |
| 115 | 57 |
| 116 class RelayCreateOrOpen : public MessageLoopRelay { | 58 class RelayCreateOrOpen : public MessageLoopRelay { |
| 117 public: | 59 public: |
| 118 RelayCreateOrOpen( | 60 RelayCreateOrOpen( |
| 119 scoped_refptr<base::MessageLoopProxy> message_loop_proxy, | 61 scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| 120 const FilePath& file_path, | 62 const FilePath& file_path, |
| 121 int file_flags, | 63 int file_flags, |
| 122 const base::FileUtilProxy::CreateOrOpenCallback& callback) | 64 const FileUtilProxy::CreateOrOpenCallback& callback) |
| 123 : message_loop_proxy_(message_loop_proxy), | 65 : message_loop_proxy_(message_loop_proxy), |
| 124 file_path_(file_path), | 66 file_path_(file_path), |
| 125 file_flags_(file_flags), | 67 file_flags_(file_flags), |
| 126 callback_(callback), | 68 callback_(callback), |
| 127 file_handle_(base::kInvalidPlatformFileValue), | 69 file_handle_(kInvalidPlatformFileValue), |
| 128 created_(false) { | 70 created_(false) { |
| 129 DCHECK_EQ(false, callback.is_null()); | 71 DCHECK_EQ(false, callback.is_null()); |
| 130 } | 72 } |
| 131 | 73 |
| 132 protected: | 74 protected: |
| 133 virtual ~RelayCreateOrOpen() { | 75 virtual ~RelayCreateOrOpen() { |
| 134 if (file_handle_ != base::kInvalidPlatformFileValue) | 76 if (file_handle_ != kInvalidPlatformFileValue) |
| 135 base::FileUtilProxy::Close(message_loop_proxy_, file_handle_, | 77 FileUtilProxy::Close(message_loop_proxy_, file_handle_, |
| 136 base::FileUtilProxy::StatusCallback()); | 78 FileUtilProxy::StatusCallback()); |
| 137 } | 79 } |
| 138 | 80 |
| 139 virtual void RunWork() { | 81 virtual void RunWork() { |
| 140 if (!file_util::DirectoryExists(file_path_.DirName())) { | 82 if (!file_util::DirectoryExists(file_path_.DirName())) { |
| 141 // If its parent does not exist, should return NOT_FOUND error. | 83 // If its parent does not exist, should return NOT_FOUND error. |
| 142 set_error_code(base::PLATFORM_FILE_ERROR_NOT_FOUND); | 84 set_error_code(PLATFORM_FILE_ERROR_NOT_FOUND); |
| 143 return; | 85 return; |
| 144 } | 86 } |
| 145 base::PlatformFileError error_code = base::PLATFORM_FILE_OK; | 87 PlatformFileError error_code = PLATFORM_FILE_OK; |
| 146 file_handle_ = base::CreatePlatformFile(file_path_, file_flags_, | 88 file_handle_ = CreatePlatformFile(file_path_, file_flags_, |
| 147 &created_, &error_code); | 89 &created_, &error_code); |
|
akalin
2011/10/18 19:05:11
indent
| |
| 148 set_error_code(error_code); | 90 set_error_code(error_code); |
| 149 } | 91 } |
| 150 | 92 |
| 151 virtual void RunCallback() { | 93 virtual void RunCallback() { |
| 152 callback_.Run(error_code(), base::PassPlatformFile(&file_handle_), | 94 callback_.Run(error_code(), PassPlatformFile(&file_handle_), |
| 153 created_); | 95 created_); |
| 154 } | 96 } |
| 155 | 97 |
| 156 private: | 98 private: |
| 157 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; | 99 scoped_refptr<MessageLoopProxy> message_loop_proxy_; |
| 158 FilePath file_path_; | 100 FilePath file_path_; |
| 159 int file_flags_; | 101 int file_flags_; |
| 160 base::FileUtilProxy::CreateOrOpenCallback callback_; | 102 FileUtilProxy::CreateOrOpenCallback callback_; |
| 161 base::PlatformFile file_handle_; | 103 PlatformFile file_handle_; |
| 162 bool created_; | 104 bool created_; |
| 163 }; | 105 }; |
| 164 | 106 |
| 165 class RelayCreateTemporary : public MessageLoopRelay { | 107 class RelayCreateTemporary : public MessageLoopRelay { |
| 166 public: | 108 public: |
| 167 RelayCreateTemporary( | 109 RelayCreateTemporary( |
| 168 scoped_refptr<base::MessageLoopProxy> message_loop_proxy, | 110 scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| 169 int additional_file_flags, | 111 int additional_file_flags, |
| 170 const base::FileUtilProxy::CreateTemporaryCallback& callback) | 112 const FileUtilProxy::CreateTemporaryCallback& callback) |
| 171 : message_loop_proxy_(message_loop_proxy), | 113 : message_loop_proxy_(message_loop_proxy), |
| 172 additional_file_flags_(additional_file_flags), | 114 additional_file_flags_(additional_file_flags), |
| 173 callback_(callback), | 115 callback_(callback), |
| 174 file_handle_(base::kInvalidPlatformFileValue) { | 116 file_handle_(kInvalidPlatformFileValue) { |
| 175 DCHECK_EQ(false, callback.is_null()); | 117 DCHECK_EQ(false, callback.is_null()); |
| 176 } | 118 } |
| 177 | 119 |
| 178 protected: | 120 protected: |
| 179 virtual ~RelayCreateTemporary() { | 121 virtual ~RelayCreateTemporary() { |
| 180 if (file_handle_ != base::kInvalidPlatformFileValue) | 122 if (file_handle_ != kInvalidPlatformFileValue) |
| 181 base::FileUtilProxy::Close(message_loop_proxy_, file_handle_, | 123 FileUtilProxy::Close(message_loop_proxy_, file_handle_, |
| 182 base::FileUtilProxy::StatusCallback()); | 124 FileUtilProxy::StatusCallback()); |
| 183 } | 125 } |
| 184 | 126 |
| 185 virtual void RunWork() { | 127 virtual void RunWork() { |
| 186 // TODO(darin): file_util should have a variant of CreateTemporaryFile | 128 // TODO(darin): file_util should have a variant of CreateTemporaryFile |
| 187 // that returns a FilePath and a PlatformFile. | 129 // that returns a FilePath and a PlatformFile. |
| 188 file_util::CreateTemporaryFile(&file_path_); | 130 file_util::CreateTemporaryFile(&file_path_); |
| 189 | 131 |
| 190 int file_flags = | 132 int file_flags = |
| 191 base::PLATFORM_FILE_WRITE | | 133 PLATFORM_FILE_WRITE | |
| 192 base::PLATFORM_FILE_TEMPORARY | | 134 PLATFORM_FILE_TEMPORARY | |
| 193 base::PLATFORM_FILE_CREATE_ALWAYS | | 135 PLATFORM_FILE_CREATE_ALWAYS | |
| 194 additional_file_flags_; | 136 additional_file_flags_; |
| 195 | 137 |
| 196 base::PlatformFileError error_code = base::PLATFORM_FILE_OK; | 138 PlatformFileError error_code = PLATFORM_FILE_OK; |
| 197 file_handle_ = base::CreatePlatformFile(file_path_, file_flags, | 139 file_handle_ = CreatePlatformFile(file_path_, file_flags, |
| 198 NULL, &error_code); | 140 NULL, &error_code); |
| 199 set_error_code(error_code); | 141 set_error_code(error_code); |
| 200 } | 142 } |
| 201 | 143 |
| 202 virtual void RunCallback() { | 144 virtual void RunCallback() { |
| 203 callback_.Run(error_code(), base::PassPlatformFile(&file_handle_), | 145 callback_.Run(error_code(), PassPlatformFile(&file_handle_), |
| 204 file_path_); | 146 file_path_); |
| 205 } | 147 } |
| 206 | 148 |
| 207 private: | 149 private: |
| 208 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; | 150 scoped_refptr<MessageLoopProxy> message_loop_proxy_; |
| 209 int additional_file_flags_; | 151 int additional_file_flags_; |
| 210 base::FileUtilProxy::CreateTemporaryCallback callback_; | 152 FileUtilProxy::CreateTemporaryCallback callback_; |
| 211 base::PlatformFile file_handle_; | 153 PlatformFile file_handle_; |
| 212 FilePath file_path_; | 154 FilePath file_path_; |
| 213 }; | 155 }; |
| 214 | 156 |
| 215 class RelayWithStatusCallback : public MessageLoopRelay { | 157 class RelayWithStatusCallback : public MessageLoopRelay { |
| 216 public: | 158 public: |
| 217 explicit RelayWithStatusCallback( | 159 explicit RelayWithStatusCallback( |
| 218 const base::FileUtilProxy::StatusCallback& callback) | 160 const FileUtilProxy::StatusCallback& callback) |
| 219 : callback_(callback) { | 161 : callback_(callback) { |
| 220 // It is OK for callback to be NULL. | 162 // It is OK for callback to be NULL. |
| 221 } | 163 } |
| 222 | 164 |
| 223 protected: | 165 protected: |
| 224 virtual void RunCallback() { | 166 virtual void RunCallback() { |
| 225 // The caller may not have been interested in the result. | 167 // The caller may not have been interested in the result. |
| 226 if (!callback_.is_null()) | 168 if (!callback_.is_null()) |
| 227 callback_.Run(error_code()); | 169 callback_.Run(error_code()); |
| 228 } | 170 } |
| 229 | 171 |
| 230 private: | 172 private: |
| 231 base::FileUtilProxy::StatusCallback callback_; | 173 FileUtilProxy::StatusCallback callback_; |
| 232 }; | 174 }; |
| 233 | 175 |
| 234 class RelayClose : public RelayWithStatusCallback { | 176 class RelayClose : public RelayWithStatusCallback { |
| 235 public: | 177 public: |
| 236 RelayClose(base::PlatformFile file_handle, | 178 RelayClose(PlatformFile file_handle, |
| 237 const base::FileUtilProxy::StatusCallback& callback) | 179 const FileUtilProxy::StatusCallback& callback) |
| 238 : RelayWithStatusCallback(callback), | 180 : RelayWithStatusCallback(callback), |
| 239 file_handle_(file_handle) { | 181 file_handle_(file_handle) { |
| 240 } | 182 } |
| 241 | 183 |
| 242 protected: | 184 protected: |
| 243 virtual void RunWork() { | 185 virtual void RunWork() { |
| 244 if (!base::ClosePlatformFile(file_handle_)) | 186 if (!ClosePlatformFile(file_handle_)) |
| 245 set_error_code(base::PLATFORM_FILE_ERROR_FAILED); | 187 set_error_code(PLATFORM_FILE_ERROR_FAILED); |
| 246 } | 188 } |
| 247 | 189 |
| 248 private: | 190 private: |
| 249 base::PlatformFile file_handle_; | 191 PlatformFile file_handle_; |
| 250 }; | |
| 251 | |
| 252 class RelayEnsureFileExists : public MessageLoopRelay { | |
| 253 public: | |
| 254 RelayEnsureFileExists( | |
| 255 scoped_refptr<base::MessageLoopProxy> message_loop_proxy, | |
| 256 const FilePath& file_path, | |
| 257 const base::FileUtilProxy::EnsureFileExistsCallback& callback) | |
| 258 : message_loop_proxy_(message_loop_proxy), | |
| 259 file_path_(file_path), | |
| 260 callback_(callback), | |
| 261 created_(false) { | |
| 262 DCHECK_EQ(false, callback.is_null()); | |
| 263 } | |
| 264 | |
| 265 protected: | |
| 266 virtual void RunWork() { | |
| 267 if (!file_util::DirectoryExists(file_path_.DirName())) { | |
| 268 // If its parent does not exist, should return NOT_FOUND error. | |
| 269 set_error_code(base::PLATFORM_FILE_ERROR_NOT_FOUND); | |
| 270 return; | |
| 271 } | |
| 272 base::PlatformFileError error_code = base::PLATFORM_FILE_OK; | |
| 273 // Tries to create the |file_path_| exclusively. This should fail | |
| 274 // with PLATFORM_FILE_ERROR_EXISTS if the path already exists. | |
| 275 base::PlatformFile handle = base::CreatePlatformFile( | |
| 276 file_path_, | |
| 277 base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_READ, | |
| 278 &created_, &error_code); | |
| 279 if (error_code == base::PLATFORM_FILE_ERROR_EXISTS) { | |
| 280 // Make sure created_ is false. | |
| 281 created_ = false; | |
| 282 error_code = base::PLATFORM_FILE_OK; | |
| 283 } | |
| 284 if (handle != base::kInvalidPlatformFileValue) | |
| 285 base::ClosePlatformFile(handle); | |
| 286 set_error_code(error_code); | |
| 287 } | |
| 288 | |
| 289 virtual void RunCallback() { | |
| 290 callback_.Run(error_code(), created_); | |
| 291 } | |
| 292 | |
| 293 private: | |
| 294 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; | |
| 295 FilePath file_path_; | |
| 296 base::FileUtilProxy::EnsureFileExistsCallback callback_; | |
| 297 bool created_; | |
| 298 }; | 192 }; |
| 299 | 193 |
| 300 class RelayDelete : public RelayWithStatusCallback { | 194 class RelayDelete : public RelayWithStatusCallback { |
| 301 public: | 195 public: |
| 302 RelayDelete(const FilePath& file_path, | 196 RelayDelete(const FilePath& file_path, |
| 303 bool recursive, | 197 bool recursive, |
| 304 const base::FileUtilProxy::StatusCallback& callback) | 198 const FileUtilProxy::StatusCallback& callback) |
| 305 : RelayWithStatusCallback(callback), | 199 : RelayWithStatusCallback(callback), |
| 306 file_path_(file_path), | 200 file_path_(file_path), |
| 307 recursive_(recursive) { | 201 recursive_(recursive) { |
| 308 } | 202 } |
| 309 | 203 |
| 310 protected: | 204 protected: |
| 311 virtual void RunWork() { | 205 virtual void RunWork() { |
| 312 if (!file_util::PathExists(file_path_)) { | 206 if (!file_util::PathExists(file_path_)) { |
| 313 set_error_code(base::PLATFORM_FILE_ERROR_NOT_FOUND); | 207 set_error_code(PLATFORM_FILE_ERROR_NOT_FOUND); |
| 314 return; | 208 return; |
| 315 } | 209 } |
| 316 if (!file_util::Delete(file_path_, recursive_)) { | 210 if (!file_util::Delete(file_path_, recursive_)) { |
| 317 if (!recursive_ && !file_util::IsDirectoryEmpty(file_path_)) { | 211 if (!recursive_ && !file_util::IsDirectoryEmpty(file_path_)) { |
| 318 set_error_code(base::PLATFORM_FILE_ERROR_NOT_EMPTY); | 212 set_error_code(PLATFORM_FILE_ERROR_NOT_EMPTY); |
| 319 return; | 213 return; |
| 320 } | 214 } |
| 321 set_error_code(base::PLATFORM_FILE_ERROR_FAILED); | 215 set_error_code(PLATFORM_FILE_ERROR_FAILED); |
| 322 } | 216 } |
| 323 } | 217 } |
| 324 | 218 |
| 325 private: | 219 private: |
| 326 FilePath file_path_; | 220 FilePath file_path_; |
| 327 bool recursive_; | 221 bool recursive_; |
| 328 }; | 222 }; |
| 329 | 223 |
| 330 class RelayCopy : public RelayWithStatusCallback { | |
| 331 public: | |
| 332 RelayCopy(const FilePath& src_file_path, | |
| 333 const FilePath& dest_file_path, | |
| 334 const base::FileUtilProxy::StatusCallback& callback) | |
| 335 : RelayWithStatusCallback(callback), | |
| 336 src_file_path_(src_file_path), | |
| 337 dest_file_path_(dest_file_path) { | |
| 338 } | |
| 339 | |
| 340 protected: | |
| 341 virtual void RunWork() { | |
| 342 set_error_code(PerformCommonCheckAndPreparationForMoveAndCopy( | |
| 343 src_file_path_, dest_file_path_)); | |
| 344 if (error_code() != base::PLATFORM_FILE_OK) | |
| 345 return; | |
| 346 if (!file_util::CopyDirectory(src_file_path_, dest_file_path_, | |
| 347 true /* recursive */)) | |
| 348 set_error_code(base::PLATFORM_FILE_ERROR_FAILED); | |
| 349 } | |
| 350 | |
| 351 private: | |
| 352 FilePath src_file_path_; | |
| 353 FilePath dest_file_path_; | |
| 354 }; | |
| 355 | |
| 356 class RelayMove : public RelayWithStatusCallback { | |
| 357 public: | |
| 358 RelayMove(const FilePath& src_file_path, | |
| 359 const FilePath& dest_file_path, | |
| 360 const base::FileUtilProxy::StatusCallback& callback) | |
| 361 : RelayWithStatusCallback(callback), | |
| 362 src_file_path_(src_file_path), | |
| 363 dest_file_path_(dest_file_path) { | |
| 364 } | |
| 365 | |
| 366 protected: | |
| 367 virtual void RunWork() { | |
| 368 set_error_code(PerformCommonCheckAndPreparationForMoveAndCopy( | |
| 369 src_file_path_, dest_file_path_)); | |
| 370 if (error_code() != base::PLATFORM_FILE_OK) | |
| 371 return; | |
| 372 if (!file_util::Move(src_file_path_, dest_file_path_)) | |
| 373 set_error_code(base::PLATFORM_FILE_ERROR_FAILED); | |
| 374 } | |
| 375 | |
| 376 private: | |
| 377 FilePath src_file_path_; | |
| 378 FilePath dest_file_path_; | |
| 379 }; | |
| 380 | |
| 381 class RelayCreateDirectory : public RelayWithStatusCallback { | |
| 382 public: | |
| 383 RelayCreateDirectory( | |
| 384 const FilePath& file_path, | |
| 385 bool exclusive, | |
| 386 bool recursive, | |
| 387 const base::FileUtilProxy::StatusCallback& callback) | |
| 388 : RelayWithStatusCallback(callback), | |
| 389 file_path_(file_path), | |
| 390 exclusive_(exclusive), | |
| 391 recursive_(recursive) { | |
| 392 } | |
| 393 | |
| 394 protected: | |
| 395 virtual void RunWork() { | |
| 396 bool path_exists = file_util::PathExists(file_path_); | |
| 397 // If parent dir of file doesn't exist. | |
| 398 if (!recursive_ && !file_util::PathExists(file_path_.DirName())) { | |
| 399 set_error_code(base::PLATFORM_FILE_ERROR_NOT_FOUND); | |
| 400 return; | |
| 401 } | |
| 402 if (exclusive_ && path_exists) { | |
| 403 set_error_code(base::PLATFORM_FILE_ERROR_EXISTS); | |
| 404 return; | |
| 405 } | |
| 406 // If file exists at the path. | |
| 407 if (path_exists && !file_util::DirectoryExists(file_path_)) { | |
| 408 set_error_code(base::PLATFORM_FILE_ERROR_EXISTS); | |
| 409 return; | |
| 410 } | |
| 411 if (!file_util::CreateDirectory(file_path_)) | |
| 412 set_error_code(base::PLATFORM_FILE_ERROR_FAILED); | |
| 413 } | |
| 414 | |
| 415 private: | |
| 416 FilePath file_path_; | |
| 417 bool exclusive_; | |
| 418 bool recursive_; | |
| 419 }; | |
| 420 | |
| 421 class RelayReadDirectory : public MessageLoopRelay { | |
| 422 public: | |
| 423 RelayReadDirectory( | |
| 424 const FilePath& file_path, | |
| 425 const base::FileUtilProxy::ReadDirectoryCallback& callback) | |
| 426 : callback_(callback), | |
| 427 file_path_(file_path) { | |
| 428 DCHECK_EQ(false, callback.is_null()); | |
| 429 } | |
| 430 | |
| 431 protected: | |
| 432 virtual void RunWork() { | |
| 433 // TODO(kkanetkar): Implement directory read in multiple chunks. | |
| 434 if (!file_util::DirectoryExists(file_path_)) { | |
| 435 set_error_code(base::PLATFORM_FILE_ERROR_NOT_FOUND); | |
| 436 return; | |
| 437 } | |
| 438 | |
| 439 file_util::FileEnumerator file_enum( | |
| 440 file_path_, false, static_cast<file_util::FileEnumerator::FileType>( | |
| 441 file_util::FileEnumerator::FILES | | |
| 442 file_util::FileEnumerator::DIRECTORIES)); | |
| 443 FilePath current; | |
| 444 while (!(current = file_enum.Next()).empty()) { | |
| 445 base::FileUtilProxy::Entry entry; | |
| 446 file_util::FileEnumerator::FindInfo info; | |
| 447 file_enum.GetFindInfo(&info); | |
| 448 entry.is_directory = file_enum.IsDirectory(info); | |
| 449 // This will just give the entry's name instead of entire path | |
| 450 // if we use current.value(). | |
| 451 entry.name = file_util::FileEnumerator::GetFilename(info).value(); | |
| 452 entry.size = file_util::FileEnumerator::GetFilesize(info); | |
| 453 entry.last_modified_time = | |
| 454 file_util::FileEnumerator::GetLastModifiedTime(info); | |
| 455 entries_.push_back(entry); | |
| 456 } | |
| 457 } | |
| 458 | |
| 459 virtual void RunCallback() { | |
| 460 callback_.Run(error_code(), entries_); | |
| 461 } | |
| 462 | |
| 463 private: | |
| 464 base::FileUtilProxy::ReadDirectoryCallback callback_; | |
| 465 FilePath file_path_; | |
| 466 std::vector<base::FileUtilProxy::Entry> entries_; | |
| 467 }; | |
| 468 | |
| 469 class RelayGetFileInfo : public MessageLoopRelay { | 224 class RelayGetFileInfo : public MessageLoopRelay { |
| 470 public: | 225 public: |
| 471 RelayGetFileInfo(const FilePath& file_path, | 226 RelayGetFileInfo(const FilePath& file_path, |
| 472 const base::FileUtilProxy::GetFileInfoCallback& callback) | 227 const FileUtilProxy::GetFileInfoCallback& callback) |
| 473 : callback_(callback), | 228 : callback_(callback), |
| 474 file_path_(file_path) { | 229 file_path_(file_path) { |
| 475 DCHECK_EQ(false, callback.is_null()); | 230 DCHECK_EQ(false, callback.is_null()); |
| 476 } | 231 } |
| 477 | 232 |
| 478 protected: | 233 protected: |
| 479 virtual void RunWork() { | 234 virtual void RunWork() { |
| 480 if (!file_util::PathExists(file_path_)) { | 235 if (!file_util::PathExists(file_path_)) { |
| 481 set_error_code(base::PLATFORM_FILE_ERROR_NOT_FOUND); | 236 set_error_code(PLATFORM_FILE_ERROR_NOT_FOUND); |
| 482 return; | 237 return; |
| 483 } | 238 } |
| 484 if (!file_util::GetFileInfo(file_path_, &file_info_)) | 239 if (!file_util::GetFileInfo(file_path_, &file_info_)) |
| 485 set_error_code(base::PLATFORM_FILE_ERROR_FAILED); | 240 set_error_code(PLATFORM_FILE_ERROR_FAILED); |
| 486 } | 241 } |
| 487 | 242 |
| 488 virtual void RunCallback() { | 243 virtual void RunCallback() { |
| 489 callback_.Run(error_code(), file_info_); | 244 callback_.Run(error_code(), file_info_); |
| 490 } | 245 } |
| 491 | 246 |
| 492 private: | 247 private: |
| 493 base::FileUtilProxy::GetFileInfoCallback callback_; | 248 FileUtilProxy::GetFileInfoCallback callback_; |
| 494 FilePath file_path_; | 249 FilePath file_path_; |
| 495 base::PlatformFileInfo file_info_; | 250 PlatformFileInfo file_info_; |
| 496 }; | 251 }; |
| 497 | 252 |
| 498 class RelayGetFileInfoFromPlatformFile : public MessageLoopRelay { | 253 class RelayGetFileInfoFromPlatformFile : public MessageLoopRelay { |
| 499 public: | 254 public: |
| 500 RelayGetFileInfoFromPlatformFile( | 255 RelayGetFileInfoFromPlatformFile( |
| 501 base::PlatformFile file, | 256 PlatformFile file, |
| 502 const base::FileUtilProxy::GetFileInfoCallback& callback) | 257 const FileUtilProxy::GetFileInfoCallback& callback) |
| 503 : callback_(callback), | 258 : callback_(callback), |
| 504 file_(file) { | 259 file_(file) { |
| 505 DCHECK_EQ(false, callback.is_null()); | 260 DCHECK_EQ(false, callback.is_null()); |
| 506 } | 261 } |
| 507 | 262 |
| 508 protected: | 263 protected: |
| 509 virtual void RunWork() { | 264 virtual void RunWork() { |
| 510 if (!base::GetPlatformFileInfo(file_, &file_info_)) | 265 if (!GetPlatformFileInfo(file_, &file_info_)) |
| 511 set_error_code(base::PLATFORM_FILE_ERROR_FAILED); | 266 set_error_code(PLATFORM_FILE_ERROR_FAILED); |
| 512 } | 267 } |
| 513 | 268 |
| 514 virtual void RunCallback() { | 269 virtual void RunCallback() { |
| 515 callback_.Run(error_code(), file_info_); | 270 callback_.Run(error_code(), file_info_); |
| 516 } | 271 } |
| 517 | 272 |
| 518 private: | 273 private: |
| 519 base::FileUtilProxy::GetFileInfoCallback callback_; | 274 FileUtilProxy::GetFileInfoCallback callback_; |
| 520 base::PlatformFile file_; | 275 PlatformFile file_; |
| 521 base::PlatformFileInfo file_info_; | 276 PlatformFileInfo file_info_; |
| 522 }; | 277 }; |
| 523 | 278 |
| 524 class RelayRead : public MessageLoopRelay { | 279 class RelayRead : public MessageLoopRelay { |
| 525 public: | 280 public: |
| 526 RelayRead(base::PlatformFile file, | 281 RelayRead(PlatformFile file, |
| 527 int64 offset, | 282 int64 offset, |
| 528 int bytes_to_read, | 283 int bytes_to_read, |
| 529 const base::FileUtilProxy::ReadCallback& callback) | 284 const FileUtilProxy::ReadCallback& callback) |
| 530 : file_(file), | 285 : file_(file), |
| 531 offset_(offset), | 286 offset_(offset), |
| 532 buffer_(new char[bytes_to_read]), | 287 buffer_(new char[bytes_to_read]), |
| 533 bytes_to_read_(bytes_to_read), | 288 bytes_to_read_(bytes_to_read), |
| 534 callback_(callback), | 289 callback_(callback), |
| 535 bytes_read_(0) { | 290 bytes_read_(0) { |
| 536 } | 291 } |
| 537 | 292 |
| 538 protected: | 293 protected: |
| 539 virtual void RunWork() { | 294 virtual void RunWork() { |
| 540 bytes_read_ = base::ReadPlatformFile(file_, offset_, buffer_.get(), | 295 bytes_read_ = ReadPlatformFile(file_, offset_, buffer_.get(), |
| 541 bytes_to_read_); | 296 bytes_to_read_); |
| 542 if (bytes_read_ < 0) | 297 if (bytes_read_ < 0) |
| 543 set_error_code(base::PLATFORM_FILE_ERROR_FAILED); | 298 set_error_code(PLATFORM_FILE_ERROR_FAILED); |
| 544 } | 299 } |
| 545 | 300 |
| 546 virtual void RunCallback() { | 301 virtual void RunCallback() { |
| 547 if (!callback_.is_null()) | 302 if (!callback_.is_null()) |
| 548 callback_.Run(error_code(), buffer_.get(), bytes_read_); | 303 callback_.Run(error_code(), buffer_.get(), bytes_read_); |
| 549 } | 304 } |
| 550 | 305 |
| 551 private: | 306 private: |
| 552 base::PlatformFile file_; | 307 PlatformFile file_; |
| 553 int64 offset_; | 308 int64 offset_; |
| 554 scoped_array<char> buffer_; | 309 scoped_array<char> buffer_; |
| 555 int bytes_to_read_; | 310 int bytes_to_read_; |
| 556 base::FileUtilProxy::ReadCallback callback_; | 311 FileUtilProxy::ReadCallback callback_; |
| 557 int bytes_read_; | 312 int bytes_read_; |
| 558 }; | 313 }; |
| 559 | 314 |
| 560 class RelayWrite : public MessageLoopRelay { | 315 class RelayWrite : public MessageLoopRelay { |
| 561 public: | 316 public: |
| 562 RelayWrite(base::PlatformFile file, | 317 RelayWrite(PlatformFile file, |
| 563 int64 offset, | 318 int64 offset, |
| 564 const char* buffer, | 319 const char* buffer, |
| 565 int bytes_to_write, | 320 int bytes_to_write, |
| 566 const base::FileUtilProxy::WriteCallback& callback) | 321 const FileUtilProxy::WriteCallback& callback) |
| 567 : file_(file), | 322 : file_(file), |
| 568 offset_(offset), | 323 offset_(offset), |
| 569 buffer_(new char[bytes_to_write]), | 324 buffer_(new char[bytes_to_write]), |
| 570 bytes_to_write_(bytes_to_write), | 325 bytes_to_write_(bytes_to_write), |
| 571 callback_(callback), | 326 callback_(callback), |
| 572 bytes_written_(0) { | 327 bytes_written_(0) { |
| 573 memcpy(buffer_.get(), buffer, bytes_to_write); | 328 memcpy(buffer_.get(), buffer, bytes_to_write); |
| 574 } | 329 } |
| 575 | 330 |
| 576 protected: | 331 protected: |
| 577 virtual void RunWork() { | 332 virtual void RunWork() { |
| 578 bytes_written_ = base::WritePlatformFile(file_, offset_, buffer_.get(), | 333 bytes_written_ = WritePlatformFile(file_, offset_, buffer_.get(), |
| 579 bytes_to_write_); | 334 bytes_to_write_); |
| 580 if (bytes_written_ < 0) | 335 if (bytes_written_ < 0) |
| 581 set_error_code(base::PLATFORM_FILE_ERROR_FAILED); | 336 set_error_code(PLATFORM_FILE_ERROR_FAILED); |
| 582 } | 337 } |
| 583 | 338 |
| 584 virtual void RunCallback() { | 339 virtual void RunCallback() { |
| 585 if (!callback_.is_null()) | 340 if (!callback_.is_null()) |
| 586 callback_.Run(error_code(), bytes_written_); | 341 callback_.Run(error_code(), bytes_written_); |
| 587 } | 342 } |
| 588 | 343 |
| 589 private: | 344 private: |
| 590 base::PlatformFile file_; | 345 PlatformFile file_; |
| 591 int64 offset_; | 346 int64 offset_; |
| 592 scoped_array<char> buffer_; | 347 scoped_array<char> buffer_; |
| 593 int bytes_to_write_; | 348 int bytes_to_write_; |
| 594 base::FileUtilProxy::WriteCallback callback_; | 349 FileUtilProxy::WriteCallback callback_; |
| 595 int bytes_written_; | 350 int bytes_written_; |
| 596 }; | 351 }; |
| 597 | 352 |
| 598 class RelayTouch : public RelayWithStatusCallback { | 353 class RelayTouch : public RelayWithStatusCallback { |
| 599 public: | 354 public: |
| 600 RelayTouch(base::PlatformFile file, | 355 RelayTouch(PlatformFile file, |
| 601 const base::Time& last_access_time, | 356 const Time& last_access_time, |
| 602 const base::Time& last_modified_time, | 357 const Time& last_modified_time, |
| 603 const base::FileUtilProxy::StatusCallback& callback) | 358 const FileUtilProxy::StatusCallback& callback) |
| 604 : RelayWithStatusCallback(callback), | 359 : RelayWithStatusCallback(callback), |
| 605 file_(file), | 360 file_(file), |
| 606 last_access_time_(last_access_time), | 361 last_access_time_(last_access_time), |
| 607 last_modified_time_(last_modified_time) { | 362 last_modified_time_(last_modified_time) { |
| 608 } | 363 } |
| 609 | 364 |
| 610 protected: | 365 protected: |
| 611 virtual void RunWork() { | 366 virtual void RunWork() { |
| 612 if (!base::TouchPlatformFile(file_, last_access_time_, last_modified_time_)) | 367 if (!TouchPlatformFile(file_, last_access_time_, last_modified_time_)) |
| 613 set_error_code(base::PLATFORM_FILE_ERROR_FAILED); | 368 set_error_code(PLATFORM_FILE_ERROR_FAILED); |
| 614 } | 369 } |
| 615 | 370 |
| 616 private: | 371 private: |
| 617 base::PlatformFile file_; | 372 PlatformFile file_; |
| 618 base::Time last_access_time_; | 373 Time last_access_time_; |
| 619 base::Time last_modified_time_; | 374 Time last_modified_time_; |
| 620 }; | 375 }; |
| 621 | 376 |
| 622 class RelayTouchFilePath : public RelayWithStatusCallback { | 377 class RelayTouchFilePath : public RelayWithStatusCallback { |
| 623 public: | 378 public: |
| 624 RelayTouchFilePath(const FilePath& file_path, | 379 RelayTouchFilePath(const FilePath& file_path, |
| 625 const base::Time& last_access_time, | 380 const Time& last_access_time, |
| 626 const base::Time& last_modified_time, | 381 const Time& last_modified_time, |
| 627 const base::FileUtilProxy::StatusCallback& callback) | 382 const FileUtilProxy::StatusCallback& callback) |
| 628 : RelayWithStatusCallback(callback), | 383 : RelayWithStatusCallback(callback), |
| 629 file_path_(file_path), | 384 file_path_(file_path), |
| 630 last_access_time_(last_access_time), | 385 last_access_time_(last_access_time), |
| 631 last_modified_time_(last_modified_time) { | 386 last_modified_time_(last_modified_time) { |
| 632 } | 387 } |
| 633 | 388 |
| 634 protected: | 389 protected: |
| 635 virtual void RunWork() { | 390 virtual void RunWork() { |
| 636 if (!file_util::TouchFile( | 391 if (!file_util::TouchFile( |
| 637 file_path_, last_access_time_, last_modified_time_)) | 392 file_path_, last_access_time_, last_modified_time_)) |
| 638 set_error_code(base::PLATFORM_FILE_ERROR_FAILED); | 393 set_error_code(PLATFORM_FILE_ERROR_FAILED); |
| 639 } | 394 } |
| 640 | 395 |
| 641 private: | 396 private: |
| 642 FilePath file_path_; | 397 FilePath file_path_; |
| 643 base::Time last_access_time_; | 398 Time last_access_time_; |
| 644 base::Time last_modified_time_; | 399 Time last_modified_time_; |
| 645 }; | 400 }; |
| 646 | 401 |
| 647 class RelayTruncatePlatformFile : public RelayWithStatusCallback { | 402 class RelayTruncatePlatformFile : public RelayWithStatusCallback { |
| 648 public: | 403 public: |
| 649 RelayTruncatePlatformFile(base::PlatformFile file, | 404 RelayTruncatePlatformFile(PlatformFile file, |
| 650 int64 length, | 405 int64 length, |
| 651 const base::FileUtilProxy::StatusCallback& callback) | 406 const FileUtilProxy::StatusCallback& callback) |
| 652 : RelayWithStatusCallback(callback), | 407 : RelayWithStatusCallback(callback), |
| 653 file_(file), | 408 file_(file), |
| 654 length_(length) { | 409 length_(length) { |
| 655 } | 410 } |
| 656 | 411 |
| 657 protected: | 412 protected: |
| 658 virtual void RunWork() { | 413 virtual void RunWork() { |
| 659 if (!base::TruncatePlatformFile(file_, length_)) | 414 if (!TruncatePlatformFile(file_, length_)) |
| 660 set_error_code(base::PLATFORM_FILE_ERROR_FAILED); | 415 set_error_code(PLATFORM_FILE_ERROR_FAILED); |
| 661 } | 416 } |
| 662 | 417 |
| 663 private: | 418 private: |
| 664 base::PlatformFile file_; | 419 PlatformFile file_; |
| 665 int64 length_; | 420 int64 length_; |
| 666 }; | 421 }; |
| 667 | 422 |
| 668 class RelayTruncate : public RelayWithStatusCallback { | 423 class RelayTruncate : public RelayWithStatusCallback { |
| 669 public: | 424 public: |
| 670 RelayTruncate(const FilePath& path, | 425 RelayTruncate(const FilePath& path, |
| 671 int64 length, | 426 int64 length, |
| 672 const base::FileUtilProxy::StatusCallback& callback) | 427 const FileUtilProxy::StatusCallback& callback) |
| 673 : RelayWithStatusCallback(callback), | 428 : RelayWithStatusCallback(callback), |
| 674 path_(path), | 429 path_(path), |
| 675 length_(length) { | 430 length_(length) { |
| 676 } | 431 } |
| 677 | 432 |
| 678 protected: | 433 protected: |
| 679 virtual void RunWork() { | 434 virtual void RunWork() { |
| 680 base::PlatformFileError error_code(base::PLATFORM_FILE_ERROR_FAILED); | 435 PlatformFileError error_code(PLATFORM_FILE_ERROR_FAILED); |
| 681 base::PlatformFile file = | 436 PlatformFile file = |
| 682 base::CreatePlatformFile( | 437 CreatePlatformFile( |
| 683 path_, | 438 path_, |
| 684 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE, | 439 PLATFORM_FILE_OPEN | PLATFORM_FILE_WRITE, |
| 685 NULL, | 440 NULL, |
| 686 &error_code); | 441 &error_code); |
| 687 if (error_code != base::PLATFORM_FILE_OK) { | 442 if (error_code != PLATFORM_FILE_OK) { |
| 688 set_error_code(error_code); | 443 set_error_code(error_code); |
| 689 return; | 444 return; |
| 690 } | 445 } |
| 691 if (!base::TruncatePlatformFile(file, length_)) | 446 if (!TruncatePlatformFile(file, length_)) |
| 692 set_error_code(base::PLATFORM_FILE_ERROR_FAILED); | 447 set_error_code(PLATFORM_FILE_ERROR_FAILED); |
| 693 base::ClosePlatformFile(file); | 448 ClosePlatformFile(file); |
| 694 } | 449 } |
| 695 | 450 |
| 696 private: | 451 private: |
| 697 FilePath path_; | 452 FilePath path_; |
| 698 int64 length_; | 453 int64 length_; |
| 699 }; | 454 }; |
| 700 | 455 |
| 701 class RelayFlush : public RelayWithStatusCallback { | 456 class RelayFlush : public RelayWithStatusCallback { |
| 702 public: | 457 public: |
| 703 RelayFlush(base::PlatformFile file, | 458 RelayFlush(PlatformFile file, |
| 704 const base::FileUtilProxy::StatusCallback& callback) | 459 const FileUtilProxy::StatusCallback& callback) |
| 705 : RelayWithStatusCallback(callback), | 460 : RelayWithStatusCallback(callback), |
| 706 file_(file) { | 461 file_(file) { |
| 707 } | 462 } |
| 708 | 463 |
| 709 protected: | 464 protected: |
| 710 virtual void RunWork() { | 465 virtual void RunWork() { |
| 711 if (!base::FlushPlatformFile(file_)) | 466 if (!FlushPlatformFile(file_)) |
| 712 set_error_code(base::PLATFORM_FILE_ERROR_FAILED); | 467 set_error_code(PLATFORM_FILE_ERROR_FAILED); |
| 713 } | 468 } |
| 714 | 469 |
| 715 private: | 470 private: |
| 716 base::PlatformFile file_; | 471 PlatformFile file_; |
| 717 }; | 472 }; |
| 718 | 473 |
| 719 bool Start(const tracked_objects::Location& from_here, | 474 bool Start(const tracked_objects::Location& from_here, |
| 720 scoped_refptr<base::MessageLoopProxy> message_loop_proxy, | 475 scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| 721 scoped_refptr<MessageLoopRelay> relay) { | 476 scoped_refptr<MessageLoopRelay> relay) { |
| 722 return relay->Start(message_loop_proxy, from_here); | 477 return relay->Start(message_loop_proxy, from_here); |
| 723 } | 478 } |
| 724 | 479 |
| 725 } // namespace | 480 } // namespace |
| 726 | 481 |
| 727 namespace base { | |
| 728 | |
| 729 // static | 482 // static |
| 730 bool FileUtilProxy::CreateOrOpen( | 483 bool FileUtilProxy::CreateOrOpen( |
| 731 scoped_refptr<MessageLoopProxy> message_loop_proxy, | 484 scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| 732 const FilePath& file_path, int file_flags, | 485 const FilePath& file_path, int file_flags, |
| 733 const CreateOrOpenCallback& callback) { | 486 const CreateOrOpenCallback& callback) { |
| 734 return Start(FROM_HERE, message_loop_proxy, new RelayCreateOrOpen( | 487 return Start(FROM_HERE, message_loop_proxy, new RelayCreateOrOpen( |
| 735 message_loop_proxy, file_path, file_flags, callback)); | 488 message_loop_proxy, file_path, file_flags, callback)); |
| 736 } | 489 } |
| 737 | 490 |
| 738 // static | 491 // static |
| 739 bool FileUtilProxy::CreateTemporary( | 492 bool FileUtilProxy::CreateTemporary( |
| 740 scoped_refptr<MessageLoopProxy> message_loop_proxy, | 493 scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| 741 int additional_file_flags, | 494 int additional_file_flags, |
| 742 const CreateTemporaryCallback& callback) { | 495 const CreateTemporaryCallback& callback) { |
| 743 return Start(FROM_HERE, message_loop_proxy, | 496 return Start(FROM_HERE, message_loop_proxy, |
| 744 new RelayCreateTemporary(message_loop_proxy, | 497 new RelayCreateTemporary(message_loop_proxy, |
| 745 additional_file_flags, | 498 additional_file_flags, |
| 746 callback)); | 499 callback)); |
| 747 } | 500 } |
| 748 | 501 |
| 749 // static | 502 // static |
| 750 bool FileUtilProxy::Close(scoped_refptr<MessageLoopProxy> message_loop_proxy, | 503 bool FileUtilProxy::Close(scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| 751 base::PlatformFile file_handle, | 504 PlatformFile file_handle, |
| 752 const StatusCallback& callback) { | 505 const StatusCallback& callback) { |
| 753 return Start(FROM_HERE, message_loop_proxy, | 506 return Start(FROM_HERE, message_loop_proxy, |
| 754 new RelayClose(file_handle, callback)); | 507 new RelayClose(file_handle, callback)); |
| 755 } | 508 } |
| 756 | 509 |
| 757 // static | |
| 758 bool FileUtilProxy::EnsureFileExists( | |
| 759 scoped_refptr<MessageLoopProxy> message_loop_proxy, | |
| 760 const FilePath& file_path, | |
| 761 const EnsureFileExistsCallback& callback) { | |
| 762 return Start(FROM_HERE, message_loop_proxy, new RelayEnsureFileExists( | |
| 763 message_loop_proxy, file_path, callback)); | |
| 764 } | |
| 765 | |
| 766 // Retrieves the information about a file. It is invalid to pass NULL for the | 510 // Retrieves the information about a file. It is invalid to pass NULL for the |
| 767 // callback. | 511 // callback. |
| 768 bool FileUtilProxy::GetFileInfo( | 512 bool FileUtilProxy::GetFileInfo( |
| 769 scoped_refptr<MessageLoopProxy> message_loop_proxy, | 513 scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| 770 const FilePath& file_path, | 514 const FilePath& file_path, |
| 771 const GetFileInfoCallback& callback) { | 515 const GetFileInfoCallback& callback) { |
| 772 return Start(FROM_HERE, message_loop_proxy, new RelayGetFileInfo( | 516 return Start(FROM_HERE, message_loop_proxy, new RelayGetFileInfo( |
| 773 file_path, callback)); | 517 file_path, callback)); |
| 774 } | 518 } |
| 775 | 519 |
| 776 // static | 520 // static |
| 777 bool FileUtilProxy::GetFileInfoFromPlatformFile( | 521 bool FileUtilProxy::GetFileInfoFromPlatformFile( |
| 778 scoped_refptr<MessageLoopProxy> message_loop_proxy, | 522 scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| 779 PlatformFile file, | 523 PlatformFile file, |
| 780 const GetFileInfoCallback& callback) { | 524 const GetFileInfoCallback& callback) { |
| 781 return Start(FROM_HERE, message_loop_proxy, | 525 return Start(FROM_HERE, message_loop_proxy, |
| 782 new RelayGetFileInfoFromPlatformFile(file, callback)); | 526 new RelayGetFileInfoFromPlatformFile(file, callback)); |
| 783 } | 527 } |
| 784 | 528 |
| 785 // static | 529 // static |
| 786 bool FileUtilProxy::ReadDirectory( | |
| 787 scoped_refptr<MessageLoopProxy> message_loop_proxy, | |
| 788 const FilePath& file_path, | |
| 789 const ReadDirectoryCallback& callback) { | |
| 790 return Start(FROM_HERE, message_loop_proxy, new RelayReadDirectory( | |
| 791 file_path, callback)); | |
| 792 } | |
| 793 | |
| 794 // static | |
| 795 bool FileUtilProxy::CreateDirectory( | |
| 796 scoped_refptr<MessageLoopProxy> message_loop_proxy, | |
| 797 const FilePath& file_path, | |
| 798 bool exclusive, | |
| 799 bool recursive, | |
| 800 const StatusCallback& callback) { | |
| 801 return Start(FROM_HERE, message_loop_proxy, new RelayCreateDirectory( | |
| 802 file_path, exclusive, recursive, callback)); | |
| 803 } | |
| 804 | |
| 805 // static | |
| 806 bool FileUtilProxy::Copy(scoped_refptr<MessageLoopProxy> message_loop_proxy, | |
| 807 const FilePath& src_file_path, | |
| 808 const FilePath& dest_file_path, | |
| 809 const StatusCallback& callback) { | |
| 810 return Start(FROM_HERE, message_loop_proxy, | |
| 811 new RelayCopy(src_file_path, dest_file_path, callback)); | |
| 812 } | |
| 813 | |
| 814 // static | |
| 815 bool FileUtilProxy::Move(scoped_refptr<MessageLoopProxy> message_loop_proxy, | |
| 816 const FilePath& src_file_path, | |
| 817 const FilePath& dest_file_path, | |
| 818 const StatusCallback& callback) { | |
| 819 return Start(FROM_HERE, message_loop_proxy, | |
| 820 new RelayMove(src_file_path, dest_file_path, callback)); | |
| 821 } | |
| 822 | |
| 823 // static | |
| 824 bool FileUtilProxy::Delete(scoped_refptr<MessageLoopProxy> message_loop_proxy, | 530 bool FileUtilProxy::Delete(scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| 825 const FilePath& file_path, | 531 const FilePath& file_path, |
| 826 bool recursive, | 532 bool recursive, |
| 827 const StatusCallback& callback) { | 533 const StatusCallback& callback) { |
| 828 return Start(FROM_HERE, message_loop_proxy, | 534 return Start(FROM_HERE, message_loop_proxy, |
| 829 new RelayDelete(file_path, recursive, callback)); | 535 new RelayDelete(file_path, recursive, callback)); |
| 830 } | 536 } |
| 831 | 537 |
| 832 // static | 538 // static |
| 833 bool FileUtilProxy::RecursiveDelete( | 539 bool FileUtilProxy::RecursiveDelete( |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 864 return false; | 570 return false; |
| 865 | 571 |
| 866 return Start(FROM_HERE, message_loop_proxy, | 572 return Start(FROM_HERE, message_loop_proxy, |
| 867 new RelayWrite(file, offset, buffer, bytes_to_write, callback)); | 573 new RelayWrite(file, offset, buffer, bytes_to_write, callback)); |
| 868 } | 574 } |
| 869 | 575 |
| 870 // static | 576 // static |
| 871 bool FileUtilProxy::Touch( | 577 bool FileUtilProxy::Touch( |
| 872 scoped_refptr<MessageLoopProxy> message_loop_proxy, | 578 scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| 873 PlatformFile file, | 579 PlatformFile file, |
| 874 const base::Time& last_access_time, | 580 const Time& last_access_time, |
| 875 const base::Time& last_modified_time, | 581 const Time& last_modified_time, |
| 876 const StatusCallback& callback) { | 582 const StatusCallback& callback) { |
| 877 return Start(FROM_HERE, message_loop_proxy, | 583 return Start(FROM_HERE, message_loop_proxy, |
| 878 new RelayTouch(file, last_access_time, last_modified_time, | 584 new RelayTouch(file, last_access_time, last_modified_time, |
| 879 callback)); | 585 callback)); |
| 880 } | 586 } |
| 881 | 587 |
| 882 // static | 588 // static |
| 883 bool FileUtilProxy::Touch( | 589 bool FileUtilProxy::Touch( |
| 884 scoped_refptr<MessageLoopProxy> message_loop_proxy, | 590 scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| 885 const FilePath& file_path, | 591 const FilePath& file_path, |
| 886 const base::Time& last_access_time, | 592 const Time& last_access_time, |
| 887 const base::Time& last_modified_time, | 593 const Time& last_modified_time, |
| 888 const StatusCallback& callback) { | 594 const StatusCallback& callback) { |
| 889 return Start(FROM_HERE, message_loop_proxy, | 595 return Start(FROM_HERE, message_loop_proxy, |
| 890 new RelayTouchFilePath(file_path, last_access_time, | 596 new RelayTouchFilePath(file_path, last_access_time, |
| 891 last_modified_time, callback)); | 597 last_modified_time, callback)); |
| 892 } | 598 } |
| 893 | 599 |
| 894 // static | 600 // static |
| 895 bool FileUtilProxy::Truncate( | 601 bool FileUtilProxy::Truncate( |
| 896 scoped_refptr<MessageLoopProxy> message_loop_proxy, | 602 scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| 897 PlatformFile file, | 603 PlatformFile file, |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 913 | 619 |
| 914 // static | 620 // static |
| 915 bool FileUtilProxy::Flush( | 621 bool FileUtilProxy::Flush( |
| 916 scoped_refptr<MessageLoopProxy> message_loop_proxy, | 622 scoped_refptr<MessageLoopProxy> message_loop_proxy, |
| 917 PlatformFile file, | 623 PlatformFile file, |
| 918 const StatusCallback& callback) { | 624 const StatusCallback& callback) { |
| 919 return Start(FROM_HERE, message_loop_proxy, new RelayFlush(file, callback)); | 625 return Start(FROM_HERE, message_loop_proxy, new RelayFlush(file, callback)); |
| 920 } | 626 } |
| 921 | 627 |
| 922 } // namespace base | 628 } // namespace base |
| OLD | NEW |