blob: 72d9436fa1f6d9b26a2cd018c570d60cb6b6acf3 [file] [log] [blame]
battre@chromium.org6d025972012-04-17 11:48:06 +09001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
dumi@chromium.orgc980e402010-08-21 07:42:50 +09002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
brettw@chromium.org06a553b2013-01-26 09:21:58 +09005#include "base/files/file_util_proxy.h"
dumi@chromium.orgc980e402010-08-21 07:42:50 +09006
jhawkins@chromium.orgc14280a2011-10-18 07:39:51 +09007#include "base/bind.h"
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +09008#include "base/bind_helpers.h"
9#include "base/file_util.h"
thestig@chromium.org98e70672012-04-24 06:23:04 +090010#include "base/location.h"
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090011#include "base/task_runner.h"
battre@chromium.org6d025972012-04-17 11:48:06 +090012#include "base/task_runner_util.h"
dumi@chromium.orgc980e402010-08-21 07:42:50 +090013
kinuko@chromium.org4f65c992011-10-19 16:21:57 +090014namespace base {
dumi@chromium.orgc980e402010-08-21 07:42:50 +090015
kinuko@chromium.org1a078042010-10-07 17:35:09 +090016namespace {
17
battre@chromium.org6d025972012-04-17 11:48:06 +090018void CallWithTranslatedParameter(const FileUtilProxy::StatusCallback& callback,
19 bool value) {
20 DCHECK(!callback.is_null());
rvargas@chromium.org9e469f62014-01-28 06:36:00 +090021 callback.Run(value ? File::FILE_OK : File::FILE_ERROR_FAILED);
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090022}
23
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090024class GetFileInfoHelper {
dumi@chromium.orgc980e402010-08-21 07:42:50 +090025 public:
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090026 GetFileInfoHelper()
rvargas@chromium.org9e469f62014-01-28 06:36:00 +090027 : error_(File::FILE_OK) {}
dumi@chromium.orgc980e402010-08-21 07:42:50 +090028
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090029 void RunWorkForFilePath(const FilePath& file_path) {
brettw@chromium.org10b64122013-07-12 02:36:07 +090030 if (!PathExists(file_path)) {
rvargas@chromium.org9e469f62014-01-28 06:36:00 +090031 error_ = File::FILE_ERROR_NOT_FOUND;
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +090032 return;
33 }
rvargas@chromium.org613afc52014-05-22 12:39:05 +090034 if (!GetFileInfo(file_path, &file_info_))
rvargas@chromium.org9e469f62014-01-28 06:36:00 +090035 error_ = File::FILE_ERROR_FAILED;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090036 }
37
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090038 void Reply(const FileUtilProxy::GetFileInfoCallback& callback) {
39 if (!callback.is_null()) {
40 callback.Run(error_, file_info_);
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +090041 }
dumi@chromium.orgc980e402010-08-21 07:42:50 +090042 }
43
44 private:
rvargas@chromium.org9e469f62014-01-28 06:36:00 +090045 File::Error error_;
46 File::Info file_info_;
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090047 DISALLOW_COPY_AND_ASSIGN(GetFileInfoHelper);
jianli@chromium.org9ed1f9d2010-08-31 11:42:36 +090048};
49
rvargas@chromium.org9e469f62014-01-28 06:36:00 +090050File::Error DeleteAdapter(const FilePath& file_path, bool recursive) {
brettw@chromium.org10b64122013-07-12 02:36:07 +090051 if (!PathExists(file_path)) {
rvargas@chromium.org9e469f62014-01-28 06:36:00 +090052 return File::FILE_ERROR_NOT_FOUND;
kinuko@chromium.org9c033e22011-11-09 15:46:39 +090053 }
brettw@chromium.org220b8de2013-07-17 04:10:23 +090054 if (!base::DeleteFile(file_path, recursive)) {
brettw@chromium.org83c44c82013-12-03 03:55:49 +090055 if (!recursive && !base::IsDirectoryEmpty(file_path)) {
rvargas@chromium.org9e469f62014-01-28 06:36:00 +090056 return File::FILE_ERROR_NOT_EMPTY;
kinuko@chromium.org9c033e22011-11-09 15:46:39 +090057 }
rvargas@chromium.org9e469f62014-01-28 06:36:00 +090058 return File::FILE_ERROR_FAILED;
kinuko@chromium.org9c033e22011-11-09 15:46:39 +090059 }
rvargas@chromium.org9e469f62014-01-28 06:36:00 +090060 return File::FILE_OK;
kinuko@chromium.org9c033e22011-11-09 15:46:39 +090061}
62
dumi@chromium.orgc980e402010-08-21 07:42:50 +090063} // namespace
64
erg@google.com37c078e2011-01-11 09:50:59 +090065// Retrieves the information about a file. It is invalid to pass NULL for the
66// callback.
67bool FileUtilProxy::GetFileInfo(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090068 TaskRunner* task_runner,
erg@google.com37c078e2011-01-11 09:50:59 +090069 const FilePath& file_path,
jhawkins@chromium.org56771f02011-10-18 05:12:05 +090070 const GetFileInfoCallback& callback) {
kinuko@chromium.orgccadc2e2011-10-25 18:37:19 +090071 GetFileInfoHelper* helper = new GetFileInfoHelper;
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090072 return task_runner->PostTaskAndReply(
battre@chromium.org6d025972012-04-17 11:48:06 +090073 FROM_HERE,
74 Bind(&GetFileInfoHelper::RunWorkForFilePath,
75 Unretained(helper), file_path),
76 Bind(&GetFileInfoHelper::Reply, Owned(helper), callback));
erg@google.com37c078e2011-01-11 09:50:59 +090077}
78
kinuko@chromium.org850eb6d2010-10-15 09:37:34 +090079// static
brettw@chromium.org220b8de2013-07-17 04:10:23 +090080bool FileUtilProxy::DeleteFile(TaskRunner* task_runner,
81 const FilePath& file_path,
82 bool recursive,
83 const StatusCallback& callback) {
kinuko@chromium.org81f6e032013-01-17 04:54:36 +090084 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090085 task_runner, FROM_HERE,
kinuko@chromium.org9c033e22011-11-09 15:46:39 +090086 Bind(&DeleteAdapter, file_path, recursive),
87 callback);
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +090088}
dumi@chromium.orgc980e402010-08-21 07:42:50 +090089
dumi@chromium.org23915982010-09-10 12:01:14 +090090// static
dumi@chromium.org12c2e2b2010-09-24 10:09:32 +090091bool FileUtilProxy::Touch(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090092 TaskRunner* task_runner,
dumi@chromium.org12c2e2b2010-09-24 10:09:32 +090093 const FilePath& file_path,
kinuko@chromium.org4f65c992011-10-19 16:21:57 +090094 const Time& last_access_time,
95 const Time& last_modified_time,
jhawkins@chromium.org162de392011-10-18 06:33:35 +090096 const StatusCallback& callback) {
battre@chromium.org6d025972012-04-17 11:48:06 +090097 return base::PostTaskAndReplyWithResult(
kinuko@chromium.org20e2efc2012-04-24 03:40:57 +090098 task_runner,
battre@chromium.org6d025972012-04-17 11:48:06 +090099 FROM_HERE,
brettw@chromium.org458d1e32013-12-05 07:49:00 +0900100 Bind(&TouchFile, file_path, last_access_time, last_modified_time),
battre@chromium.org6d025972012-04-17 11:48:06 +0900101 Bind(&CallWithTranslatedParameter, callback));
dumi@chromium.org12c2e2b2010-09-24 10:09:32 +0900102}
103
kkanetkar@chromium.org3a3bdea2010-09-02 12:43:36 +0900104} // namespace base