#ifndef CHUNKSTREAM_H #define CHUNKSTREAM_H #include #include #include class ChunkStream { public: ChunkStream(const QByteArray & data) {setSource(data);} ChunkStream(QDataStream & str) {setSource(str);} ChunkStream(QByteArray * data = 0) {setSource(data);} ~ChunkStream(); template struct Chunk { Chunk(int i, const T & d): id(i), data(d) {} int id; T data; }; template static Chunk chunk(int id, const T & data) {return Chunk(id, data);} void setSource(const QByteArray & data); void setSource(QDataStream & str); void setSource(QByteArray * data); QDataStream & dataStream() {return stream_;} QByteArray data() const {return tmp_data;} bool atEnd() const {return stream_.atEnd();} int read() {stream_ >> last_id >> last_data; return last_id;} int getID() {return last_id;} template T getData() const {T ret; QDataStream s(last_data); s.setVersion(QDataStream::Qt_4_8); s >> ret; return ret;} private: void _init(); int last_id; QByteArray * data_, last_data, tmp_data; QBuffer buffer; QDataStream stream_; }; template ChunkStream & operator <<(ChunkStream & s, const ChunkStream::Chunk & c) { QByteArray ba; QDataStream bas(&ba, QIODevice::WriteOnly); bas.setVersion(QDataStream::Qt_4_8); bas << c.data; s.dataStream() << c.id << ba; return s; } #endif // CHUNKSTREAM_H