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_BUFFER_H_
      6 #define WEBKIT_BROWSER_FILEAPI_QUOTA_QUOTA_RESERVATION_BUFFER_H_
      7 
      8 #include <map>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/files/file_path.h"
     12 #include "base/memory/ref_counted.h"
     13 #include "base/memory/weak_ptr.h"
     14 #include "base/platform_file.h"
     15 #include "url/gurl.h"
     16 #include "webkit/browser/webkit_storage_browser_export.h"
     17 #include "webkit/common/fileapi/file_system_types.h"
     18 
     19 namespace fileapi {
     20 
     21 class QuotaReservation;
     22 class OpenFileHandle;
     23 class OpenFileHandleContext;
     24 class 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.
     33 class 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::PlatformFileError error);
     64 
     65   typedef std::map<base::FilePath, OpenFileHandleContext*>
     66       OpenFileHandleContextByPath;
     67 
     68   // Not owned.  The destructor of OpenFileHandler should erase itself from
     69   // |open_files_|.
     70   OpenFileHandleContextByPath open_files_;
     71 
     72   base::WeakPtr<QuotaReservationManager> reservation_manager_;
     73 
     74   GURL origin_;
     75   fileapi::FileSystemType type_;
     76 
     77   int64 reserved_quota_;
     78 
     79   base::SequenceChecker sequence_checker_;
     80 
     81   DISALLOW_COPY_AND_ASSIGN(QuotaReservationBuffer);
     82 };
     83 
     84 }  // namespace fileapi
     85 
     86 #endif  // WEBKIT_BROWSER_FILEAPI_QUOTA_QUOTA_RESERVATION_BUFFER_H_
     87