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 #include "webkit/browser/fileapi/quota/quota_reservation.h"
      6 
      7 #include "base/bind.h"
      8 #include "webkit/browser/fileapi/quota/open_file_handle.h"
      9 #include "webkit/browser/fileapi/quota/quota_reservation_buffer.h"
     10 
     11 namespace fileapi {
     12 
     13 void QuotaReservation::RefreshReservation(
     14     int64 size,
     15     const StatusCallback& callback) {
     16   DCHECK(sequence_checker_.CalledOnValidSequencedThread());
     17   DCHECK(!running_refresh_request_);
     18   if (!reservation_manager())
     19     return;
     20 
     21   running_refresh_request_ = true;
     22 
     23   reservation_manager()->ReserveQuota(
     24       origin(), type(), size - remaining_quota_,
     25       base::Bind(&QuotaReservation::AdaptDidUpdateReservedQuota,
     26                  weak_ptr_factory_.GetWeakPtr(),
     27                  size, callback));
     28 
     29   if (running_refresh_request_)
     30     remaining_quota_ = 0;
     31 }
     32 
     33 scoped_ptr<OpenFileHandle> QuotaReservation::GetOpenFileHandle(
     34     const base::FilePath& platform_path) {
     35   DCHECK(sequence_checker_.CalledOnValidSequencedThread());
     36   return reservation_buffer_->GetOpenFileHandle(this, platform_path);
     37 }
     38 
     39 void QuotaReservation::OnClientCrash() {
     40   DCHECK(sequence_checker_.CalledOnValidSequencedThread());
     41 
     42   if (remaining_quota_) {
     43     reservation_buffer_->PutReservationToBuffer(remaining_quota_);
     44     remaining_quota_ = 0;
     45   }
     46 }
     47 
     48 void QuotaReservation::ConsumeReservation(int64 size) {
     49   DCHECK(sequence_checker_.CalledOnValidSequencedThread());
     50   DCHECK_LT(0, size);
     51   DCHECK_LT(size, remaining_quota_);
     52 
     53   remaining_quota_ -= size;
     54   reservation_buffer_->PutReservationToBuffer(size);
     55 }
     56 
     57 QuotaReservationManager* QuotaReservation::reservation_manager() {
     58   return reservation_buffer_->reservation_manager();
     59 }
     60 
     61 const GURL& QuotaReservation::origin() const {
     62   return reservation_buffer_->origin();
     63 }
     64 
     65 FileSystemType QuotaReservation::type() const {
     66   return reservation_buffer_->type();
     67 }
     68 
     69 QuotaReservation::QuotaReservation(
     70     QuotaReservationBuffer* reservation_buffer)
     71     : running_refresh_request_(false),
     72       remaining_quota_(0),
     73       reservation_buffer_(reservation_buffer),
     74       weak_ptr_factory_(this) {
     75   DCHECK(sequence_checker_.CalledOnValidSequencedThread());
     76 }
     77 
     78 QuotaReservation::~QuotaReservation() {
     79   DCHECK(sequence_checker_.CalledOnValidSequencedThread());
     80 
     81   if (remaining_quota_ && reservation_manager()) {
     82     reservation_manager()->ReleaseReservedQuota(
     83         origin(), type(), remaining_quota_);
     84   }
     85 }
     86 
     87 // static
     88 bool QuotaReservation::AdaptDidUpdateReservedQuota(
     89     const base::WeakPtr<QuotaReservation>& reservation,
     90     int64 new_reserved_size,
     91     const StatusCallback& callback,
     92     base::PlatformFileError error) {
     93   if (!reservation)
     94     return false;
     95 
     96   reservation->DidUpdateReservedQuota(new_reserved_size, callback, error);
     97   return true;
     98 }
     99 
    100 void QuotaReservation::DidUpdateReservedQuota(
    101     int64 new_reserved_size,
    102     const StatusCallback& callback,
    103     base::PlatformFileError error) {
    104   DCHECK(sequence_checker_.CalledOnValidSequencedThread());
    105   DCHECK(running_refresh_request_);
    106   running_refresh_request_ = false;
    107 
    108   if (error == base::PLATFORM_FILE_OK)
    109     remaining_quota_ = new_reserved_size;
    110   callback.Run(error);
    111 }
    112 
    113 }  // namespace fileapi
    114