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