Upstream version 5.34.92.0
[platform/framework/web/crosswalk.git] / src / webkit / browser / fileapi / quota / quota_reservation.cc
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                  size, 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 new_reserved_size,
97     const StatusCallback& callback,
98     base::File::Error error) {
99   if (!reservation)
100     return false;
101
102   return reservation->DidUpdateReservedQuota(
103       new_reserved_size, callback, error);
104 }
105
106 bool QuotaReservation::DidUpdateReservedQuota(
107     int64 new_reserved_size,
108     const StatusCallback& callback,
109     base::File::Error error) {
110   DCHECK(sequence_checker_.CalledOnValidSequencedThread());
111   DCHECK(running_refresh_request_);
112   running_refresh_request_ = false;
113
114   if (client_crashed_) {
115     callback.Run(base::File::FILE_ERROR_ABORT);
116     return false;
117   }
118
119   if (error == base::File::FILE_OK)
120     remaining_quota_ = new_reserved_size;
121   callback.Run(error);
122   return true;
123 }
124
125 }  // namespace fileapi