public function decode() { parent::decode(); $this->splitpackets = []; $this->packets = []; $this->seqNumber = $this->getLTriad(); while (!$this->feof()) { $offset = 0; $data = substr($this->buffer, $this->offset); $packet = EncapsulatedPacket::fromBinary($data, false, $offset); $this->offset += $offset; if (strlen($packet->buffer) === 0) { break; } if ($packet->hasSplit) { $this->splitpackets[] = $packet; } else { $this->packets[] = $packet; } } }
public function ReceivePacket($callname, $buffer) { $id = ord($buffer[0]); switch ($id) { case 1: $packet = new UnconnectedPingPacket($buffer); break; case 5: $packet = new OpenConnectionRequest1Packet($buffer); break; case 6: $packet = new OpenConnectionReply1Packet($buffer); break; case 7: $packet = new OpenConnectionRequest2Packet($buffer); break; case 8: $packet = new OpenConnectionReply2Packet($buffer); break; case 28: $packet = new UnconnectedPongPacket($buffer); break; case 128: case 129: case 130: case 131: case 132: case 133: case 134: case 135: case 136: case 137: case 138: case 139: case 140: case 141: case 142: case 143: $packet = new CustomPacket($buffer); $packet->decode(); foreach ($packet->packets as $num => $enpacket) { $enpacket = EncapsulatedPacket::fromBinary($enpacket->toBinary(true), true); $this->datapacketanlyze->ReceiveDataPacket($enpacket->buffer, $callname, $this->status); } foreach ($packet->splitpackets as $num => $splitpacket) { if ($splitpacket->splitCount >= 128) { return; } if (!isset($this->splitPackets[$splitpacket->splitID])) { $this->splitPackets[$splitpacket->splitID] = [$splitpacket->splitIndex => $splitpacket]; } else { $this->splitPackets[$splitpacket->splitID][$splitpacket->splitIndex] = $splitpacket; } if (count($this->splitPackets[$splitpacket->splitID]) === $splitpacket->splitCount) { $pk = new EncapsulatedPacket(); $pk->buffer = ""; for ($i = 0; $i < $splitpacket->splitCount; ++$i) { if (isset($this->splitPackets[$splitpacket->splitID][$i])) { $pk->buffer .= $this->splitPackets[$splitpacket->splitID][$i]->buffer; } else { $this->logger->debug("[Encapsulated] " . $splitpacket->splitID . " : " . $i . "", 1); } } $pk->length = strlen($pk->buffer); unset($this->splitPackets[$splitpacket->splitID]); $this->datapacketanlyze->ReceiveDataPacket($pk->buffer, $callname, $this->status); } } break; case 160: $packet = new NACK($buffer); break; case 192: $packet = new ACK($buffer); break; default: $packet = new UnknownPacket($buffer); break; } $this->logger->debug("RakPacket (" . $callname . "): " . $id . " (0x" . bin2hex(chr($id)) . ") : " . $packet->getName(), 2); if (!$packet->decoded) { $packet->decode(); } $packet->check(); unset($packet); }