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)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#ifndef WEBKIT_COMMON_BLOB_SHAREABLE_FILE_REFERENCE_H_
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define WEBKIT_COMMON_BLOB_SHAREABLE_FILE_REFERENCE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/common/blob/scoped_file.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace webkit_blob {
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.
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class WEBKIT_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)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace webkit_blob
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif  // WEBKIT_COMMON_BLOB_SHAREABLE_FILE_REFERENCE_H_
75