15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_util_proxy.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/files/file_util.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/task_runner.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/task_runner_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CallWithTranslatedParameter(const FileUtilProxy::StatusCallback& callback,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool value) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!callback.is_null());
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  callback.Run(value ? File::FILE_OK : File::FILE_ERROR_FAILED);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GetFileInfoHelper {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetFileInfoHelper()
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : error_(File::FILE_OK) {}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunWorkForFilePath(const FilePath& file_path) {
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (!PathExists(file_path)) {
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      error_ = File::FILE_ERROR_NOT_FOUND;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!GetFileInfo(file_path, &file_info_))
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      error_ = File::FILE_ERROR_FAILED;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reply(const FileUtilProxy::GetFileInfoCallback& callback) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!callback.is_null()) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback.Run(error_, file_info_);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  File::Error error_;
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  File::Info file_info_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GetFileInfoHelper);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::Error DeleteAdapter(const FilePath& file_path, bool recursive) {
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!PathExists(file_path)) {
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return File::FILE_ERROR_NOT_FOUND;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!base::DeleteFile(file_path, recursive)) {
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (!recursive && !base::IsDirectoryEmpty(file_path)) {
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return File::FILE_ERROR_NOT_EMPTY;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return File::FILE_ERROR_FAILED;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return File::FILE_OK;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Retrieves the information about a file. It is invalid to pass NULL for the
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// callback.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FileUtilProxy::GetFileInfo(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TaskRunner* task_runner,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FilePath& file_path,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GetFileInfoCallback& callback) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetFileInfoHelper* helper = new GetFileInfoHelper;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return task_runner->PostTaskAndReply(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Bind(&GetFileInfoHelper::RunWorkForFilePath,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           Unretained(helper), file_path),
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Bind(&GetFileInfoHelper::Reply, Owned(helper), callback));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool FileUtilProxy::DeleteFile(TaskRunner* task_runner,
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               const FilePath& file_path,
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               bool recursive,
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               const StatusCallback& callback) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::PostTaskAndReplyWithResult(
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      task_runner, FROM_HERE,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Bind(&DeleteAdapter, file_path, recursive),
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      callback);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool FileUtilProxy::Touch(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TaskRunner* task_runner,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FilePath& file_path,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Time& last_access_time,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Time& last_modified_time,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const StatusCallback& callback) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::PostTaskAndReplyWithResult(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      task_runner,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      Bind(&TouchFile, file_path, last_access_time, last_modified_time),
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Bind(&CallWithTranslatedParameter, callback));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
105