blob: 583ce783927994d8685c200d6772a1708ea8813e [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <map>
#include "base/callback_forward.h"
#include "base/files/file_path.h"
#include "base/memory/ref_counted.h"
#include "base/move.h"
#include "storage/browser/storage_browser_export.h"
namespace base {
class TaskRunner;
namespace storage {
// A scoped reference for a FilePath that can optionally schedule the file
// to be deleted and/or to notify a consumer when it is going to be scoped out.
// This class supports move semantics, i.e. consumers can call Pass() to
// pass the ownership of ScopedFile.
// TODO(kinuko): Probably this can be moved under base or somewhere more
// common place.
class STORAGE_EXPORT ScopedFile {
typedef base::Callback<void(const base::FilePath&)> ScopeOutCallback;
typedef std::pair<ScopeOutCallback, scoped_refptr<base::TaskRunner> >
typedef std::vector<ScopeOutCallbackPair> ScopeOutCallbackList;
enum ScopeOutPolicy {
// |file_task_runner| is used to schedule a file deletion if |policy|
ScopedFile(const base::FilePath& path,
ScopeOutPolicy policy,
const scoped_refptr<base::TaskRunner>& file_task_runner);
// Move constructor and operator. The data of r-value will be transfered
// in a destructive way. (See base/move.h)
ScopedFile(ScopedFile&& other);
ScopedFile& operator=(ScopedFile&& rhs) {
return *this;
// The |callback| is fired on |callback_runner| when the final reference
// of this instance is released.
// If release policy is DELETE_ON_SCOPE_OUT the
// callback task(s) is/are posted before the deletion is scheduled.
void AddScopeOutCallback(const ScopeOutCallback& callback,
base::TaskRunner* callback_runner);
// The full file path.
const base::FilePath& path() const { return path_; }
// Releases the file. After calling this, this instance will hold
// an empty file path and scoping out won't make any file deletion
// or callback dispatch. (If an owned pointer is attached to any of
// callbacks the pointer will be deleted.)
base::FilePath Release();
void Reset();
// Performs destructive move from |other| to this.
void MoveFrom(ScopedFile& other);
base::FilePath path_;
ScopeOutPolicy scope_out_policy_;
scoped_refptr<base::TaskRunner> file_task_runner_;
ScopeOutCallbackList scope_out_callbacks_;
} // namespace storage