15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef STORAGE_COMMON_BLOB_SHAREABLE_FILE_REFERENCE_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define STORAGE_COMMON_BLOB_SHAREABLE_FILE_REFERENCE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/blob/scoped_file.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// ShareableFileReference allows consumers to share FileReference for the 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// same path if it already exists in its internal map. 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This class is non-thread-safe and all methods must be called on a single 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// thread. 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass STORAGE_COMMON_EXPORT ShareableFileReference 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCounted<ShareableFileReference> { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef ScopedFile::ScopeOutCallback FinalReleaseCallback; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum FinalReleasePolicy { 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DELETE_ON_FINAL_RELEASE = ScopedFile::DELETE_ON_SCOPE_OUT, 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DONT_DELETE_ON_FINAL_RELEASE = ScopedFile::DONT_DELETE_ON_SCOPE_OUT, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a ShareableFileReference for the given path, if no reference 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for this path exists returns NULL. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_refptr<ShareableFileReference> Get(const base::FilePath& path); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a ShareableFileReference for the given path, creating a new 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reference if none yet exists. If there's a pre-existing reference for 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the path, the policy parameter of this method is ignored. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static scoped_refptr<ShareableFileReference> GetOrCreate( 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinalReleasePolicy policy, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TaskRunner* file_task_runner); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns a ShareableFileReference for the given path of the |scoped_file|, 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // creating a new reference if none yet exists. The ownership of |scoped_file| 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is passed to this reference. 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If there's a pre-existing reference for the path, the scope out policy 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // and scope-out-callbacks of the given |scoped_file| is ignored. 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the given scoped_file has an empty path (e.g. maybe already 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // released) this returns NULL reference. 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(kinuko): Make sure if this behavior is ok, we could alternatively 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // merge callbacks to the existing one. 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static scoped_refptr<ShareableFileReference> GetOrCreate( 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedFile scoped_file); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The full file path. 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& path() const { return scoped_file_.path(); } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The |callback| is fired when the final reference of this instance 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is released. If release policy is DELETE_ON_FINAL_RELEASE the 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // callback task(s) is/are posted before the deletion is scheduled. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddFinalReleaseCallback(const FinalReleaseCallback& callback); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<ShareableFileReference>; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ShareableFileReference(ScopedFile scoped_file); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ShareableFileReference(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedFile scoped_file_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ShareableFileReference); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace storage 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // STORAGE_COMMON_BLOB_SHAREABLE_FILE_REFERENCE_H_ 75