1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// found in the LICENSE file. 4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/sync_file_system/local/root_delete_helper.h" 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/sequenced_task_runner.h" 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/sync_file_system/local/local_file_change_tracker.h" 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/sync_file_system/local/local_file_sync_status.h" 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/sync_file_system/local/sync_file_system_backend.h" 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/sync_file_system/logger.h" 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/sync_file_system/sync_callbacks.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_context.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/sandbox_file_system_backend_delegate.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_util.h" 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace sync_file_system { 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace { 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// This runs on FileSystemContext's default_file_task_runner. 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void ResetFileChangeTracker(storage::FileSystemContext* file_system_context, 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url) { 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(file_system_context->default_file_task_runner()-> 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RunsTasksOnCurrentThread()); 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyncFileSystemBackend* backend = 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SyncFileSystemBackend::GetBackend(file_system_context); 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(backend); 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(backend->change_tracker()); 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) backend->change_tracker()->ResetForFileSystem(url.origin(), url.type()); 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RootDeleteHelper::RootDeleteHelper( 3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemContext* file_system_context, 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LocalFileSyncStatus* sync_status, 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url, 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const FileStatusCallback& callback) 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : file_system_context_(file_system_context), 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) url_(url), 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) callback_(callback), 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) sync_status_(sync_status), 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) weak_factory_(this) { 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(file_system_context_.get()); 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(url_.is_valid()); 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!callback_.is_null()); 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(sync_status_); 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This is expected to run on the filesystem root. 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(storage::VirtualPath::IsRootPath(url.path())); 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RootDeleteHelper::~RootDeleteHelper() { 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RootDeleteHelper::Run() { 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) util::Log(logging::LOG_VERBOSE, FROM_HERE, 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "Deleting the entire local filesystem for remote root deletion: " 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "%s", url_.DebugString().c_str()); 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) file_system_context_->DeleteFileSystem( 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) url_.origin(), url_.type(), 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&RootDeleteHelper::DidDeleteFileSystem, 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) weak_factory_.GetWeakPtr())); 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RootDeleteHelper::DidDeleteFileSystem(base::File::Error error) { 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Ignore errors, no idea how to deal with it. 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!sync_status_->IsWritable(url_)); 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!sync_status_->IsWriting(url_)); 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // All writes to the entire file system must be now blocked, so we have 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // to be able to safely reset the local changes and sync statuses for it. 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(kinuko): This should be probably automatically handled in 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // DeleteFileSystem via QuotaUtil::DeleteOriginDataOnFileThread. 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) file_system_context_->default_file_task_runner()->PostTaskAndReply( 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FROM_HERE, 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&ResetFileChangeTracker, file_system_context_, url_), 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&RootDeleteHelper::DidResetFileChangeTracker, 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) weak_factory_.GetWeakPtr())); 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RootDeleteHelper::DidResetFileChangeTracker() { 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!sync_status_->IsWritable(url_)); 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!sync_status_->IsWriting(url_)); 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Reopening the filesystem. 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) file_system_context_->sandbox_delegate()->OpenFileSystem( 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) url_.origin(), 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) url_.type(), 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&RootDeleteHelper::DidOpenFileSystem, 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) weak_factory_.GetWeakPtr()), 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GURL()); 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void RootDeleteHelper::DidOpenFileSystem(const GURL& /* root */, 100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& /* name */, 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error) { 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FileStatusCallback callback = callback_; 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) callback.Run(error); 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace sync_file_system 107