QIODevice::read() can read any number of bytes less than the amount requested if there wasn't that much data available. If the result is >= 0, we haven't actually hit EOF yet and should continue trying to read data. Since QIODevice::read() doesn't block, we use QIODevice::waitForReadyRead() to avoid spinning waiting for input to arrive. If we encounter EOF or another error during a read, we set the ReadPastEnd status and walk away as normal.
qmsgpack
MessagePack for Qt
Documentation
Complete documentation is available here: qmsgpack.readthedocs.io
Installation
Clone repository:
git clone https://github.com/romixlab/qmsgpack.git
Run cmake:
cd qmsgpack
mkdir build
cd build
cmake ..
Compile:
make
Run tests and install
make tests install
Sample usage
Packing
QVariantList list;
list << 1 << 2 << 3;
QByteArray array = MsgPack::pack(list);
Unpacking:
QVariantList unpacked = MsgPack::unpack(array).toList();
By default these Qt types are supported: Int, UInt, LongLong, ULongLong, Double, QByteArray, Bool, QString, QStringList, QVariantList, QVariantMap
.
Also you can provide packer and unpacker functions for any other type (even for user type defined via Q_DECLARE_METATYPE
) or MsgPack type.
Qt types and User types
There is packers and unpackers for QColor, QTime, QDate, QDateTime, QPoint, QSize, QRect. Also you can create your own packer/unpacker methods for Qt or your own types. See docs for details.
Thread-safety
At this time it is not safe to call MsgPack::registerPacker
, MsgPack::registerUnpacker
and MsgPack::setCompatibilityModeEnabled
from different threads.
pack and unpack methods do not use any global data, so should be safe to use from multiple threads.