void UDPSocketParent::Send(const IPCStream& aStream, const UDPSocketAddr& aAddr) { nsCOMPtr<nsIInputStream> stream = DeserializeIPCStream(aStream); if (NS_WARN_IF(!stream)) { return; } nsresult rv; switch (aAddr.type()) { case UDPSocketAddr::TUDPAddressInfo: { const UDPAddressInfo& addrInfo(aAddr.get_UDPAddressInfo()); rv = mSocket->SendBinaryStream(addrInfo.addr(), addrInfo.port(), stream); break; } case UDPSocketAddr::TNetAddr: { const NetAddr& addr(aAddr.get_NetAddr()); rv = mSocket->SendBinaryStreamWithAddress(&addr, stream); break; } default: MOZ_ASSERT(false, "Invalid address type!"); return; } if (NS_FAILED(rv)) { FireInternalError(__LINE__); } }
already_AddRefed<BlobImpl> Deserialize(const IPCBlob& aIPCBlob) { nsCOMPtr<nsIInputStream> inputStream; const IPCBlobStream& stream = aIPCBlob.inputStream(); switch (stream.type()) { // Parent to child: when an nsIInputStream is sent from parent to child, the // child receives a IPCBlobInputStream actor. case IPCBlobStream::TPIPCBlobInputStreamChild: { IPCBlobInputStreamChild* actor = static_cast<IPCBlobInputStreamChild*>(stream.get_PIPCBlobInputStreamChild()); inputStream = actor->CreateStream(); break; } // Child to Parent: when a blob is created on the content process send it's // sent to the parent, we have an IPCStream object. case IPCBlobStream::TIPCStream: MOZ_ASSERT(XRE_IsParentProcess()); inputStream = DeserializeIPCStream(stream.get_IPCStream()); break; default: MOZ_CRASH("Unknown type."); break; } MOZ_ASSERT(inputStream); RefPtr<StreamBlobImpl> blobImpl; if (aIPCBlob.file().type() == IPCFileUnion::Tvoid_t) { blobImpl = StreamBlobImpl::Create(inputStream.forget(), aIPCBlob.type(), aIPCBlob.size()); } else { const IPCFile& file = aIPCBlob.file().get_IPCFile(); blobImpl = StreamBlobImpl::Create(inputStream.forget(), file.name(), aIPCBlob.type(), file.lastModified(), aIPCBlob.size()); blobImpl->SetDOMPath(file.DOMPath()); blobImpl->SetFullPath(file.fullPath()); blobImpl->SetIsDirectory(file.isDirectory()); } blobImpl->SetFileId(aIPCBlob.fileId()); return blobImpl.forget(); }
already_AddRefed<InternalResponse> InternalResponse::FromIPC(const IPCInternalResponse& aIPCResponse) { if (aIPCResponse.type() == ResponseType::Error) { return InternalResponse::NetworkError(aIPCResponse.errorCode()); } RefPtr<InternalResponse> response = new InternalResponse(aIPCResponse.status(), aIPCResponse.statusText()); response->SetURLList(aIPCResponse.urlList()); response->mHeaders = new InternalHeaders(aIPCResponse.headers(), aIPCResponse.headersGuard()); response->InitChannelInfo(aIPCResponse.channelInfo()); if (aIPCResponse.principalInfo().type() == mozilla::ipc::OptionalPrincipalInfo::TPrincipalInfo) { UniquePtr<mozilla::ipc::PrincipalInfo> info(new mozilla::ipc::PrincipalInfo(aIPCResponse.principalInfo().get_PrincipalInfo())); response->SetPrincipalInfo(std::move(info)); } nsCOMPtr<nsIInputStream> stream = DeserializeIPCStream(aIPCResponse.body()); response->SetBody(stream, aIPCResponse.bodySize()); switch (aIPCResponse.type()) { case ResponseType::Basic: response = response->BasicResponse(); break; case ResponseType::Cors: response = response->CORSResponse(); break; case ResponseType::Default: break; case ResponseType::Opaque: response = response->OpaqueResponse(); break; case ResponseType::Opaqueredirect: response = response->OpaqueRedirectResponse(); break; default: MOZ_CRASH("Unexpected ResponseType!"); } MOZ_ASSERT(response); return response.forget(); }