#include #include #include #include #include //------------------------------------------------------------------------------ Preamble::Preamble(DataSource& source, Allocator& allocator) : _stream(source, allocator) { } //------------------------------------------------------------------------------ Transport Preamble::get_transport() { if (!_parsed) parse_header(); return Transport(std::move(_stream)); } //------------------------------------------------------------------------------ Protocol Preamble::get_protocol() { if (!_parsed) parse_header(); return Protocol(_protocol_version); } //------------------------------------------------------------------------------ void Preamble::parse_header() { // magic uint32 magic = _stream.read(); if (magic != 'TRC2') throw Exception::StreamError("Unexpected magic value", 0, magic); // meta uint32 meta_size = _stream.read(); _stream.read(meta_size); // transport _transport_version = _stream.read(); if (_transport_version != 4) throw Exception::StreamError("Unexpected transport version", 0, _transport_version); // protocol _protocol_version = _stream.read(); if (_protocol_version != 6 && _protocol_version != 7) throw Exception::StreamError("Unexpected protocol version", 0, _protocol_version); _parsed = true; }