QIODevice::write() can theoretically write any number of bytes less than the amount that was requested. If the result was >= 0, we haven't hit EOF or an actual error yet and should continue attempting to write. Note that the docs[1] for QIODevice::writeData() specify that writeData should write all available data before returning or else QDataStream won't work, but that's no guarantee that all implementors of QIODevice will actually do so. Also note that this does not call QIODevice::waitForBytesWritten after writing, which would negate the benefits of buffering for buffered devices. As a side-effect, that means this will spin if the writes don't complete. [1] http://doc.qt.io/qt-5/qiodevice.html#writeData
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.