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 DCHECK(!client_crashed_); 19 if (!reservation_manager()) 20 return; 21 22 running_refresh_request_ = true; 23 24 reservation_manager()->ReserveQuota( 25 origin(), type(), size - remaining_quota_, 26 base::Bind(&QuotaReservation::AdaptDidUpdateReservedQuota, 27 weak_ptr_factory_.GetWeakPtr(), 28 remaining_quota_, callback)); 29 30 if (running_refresh_request_) 31 remaining_quota_ = 0; 32 } 33 34 scoped_ptr<OpenFileHandle> QuotaReservation::GetOpenFileHandle( 35 const base::FilePath& platform_path) { 36 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); 37 DCHECK(!client_crashed_); 38 return reservation_buffer_->GetOpenFileHandle(this, platform_path); 39 } 40 41 void QuotaReservation::OnClientCrash() { 42 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); 43 client_crashed_ = true; 44 45 if (remaining_quota_) { 46 reservation_buffer_->PutReservationToBuffer(remaining_quota_); 47 remaining_quota_ = 0; 48 } 49 } 50 51 void QuotaReservation::ConsumeReservation(int64 size) { 52 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); 53 DCHECK_LT(0, size); 54 DCHECK_LE(size, remaining_quota_); 55 if (client_crashed_) 56 return; 57 58 remaining_quota_ -= size; 59 reservation_buffer_->PutReservationToBuffer(size); 60 } 61 62 QuotaReservationManager* QuotaReservation::reservation_manager() { 63 return reservation_buffer_->reservation_manager(); 64 } 65 66 const GURL& QuotaReservation::origin() const { 67 return reservation_buffer_->origin(); 68 } 69 70 FileSystemType QuotaReservation::type() const { 71 return reservation_buffer_->type(); 72 } 73 74 QuotaReservation::QuotaReservation( 75 QuotaReservationBuffer* reservation_buffer) 76 : client_crashed_(false), 77 running_refresh_request_(false), 78 remaining_quota_(0), 79 reservation_buffer_(reservation_buffer), 80 weak_ptr_factory_(this) { 81 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); 82 } 83 84 QuotaReservation::~QuotaReservation() { 85 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); 86 87 if (remaining_quota_ && reservation_manager()) { 88 reservation_manager()->ReleaseReservedQuota( 89 origin(), type(), remaining_quota_); 90 } 91 } 92 93 // static 94 bool QuotaReservation::AdaptDidUpdateReservedQuota( 95 const base::WeakPtr<QuotaReservation>& reservation, 96 int64 previous_size, 97 const StatusCallback& callback, 98 base::File::Error error, 99 int64 delta) { 100 if (!reservation) 101 return false; 102 103 return reservation->DidUpdateReservedQuota( 104 previous_size, callback, error, delta); 105 } 106 107 bool QuotaReservation::DidUpdateReservedQuota( 108 int64 previous_size, 109 const StatusCallback& callback, 110 base::File::Error error, 111 int64 delta) { 112 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); 113 DCHECK(running_refresh_request_); 114 running_refresh_request_ = false; 115 116 if (client_crashed_) { 117 callback.Run(base::File::FILE_ERROR_ABORT); 118 return false; 119 } 120 121 if (error == base::File::FILE_OK) 122 remaining_quota_ = previous_size + delta; 123 callback.Run(error); 124 return true; 125 } 126 127 } // namespace fileapi 128