//
// Automatically generated by ipdlc.
// Edit at your own risk
//


#include "mozilla/dom/PInProcessParent.h"
#include "mozilla/GfxMessageUtils.h"
#include "mozilla/RemoteLazyInputStream.h"
#include "mozilla/URLClassifierIPCUtils.h"
#include "mozilla/dom/CSPMessageUtils.h"
#include "mozilla/dom/DocShellMessageUtils.h"
#include "mozilla/dom/DomSecurityIPCUtils.h"
#include "mozilla/dom/InProcessParent.h"
#include "mozilla/dom/NavigationAPIIPCUtils.h"
#include "mozilla/dom/PermissionMessageUtils.h"
#include "mozilla/dom/PolicyContainerMessageUtils.h"
#include "mozilla/dom/PropertyBagUtils.h"
#include "mozilla/dom/ReferrerInfoUtils.h"
#include "mozilla/dom/RemoteType.h"
#include "mozilla/dom/SessionHistoryEntry.h"
#include "mozilla/dom/TabMessageUtils.h"
#include "mozilla/dom/ipc/StructuredCloneData.h"
#include "mozilla/dom/notification/IPCUtils.h"
#include "mozilla/ipc/BigBuffer.h"
#include "mozilla/ipc/IPCCore.h"
#include "mozilla/ipc/IPCStreamUtils.h"
#include "mozilla/ipc/URIUtils.h"
#include "mozilla/layers/LayersMessageUtils.h"
#include "mozilla/net/NeckoMessageUtils.h"
#include "nsIPolicyContainer.h"
#include "nsIPrincipal.h"
#include "nsIReferrerInfo.h"
#include "nsIURI.h"
#include "nsIVariant.h"
#include "nsStructuredCloneContainer.h"

#include "mozilla/extensions/PExtensionsParent.h"
#include "mozilla/dom/PSessionStoreParent.h"
#include "mozilla/dom/PWindowGlobalParent.h"

#include "ipc/IPCMessageUtils.h"
#include "ipc/IPCMessageUtilsSpecializations.h"
#include "nsIFile.h"
#include "mozilla/ipc/Endpoint.h"
#include "mozilla/ipc/ProtocolMessageUtils.h"
#include "mozilla/ipc/ProtocolUtils.h"
#include "mozilla/ipc/ShmemMessageUtils.h"
#include "mozilla/ipc/TaintingIPCUtils.h"

