summaryrefslogtreecommitdiffstats
path: root/dom/simpledb/ActorsChild.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/simpledb/ActorsChild.cpp')
-rw-r--r--dom/simpledb/ActorsChild.cpp222
1 files changed, 222 insertions, 0 deletions
diff --git a/dom/simpledb/ActorsChild.cpp b/dom/simpledb/ActorsChild.cpp
new file mode 100644
index 0000000000..f6c234fa1d
--- /dev/null
+++ b/dom/simpledb/ActorsChild.cpp
@@ -0,0 +1,222 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "ActorsChild.h"
+
+// Local includes
+#include "SDBConnection.h"
+#include "SDBRequest.h"
+#include "SDBResults.h"
+
+// Global includes
+#include "mozilla/Assertions.h"
+#include "mozilla/dom/PBackgroundSDBRequest.h"
+#include "nsError.h"
+#include "nsID.h"
+#include "nsISDBResults.h"
+#include "nsVariant.h"
+
+namespace mozilla::dom {
+
+/*******************************************************************************
+ * SDBConnectionChild
+ ******************************************************************************/
+
+SDBConnectionChild::SDBConnectionChild(SDBConnection* aConnection)
+ : mConnection(aConnection) {
+ AssertIsOnOwningThread();
+ MOZ_ASSERT(aConnection);
+
+ MOZ_COUNT_CTOR(SDBConnectionChild);
+}
+
+SDBConnectionChild::~SDBConnectionChild() {
+ AssertIsOnOwningThread();
+
+ MOZ_COUNT_DTOR(SDBConnectionChild);
+}
+
+void SDBConnectionChild::SendDeleteMeInternal() {
+ AssertIsOnOwningThread();
+
+ if (mConnection) {
+ mConnection->ClearBackgroundActor();
+ mConnection = nullptr;
+
+ MOZ_ALWAYS_TRUE(PBackgroundSDBConnectionChild::SendDeleteMe());
+ }
+}
+
+void SDBConnectionChild::ActorDestroy(ActorDestroyReason aWhy) {
+ AssertIsOnOwningThread();
+
+ if (mConnection) {
+ mConnection->ClearBackgroundActor();
+#ifdef DEBUG
+ mConnection = nullptr;
+#endif
+ }
+}
+
+PBackgroundSDBRequestChild* SDBConnectionChild::AllocPBackgroundSDBRequestChild(
+ const SDBRequestParams& aParams) {
+ AssertIsOnOwningThread();
+
+ MOZ_CRASH(
+ "PBackgroundSDBRequestChild actors should be manually "
+ "constructed!");
+}
+
+bool SDBConnectionChild::DeallocPBackgroundSDBRequestChild(
+ PBackgroundSDBRequestChild* aActor) {
+ AssertIsOnOwningThread();
+ MOZ_ASSERT(aActor);
+
+ delete static_cast<SDBRequestChild*>(aActor);
+ return true;
+}
+
+mozilla::ipc::IPCResult SDBConnectionChild::RecvAllowToClose() {
+ AssertIsOnOwningThread();
+
+ if (mConnection) {
+ mConnection->AllowToClose();
+ }
+
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult SDBConnectionChild::RecvClosed() {
+ AssertIsOnOwningThread();
+
+ if (mConnection) {
+ mConnection->OnClose(/* aAbnormal */ true);
+ }
+
+ return IPC_OK();
+}
+
+/*******************************************************************************
+ * SDBRequestChild
+ ******************************************************************************/
+
+SDBRequestChild::SDBRequestChild(SDBRequest* aRequest)
+ : mConnection(aRequest->GetConnection()), mRequest(aRequest) {
+ AssertIsOnOwningThread();
+ MOZ_ASSERT(aRequest);
+
+ MOZ_COUNT_CTOR(SDBRequestChild);
+}
+
+SDBRequestChild::~SDBRequestChild() {
+ AssertIsOnOwningThread();
+
+ MOZ_COUNT_DTOR(SDBRequestChild);
+}
+
+#ifdef DEBUG
+
+void SDBRequestChild::AssertIsOnOwningThread() const {
+ MOZ_ASSERT(mRequest);
+ mRequest->AssertIsOnOwningThread();
+}
+
+#endif // DEBUG
+
+void SDBRequestChild::HandleResponse(nsresult aResponse) {
+ AssertIsOnOwningThread();
+ MOZ_ASSERT(NS_FAILED(aResponse));
+ MOZ_ASSERT(mRequest);
+
+ mRequest->SetError(aResponse);
+}
+
+void SDBRequestChild::HandleResponse() {
+ AssertIsOnOwningThread();
+ MOZ_ASSERT(mRequest);
+
+ RefPtr<nsVariant> variant = new nsVariant();
+ variant->SetAsVoid();
+
+ mRequest->SetResult(variant);
+}
+
+void SDBRequestChild::HandleResponse(const nsCString& aResponse) {
+ AssertIsOnOwningThread();
+ MOZ_ASSERT(mRequest);
+
+ RefPtr<SDBResult> result = new SDBResult(aResponse);
+
+ RefPtr<nsVariant> variant = new nsVariant();
+ variant->SetAsInterface(NS_GET_IID(nsISDBResult), result);
+
+ mRequest->SetResult(variant);
+}
+
+void SDBRequestChild::ActorDestroy(ActorDestroyReason aWhy) {
+ AssertIsOnOwningThread();
+
+ if (mConnection) {
+ mConnection->AssertIsOnOwningThread();
+
+ mConnection->OnRequestFinished();
+#ifdef DEBUG
+ mConnection = nullptr;
+#endif
+ }
+}
+
+mozilla::ipc::IPCResult SDBRequestChild::Recv__delete__(
+ const SDBRequestResponse& aResponse) {
+ AssertIsOnOwningThread();
+ MOZ_ASSERT(mRequest);
+ MOZ_ASSERT(mConnection);
+
+ switch (aResponse.type()) {
+ case SDBRequestResponse::Tnsresult:
+ HandleResponse(aResponse.get_nsresult());
+ break;
+
+ case SDBRequestResponse::TSDBRequestOpenResponse:
+ HandleResponse();
+
+ mConnection->OnOpen();
+
+ break;
+
+ case SDBRequestResponse::TSDBRequestSeekResponse:
+ HandleResponse();
+ break;
+
+ case SDBRequestResponse::TSDBRequestReadResponse:
+ HandleResponse(aResponse.get_SDBRequestReadResponse().data());
+ break;
+
+ case SDBRequestResponse::TSDBRequestWriteResponse:
+ HandleResponse();
+ break;
+
+ case SDBRequestResponse::TSDBRequestCloseResponse:
+ HandleResponse();
+
+ mConnection->OnClose(/* aAbnormal */ false);
+
+ break;
+
+ default:
+ MOZ_CRASH("Unknown response type!");
+ }
+
+ mConnection->OnRequestFinished();
+
+ // Null this out so that we don't try to call OnRequestFinished() again in
+ // ActorDestroy.
+ mConnection = nullptr;
+
+ return IPC_OK();
+}
+
+} // namespace mozilla::dom