bool Open(const PrivateIPDLInterface&, MessageChannel* aOpenerChannel, ProcessId aOtherProcessId, Transport::Mode aOpenerMode, ProtocolId aProtocol, ProtocolId aChildProtocol) { bool isParent = (Transport::MODE_SERVER == aOpenerMode); ProcessId thisPid = GetCurrentProcId(); ProcessId parentId = isParent ? thisPid : aOtherProcessId; ProcessId childId = !isParent ? thisPid : aOtherProcessId; if (!parentId || !childId) { return false; } TransportDescriptor parentSide, childSide; if (!CreateTransport(parentId, &parentSide, &childSide)) { return false; } Message* parentMsg = new ChannelOpened(parentSide, childId, aProtocol); Message* childMsg = new ChannelOpened(childSide, parentId, aChildProtocol); nsAutoPtr<Message> messageForUs(isParent ? parentMsg : childMsg); nsAutoPtr<Message> messageForOtherSide(!isParent ? parentMsg : childMsg); if (!aOpenerChannel->Echo(messageForUs.forget()) || !aOpenerChannel->Send(messageForOtherSide.forget())) { CloseDescriptor(parentSide); CloseDescriptor(childSide); return false; } return true; }
bool Bridge(const PrivateIPDLInterface&, MessageChannel* aParentChannel, ProcessHandle aParentProcess, MessageChannel* aChildChannel, ProcessHandle aChildProcess, ProtocolId aProtocol, ProtocolId aChildProtocol) { ProcessId parentId = GetProcId(aParentProcess); ProcessId childId = GetProcId(aChildProcess); if (!parentId || !childId) { return false; } TransportDescriptor parentSide, childSide; if (!CreateTransport(aParentProcess, aChildProcess, &parentSide, &childSide)) { return false; } if (!aParentChannel->Send(new ChannelOpened(parentSide, childId, aProtocol)) || !aChildChannel->Send(new ChannelOpened(childSide, parentId, aChildProtocol))) { CloseDescriptor(parentSide); CloseDescriptor(childSide); return false; } return true; }
bool Bridge(const PrivateIPDLInterface&, MessageChannel* aParentChannel, ProcessId aParentPid, MessageChannel* aChildChannel, ProcessId aChildPid, ProtocolId aProtocol, ProtocolId aChildProtocol) { if (!aParentPid || !aChildPid) { return false; } TransportDescriptor parentSide, childSide; if (!CreateTransport(aParentPid, &parentSide, &childSide)) { return false; } if (!aParentChannel->Send(new ChannelOpened(parentSide, aChildPid, aProtocol, IPC::Message::PRIORITY_URGENT)) || !aChildChannel->Send(new ChannelOpened(childSide, aParentPid, aChildProtocol, IPC::Message::PRIORITY_URGENT))) { CloseDescriptor(parentSide); CloseDescriptor(childSide); return false; } return true; }
nsresult Bridge(const PrivateIPDLInterface&, MessageChannel* aParentChannel, ProcessId aParentPid, MessageChannel* aChildChannel, ProcessId aChildPid, ProtocolId aProtocol, ProtocolId aChildProtocol) { if (!aParentPid || !aChildPid) { return NS_ERROR_INVALID_ARG; } TransportDescriptor parentSide, childSide; nsresult rv; if (NS_FAILED(rv = CreateTransport(aParentPid, &parentSide, &childSide))) { return rv; } if (!aParentChannel->Send(new ChannelOpened(parentSide, aChildPid, aProtocol, IPC::Message::NESTED_INSIDE_CPOW))) { CloseDescriptor(parentSide); CloseDescriptor(childSide); return NS_ERROR_BRIDGE_OPEN_PARENT; } if (!aChildChannel->Send(new ChannelOpened(childSide, aParentPid, aChildProtocol, IPC::Message::NESTED_INSIDE_CPOW))) { CloseDescriptor(parentSide); CloseDescriptor(childSide); return NS_ERROR_BRIDGE_OPEN_CHILD; } return NS_OK; }