namespace mozilla {
namespace dom {


auto PInProcessParent::ProcessingError(
        Result aCode,
        const char* aReason) -> void
{
}

auto PInProcessParent::ShouldContinueFromReplyTimeout() -> bool
{
    return true;
}

MOZ_IMPLICIT PInProcessParent::PInProcessParent() :
    mozilla::ipc::IToplevelProtocol("PInProcessParent", kProtocolId, mozilla::ipc::ParentSide)
{
    MOZ_COUNT_CTOR(PInProcessParent);
}

PInProcessParent::~PInProcessParent()
{
    MOZ_COUNT_DTOR(PInProcessParent);
}

auto PInProcessParent::ActorAlloc() -> void
{
    MOZ_RELEASE_ASSERT(XRE_IsParentProcess(), "Invalid process for `PInProcessParent'");
    AddRef();
}

auto PInProcessParent::ActorDealloc() -> void
{
    Release();
}

auto PInProcessParent::ManagedPExtensionsParent(nsTArray<PExtensionsParent*>& aArr) const -> void
{
    mManagedPExtensionsParent.ToArray(aArr);
}

auto PInProcessParent::ManagedPExtensionsParent() const -> const ManagedContainer<PExtensionsParent>&
{
    return mManagedPExtensionsParent;
}

auto PInProcessParent::ManagedPSessionStoreParent(nsTArray<PSessionStoreParent*>& aArr) const -> void
{
    mManagedPSessionStoreParent.ToArray(aArr);
}

auto PInProcessParent::ManagedPSessionStoreParent() const -> const ManagedContainer<PSessionStoreParent>&
{
    return mManagedPSessionStoreParent;
}

auto PInProcessParent::ManagedPWindowGlobalParent(nsTArray<PWindowGlobalParent*>& aArr) const -> void
{
    mManagedPWindowGlobalParent.ToArray(aArr);
}

auto PInProcessParent::ManagedPWindowGlobalParent() const -> const ManagedContainer<PWindowGlobalParent>&
{
    return mManagedPWindowGlobalParent;
}

auto PInProcessParent::ManagedProtocolIds() const -> mozilla::Span<mozilla::ipc::ProtocolId const>
{
    static constexpr ::mozilla::ipc::ProtocolId sIds[] = {
        PExtensionsMsgStart,
        PSessionStoreMsgStart,
        PWindowGlobalMsgStart
    };
    return sIds;
}

auto PInProcessParent::GetManagedActors(mozilla::ipc::ProtocolId aProtocol) -> UntypedManagedContainer*
{
    switch (aProtocol) {
    case PExtensionsMsgStart:
        return (&(mManagedPExtensionsParent));
    case PSessionStoreMsgStart:
        return (&(mManagedPSessionStoreParent));
    case PWindowGlobalMsgStart:
        return (&(mManagedPWindowGlobalParent));
    default:
        return nullptr;
    }
}

auto PInProcessParent::OpenPExtensionsEndpoint(PExtensionsParent* aActor) -> ManagedEndpoint<PExtensionsChild>
{
    if (!aActor) {
        NS_WARNING("Cannot bind null PExtensionsParent actor");
        return ManagedEndpoint<PExtensionsChild>();
    }

    if (!aActor->SetManagerAndRegister(this)) {
        NS_WARNING("Failed to bind PExtensionsParent actor");
        return ManagedEndpoint<PExtensionsChild>();
    }

    // Mark our actor as awaiting the other side to be bound. This will
    // be cleared when a `MANAGED_ENDPOINT_{DROPPED,BOUND}` message is
    // received.
    aActor->mAwaitingManagedEndpointBind = true;
    return ManagedEndpoint<PExtensionsChild>(mozilla::ipc::PrivateIPDLInterface(), aActor);
}

auto PInProcessParent::BindPExtensionsEndpoint(
        ManagedEndpoint<PExtensionsParent> aEndpoint,
        PExtensionsParent* aActor) -> bool
{
    return aEndpoint.Bind(mozilla::ipc::PrivateIPDLInterface(), aActor, this);
}

auto PInProcessParent::OpenPSessionStoreEndpoint(PSessionStoreParent* aActor) -> ManagedEndpoint<PSessionStoreChild>
{
    if (!aActor) {
        NS_WARNING("Cannot bind null PSessionStoreParent actor");
        return ManagedEndpoint<PSessionStoreChild>();
    }

    if (!aActor->SetManagerAndRegister(this)) {
        NS_WARNING("Failed to bind PSessionStoreParent actor");
        return ManagedEndpoint<PSessionStoreChild>();
    }

    // Mark our actor as awaiting the other side to be bound. This will
    // be cleared when a `MANAGED_ENDPOINT_{DROPPED,BOUND}` message is
    // received.
    aActor->mAwaitingManagedEndpointBind = true;
    return ManagedEndpoint<PSessionStoreChild>(mozilla::ipc::PrivateIPDLInterface(), aActor);
}

auto PInProcessParent::BindPSessionStoreEndpoint(
        ManagedEndpoint<PSessionStoreParent> aEndpoint,
        PSessionStoreParent* aActor) -> bool
{
    return aEndpoint.Bind(mozilla::ipc::PrivateIPDLInterface(), aActor, this);
}

auto PInProcessParent::OpenPWindowGlobalEndpoint(PWindowGlobalParent* aActor) -> ManagedEndpoint<PWindowGlobalChild>
{
    if (!aActor) {
        NS_WARNING("Cannot bind null PWindowGlobalParent actor");
        return ManagedEndpoint<PWindowGlobalChild>();
    }

    if (!aActor->SetManagerAndRegister(this)) {
        NS_WARNING("Failed to bind PWindowGlobalParent actor");
        return ManagedEndpoint<PWindowGlobalChild>();
    }

    // Mark our actor as awaiting the other side to be bound. This will
    // be cleared when a `MANAGED_ENDPOINT_{DROPPED,BOUND}` message is
    // received.
    aActor->mAwaitingManagedEndpointBind = true;
    return ManagedEndpoint<PWindowGlobalChild>(mozilla::ipc::PrivateIPDLInterface(), aActor);
}

auto PInProcessParent::BindPWindowGlobalEndpoint(
        ManagedEndpoint<PWindowGlobalParent> aEndpoint,
        PWindowGlobalParent* aActor) -> bool
{
    return aEndpoint.Bind(mozilla::ipc::PrivateIPDLInterface(), aActor, this);
}

auto PInProcessParent::DeallocManagee(
        mozilla::ipc::ProtocolId aProtocolId,
        IProtocol* aListener) -> void
{
    switch (aProtocolId) {
    default:
        FatalError("unreached");
        return;
    }
}

auto PInProcessParent::OnMessageReceived(const Message& msg__) -> PInProcessParent::Result
{
    if (!CanSend()) {
        if (mozilla::ipc::LoggingEnabledFor("PInProcess", mozilla::ipc::ParentSide)) {
            mozilla::ipc::LogMessageForProtocol(
                "PInProcessParent",
                this->ToplevelProtocol()->OtherPidMaybeInvalid(),
                "Ignored message for dead actor",
                (&(msg__))->type(),
                mozilla::ipc::MessageDirection::eSending);
        }
        return MsgProcessed;

    }
    IPC::Message::routeid_t route__ = msg__.routing_id();
    if (MSG_ROUTING_CONTROL != route__) {
        IProtocol* routed__ = Lookup(route__);
        if (!routed__ || !routed__->GetLifecycleProxy()) {
            if (mozilla::ipc::LoggingEnabledFor("PInProcess", mozilla::ipc::ParentSide)) {
                mozilla::ipc::LogMessageForProtocol(
                    "PInProcessParent",
                    this->ToplevelProtocol()->OtherPidMaybeInvalid(),
                    "Ignored message for dead actor",
                    (&(msg__))->type(),
                    mozilla::ipc::MessageDirection::eSending);
            }
            return MsgProcessed;

        }

        RefPtr<mozilla::ipc::ActorLifecycleProxy> proxy__ =
            routed__->GetLifecycleProxy();
        return proxy__->Get()->OnMessageReceived(msg__);
    }

    switch (msg__.type()) {
    default:
        return MsgNotKnown;
    case SHMEM_CREATED_MESSAGE_TYPE:
        {
            if (!ShmemCreated(msg__)) {
                return MsgPayloadError;
            }
            return MsgProcessed;
        }
    case SHMEM_DESTROYED_MESSAGE_TYPE:
        {
            if (!ShmemDestroyed(msg__)) {
                return MsgPayloadError;
            }
            return MsgProcessed;
        }
    }
}

auto PInProcessParent::OnMessageReceived(
        const Message& msg__,
        UniquePtr<Message>& reply__) -> PInProcessParent::Result
{
    if (!CanSend()) {
        return MsgDropped;

    }
    IPC::Message::routeid_t route__ = msg__.routing_id();
    if (MSG_ROUTING_CONTROL != route__) {
        IProtocol* routed__ = Lookup(route__);
        if (!routed__ || !routed__->GetLifecycleProxy()) {
            return MsgDropped;

        }

        RefPtr<mozilla::ipc::ActorLifecycleProxy> proxy__ =
            routed__->GetLifecycleProxy();
        return proxy__->Get()->OnMessageReceived(msg__, reply__);
    }

    MOZ_ASSERT_UNREACHABLE("message protocol not supported");
    return MsgNotKnown;
}



} // namespace dom
} // namespace mozilla
