summaryrefslogtreecommitdiffstats
path: root/webkit/browser/fileapi/quota/quota_reservation.cc
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/browser/fileapi/quota/quota_reservation.cc')
-rw-r--r--webkit/browser/fileapi/quota/quota_reservation.cc113
1 files changed, 113 insertions, 0 deletions
diff --git a/webkit/browser/fileapi/quota/quota_reservation.cc b/webkit/browser/fileapi/quota/quota_reservation.cc
new file mode 100644
index 0000000..c5a22ab
--- /dev/null
+++ b/webkit/browser/fileapi/quota/quota_reservation.cc
@@ -0,0 +1,113 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "webkit/browser/fileapi/quota/quota_reservation.h"
+
+#include "base/bind.h"
+#include "webkit/browser/fileapi/quota/open_file_handle.h"
+#include "webkit/browser/fileapi/quota/quota_reservation_buffer.h"
+
+namespace fileapi {
+
+void QuotaReservation::RefreshReservation(
+ int64 size,
+ const StatusCallback& callback) {
+ DCHECK(sequence_checker_.CalledOnValidSequencedThread());
+ DCHECK(!running_refresh_request_);
+ if (!reservation_manager())
+ return;
+
+ running_refresh_request_ = true;
+
+ reservation_manager()->ReserveQuota(
+ origin(), type(), size - remaining_quota_,
+ base::Bind(&QuotaReservation::AdaptDidUpdateReservedQuota,
+ weak_ptr_factory_.GetWeakPtr(),
+ size, callback));
+
+ if (running_refresh_request_)
+ remaining_quota_ = 0;
+}
+
+scoped_ptr<OpenFileHandle> QuotaReservation::GetOpenFileHandle(
+ const base::FilePath& platform_path) {
+ DCHECK(sequence_checker_.CalledOnValidSequencedThread());
+ return reservation_buffer_->GetOpenFileHandle(this, platform_path);
+}
+
+void QuotaReservation::OnClientCrash() {
+ DCHECK(sequence_checker_.CalledOnValidSequencedThread());
+
+ if (remaining_quota_) {
+ reservation_buffer_->PutReservationToBuffer(remaining_quota_);
+ remaining_quota_ = 0;
+ }
+}
+
+void QuotaReservation::ConsumeReservation(int64 size) {
+ DCHECK(sequence_checker_.CalledOnValidSequencedThread());
+ DCHECK_LT(0, size);
+ DCHECK_LT(size, remaining_quota_);
+
+ remaining_quota_ -= size;
+ reservation_buffer_->PutReservationToBuffer(size);
+}
+
+QuotaReservationManager* QuotaReservation::reservation_manager() {
+ return reservation_buffer_->reservation_manager();
+}
+
+const GURL& QuotaReservation::origin() const {
+ return reservation_buffer_->origin();
+}
+
+FileSystemType QuotaReservation::type() const {
+ return reservation_buffer_->type();
+}
+
+QuotaReservation::QuotaReservation(
+ QuotaReservationBuffer* reservation_buffer)
+ : running_refresh_request_(false),
+ remaining_quota_(0),
+ reservation_buffer_(reservation_buffer),
+ weak_ptr_factory_(this) {
+ DCHECK(sequence_checker_.CalledOnValidSequencedThread());
+}
+
+QuotaReservation::~QuotaReservation() {
+ DCHECK(sequence_checker_.CalledOnValidSequencedThread());
+
+ if (remaining_quota_ && reservation_manager()) {
+ reservation_manager()->ReleaseReservedQuota(
+ origin(), type(), remaining_quota_);
+ }
+}
+
+// static
+bool QuotaReservation::AdaptDidUpdateReservedQuota(
+ const base::WeakPtr<QuotaReservation>& reservation,
+ int64 new_reserved_size,
+ const StatusCallback& callback,
+ base::PlatformFileError error) {
+ if (!reservation)
+ return false;
+
+ reservation->DidUpdateReservedQuota(new_reserved_size, callback, error);
+ return true;
+}
+
+void QuotaReservation::DidUpdateReservedQuota(
+ int64 new_reserved_size,
+ const StatusCallback& callback,
+ base::PlatformFileError error) {
+ DCHECK(sequence_checker_.CalledOnValidSequencedThread());
+ DCHECK(running_refresh_request_);
+ running_refresh_request_ = false;
+
+ if (error == base::PLATFORM_FILE_OK)
+ remaining_quota_ = new_reserved_size;
+ callback.Run(error);
+}
+
+} // namespace fileapi