1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef STORAGE_BROWSER_FILEAPI_QUOTA_QUOTA_RESERVATION_BUFFER_H_
6#define STORAGE_BROWSER_FILEAPI_QUOTA_QUOTA_RESERVATION_BUFFER_H_
7
8#include <map>
9
10#include "base/basictypes.h"
11#include "base/files/file.h"
12#include "base/files/file_path.h"
13#include "base/memory/ref_counted.h"
14#include "base/memory/weak_ptr.h"
15#include "storage/browser/storage_browser_export.h"
16#include "storage/common/fileapi/file_system_types.h"
17#include "url/gurl.h"
18
19namespace storage {
20
21class QuotaReservation;
22class OpenFileHandle;
23class OpenFileHandleContext;
24class QuotaReservationManager;
25
26// QuotaReservationBuffer manages QuotaReservation instances.  All consumed
27// quota and leaked quota by associated QuotaReservation will be staged in
28// QuotaReservationBuffer, and will be committed on a modified file is closed.
29// The instance keeps alive while any associated QuotaReservation or
30// OpenFileHandle alive.
31// This class is usually manipulated only via OpenFileHandle and
32// QuotaReservation.
33class QuotaReservationBuffer : public base::RefCounted<QuotaReservationBuffer> {
34 public:
35  QuotaReservationBuffer(
36      base::WeakPtr<QuotaReservationManager> reservation_manager,
37      const GURL& origin,
38      FileSystemType type);
39
40  scoped_refptr<QuotaReservation> CreateReservation();
41  scoped_ptr<OpenFileHandle> GetOpenFileHandle(
42      QuotaReservation* reservation,
43      const base::FilePath& platform_path);
44  void CommitFileGrowth(int64 quota_consumption, int64 usage_delta);
45  void DetachOpenFileHandleContext(OpenFileHandleContext* context);
46  void PutReservationToBuffer(int64 size);
47
48  QuotaReservationManager* reservation_manager() {
49    return reservation_manager_.get();
50  }
51
52  const GURL& origin() const { return origin_; }
53  FileSystemType type() const { return type_; }
54
55 private:
56  friend class base::RefCounted<QuotaReservationBuffer>;
57  virtual ~QuotaReservationBuffer();
58
59  static bool DecrementDirtyCount(
60      base::WeakPtr<QuotaReservationManager> reservation_manager,
61      const GURL& origin,
62      FileSystemType type,
63      base::File::Error error,
64      int64 delta);
65
66  typedef std::map<base::FilePath, OpenFileHandleContext*>
67      OpenFileHandleContextByPath;
68
69  // Not owned.  The destructor of OpenFileHandler should erase itself from
70  // |open_files_|.
71  OpenFileHandleContextByPath open_files_;
72
73  base::WeakPtr<QuotaReservationManager> reservation_manager_;
74
75  GURL origin_;
76  storage::FileSystemType type_;
77
78  int64 reserved_quota_;
79
80  base::SequenceChecker sequence_checker_;
81
82  DISALLOW_COPY_AND_ASSIGN(QuotaReservationBuffer);
83};
84
85}  // namespace storage
86
87#endif  // STORAGE_BROWSER_FILEAPI_QUOTA_QUOTA_RESERVATION_BUFFER_H_
88