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
11namespace fileapi {
12
13RemoveOperationDelegate::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
23RemoveOperationDelegate::~RemoveOperationDelegate() {}
24
25void RemoveOperationDelegate::Run() {
26  operation_runner()->RemoveFile(url_, base::Bind(
27      &RemoveOperationDelegate::DidTryRemoveFile, weak_factory_.GetWeakPtr()));
28}
29
30void RemoveOperationDelegate::RunRecursively() {
31  StartRecursiveOperation(url_, callback_);
32}
33
34void 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
42void RemoveOperationDelegate::ProcessDirectory(const FileSystemURL& url,
43                                               const StatusCallback& callback) {
44  callback.Run(base::PLATFORM_FILE_OK);
45}
46
47void RemoveOperationDelegate::PostProcessDirectory(
48    const FileSystemURL& url, const StatusCallback& callback) {
49  operation_runner()->RemoveDirectory(url, callback);
50}
51
52void 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
65void 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
74void 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