Chris@0: read(10); Chris@0: $filenameHeaderLength = $this->getLengthOfPossibleFilenameHeader($stream, $header); Chris@0: // Skip the header, that is 10 + length of filename + 1 (nil) bytes Chris@0: $stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength); Chris@0: $resource = StreamWrapper::getResource($stream); Chris@0: stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ); Chris@17: $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param StreamInterface $stream Chris@0: * @param $header Chris@0: * @return int Chris@0: */ Chris@0: private function getLengthOfPossibleFilenameHeader(StreamInterface $stream, $header) Chris@0: { Chris@0: $filename_header_length = 0; Chris@0: Chris@0: if (substr(bin2hex($header), 6, 2) === '08') { Chris@0: // we have a filename, read until nil Chris@0: $filename_header_length = 1; Chris@0: while ($stream->read(1) !== chr(0)) { Chris@0: $filename_header_length++; Chris@0: } Chris@0: } Chris@0: Chris@0: return $filename_header_length; Chris@0: } Chris@0: }