mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-20 16:55:40 +00:00
265e672179
# ignore-this-changeset --HG-- extra : amend_source : 4d301d3b0b8711c4692392aa76088ba7fd7d1022
229 lines
6.4 KiB
C++
229 lines
6.4 KiB
C++
/* -*- 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 "DCPresentationChannelDescription.h"
|
|
#include "PresentationBuilderParent.h"
|
|
#include "PresentationSessionInfo.h"
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
namespace {
|
|
|
|
class PresentationSessionTransportIPC final
|
|
: public nsIPresentationSessionTransport {
|
|
public:
|
|
NS_DECL_ISUPPORTS
|
|
NS_DECL_NSIPRESENTATIONSESSIONTRANSPORT
|
|
|
|
PresentationSessionTransportIPC(PresentationParent* aParent,
|
|
const nsAString& aSessionId, uint8_t aRole)
|
|
: mParent(aParent), mSessionId(aSessionId), mRole(aRole) {
|
|
MOZ_ASSERT(mParent);
|
|
}
|
|
|
|
private:
|
|
virtual ~PresentationSessionTransportIPC() = default;
|
|
|
|
RefPtr<PresentationParent> mParent;
|
|
nsString mSessionId;
|
|
uint8_t mRole;
|
|
};
|
|
|
|
NS_IMPL_ISUPPORTS(PresentationSessionTransportIPC,
|
|
nsIPresentationSessionTransport)
|
|
|
|
NS_IMETHODIMP
|
|
PresentationSessionTransportIPC::GetCallback(
|
|
nsIPresentationSessionTransportCallback** aCallback) {
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
PresentationSessionTransportIPC::SetCallback(
|
|
nsIPresentationSessionTransportCallback* aCallback) {
|
|
if (aCallback) {
|
|
aCallback->NotifyTransportReady();
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
PresentationSessionTransportIPC::GetSelfAddress(nsINetAddr** aSelfAddress) {
|
|
MOZ_ASSERT(false, "Not expected.");
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
PresentationSessionTransportIPC::EnableDataNotification() { return NS_OK; }
|
|
|
|
NS_IMETHODIMP
|
|
PresentationSessionTransportIPC::Send(const nsAString& aData) { return NS_OK; }
|
|
|
|
NS_IMETHODIMP
|
|
PresentationSessionTransportIPC::SendBinaryMsg(const nsACString& aData) {
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
PresentationSessionTransportIPC::SendBlob(Blob* aBlob) { return NS_OK; }
|
|
|
|
NS_IMETHODIMP
|
|
PresentationSessionTransportIPC::Close(nsresult aReason) {
|
|
if (NS_WARN_IF(!mParent->SendNotifyCloseSessionTransport(mSessionId, mRole,
|
|
aReason))) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
} // anonymous namespace
|
|
|
|
NS_IMPL_ISUPPORTS(PresentationBuilderParent,
|
|
nsIPresentationSessionTransportBuilder,
|
|
nsIPresentationDataChannelSessionTransportBuilder)
|
|
|
|
PresentationBuilderParent::PresentationBuilderParent(
|
|
PresentationParent* aParent)
|
|
: mParent(aParent) {}
|
|
|
|
PresentationBuilderParent::~PresentationBuilderParent() {
|
|
if (mNeedDestroyActor) {
|
|
Unused << NS_WARN_IF(!Send__delete__(this));
|
|
}
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
PresentationBuilderParent::BuildDataChannelTransport(
|
|
uint8_t aRole, mozIDOMWindow* aWindow, /* unused */
|
|
nsIPresentationSessionTransportBuilderListener* aListener) {
|
|
mBuilderListener = aListener;
|
|
|
|
RefPtr<PresentationSessionInfo> info =
|
|
static_cast<PresentationSessionInfo*>(aListener);
|
|
nsAutoString sessionId(info->GetSessionId());
|
|
if (NS_WARN_IF(!mParent->SendPPresentationBuilderConstructor(this, sessionId,
|
|
aRole))) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
mIPCSessionTransport =
|
|
new PresentationSessionTransportIPC(mParent, sessionId, aRole);
|
|
mNeedDestroyActor = true;
|
|
mParent = nullptr;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
PresentationBuilderParent::OnIceCandidate(const nsAString& aCandidate) {
|
|
if (NS_WARN_IF(!SendOnIceCandidate(nsString(aCandidate)))) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
PresentationBuilderParent::OnOffer(
|
|
nsIPresentationChannelDescription* aDescription) {
|
|
nsAutoString SDP;
|
|
nsresult rv = aDescription->GetDataChannelSDP(SDP);
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
return rv;
|
|
}
|
|
|
|
if (NS_WARN_IF(!SendOnOffer(SDP))) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
PresentationBuilderParent::OnAnswer(
|
|
nsIPresentationChannelDescription* aDescription) {
|
|
nsAutoString SDP;
|
|
nsresult rv = aDescription->GetDataChannelSDP(SDP);
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
return rv;
|
|
}
|
|
|
|
if (NS_WARN_IF(!SendOnAnswer(SDP))) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
PresentationBuilderParent::NotifyDisconnected(nsresult aReason) {
|
|
return NS_OK;
|
|
}
|
|
|
|
void PresentationBuilderParent::ActorDestroy(ActorDestroyReason aWhy) {
|
|
mNeedDestroyActor = false;
|
|
mParent = nullptr;
|
|
mBuilderListener = nullptr;
|
|
}
|
|
|
|
mozilla::ipc::IPCResult PresentationBuilderParent::RecvSendOffer(
|
|
const nsString& aSDP) {
|
|
RefPtr<DCPresentationChannelDescription> description =
|
|
new DCPresentationChannelDescription(aSDP);
|
|
if (NS_WARN_IF(!mBuilderListener ||
|
|
NS_FAILED(mBuilderListener->SendOffer(description)))) {
|
|
return IPC_FAIL_NO_REASON(this);
|
|
}
|
|
return IPC_OK();
|
|
}
|
|
|
|
mozilla::ipc::IPCResult PresentationBuilderParent::RecvSendAnswer(
|
|
const nsString& aSDP) {
|
|
RefPtr<DCPresentationChannelDescription> description =
|
|
new DCPresentationChannelDescription(aSDP);
|
|
if (NS_WARN_IF(!mBuilderListener ||
|
|
NS_FAILED(mBuilderListener->SendAnswer(description)))) {
|
|
return IPC_FAIL_NO_REASON(this);
|
|
}
|
|
return IPC_OK();
|
|
}
|
|
|
|
mozilla::ipc::IPCResult PresentationBuilderParent::RecvSendIceCandidate(
|
|
const nsString& aCandidate) {
|
|
if (NS_WARN_IF(!mBuilderListener ||
|
|
NS_FAILED(mBuilderListener->SendIceCandidate(aCandidate)))) {
|
|
return IPC_FAIL_NO_REASON(this);
|
|
}
|
|
return IPC_OK();
|
|
}
|
|
|
|
mozilla::ipc::IPCResult PresentationBuilderParent::RecvClose(
|
|
const nsresult& aReason) {
|
|
if (NS_WARN_IF(!mBuilderListener ||
|
|
NS_FAILED(mBuilderListener->Close(aReason)))) {
|
|
return IPC_FAIL_NO_REASON(this);
|
|
}
|
|
return IPC_OK();
|
|
}
|
|
|
|
// Delegate to nsIPresentationSessionTransportBuilderListener
|
|
mozilla::ipc::IPCResult PresentationBuilderParent::RecvOnSessionTransport() {
|
|
RefPtr<PresentationBuilderParent> kungFuDeathGrip = this;
|
|
Unused << NS_WARN_IF(
|
|
!mBuilderListener ||
|
|
NS_FAILED(mBuilderListener->OnSessionTransport(mIPCSessionTransport)));
|
|
return IPC_OK();
|
|
}
|
|
|
|
mozilla::ipc::IPCResult PresentationBuilderParent::RecvOnSessionTransportError(
|
|
const nsresult& aReason) {
|
|
if (NS_WARN_IF(!mBuilderListener ||
|
|
NS_FAILED(mBuilderListener->OnError(aReason)))) {
|
|
return IPC_FAIL_NO_REASON(this);
|
|
}
|
|
return IPC_OK();
|
|
}
|
|
|
|
} // namespace dom
|
|
} // namespace mozilla
|