예제 #1
0
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);
}
예제 #2
0
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");
  }
}