/** * Parse server data * * @param string $data Binary data * * @return Packet * @throws Exception\UnSupported */ public function parse($data) { $return = new Packet(); $part = new Entity\Packet(); $byteStream = new ByteStream($data); while ($byteStream->length() > 0) { $type = $byteStream->short(); $partLength = $byteStream->short(); $length = $partLength - static::HEADER_LENGTH; switch ($type) { case static::TYPE_HOST: $host = $byteStream->string($length); $part->setHost($host); break; case static::TYPE_TIME: $time = $byteStream->longLong(); $dateTime = new \DateTime(); $dateTime->setTimestamp($time); $part->getTime()->setNormal($dateTime); break; case static::TYPE_PLUGIN: $plugin = $byteStream->string($length); $part->getPlugin()->setName($plugin); break; case static::TYPE_PLUGIN_INSTANCE: $pluginInstance = $byteStream->string($length); $part->getPlugin()->setInstanceName($pluginInstance); break; case static::TYPE_TYPE: $type = $byteStream->string($length); $part->getType()->setName($type); break; case static::TYPE_TYPE_INSTANCE: $typeInstance = $byteStream->string($length); $part->getType()->setInstanceName($typeInstance); break; case static::TYPE_VALUES: $amountValues = $byteStream->short(); $types = array(); // Reset all the values of the part section $part->resetValues(); for ($i = 0; $i < $amountValues; $i++) { $types[$i] = $byteStream->byte(); } for ($i = 0; $i < $amountValues; $i++) { switch ($types[$i]) { case static::VALUE_TYPE_COUNTER: $value = $byteStream->longLong(); break; case static::VALUE_TYPE_GAUGE: $value = $byteStream->double(8); break; case static::VALUE_TYPE_DERIVE: $value = $byteStream->longLong(false); break; case static::VALUE_TYPE_ABSOLUTE: $value = $byteStream->longLong(); break; default: throw new Exception\UnSupported('Unknown value type', 4); } $part->addValue(new Entity\Value($types[$i], $value)); } $oldPart = $part; $part = clone $oldPart; $return->append($oldPart); break; case static::TYPE_INTERVAL: $interval = $byteStream->longLong(); $part->getInterval()->setNormal($interval); break; case static::TYPE_TIME_HIGH_RESOLUTION: $timeHS = $byteStream->longLong(); $dateTime = new \DateTime(); $dateTime->setTimestamp($timeHS / 1073741824); $part->getTime()->setHighResolution($dateTime); break; case static::TYPE_INTERVAL_HIGH_RESOLUTION: $intervalHS = $byteStream->longLong(); $part->getInterval()->setHighResolution($intervalHS / 1073741824); break; case static::TYPE_MESSAGE: $message = $byteStream->string($length); $part->setMessage($message); break; case static::TYPE_SEVERITY: $severity = $byteStream->longLong(); $part->setSeverity($severity); break; case static::TYPE_SIGNATURE: throw new Exception\UnSupported('Signature packet', 1); case static::TYPE_ENCRYPTION: throw new Exception\UnSupported('Encrypted packet', 2); default: throw new Exception\UnSupported('Unknown packet', 3); } } // When no parts has been set yet we will set it if ($part !== null && $return->count() === 0) { $return->append($part); } return $return; }
public function testByte() { $stream = new ByteStream(hex2bin('0F')); $this->assertEquals(15, $stream->byte()); }