Home | History | Annotate | Download | only in quota
      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 WEBKIT_BROWSER_FILEAPI_QUOTA_QUOTA_RESERVATION_MANAGER_H_
      6 #define WEBKIT_BROWSER_FILEAPI_QUOTA_QUOTA_RESERVATION_MANAGER_H_
      7 
      8 #include <map>
      9 #include <utility>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/callback_forward.h"
     13 #include "base/files/file.h"
     14 #include "base/memory/ref_counted.h"
     15 #include "base/memory/weak_ptr.h"
     16 #include "url/gurl.h"
     17 #include "webkit/browser/webkit_storage_browser_export.h"
     18 #include "webkit/common/fileapi/file_system_types.h"
     19 
     20 namespace content {
     21 class QuotaReservationManagerTest;
     22 }
     23 
     24 namespace fileapi {
     25 
     26 class QuotaReservation;
     27 class QuotaReservationBuffer;
     28 class OpenFileHandle;
     29 class OpenFileHandleContext;
     30 
     31 class WEBKIT_STORAGE_BROWSER_EXPORT QuotaReservationManager {
     32  public:
     33   // Callback for ReserveQuota. When this callback returns false, ReserveQuota
     34   // operation should be reverted.
     35   typedef base::Callback<bool(base::File::Error error, int64 delta)>
     36       ReserveQuotaCallback;
     37 
     38   // An abstraction of backing quota system.
     39   class WEBKIT_STORAGE_BROWSER_EXPORT QuotaBackend {
     40    public:
     41     QuotaBackend() {}
     42     virtual ~QuotaBackend() {}
     43 
     44     // Reserves or reclaims |delta| of quota for |origin| and |type| pair.
     45     // Reserved quota should be counted as usage, but it should be on-memory
     46     // and be cleared by a browser restart.
     47     // Invokes |callback| upon completion with an error code.
     48     // |callback| should return false if it can't accept the reservation, in
     49     // that case, the backend should roll back the reservation.
     50     virtual void ReserveQuota(const GURL& origin,
     51                               FileSystemType type,
     52                               int64 delta,
     53                               const ReserveQuotaCallback& callback) = 0;
     54 
     55     // Reclaims |size| of quota for |origin| and |type|.
     56     virtual void ReleaseReservedQuota(const GURL& origin,
     57                                       FileSystemType type,
     58                                       int64 size) = 0;
     59 
     60     // Updates disk usage of |origin| and |type|.
     61     // Invokes |callback| upon completion with an error code.
     62     virtual void CommitQuotaUsage(const GURL& origin,
     63                                   FileSystemType type,
     64                                   int64 delta) = 0;
     65 
     66     virtual void IncrementDirtyCount(const GURL& origin,
     67                                     FileSystemType type) = 0;
     68     virtual void DecrementDirtyCount(const GURL& origin,
     69                                     FileSystemType type) = 0;
     70 
     71    private:
     72     DISALLOW_COPY_AND_ASSIGN(QuotaBackend);
     73   };
     74 
     75   explicit QuotaReservationManager(scoped_ptr<QuotaBackend> backend);
     76   ~QuotaReservationManager();
     77 
     78   // The entry point of the quota reservation.  Creates new reservation object
     79   // for |origin| and |type|.
     80   scoped_refptr<QuotaReservation> CreateReservation(
     81       const GURL& origin,
     82       FileSystemType type);
     83 
     84  private:
     85   typedef std::map<std::pair<GURL, FileSystemType>, QuotaReservationBuffer*>
     86       ReservationBufferByOriginAndType;
     87 
     88   friend class QuotaReservation;
     89   friend class QuotaReservationBuffer;
     90   friend class content::QuotaReservationManagerTest;
     91 
     92   void ReserveQuota(const GURL& origin,
     93                     FileSystemType type,
     94                     int64 delta,
     95                     const ReserveQuotaCallback& callback);
     96 
     97   void ReleaseReservedQuota(const GURL& origin,
     98                             FileSystemType type,
     99                             int64 size);
    100 
    101   void CommitQuotaUsage(const GURL& origin,
    102                         FileSystemType type,
    103                         int64 delta);
    104 
    105   void IncrementDirtyCount(const GURL& origin, FileSystemType type);
    106   void DecrementDirtyCount(const GURL& origin, FileSystemType type);
    107 
    108   scoped_refptr<QuotaReservationBuffer> GetReservationBuffer(
    109       const GURL& origin,
    110       FileSystemType type);
    111   void ReleaseReservationBuffer(QuotaReservationBuffer* reservation_pool);
    112 
    113   scoped_ptr<QuotaBackend> backend_;
    114 
    115   // Not owned.  The destructor of ReservationBuffer should erase itself from
    116   // |reservation_buffers_| by calling ReleaseReservationBuffer.
    117   ReservationBufferByOriginAndType reservation_buffers_;
    118 
    119   base::SequenceChecker sequence_checker_;
    120   base::WeakPtrFactory<QuotaReservationManager> weak_ptr_factory_;
    121 
    122   DISALLOW_COPY_AND_ASSIGN(QuotaReservationManager);
    123 };
    124 
    125 }  // namespace fileapi
    126 
    127 #endif  // WEBKIT_BROWSER_FILEAPI_QUOTA_QUOTA_RESERVATION_MANAGER_H_
    128