DataStreamPeer: Optimize the InitData message
authorManuel Nickschas <sputnick@quassel-irc.org>
Wed, 29 Jan 2014 00:36:49 +0000 (01:36 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Sat, 15 Feb 2014 21:01:01 +0000 (22:01 +0100)
Since an InitData message consists of the usual message header
(serialized as a QVariantList) followed by a QVariantMap, we can
do what we did in a few other places already; transform the map
into a list of key-value pairs, the keys being UTF-8 strings (as
QByteArrays) instead of QStrings, and append that list to the
rest of the message.

This is just a small optimization, but straightforward to do without
changing protocol semantics or introspecting payloads. And
since we send lots of InitData messages, saving even a few bytes
per message may be worth it.

src/common/protocols/datastream/datastreampeer.cpp

index a1b4e91..86fbf53 100644 (file)
@@ -383,13 +383,15 @@ void DataStreamPeer::handlePackedFunc(const QVariantList &packedFunc)
             break;
         }
         case InitData: {
             break;
         }
         case InitData: {
-            if (params.count() != 3) {
+            if (params.count() < 2) {
                 qWarning() << Q_FUNC_INFO << "Received invalid InitData:" << params;
                 return;
             }
                 qWarning() << Q_FUNC_INFO << "Received invalid InitData:" << params;
                 return;
             }
-            QByteArray className = params[0].toByteArray();
-            QString objectName = QString::fromUtf8(params[1].toByteArray());
-            QVariantMap initData = params[2].toMap();
+            QByteArray className = params.takeFirst().toByteArray();
+            QString objectName = QString::fromUtf8(params.takeFirst().toByteArray());
+            QVariantMap initData;
+            for (int i = 0; i < params.count()/2; ++i)
+                initData[QString::fromUtf8(params[2*i].toByteArray())] = params[2*i+1];
             handle(Protocol::InitData(className, objectName, initData));
             break;
         }
             handle(Protocol::InitData(className, objectName, initData));
             break;
         }
@@ -436,7 +438,13 @@ void DataStreamPeer::dispatch(const Protocol::InitRequest &msg)
 
 void DataStreamPeer::dispatch(const Protocol::InitData &msg)
 {
 
 void DataStreamPeer::dispatch(const Protocol::InitData &msg)
 {
-    dispatchPackedFunc(QVariantList() << (qint16)InitData << msg.className << msg.objectName.toUtf8() << msg.initData);
+    QVariantList initData;
+    QVariantMap::const_iterator it = msg.initData.begin();
+    while (it != msg.initData.end()) {
+        initData << it.key().toUtf8() << it.value();
+        ++it;
+    }
+    dispatchPackedFunc(QVariantList() << (qint16)InitData << msg.className << msg.objectName.toUtf8() << initData);
 }
 
 
 }