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