diff -r 000000000000 -r 6474c204b198 dom/bluetooth/ipc/BluetoothChild.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/bluetooth/ipc/BluetoothChild.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,169 @@ +/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ +/* vim: set ts=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 "base/basictypes.h" + +#include "BluetoothChild.h" + +#include "mozilla/Assertions.h" +#include "nsDebug.h" +#include "nsISupportsImpl.h" +#include "nsThreadUtils.h" + +#include "BluetoothReplyRunnable.h" +#include "BluetoothService.h" +#include "BluetoothServiceChildProcess.h" + +USING_BLUETOOTH_NAMESPACE + +namespace { + +BluetoothServiceChildProcess* sBluetoothService; + +} // anonymous namespace + +/******************************************************************************* + * BluetoothChild + ******************************************************************************/ + +BluetoothChild::BluetoothChild(BluetoothServiceChildProcess* aBluetoothService) +: mShutdownState(Running) +{ + MOZ_COUNT_CTOR(BluetoothChild); + MOZ_ASSERT(!sBluetoothService); + MOZ_ASSERT(aBluetoothService); + + sBluetoothService = aBluetoothService; +} + +BluetoothChild::~BluetoothChild() +{ + MOZ_COUNT_DTOR(BluetoothChild); + MOZ_ASSERT(sBluetoothService); + MOZ_ASSERT(mShutdownState == Dead); + + sBluetoothService = nullptr; +} + +void +BluetoothChild::BeginShutdown() +{ + // Only do something here if we haven't yet begun the shutdown sequence. + if (mShutdownState == Running) { + SendStopNotifying(); + mShutdownState = SentStopNotifying; + } +} + +void +BluetoothChild::ActorDestroy(ActorDestroyReason aWhy) +{ + MOZ_ASSERT(sBluetoothService); + + sBluetoothService->NoteDeadActor(); + +#ifdef DEBUG + mShutdownState = Dead; +#endif +} + +bool +BluetoothChild::RecvNotify(const BluetoothSignal& aSignal) +{ + MOZ_ASSERT(sBluetoothService); + + sBluetoothService->DistributeSignal(aSignal); + return true; +} + +bool +BluetoothChild::RecvEnabled(const bool& aEnabled) +{ + MOZ_ASSERT(sBluetoothService); + + sBluetoothService->SetEnabled(aEnabled); + return true; +} + +bool +BluetoothChild::RecvBeginShutdown() +{ + if (mShutdownState != Running && mShutdownState != SentStopNotifying) { + MOZ_ASSERT(false, "Bad state!"); + return false; + } + + SendStopNotifying(); + mShutdownState = SentStopNotifying; + + return true; +} + +bool +BluetoothChild::RecvNotificationsStopped() +{ + if (mShutdownState != SentStopNotifying) { + MOZ_ASSERT(false, "Bad state!"); + return false; + } + + Send__delete__(this); + return true; +} + +PBluetoothRequestChild* +BluetoothChild::AllocPBluetoothRequestChild(const Request& aRequest) +{ + MOZ_CRASH("Caller is supposed to manually construct a request!"); +} + +bool +BluetoothChild::DeallocPBluetoothRequestChild(PBluetoothRequestChild* aActor) +{ + delete aActor; + return true; +} + +/******************************************************************************* + * BluetoothRequestChild + ******************************************************************************/ + +BluetoothRequestChild::BluetoothRequestChild( + BluetoothReplyRunnable* aReplyRunnable) +: mReplyRunnable(aReplyRunnable) +{ + MOZ_COUNT_CTOR(BluetoothRequestChild); + MOZ_ASSERT(aReplyRunnable); +} + +BluetoothRequestChild::~BluetoothRequestChild() +{ + MOZ_COUNT_DTOR(BluetoothRequestChild); +} + +void +BluetoothRequestChild::ActorDestroy(ActorDestroyReason aWhy) +{ + // Nothing needed here. +} + +bool +BluetoothRequestChild::Recv__delete__(const BluetoothReply& aReply) +{ + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(mReplyRunnable); + + nsRefPtr replyRunnable; + mReplyRunnable.swap(replyRunnable); + + if (replyRunnable) { + // XXXbent Need to fix this, it copies unnecessarily. + replyRunnable->SetReply(new BluetoothReply(aReply)); + return NS_SUCCEEDED(NS_DispatchToCurrentThread(replyRunnable)); + } + + return true; +}