NS_IMETHODIMP UDPSocketParent::OnPacketReceived(nsIUDPSocket* aSocket, nsIUDPMessage* aMessage) { // receiving packet from remote host, forward the message content to child process if (!mIPCOpen) { return NS_OK; } NS_ASSERTION(mFilter, "No packet filter"); uint16_t port; nsCString ip; nsCOMPtr<nsINetAddr> fromAddr; aMessage->GetFromAddr(getter_AddRefs(fromAddr)); fromAddr->GetPort(&port); fromAddr->GetAddress(ip); nsCString data; aMessage->GetData(data); const char* buffer = data.get(); uint32_t len = data.Length(); bool allowed; mozilla::net::NetAddr addr; fromAddr->GetNetAddr(&addr); nsresult rv = mFilter->FilterPacket(&addr, (const uint8_t*)buffer, len, nsIUDPSocketFilter::SF_INCOMING, &allowed); // Receiving unallowed data, drop. NS_ENSURE_SUCCESS(rv, NS_OK); NS_ENSURE_TRUE(allowed, NS_OK); FallibleTArray<uint8_t> fallibleArray; if (!fallibleArray.InsertElementsAt(0, buffer, len)) { FireInternalError(this, __LINE__); return NS_ERROR_OUT_OF_MEMORY; } InfallibleTArray<uint8_t> infallibleArray; infallibleArray.SwapElements(fallibleArray); // compose callback mozilla::unused << PUDPSocketParent::SendCallback(NS_LITERAL_CSTRING("ondata"), UDPMessage(ip, port, infallibleArray), NS_LITERAL_CSTRING("connected")); return NS_OK; }
unsigned int TeaseLibService::processIdPacket(char* buffer) { const String deviceId = "My_Photon"; const char* parameters[] = {deviceId, deviceAddress, "1", services[0]->name, services[0]->description, services[0]->version}; return UDPMessage("services", parameters, sizeof(parameters)/sizeof(char*)).toBuffer(buffer); }