1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef STORAGE_BROWSER_FILEAPI_QUOTA_QUOTA_RESERVATION_MANAGER_H_
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define STORAGE_BROWSER_FILEAPI_QUOTA_QUOTA_RESERVATION_MANAGER_H_
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <map>
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <utility>
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/basictypes.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/callback_forward.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/file.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/ref_counted.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/weak_ptr.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/storage_browser_export.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_types.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "url/gurl.h"
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace content {
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass QuotaReservationManagerTest;
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage {
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class QuotaReservation;
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class QuotaReservationBuffer;
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class OpenFileHandle;
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class OpenFileHandleContext;
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass STORAGE_EXPORT QuotaReservationManager {
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Callback for ReserveQuota. When this callback returns false, ReserveQuota
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // operation should be reverted.
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef base::Callback<bool(base::File::Error error, int64 delta)>
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ReserveQuotaCallback;
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // An abstraction of backing quota system.
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  class STORAGE_EXPORT QuotaBackend {
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   public:
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    QuotaBackend() {}
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual ~QuotaBackend() {}
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Reserves or reclaims |delta| of quota for |origin| and |type| pair.
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Reserved quota should be counted as usage, but it should be on-memory
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // and be cleared by a browser restart.
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Invokes |callback| upon completion with an error code.
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // |callback| should return false if it can't accept the reservation, in
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // that case, the backend should roll back the reservation.
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void ReserveQuota(const GURL& origin,
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              FileSystemType type,
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              int64 delta,
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              const ReserveQuotaCallback& callback) = 0;
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Reclaims |size| of quota for |origin| and |type|.
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void ReleaseReservedQuota(const GURL& origin,
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                      FileSystemType type,
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                      int64 size) = 0;
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Updates disk usage of |origin| and |type|.
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Invokes |callback| upon completion with an error code.
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void CommitQuotaUsage(const GURL& origin,
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                  FileSystemType type,
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                  int64 delta) = 0;
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void IncrementDirtyCount(const GURL& origin,
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    FileSystemType type) = 0;
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void DecrementDirtyCount(const GURL& origin,
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    FileSystemType type) = 0;
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   private:
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(QuotaBackend);
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  explicit QuotaReservationManager(scoped_ptr<QuotaBackend> backend);
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ~QuotaReservationManager();
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The entry point of the quota reservation.  Creates new reservation object
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // for |origin| and |type|.
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<QuotaReservation> CreateReservation(
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const GURL& origin,
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FileSystemType type);
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  typedef std::map<std::pair<GURL, FileSystemType>, QuotaReservationBuffer*>
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ReservationBufferByOriginAndType;
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  friend class QuotaReservation;
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  friend class QuotaReservationBuffer;
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  friend class content::QuotaReservationManagerTest;
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void ReserveQuota(const GURL& origin,
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    FileSystemType type,
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    int64 delta,
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    const ReserveQuotaCallback& callback);
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void ReleaseReservedQuota(const GURL& origin,
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            FileSystemType type,
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            int64 size);
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void CommitQuotaUsage(const GURL& origin,
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        FileSystemType type,
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        int64 delta);
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void IncrementDirtyCount(const GURL& origin, FileSystemType type);
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void DecrementDirtyCount(const GURL& origin, FileSystemType type);
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<QuotaReservationBuffer> GetReservationBuffer(
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const GURL& origin,
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      FileSystemType type);
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void ReleaseReservationBuffer(QuotaReservationBuffer* reservation_pool);
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<QuotaBackend> backend_;
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Not owned.  The destructor of ReservationBuffer should erase itself from
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |reservation_buffers_| by calling ReleaseReservationBuffer.
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ReservationBufferByOriginAndType reservation_buffers_;
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::SequenceChecker sequence_checker_;
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::WeakPtrFactory<QuotaReservationManager> weak_ptr_factory_;
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuotaReservationManager);
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace storage
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // STORAGE_BROWSER_FILEAPI_QUOTA_QUOTA_RESERVATION_MANAGER_H_
128