Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #include "QuotaRequests.h"
8 :
9 : #include "ActorsChild.h"
10 : #include "nsIQuotaCallbacks.h"
11 :
12 : namespace mozilla {
13 : namespace dom {
14 : namespace quota {
15 :
16 0 : RequestBase::RequestBase()
17 : : mResultCode(NS_OK)
18 0 : , mHaveResultOrErrorCode(false)
19 : {
20 0 : AssertIsOnOwningThread();
21 0 : }
22 :
23 0 : RequestBase::RequestBase(nsIPrincipal* aPrincipal)
24 : : mPrincipal(aPrincipal)
25 : , mResultCode(NS_OK)
26 0 : , mHaveResultOrErrorCode(false)
27 : {
28 0 : AssertIsOnOwningThread();
29 0 : }
30 :
31 : #ifdef DEBUG
32 :
33 : void
34 0 : RequestBase::AssertIsOnOwningThread() const
35 : {
36 0 : NS_ASSERT_OWNINGTHREAD(RequestBase);
37 0 : }
38 :
39 : #endif // DEBUG
40 :
41 : void
42 0 : RequestBase::SetError(nsresult aRv)
43 : {
44 0 : AssertIsOnOwningThread();
45 0 : MOZ_ASSERT(mResultCode == NS_OK);
46 0 : MOZ_ASSERT(!mHaveResultOrErrorCode);
47 :
48 0 : mResultCode = aRv;
49 0 : mHaveResultOrErrorCode = true;
50 :
51 0 : FireCallback();
52 0 : }
53 :
54 0 : NS_IMPL_CYCLE_COLLECTION_0(RequestBase)
55 :
56 0 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RequestBase)
57 0 : NS_INTERFACE_MAP_ENTRY(nsISupports)
58 0 : NS_INTERFACE_MAP_END
59 :
60 0 : NS_IMPL_CYCLE_COLLECTING_ADDREF(RequestBase)
61 0 : NS_IMPL_CYCLE_COLLECTING_RELEASE(RequestBase)
62 :
63 : NS_IMETHODIMP
64 0 : RequestBase::GetPrincipal(nsIPrincipal** aPrincipal)
65 : {
66 0 : AssertIsOnOwningThread();
67 0 : MOZ_ASSERT(aPrincipal);
68 :
69 0 : NS_IF_ADDREF(*aPrincipal = mPrincipal);
70 0 : return NS_OK;
71 : }
72 :
73 : NS_IMETHODIMP
74 0 : RequestBase::GetResultCode(nsresult* aResultCode)
75 : {
76 0 : AssertIsOnOwningThread();
77 0 : MOZ_ASSERT(aResultCode);
78 :
79 0 : if (!mHaveResultOrErrorCode) {
80 0 : return NS_ERROR_FAILURE;
81 : }
82 :
83 0 : *aResultCode = mResultCode;
84 0 : return NS_OK;
85 : }
86 :
87 0 : UsageRequest::UsageRequest(nsIQuotaUsageCallback* aCallback)
88 : : mCallback(aCallback)
89 : , mBackgroundActor(nullptr)
90 0 : , mCanceled(false)
91 : {
92 0 : AssertIsOnOwningThread();
93 0 : MOZ_ASSERT(aCallback);
94 0 : }
95 :
96 0 : UsageRequest::UsageRequest(nsIPrincipal* aPrincipal,
97 0 : nsIQuotaUsageCallback* aCallback)
98 : : RequestBase(aPrincipal)
99 : , mCallback(aCallback)
100 : , mBackgroundActor(nullptr)
101 0 : , mCanceled(false)
102 : {
103 0 : AssertIsOnOwningThread();
104 0 : MOZ_ASSERT(aPrincipal);
105 0 : MOZ_ASSERT(aCallback);
106 0 : }
107 :
108 0 : UsageRequest::~UsageRequest()
109 : {
110 0 : AssertIsOnOwningThread();
111 0 : }
112 :
113 : void
114 0 : UsageRequest::SetBackgroundActor(QuotaUsageRequestChild* aBackgroundActor)
115 : {
116 0 : AssertIsOnOwningThread();
117 0 : MOZ_ASSERT(aBackgroundActor);
118 0 : MOZ_ASSERT(!mBackgroundActor);
119 :
120 0 : mBackgroundActor = aBackgroundActor;
121 :
122 0 : if (mCanceled) {
123 0 : mBackgroundActor->SendCancel();
124 : }
125 0 : }
126 :
127 : void
128 0 : UsageRequest::SetResult(nsIVariant* aResult)
129 : {
130 0 : AssertIsOnOwningThread();
131 0 : MOZ_ASSERT(aResult);
132 0 : MOZ_ASSERT(!mHaveResultOrErrorCode);
133 :
134 0 : mResult = aResult;
135 :
136 0 : mHaveResultOrErrorCode = true;
137 :
138 0 : FireCallback();
139 0 : }
140 :
141 0 : NS_IMPL_CYCLE_COLLECTION_INHERITED(UsageRequest, RequestBase, mCallback)
142 :
143 0 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(UsageRequest)
144 0 : NS_INTERFACE_MAP_ENTRY(nsIQuotaUsageRequest)
145 0 : NS_INTERFACE_MAP_END_INHERITING(RequestBase)
146 :
147 0 : NS_IMPL_ADDREF_INHERITED(UsageRequest, RequestBase)
148 0 : NS_IMPL_RELEASE_INHERITED(UsageRequest, RequestBase)
149 :
150 : NS_IMETHODIMP
151 0 : UsageRequest::GetResult(nsIVariant** aResult)
152 : {
153 0 : AssertIsOnOwningThread();
154 0 : MOZ_ASSERT(aResult);
155 :
156 0 : if (!mHaveResultOrErrorCode) {
157 0 : return NS_ERROR_FAILURE;
158 : }
159 :
160 0 : NS_IF_ADDREF(*aResult = mResult);
161 0 : return NS_OK;
162 : }
163 :
164 : NS_IMETHODIMP
165 0 : UsageRequest::GetCallback(nsIQuotaUsageCallback** aCallback)
166 : {
167 0 : AssertIsOnOwningThread();
168 0 : MOZ_ASSERT(aCallback);
169 :
170 0 : NS_IF_ADDREF(*aCallback = mCallback);
171 0 : return NS_OK;
172 : }
173 :
174 : NS_IMETHODIMP
175 0 : UsageRequest::SetCallback(nsIQuotaUsageCallback* aCallback)
176 : {
177 0 : AssertIsOnOwningThread();
178 :
179 0 : mCallback = aCallback;
180 0 : return NS_OK;
181 : }
182 :
183 : NS_IMETHODIMP
184 0 : UsageRequest::Cancel()
185 : {
186 0 : AssertIsOnOwningThread();
187 :
188 0 : if (mCanceled) {
189 0 : NS_WARNING("Canceled more than once?!");
190 0 : return NS_ERROR_UNEXPECTED;
191 : }
192 :
193 0 : if (mBackgroundActor) {
194 0 : mBackgroundActor->SendCancel();
195 : }
196 :
197 0 : mCanceled = true;
198 :
199 0 : return NS_OK;
200 : }
201 :
202 : void
203 0 : UsageRequest::FireCallback()
204 : {
205 0 : AssertIsOnOwningThread();
206 0 : MOZ_ASSERT(mCallback);
207 :
208 0 : mCallback->OnUsageResult(this);
209 :
210 : // Clean up.
211 0 : mCallback = nullptr;
212 0 : }
213 :
214 0 : Request::Request()
215 : {
216 0 : AssertIsOnOwningThread();
217 0 : }
218 :
219 0 : Request::Request(nsIPrincipal* aPrincipal)
220 0 : : RequestBase(aPrincipal)
221 : {
222 0 : AssertIsOnOwningThread();
223 0 : MOZ_ASSERT(aPrincipal);
224 0 : }
225 :
226 0 : Request::~Request()
227 : {
228 0 : AssertIsOnOwningThread();
229 0 : }
230 :
231 : void
232 0 : Request::SetResult(nsIVariant* aResult)
233 : {
234 0 : AssertIsOnOwningThread();
235 0 : MOZ_ASSERT(aResult);
236 0 : MOZ_ASSERT(!mHaveResultOrErrorCode);
237 :
238 0 : mResult = aResult;
239 :
240 0 : mHaveResultOrErrorCode = true;
241 :
242 0 : FireCallback();
243 0 : }
244 :
245 : NS_IMETHODIMP
246 0 : Request::GetResult(nsIVariant** aResult)
247 : {
248 0 : AssertIsOnOwningThread();
249 0 : MOZ_ASSERT(aResult);
250 :
251 0 : if (!mHaveResultOrErrorCode) {
252 0 : return NS_ERROR_FAILURE;
253 : }
254 :
255 0 : NS_IF_ADDREF(*aResult = mResult);
256 0 : return NS_OK;
257 : }
258 :
259 0 : NS_IMPL_CYCLE_COLLECTION_INHERITED(Request, RequestBase, mCallback, mResult)
260 :
261 0 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(Request)
262 0 : NS_INTERFACE_MAP_ENTRY(nsIQuotaRequest)
263 0 : NS_INTERFACE_MAP_END_INHERITING(RequestBase)
264 :
265 0 : NS_IMPL_ADDREF_INHERITED(mozilla::dom::quota::Request, RequestBase)
266 0 : NS_IMPL_RELEASE_INHERITED(mozilla::dom::quota::Request, RequestBase)
267 :
268 : NS_IMETHODIMP
269 0 : Request::GetCallback(nsIQuotaCallback** aCallback)
270 : {
271 0 : AssertIsOnOwningThread();
272 0 : MOZ_ASSERT(aCallback);
273 :
274 0 : NS_IF_ADDREF(*aCallback = mCallback);
275 0 : return NS_OK;
276 : }
277 :
278 : NS_IMETHODIMP
279 0 : Request::SetCallback(nsIQuotaCallback* aCallback)
280 : {
281 0 : AssertIsOnOwningThread();
282 :
283 0 : mCallback = aCallback;
284 0 : return NS_OK;
285 : }
286 :
287 : void
288 0 : Request::FireCallback()
289 : {
290 0 : AssertIsOnOwningThread();
291 :
292 0 : if (mCallback) {
293 0 : mCallback->OnComplete(this);
294 :
295 : // Clean up.
296 0 : mCallback = nullptr;
297 : }
298 0 : }
299 :
300 : } // namespace quota
301 : } // namespace dom
302 : } // namespace mozilla
|