diff --git a/src/private/qt_types_p.cpp b/src/private/qt_types_p.cpp index 0bac757..5545dcf 100644 --- a/src/private/qt_types_p.cpp +++ b/src/private/qt_types_p.cpp @@ -1,6 +1,7 @@ #include "qt_types_p.h" #include "pack_p.h" #include "unpack_p.h" +#include "sysdep.h" #include @@ -9,19 +10,29 @@ #endif #define NO_QTGUI_WARNING "Library built without QtGui, hence some types are not available" +#include + bool MsgPackPrivate::register_qtype(QMetaType::Type q_type, quint8 msgpack_type) { if (q_type == QMetaType::QColor) { #ifdef QT_GUI_LIB - qRegisterMetaType("QColor"); - MsgPackPrivate::register_packer((QMetaType::Type)qMetaTypeId(), msgpack_type, pack_qcolor); + MsgPackPrivate::register_packer(q_type, msgpack_type, pack_qcolor); MsgPackPrivate::register_unpacker(msgpack_type, unpack_qcolor); - return true; #else qWarning() << NO_QTGUI_WARNING; return false; #endif //QT_GUI_LIB - } + } else if (q_type == QMetaType::QTime) { + MsgPackPrivate::register_packer(q_type, msgpack_type, pack_qtime); + MsgPackPrivate::register_unpacker(msgpack_type, unpack_qtime); + } else if (q_type == QMetaType::QDate) { + MsgPackPrivate::register_packer(q_type, msgpack_type, pack_qdate); + MsgPackPrivate::register_unpacker(msgpack_type, unpack_qdate); + } else if (q_type == QMetaType::QDateTime) { + MsgPackPrivate::register_packer(q_type, msgpack_type, pack_qdatetime); + MsgPackPrivate::register_unpacker(msgpack_type, unpack_qdatetime); + } + return true; } #ifdef QT_GUI_LIB @@ -44,3 +55,80 @@ QVariant MsgPackPrivate::unpack_qcolor(const QByteArray &data) (quint8)data[2], (quint8)data[3]); } #endif //MsgPackPrivate + +// Date and Time +void MsgPackPrivate::pack_qtime_raw(const QTime &time, quint8 *p) +{ + quint32 t = time.msecsSinceStartOfDay(); + _msgpack_store32(p, t); +} + +QTime MsgPackPrivate::unpack_qtime_raw(quint8 *p) +{ + quint32 t = _msgpack_load32(quint32, p); + return QTime::fromMSecsSinceStartOfDay(t); +} + +quint32 MsgPackPrivate::pack_qtime(const QVariant &variant, QByteArray &data, bool write) +{ + if (write) + pack_qtime_raw(variant.toTime(), (quint8 *)data.data()); + return 4; // 24h*60m*60s*1000ms = max 27 bits +} + +QVariant MsgPackPrivate::unpack_qtime(const QByteArray &data) +{ + return unpack_qtime_raw((quint8 *)data.data()); +} + +void MsgPackPrivate::pack_qdate_raw(const QDate &date, quint8 *p) +{ + quint16 year = date.year(); + quint8 month = date.month(); + quint8 day = date.day(); + quint16 dy = year | (day & 0x80); + quint8 md = (month << 4) | (day & 0xf); + _msgpack_store16(p, dy); + p[2] = md; +} + +QDate MsgPackPrivate::unpack_qdate_raw(quint8 *p) +{ + quint16 year = _msgpack_load16(quint16, p); + quint8 month = (p[2] & 0xf0) >> 4; + quint8 day = p[2] & 0xf; + day |= (quint8)((year & 0x8000) >> 11); + year &= 0x7fff; + return QDate(year, month, day); +} + +quint32 MsgPackPrivate::pack_qdate(const QVariant &variant, QByteArray &data, bool write) +{ + if (write) + pack_qdate_raw(variant.toDate(), (quint8 *)data.data()); + return 3; // d(5th bit)xyyyyyyyyyyyyyy, mmmmdddd +} + +QVariant MsgPackPrivate::unpack_qdate(const QByteArray &data) +{ + return unpack_qdate_raw((quint8 *)data.data()); +} + +quint32 MsgPackPrivate::pack_qdatetime(const QVariant &variant, QByteArray &data, bool write) +{ + if (write) { + quint8 *p = (quint8 *)data.data(); + QDateTime dt = variant.toDateTime(); + pack_qdate_raw(dt.date(), p); + pack_qtime_raw(dt.time(), p + 3); + } + return 7; // 3 for date, 4 for time +} + +QVariant MsgPackPrivate::unpack_qdatetime(const QByteArray &data) +{ + quint8 *p = (quint8 *)data.data(); + QDate d = unpack_qdate_raw(p); + QTime t = unpack_qtime_raw(p + 3); + return QDateTime(d, t); +} diff --git a/src/private/qt_types_p.h b/src/private/qt_types_p.h index a83d2e1..b3d50c1 100644 --- a/src/private/qt_types_p.h +++ b/src/private/qt_types_p.h @@ -13,6 +13,21 @@ quint32 pack_qcolor(const QVariant &variant, QByteArray &data, bool write); QVariant unpack_qcolor(const QByteArray &data); #endif //QT_GUI_LIB +// Date and Time +void pack_qtime_raw(const QTime &time, quint8 *p); +QTime unpack_qtime_raw(quint8 *p); +quint32 pack_qtime(const QVariant &variant, QByteArray &data, bool write); +QVariant unpack_qtime(const QByteArray &data); + +void pack_qdate_raw(const QDate &date, quint8 *p); +QDate unpack_qdate_raw(quint8 *p); +quint32 pack_qdate(const QVariant &variant, QByteArray &data, bool write); +QVariant unpack_qdate(const QByteArray &data); + +quint32 pack_qdatetime(const QVariant &variant, QByteArray &data, bool write); +QVariant unpack_qdatetime(const QByteArray &data); + + } // MsgPackPrivate -#endif // QT_TYPES_P_H \ No newline at end of file +#endif // QT_TYPES_P_H