+ writeMessage(block);
+}
+
+
+/*** Handshake messages ***/
+
+/* These messages are transmitted during handshake phase, which in case of the legacy protocol means they have
+ * a structure different from those being used after the handshake.
+ * Also, the legacy handshake does not fully match the redesigned one, so we'll have to do various mappings here.
+ */
+
+void LegacyPeer::handleHandshakeMessage(const QVariant &msg)
+{
+ QVariantMap m = msg.toMap();
+
+ QString msgType = m["MsgType"].toString();
+ if (msgType.isEmpty()) {
+ emit protocolError(tr("Invalid handshake message!"));
+ return;
+ }
+
+ if (msgType == "ClientInit") {
+ // FIXME only in compat mode
+ uint ver = m["ProtocolVersion"].toUInt();
+ if (ver < coreNeedsProtocol) {
+ emit protocolVersionMismatch((int)ver, (int)coreNeedsProtocol);
+ return;
+ }
+
+#ifndef QT_NO_COMPRESS
+ // FIXME only in compat mode
+ if (m["UseCompression"].toBool()) {
+ socket()->setProperty("UseCompression", true);
+ }
+#endif
+ handle(RegisterClient(m["ClientVersion"].toString(), m["ClientDate"].toString(), m["UseSsl"].toBool()));
+ }
+
+ else if (msgType == "ClientInitReject") {
+ handle(ClientDenied(m["Error"].toString()));
+ }
+
+ else if (msgType == "ClientInitAck") {
+ // FIXME only in compat mode
+ uint ver = m["ProtocolVersion"].toUInt(); // actually an UInt
+ if (ver < clientNeedsProtocol) {
+ emit protocolVersionMismatch((int)ver, (int)clientNeedsProtocol);
+ return;
+ }
+#ifndef QT_NO_COMPRESS
+ if (m["SupportsCompression"].toBool())
+ socket()->setProperty("UseCompression", true);
+#endif
+
+ handle(ClientRegistered(m["CoreFeatures"].toUInt(), m["Configured"].toBool(), m["StorageBackends"].toList(), m["SupportSsl"].toBool(), QString()));
+ }
+
+ else if (msgType == "CoreSetupData") {
+ QVariantMap map = m["SetupData"].toMap();
+ handle(SetupData(map["AdminUser"].toString(), map["AdminPasswd"].toString(), map["Backend"].toString(), map["ConnectionProperties"].toMap()));
+ }
+
+ else if (msgType == "CoreSetupReject") {
+ handle(SetupFailed(m["Error"].toString()));
+ }
+
+ else if (msgType == "CoreSetupAck") {
+ handle(SetupDone());
+ }
+
+ else if (msgType == "ClientLogin") {
+ handle(Login(m["User"].toString(), m["Password"].toString()));
+ }
+
+ else if (msgType == "ClientLoginReject") {
+ handle(LoginFailed(m["Error"].toString()));
+ }
+
+ else if (msgType == "ClientLoginAck") {
+ handle(LoginSuccess());
+ }
+
+ else if (msgType == "SessionInit") {
+ QVariantMap map = m["SessionState"].toMap();
+ handle(SessionState(map["Identities"].toList(), map["BufferInfos"].toList(), map["NetworkIds"].toList()));
+ }
+
+ else {
+ emit protocolError(tr("Unknown protocol message of type %1").arg(msgType));
+ }