1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "webkit/browser/fileapi/remove_operation_delegate.h" 6 7 #include "base/bind.h" 8 #include "webkit/browser/fileapi/file_system_context.h" 9 #include "webkit/browser/fileapi/file_system_operation_runner.h" 10 11 namespace fileapi { 12 13 RemoveOperationDelegate::RemoveOperationDelegate( 14 FileSystemContext* file_system_context, 15 const FileSystemURL& url, 16 const StatusCallback& callback) 17 : RecursiveOperationDelegate(file_system_context), 18 url_(url), 19 callback_(callback), 20 weak_factory_(this) { 21 } 22 23 RemoveOperationDelegate::~RemoveOperationDelegate() {} 24 25 void RemoveOperationDelegate::Run() { 26 operation_runner()->RemoveFile(url_, base::Bind( 27 &RemoveOperationDelegate::DidTryRemoveFile, weak_factory_.GetWeakPtr())); 28 } 29 30 void RemoveOperationDelegate::RunRecursively() { 31 StartRecursiveOperation(url_, callback_); 32 } 33 34 void RemoveOperationDelegate::ProcessFile(const FileSystemURL& url, 35 const StatusCallback& callback) { 36 operation_runner()->RemoveFile( 37 url, 38 base::Bind(&RemoveOperationDelegate::DidRemoveFile, 39 weak_factory_.GetWeakPtr(), callback)); 40 } 41 42 void RemoveOperationDelegate::ProcessDirectory(const FileSystemURL& url, 43 const StatusCallback& callback) { 44 callback.Run(base::PLATFORM_FILE_OK); 45 } 46 47 void RemoveOperationDelegate::PostProcessDirectory( 48 const FileSystemURL& url, const StatusCallback& callback) { 49 operation_runner()->RemoveDirectory(url, callback); 50 } 51 52 void RemoveOperationDelegate::DidTryRemoveFile( 53 base::PlatformFileError error) { 54 if (error != base::PLATFORM_FILE_ERROR_NOT_A_FILE && 55 error != base::PLATFORM_FILE_ERROR_SECURITY) { 56 callback_.Run(error); 57 return; 58 } 59 operation_runner()->RemoveDirectory( 60 url_, 61 base::Bind(&RemoveOperationDelegate::DidTryRemoveDirectory, 62 weak_factory_.GetWeakPtr(), error)); 63 } 64 65 void RemoveOperationDelegate::DidTryRemoveDirectory( 66 base::PlatformFileError remove_file_error, 67 base::PlatformFileError remove_directory_error) { 68 callback_.Run( 69 remove_directory_error == base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY ? 70 remove_file_error : 71 remove_directory_error); 72 } 73 74 void RemoveOperationDelegate::DidRemoveFile(const StatusCallback& callback, 75 base::PlatformFileError error) { 76 if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) { 77 callback.Run(base::PLATFORM_FILE_OK); 78 return; 79 } 80 callback.Run(error); 81 } 82 83 } // namespace fileapi 84