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 file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "ActorsChild.h"
10 #include "SDBConnection.h"
11 #include "SDBRequest.h"
12 #include "SDBResults.h"
15 #include "mozilla/Assertions.h"
16 #include "mozilla/dom/PBackgroundSDBRequest.h"
19 #include "nsISDBResults.h"
20 #include "nsVariant.h"
22 namespace mozilla::dom
{
24 /*******************************************************************************
26 ******************************************************************************/
28 SDBConnectionChild::SDBConnectionChild(SDBConnection
* aConnection
)
29 : mConnection(aConnection
) {
30 AssertIsOnOwningThread();
31 MOZ_ASSERT(aConnection
);
33 MOZ_COUNT_CTOR(SDBConnectionChild
);
36 SDBConnectionChild::~SDBConnectionChild() {
37 AssertIsOnOwningThread();
39 MOZ_COUNT_DTOR(SDBConnectionChild
);
42 void SDBConnectionChild::SendDeleteMeInternal() {
43 AssertIsOnOwningThread();
46 mConnection
->ClearBackgroundActor();
47 mConnection
= nullptr;
49 MOZ_ALWAYS_TRUE(PBackgroundSDBConnectionChild::SendDeleteMe());
53 void SDBConnectionChild::ActorDestroy(ActorDestroyReason aWhy
) {
54 AssertIsOnOwningThread();
57 mConnection
->ClearBackgroundActor();
59 mConnection
= nullptr;
64 PBackgroundSDBRequestChild
* SDBConnectionChild::AllocPBackgroundSDBRequestChild(
65 const SDBRequestParams
& aParams
) {
66 AssertIsOnOwningThread();
69 "PBackgroundSDBRequestChild actors should be manually "
73 bool SDBConnectionChild::DeallocPBackgroundSDBRequestChild(
74 PBackgroundSDBRequestChild
* aActor
) {
75 AssertIsOnOwningThread();
78 delete static_cast<SDBRequestChild
*>(aActor
);
82 mozilla::ipc::IPCResult
SDBConnectionChild::RecvAllowToClose() {
83 AssertIsOnOwningThread();
86 mConnection
->AllowToClose();
92 mozilla::ipc::IPCResult
SDBConnectionChild::RecvClosed() {
93 AssertIsOnOwningThread();
96 mConnection
->OnClose(/* aAbnormal */ true);
102 /*******************************************************************************
104 ******************************************************************************/
106 SDBRequestChild::SDBRequestChild(SDBRequest
* aRequest
)
107 : mConnection(aRequest
->GetConnection()), mRequest(aRequest
) {
108 AssertIsOnOwningThread();
109 MOZ_ASSERT(aRequest
);
111 MOZ_COUNT_CTOR(SDBRequestChild
);
114 SDBRequestChild::~SDBRequestChild() {
115 AssertIsOnOwningThread();
117 MOZ_COUNT_DTOR(SDBRequestChild
);
122 void SDBRequestChild::AssertIsOnOwningThread() const {
123 MOZ_ASSERT(mRequest
);
124 mRequest
->AssertIsOnOwningThread();
129 void SDBRequestChild::HandleResponse(nsresult aResponse
) {
130 AssertIsOnOwningThread();
131 MOZ_ASSERT(NS_FAILED(aResponse
));
132 MOZ_ASSERT(mRequest
);
134 mRequest
->SetError(aResponse
);
137 void SDBRequestChild::HandleResponse() {
138 AssertIsOnOwningThread();
139 MOZ_ASSERT(mRequest
);
141 RefPtr
<nsVariant
> variant
= new nsVariant();
142 variant
->SetAsVoid();
144 mRequest
->SetResult(variant
);
147 void SDBRequestChild::HandleResponse(const nsCString
& aResponse
) {
148 AssertIsOnOwningThread();
149 MOZ_ASSERT(mRequest
);
151 RefPtr
<SDBResult
> result
= new SDBResult(aResponse
);
153 RefPtr
<nsVariant
> variant
= new nsVariant();
154 variant
->SetAsInterface(NS_GET_IID(nsISDBResult
), result
);
156 mRequest
->SetResult(variant
);
159 void SDBRequestChild::ActorDestroy(ActorDestroyReason aWhy
) {
160 AssertIsOnOwningThread();
163 mConnection
->AssertIsOnOwningThread();
165 mConnection
->OnRequestFinished();
167 mConnection
= nullptr;
172 mozilla::ipc::IPCResult
SDBRequestChild::Recv__delete__(
173 const SDBRequestResponse
& aResponse
) {
174 AssertIsOnOwningThread();
175 MOZ_ASSERT(mRequest
);
176 MOZ_ASSERT(mConnection
);
178 switch (aResponse
.type()) {
179 case SDBRequestResponse::Tnsresult
:
180 HandleResponse(aResponse
.get_nsresult());
183 case SDBRequestResponse::TSDBRequestOpenResponse
:
186 mConnection
->OnOpen();
190 case SDBRequestResponse::TSDBRequestSeekResponse
:
194 case SDBRequestResponse::TSDBRequestReadResponse
:
195 HandleResponse(aResponse
.get_SDBRequestReadResponse().data());
198 case SDBRequestResponse::TSDBRequestWriteResponse
:
202 case SDBRequestResponse::TSDBRequestCloseResponse
:
205 mConnection
->OnClose(/* aAbnormal */ false);
210 MOZ_CRASH("Unknown response type!");
213 mConnection
->OnRequestFinished();
215 // Null this out so that we don't try to call OnRequestFinished() again in
217 mConnection
= nullptr;
222 } // namespace mozilla::dom