Home | History | Annotate | Download | only in fileapi
      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(
     32       url_,
     33       base::Bind(&RemoveOperationDelegate::RemoveNextDirectory,
     34                  weak_factory_.GetWeakPtr()));
     35 }
     36 
     37 void RemoveOperationDelegate::ProcessFile(const FileSystemURL& url,
     38                                           const StatusCallback& callback) {
     39   if (to_remove_directories_.size() == 1u &&
     40       to_remove_directories_.top() == url) {
     41     // We seem to have been re-directed from ProcessDirectory.
     42     to_remove_directories_.pop();
     43   }
     44   operation_runner()->RemoveFile(url, base::Bind(
     45       &RemoveOperationDelegate::DidRemoveFile,
     46       weak_factory_.GetWeakPtr(), callback));
     47 }
     48 
     49 void RemoveOperationDelegate::ProcessDirectory(const FileSystemURL& url,
     50                                                const StatusCallback& callback) {
     51   to_remove_directories_.push(url);
     52   callback.Run(base::PLATFORM_FILE_OK);
     53 }
     54 
     55 void RemoveOperationDelegate::DidTryRemoveFile(
     56     base::PlatformFileError error) {
     57   if (error == base::PLATFORM_FILE_OK ||
     58       error != base::PLATFORM_FILE_ERROR_NOT_A_FILE) {
     59     callback_.Run(error);
     60     return;
     61   }
     62   operation_runner()->RemoveDirectory(url_, callback_);
     63 }
     64 
     65 void RemoveOperationDelegate::DidRemoveFile(const StatusCallback& callback,
     66                                             base::PlatformFileError error) {
     67   if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) {
     68     callback.Run(base::PLATFORM_FILE_OK);
     69     return;
     70   }
     71   callback.Run(error);
     72 }
     73 
     74 void RemoveOperationDelegate::RemoveNextDirectory(
     75     base::PlatformFileError error) {
     76   if (error != base::PLATFORM_FILE_OK ||
     77       to_remove_directories_.empty()) {
     78     callback_.Run(error);
     79     return;
     80   }
     81   FileSystemURL url = to_remove_directories_.top();
     82   to_remove_directories_.pop();
     83   operation_runner()->RemoveDirectory(url, base::Bind(
     84       &RemoveOperationDelegate::RemoveNextDirectory,
     85       weak_factory_.GetWeakPtr()));
     86 }
     87 
     88 }  // namespace fileapi
     89