Browse Source

Add deserialization of QByteArray/QString lists

- Implement deserialization
- Implement tests
Alexey Edelev 6 years ago
parent
commit
6418e88992
3 changed files with 33 additions and 4 deletions
  1. 30 3
      src/lib/protobufobject.h
  2. 2 0
      tests/deserializationtest.cpp
  3. 1 1
      tests/serializationtest.cpp

+ 30 - 3
src/lib/protobufobject.h

@@ -312,6 +312,18 @@ protected:
         case QMetaType::User:
         case QMetaType::User:
             deserializeUserType(metaProperty.userType(), it, newPropertyValue);
             deserializeUserType(metaProperty.userType(), it, newPropertyValue);
             break;
             break;
+        case QMetaType::QByteArrayList: {
+            QByteArrayList currentValue = metaProperty.read(this).value<QByteArrayList>();
+            currentValue.append(deserializeListType<QByteArray>(it));
+            metaProperty.write(this, QVariant::fromValue<QByteArrayList>(currentValue));
+        }
+            return;
+        case QMetaType::QStringList: {
+            QStringList currentValue = metaProperty.read(this).value<QStringList>();
+            currentValue.append(QString::fromUtf8(deserializeListType<QString>(it)));
+            metaProperty.write(this, currentValue);
+        }
+            return;
         default:
         default:
             break;
             break;
         }
         }
@@ -367,9 +379,24 @@ protected:
 
 
     void deserializeUserType(int userType, QByteArray::const_iterator& it, QVariant &newValue)
     void deserializeUserType(int userType, QByteArray::const_iterator& it, QVariant &newValue)
     {
     {
-        auto value = reinterpret_cast<ProtobufObjectPrivate *>(QMetaType::create(userType));
-        value->deserializePrivate(deserializeLengthDelimited(it));
-        newValue = QVariant(userType, value);
+        if (userType == qMetaTypeId<IntList>()) {
+              //TODO: implement
+        } else if(userType == qMetaTypeId<FloatList>()) {
+              //TODO: implement
+        } else if(userType == qMetaTypeId<DoubleList>()) {
+              //TODO: implement
+        } else {
+            auto value = reinterpret_cast<ProtobufObjectPrivate *>(QMetaType::create(userType));
+            value->deserializePrivate(deserializeLengthDelimited(it));
+            newValue = QVariant(userType, value);
+        }
+    }
+
+    template <typename V,
+              typename std::enable_if_t<std::is_same<V, QString>::value
+                                        || std::is_same<V, QByteArray>::value, int> = 0>
+    QByteArray deserializeListType(QByteArray::const_iterator& it) {
+        return deserializeLengthDelimited(it);
     }
     }
 public:
 public:
     virtual QByteArray serializePrivate() = 0;
     virtual QByteArray serializePrivate() = 0;

File diff suppressed because it is too large
+ 2 - 0
tests/deserializationtest.cpp


+ 1 - 1
tests/serializationtest.cpp

@@ -468,7 +468,7 @@ TEST_F(SerializationTest, RepeatedIntMessageTest)
     ASSERT_TRUE(result.isEmpty());
     ASSERT_TRUE(result.isEmpty());
 }
 }
 
 
-TEST_F(SerializationTest, RepeatedStringMessage)
+TEST_F(SerializationTest, RepeatedStringMessageTest)
 {
 {
     RepeatedStringMessage test;
     RepeatedStringMessage test;
     test.setTestRepeatedString({"aaaa","bbbbb","ccc","dddddd","eeeee"});
     test.setTestRepeatedString({"aaaa","bbbbb","ccc","dddddd","eeeee"});

Some files were not shown because too many files changed in this diff