summaryrefslogtreecommitdiffstats
path: root/src/remoteobjects/qremoteobjectpacket.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/remoteobjects/qremoteobjectpacket.cpp')
-rw-r--r--src/remoteobjects/qremoteobjectpacket.cpp25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/remoteobjects/qremoteobjectpacket.cpp b/src/remoteobjects/qremoteobjectpacket.cpp
index 631c362..4b8f77c 100644
--- a/src/remoteobjects/qremoteobjectpacket.cpp
+++ b/src/remoteobjects/qremoteobjectpacket.cpp
@@ -81,11 +81,21 @@ namespace QRemoteObjectPackets {
const QVariant encodeVariant(const QVariant &value)
{
if (QMetaType::typeFlags(value.userType()).testFlag(QMetaType::IsEnumeration)) {
+ auto converted = QVariant(value);
+ const auto size = QMetaType(value.userType()).sizeOf();
+ switch (size) {
+ case 1: converted.convert(QMetaType::Char); break;
+ case 2: converted.convert(QMetaType::Short); break;
+ case 4: converted.convert(QMetaType::Int); break;
+ // Qt currently only supports enum values of 4 or less bytes (QMetaEnum value(index) returns int)
+// case 8: converted.convert(QMetaType::Long); break; // typeId for long from qmetatype.h
+ default:
+ qWarning() << "Invalid enum detected" << QMetaType::typeName(value.userType()) << "with size" << size;
+ converted.convert(QMetaType::Int);
+ }
#ifdef QTRO_VERBOSE_PROTOCOL
- qDebug() << "Converting from enum to integer type" << value << value.value<qint32>();
+ qDebug() << "Converting from enum to integer type" << size << converted << value;
#endif
- auto converted = QVariant(value);
- converted.convert(2); // typeId for int from qmetatype.h
return converted;
}
return value;
@@ -95,11 +105,11 @@ QVariant &decodeVariant(QVariant &value, int type)
{
if (QMetaType::typeFlags(type).testFlag(QMetaType::IsEnumeration)) {
#ifdef QTRO_VERBOSE_PROTOCOL
- int asInt = value.value<qint32>();
+ QVariant encoded(value);
#endif
value.convert(type);
#ifdef QTRO_VERBOSE_PROTOCOL
- qDebug() << "Converting to enum from integer type" << value << asInt;
+ qDebug() << "Converting to enum from integer type" << value << encoded;
#endif
}
return value;
@@ -363,8 +373,11 @@ static void serializeEnum(QDataStream &ds, const QMetaEnum &enumerator)
ds << QByteArray::fromRawData(enumerator.name(), qstrlen(enumerator.name()));
ds << enumerator.isFlag();
ds << enumerator.isScoped();
+ const auto typeName = QByteArray(enumerator.scope()).append("::").append(enumerator.name());
+ quint32 size = QMetaType(QMetaType::type(typeName.constData())).sizeOf();
+ ds << size;
#ifdef QTRO_VERBOSE_PROTOCOL
- qDebug(" Enum (name = %s, isFlag = %s, isScoped = %s):", enumerator.name(), enumerator.isFlag() ? "true" : "false", enumerator.isScoped() ? "true" : "false");
+ qDebug(" Enum (name = %s, size = %d, isFlag = %s, isScoped = %s):", enumerator.name(), size, enumerator.isFlag() ? "true" : "false", enumerator.isScoped() ? "true" : "false");
#endif
const int keyCount = enumerator.keyCount();
ds << keyCount;