protected function readHeader(MemStream $s) { // check header $s->serial_buffer($hskp, 4); if ($hskp !== self::HEADER) { throw new \RuntimeException('Wrong packed sheets header, expected "' . self::HEADER . '"'); } $s->serial_uint32($header_version); if ($header_version != self::HEADER_VERSION) { throw new \RuntimeException('Wrong packed sheets version, expected "' . self::HEADER_VERSION . '", got "' . $header_version . '"'); } $s->serial_byte($this->compat); $s->serial_uint32($dependBlockSize); if ($this->skipDependBlock) { // skip dependency block $pos = $s->getPos(); $s->seek($pos + $dependBlockSize); } else { // read dictionary $s->serial_uint32($nb); $s->serial_int_string($this->dictionnary, $nb); // read dependency data $this->dependencies = array(); $s->serial_uint32($depSize); for ($i = 0; $i < $depSize; $i++) { $s->serial_uint32($sheetId); $s->serial_uint32($nb); $s->serial_uint32($this->dependencies[$sheetId], $nb); } } }
/** * {@inheritdoc} */ public function serial(MemStream $s) { // string with <uint32> length counter $s->serial_string($this->name); if ($s->isReading()) { // read all remaining bytes from buffer $length = $s->getSize() - $s->getPos(); } else { $length = strlen($this->payload); } $s->serial_buffer($this->payload, $length); }
/** * Send message * * @param StreamInterface $message */ public function sendMessage(StreamInterface $message) { // TFormat from <nel/message.h> $messageType = 0; // build packet // <int32> packet length (length itself is not counted) // <int32> packet number // <byte> message type // <.....> message // first pass - to get packet length $hd = new MemStream(); $hd->serial_uint32($this->msgNum); $hd->serial_byte($messageType); // include original message $message->serial($hd); $this->msgNum++; $buf = $hd->getBuffer(); $len = strlen($buf); // second pass - final packet $hd = new MemStream(); $hd->serial_uint32_n($len); $hd->serial_buffer($buf); $this->sock->write($hd->getBuffer()); }