1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/blob/scoped_file.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/location.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/task_runner.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ScopedFile::ScopedFile() 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : scope_out_policy_(DONT_DELETE_ON_SCOPE_OUT) { 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciScopedFile::ScopedFile(const base::FilePath& path, 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopeOutPolicy policy, 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<base::TaskRunner>& file_task_runner) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : path_(path), 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scope_out_policy_(policy), 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_task_runner_(file_task_runner) { 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(path.empty() || policy != DELETE_ON_SCOPE_OUT || 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file_task_runner.get()) 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << "path:" << path.value() << " policy:" << policy 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << " runner:" << file_task_runner.get(); 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ScopedFile::ScopedFile(RValue other) { 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MoveFrom(*other.object); 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ScopedFile::~ScopedFile() { 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Reset(); 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ScopedFile::AddScopeOutCallback( 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ScopeOutCallback& callback, 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TaskRunner* callback_runner) { 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!callback_runner) 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) callback_runner = base::MessageLoopProxy::current().get(); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scope_out_callbacks_.push_back(std::make_pair(callback, callback_runner)); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::FilePath ScopedFile::Release() { 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath path = path_; 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) path_.clear(); 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scope_out_callbacks_.clear(); 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scope_out_policy_ = DONT_DELETE_ON_SCOPE_OUT; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return path; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ScopedFile::Reset() { 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (path_.empty()) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (ScopeOutCallbackList::iterator iter = scope_out_callbacks_.begin(); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter != scope_out_callbacks_.end(); ++iter) { 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter->second->PostTask(FROM_HERE, base::Bind(iter->first, path_)); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (scope_out_policy_ == DELETE_ON_SCOPE_OUT) { 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) file_task_runner_->PostTask( 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FROM_HERE, 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(base::IgnoreResult(&base::DeleteFile), 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) path_, false /* recursive */)); 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Clear all fields. 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Release(); 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ScopedFile::MoveFrom(ScopedFile& other) { 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Reset(); 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scope_out_policy_ = other.scope_out_policy_; 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scope_out_callbacks_.swap(other.scope_out_callbacks_); 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_task_runner_ = other.file_task_runner_; 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) path_ = other.Release(); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace storage 86