#include "unpacker.h" #include "watchconnector.h" QLoggingCategory Unpacker::l("Unpacker"); QByteArray Unpacker::readBytes(int n) { if (checkBad(n)) return QByteArray(); const char *u = &_buf.constData()[_offset]; _offset += n; return QByteArray(u, n); } QString Unpacker::readFixedString(int n) { if (checkBad(n)) return QString(); const char *u = &_buf.constData()[_offset]; _offset += n; return QString::fromUtf8(u, strnlen(u, n)); } QUuid Unpacker::readUuid() { if (checkBad(16)) return QString(); _offset += 16; return QUuid::fromRfc4122(_buf.mid(_offset - 16, 16)); } QMap Unpacker::readDict() { QMap d; if (checkBad(1)) return d; const int n = readLE(); for (int i = 0; i < n; i++) { if (checkBad(4 + 1 + 2)) return d; const int key = readLE(); // For some reason, this is little endian. const int type = readLE(); const int width = readLE(); switch (type) { case WatchConnector::typeBYTES: d.insert(key, QVariant::fromValue(readBytes(width))); break; case WatchConnector::typeSTRING: d.insert(key, QVariant::fromValue(readFixedString(width))); break; case WatchConnector::typeUINT: switch (width) { case sizeof(quint8): d.insert(key, QVariant::fromValue(readLE())); break; case sizeof(quint16): d.insert(key, QVariant::fromValue(readLE())); break; case sizeof(quint32): d.insert(key, QVariant::fromValue(readLE())); break; default: _bad = true; return d; } break; case WatchConnector::typeINT: switch (width) { case sizeof(qint8): d.insert(key, QVariant::fromValue(readLE())); break; case sizeof(qint16): d.insert(key, QVariant::fromValue(readLE())); break; case sizeof(qint32): d.insert(key, QVariant::fromValue(readLE())); break; default: _bad = true; return d; } break; default: _bad = true; return d; } } return d; }