diff --git a/qad/CMakeLists.txt b/qad/CMakeLists.txt index a9e6ebb..210183b 100644 --- a/qad/CMakeLists.txt +++ b/qad/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.0) cmake_policy(SET CMP0017 NEW) # need include() with .cmake project(qad) set(_QAD_MAJOR 1) -set(_QAD_MINOR 6) +set(_QAD_MINOR 7) set(_QAD_REVISION 0) set(_QAD_SUFFIX ) set(_QAD_COMPANY SHS) diff --git a/qad/utils/chunkstream.h b/qad/utils/chunkstream.h index d1b7f3f..0ade48f 100644 --- a/qad/utils/chunkstream.h +++ b/qad/utils/chunkstream.h @@ -46,9 +46,15 @@ public: int id; T data; }; - template static Chunk chunk(int id, const T & data) {return Chunk(id, data);} + template + struct ChunkConst { + ChunkConst(int i, const T & d): id(i), data(d) {} + int id; + const T & data; + }; + template static ChunkConst chunk(int id, const T & data) {return ChunkConst(id, data);} - template ChunkStream & add(int id, const T & data) {*this << Chunk(id, data); return *this;} + template ChunkStream & add(int id, const T & data) {*this << ChunkConst(id, data); return *this;} void setSource(const QByteArray & data); void setSource(QDataStream & str); @@ -88,6 +94,7 @@ private: QMap data_map; template friend ChunkStream & operator <<(ChunkStream & s, const ChunkStream::Chunk & c); + template friend ChunkStream & operator <<(ChunkStream & s, const ChunkStream::ChunkConst & c); }; template @@ -111,5 +118,26 @@ ChunkStream & operator <<(ChunkStream & s, const ChunkStream::Chunk & c) { } return s; } +template +ChunkStream & operator <<(ChunkStream & s, const ChunkStream::ChunkConst & c) { + QByteArray ba; + QDataStream bas(&ba, QIODevice::WriteOnly); + bas.setVersion(QDataStream::Qt_4_8); + bas << c.data; + switch (s.version_) { + case ChunkStream::Version_1: + s.stream_ << c.id << ba; + break; + case ChunkStream::Version_2: + if (s.data_->isEmpty()) + s.stream_ << uchar(uchar(s.version_) | 0x80); + ChunkStream::writeVInt(s.stream_, c.id); + ChunkStream::writeVInt(s.stream_, ba.size()); + s.stream_.writeRawData(ba.data(), ba.size()); + break; + default: break; + } + return s; +} #endif // CHUNKSTREAM_H