Maybe<IProtocol*> IProtocol::ReadActor(const IPC::Message* aMessage, PickleIterator* aIter, bool aNullable, const char* aActorDescription, int32_t aProtocolTypeId) { int32_t id; if (!IPC::ReadParam(aMessage, aIter, &id)) { ActorIdReadError(aActorDescription); return Nothing(); } if (id == 1 || (id == 0 && !aNullable)) { BadActorIdError(aActorDescription); return Nothing(); } if (id == 0) { return Some(static_cast<IProtocol*>(nullptr)); } IProtocol* listener = this->Lookup(id); if (!listener) { ActorLookupError(aActorDescription); return Nothing(); } if (listener->GetProtocolTypeId() != aProtocolTypeId) { MismatchedActorTypeError(aActorDescription); return Nothing(); } return Some(listener); }
nsresult SerializeUntyped(BlobImpl* aBlobImpl, IProtocol* aActor, IPCBlob& aIPCBlob) { // We always want to act on the toplevel protocol. IProtocol* manager = aActor; while (manager->Manager()) { manager = manager->Manager(); } // We always need the toplevel protocol switch(manager->GetProtocolTypeId()) { case PBackgroundMsgStart: if (manager->GetSide() == mozilla::ipc::ParentSide) { return SerializeInternal(aBlobImpl, static_cast<PBackgroundParent*>(manager), aIPCBlob); } else { return SerializeInternal(aBlobImpl, static_cast<PBackgroundChild*>(manager), aIPCBlob); } case PContentMsgStart: if (manager->GetSide() == mozilla::ipc::ParentSide) { return SerializeInternal(aBlobImpl, static_cast<ContentParent*>(manager), aIPCBlob); } else { return SerializeInternal(aBlobImpl, static_cast<ContentChild*>(manager), aIPCBlob); } default: MOZ_CRASH("Unsupported protocol passed to BlobImpl serialize"); } }