/***************************************************************************
- * Copyright (C) 2005-2018 by the Quassel Project *
+ * Copyright (C) 2005-2019 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
#include "serializers.h"
-bool checkStreamValid(QDataStream &stream)
+namespace {
+
+template<typename T>
+bool toVariant(QDataStream& stream, Quassel::Features features, QVariant& data)
+{
+ T content;
+ if (!Serializers::deserialize(stream, features, content)) {
+ return false;
+ }
+ data = QVariant::fromValue(content);
+ return true;
+}
+
+} // anon
+
+bool checkStreamValid(QDataStream& stream)
{
if (stream.status() != QDataStream::Ok) {
qWarning() << "Peer sent corrupt data";
return true;
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, QVariantList &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, QVariantList& data)
{
uint32_t size;
if (!deserialize(stream, features, size))
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, QVariantMap &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, QVariantMap& data)
{
uint32_t size;
if (!deserialize(stream, features, size))
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, QVariant &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, QVariant& data)
{
Types::VariantType type;
int8_t isNull;
name.chop(1);
if (!deserialize(stream, features, data, Types::fromName(name)))
return false;
- } else {
+ }
+ else {
if (!deserialize(stream, features, data, type))
return false;
}
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, QVariant &data, Types::VariantType type)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, QVariant& data, Types::VariantType type)
{
switch (type) {
- case Types::VariantType::Void: {
- return true;
- }
- case Types::VariantType::Bool: {
- bool content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::Int: {
- int32_t content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::UInt: {
- uint32_t content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::QChar: {
- QChar content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::QVariantMap: {
- QVariantMap content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::QVariantList: {
- QVariantList content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::QString: {
- QString content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::QStringList: {
- QStringList content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::QByteArray: {
- QByteArray content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::QDate: {
- QDate content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::QTime: {
- QTime content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::QDateTime: {
- QDateTime content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::Long: {
- qlonglong content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::Short: {
- int16_t content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::Char: {
- int8_t content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::ULong: {
- qulonglong content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::UShort: {
- uint16_t content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::UChar: {
- uint8_t content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- case Types::VariantType::QVariant: {
- QVariant content;
- if (!deserialize(stream, features, content))
- return false;
- data = QVariant(content);
- return true;
- }
- default: {
- qWarning() << "Usertype should have been caught earlier already";
- return false;
- }
+ case Types::VariantType::Void:
+ return true;
+ case Types::VariantType::Bool:
+ return toVariant<bool>(stream, features, data);
+ case Types::VariantType::Int:
+ return toVariant<int32_t>(stream, features, data);
+ case Types::VariantType::UInt:
+ return toVariant<uint32_t>(stream, features, data);
+ case Types::VariantType::QChar:
+ return toVariant<QChar>(stream, features, data);
+ case Types::VariantType::QVariantMap:
+ return toVariant<QVariantMap>(stream, features, data);
+ case Types::VariantType::QVariantList:
+ return toVariant<QVariantList>(stream, features, data);
+ case Types::VariantType::QString:
+ return toVariant<QString>(stream, features, data);
+ case Types::VariantType::QStringList:
+ return toVariant<QStringList>(stream, features, data);
+ case Types::VariantType::QByteArray:
+ return toVariant<QByteArray>(stream, features, data);
+ case Types::VariantType::QDate:
+ return toVariant<QDate>(stream, features, data);
+ case Types::VariantType::QTime:
+ return toVariant<QTime>(stream, features, data);
+ case Types::VariantType::QDateTime:
+ return toVariant<QDateTime>(stream, features, data);
+ case Types::VariantType::Long:
+ return toVariant<qlonglong>(stream, features, data);
+ case Types::VariantType::Short:
+ return toVariant<int16_t>(stream, features, data);
+ case Types::VariantType::Char:
+ return toVariant<int8_t>(stream, features, data);
+ case Types::VariantType::ULong:
+ return toVariant<qulonglong>(stream, features, data);
+ case Types::VariantType::UShort:
+ return toVariant<uint16_t>(stream, features, data);
+ case Types::VariantType::UChar:
+ return toVariant<uint8_t>(stream, features, data);
+ case Types::VariantType::QVariant:
+ return toVariant<QVariant>(stream, features, data);
+ default:
+ qWarning() << "Usertype should have been caught earlier already";
+ return false;
}
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, QVariant &data, Types::QuasselType type)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, QVariant& data, Types::QuasselType type)
{
switch (type) {
- case Types::QuasselType::BufferId: {
- BufferId content;
- if (!deserialize(stream, features, content))
- return false;
- data = qVariantFromValue(content);
- return true;
- }
- case Types::QuasselType::BufferInfo: {
- BufferInfo content;
- if (!deserialize(stream, features, content))
- return false;
- data = qVariantFromValue(content);
- return true;
- }
- case Types::QuasselType::Identity: {
- Identity content;
- if (!deserialize(stream, features, content))
- return false;
- data = qVariantFromValue(content);
- return true;
- }
- case Types::QuasselType::IdentityId: {
- IdentityId content;
- if (!deserialize(stream, features, content))
- return false;
- data = qVariantFromValue(content);
- return true;
- }
- case Types::QuasselType::Message: {
- Message content;
- if (!deserialize(stream, features, content))
- return false;
- data = qVariantFromValue(content);
- return true;
- }
- case Types::QuasselType::MsgId: {
- MsgId content;
- if (!deserialize(stream, features, content))
- return false;
- data = qVariantFromValue(content);
- return true;
- }
- case Types::QuasselType::NetworkId: {
- NetworkId content;
- if (!deserialize(stream, features, content))
- return false;
- data = qVariantFromValue(content);
- return true;
- }
- case Types::QuasselType::NetworkInfo: {
- NetworkInfo content;
- if (!deserialize(stream, features, content))
- return false;
- data = qVariantFromValue(content);
- return true;
- }
- case Types::QuasselType::Network_Server: {
- Network::Server content;
- if (!deserialize(stream, features, content))
- return false;
- data = qVariantFromValue(content);
- return true;
- }
- case Types::QuasselType::PeerPtr: {
- PeerPtr content;
- if (!deserialize(stream, features, content))
- return false;
- data = qVariantFromValue(content);
- return true;
- }
- default: {
- qWarning() << "Invalid QType";
- return false;
- }
+ case Types::QuasselType::BufferId:
+ return toVariant<BufferId>(stream, features, data);
+ case Types::QuasselType::BufferInfo:
+ return toVariant<BufferInfo>(stream, features, data);
+ case Types::QuasselType::Identity:
+ return toVariant<Identity>(stream, features, data);
+ case Types::QuasselType::IdentityId:
+ return toVariant<IdentityId>(stream, features, data);
+ case Types::QuasselType::Message:
+ return toVariant<Message>(stream, features, data);
+ case Types::QuasselType::MsgId:
+ return toVariant<MsgId>(stream, features, data);
+ case Types::QuasselType::NetworkId:
+ return toVariant<NetworkId>(stream, features, data);
+ case Types::QuasselType::NetworkInfo:
+ return toVariant<NetworkInfo>(stream, features, data);
+ case Types::QuasselType::Network_Server:
+ return toVariant<Network::Server>(stream, features, data);
+ case Types::QuasselType::PeerPtr:
+ return toVariant<PeerPtr>(stream, features, data);
+ default:
+ qWarning() << "Invalid QType";
+ return false;
}
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, Types::VariantType &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, Types::VariantType& data)
{
uint32_t raw;
if (!deserialize(stream, features, raw))
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, QStringList &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, QStringList& data)
{
uint32_t size;
if (!deserialize(stream, features, size))
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, Network::Server &server)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, Network::Server& server)
{
Q_UNUSED(features);
QVariantMap serverMap;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, Identity &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, Identity& data)
{
Q_UNUSED(features);
QVariantMap raw;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, NetworkInfo &info)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, NetworkInfo& info)
{
Q_UNUSED(features);
QVariantMap i;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, PeerPtr &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, PeerPtr& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, QByteArray &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, QByteArray& data)
{
Q_UNUSED(features);
data.clear();
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, QString &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, QString& data)
{
Q_UNUSED(features);
uint32_t bytes = 0;
while (allocated < length) {
int blockSize = std::min(step, length - allocated);
data.resize(allocated + blockSize);
- if (stream.readRawData(reinterpret_cast<char *>(data.data()) + allocated * 2, blockSize * 2) != blockSize * 2) {
+ if (stream.readRawData(reinterpret_cast<char*>(data.data()) + allocated * 2, blockSize * 2) != blockSize * 2) {
data.clear();
qWarning() << "BufferUnderFlow while reading QString";
return false;
allocated += blockSize;
}
if ((stream.byteOrder() == QDataStream::BigEndian) != (QSysInfo::ByteOrder == QSysInfo::BigEndian)) {
- auto *rawData = reinterpret_cast<uint16_t *>(data.data());
+ auto* rawData = reinterpret_cast<uint16_t*>(data.data());
while (length--) {
*rawData = qbswap(*rawData);
++rawData;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, QChar &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, QChar& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, QDate &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, QDate& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, QTime &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, QTime& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, QDateTime &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, QDateTime& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, int32_t &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, int32_t& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, uint32_t &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, uint32_t& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, int16_t &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, int16_t& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, uint16_t &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, uint16_t& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, int8_t &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, int8_t& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, uint8_t &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, uint8_t& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, qlonglong &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, qlonglong& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, qulonglong &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, qulonglong& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, bool &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, bool& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, BufferInfo &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, BufferInfo& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, Message &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, Message& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, NetworkId &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, NetworkId& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, IdentityId &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, IdentityId& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, BufferId &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, BufferId& data)
{
Q_UNUSED(features);
stream >> data;
return checkStreamValid(stream);
}
-bool Serializers::deserialize(QDataStream &stream, const Quassel::Features &features, MsgId &data)
+bool Serializers::deserialize(QDataStream& stream, const Quassel::Features& features, MsgId& data)
{
Q_UNUSED(features);
stream >> data;
Serializers::Types::VariantType Serializers::Types::variantType(Serializers::Types::QuasselType type)
{
switch (type) {
- case QuasselType::BufferId:
- return VariantType::UserType;
- case QuasselType::BufferInfo:
- return VariantType::UserType;
- case QuasselType::Identity:
- return VariantType::UserType;
- case QuasselType::IdentityId:
- return VariantType::UserType;
- case QuasselType::Message:
- return VariantType::UserType;
- case QuasselType::MsgId:
- return VariantType::UserType;
- case QuasselType::NetworkId:
- return VariantType::UserType;
- case QuasselType::NetworkInfo:
- return VariantType::UserType;
- case QuasselType::Network_Server:
- return VariantType::UserType;
- case QuasselType::PeerPtr:
- return VariantType::Long;
- default:
- return VariantType::UserType;
+ case QuasselType::BufferId:
+ return VariantType::UserType;
+ case QuasselType::BufferInfo:
+ return VariantType::UserType;
+ case QuasselType::Identity:
+ return VariantType::UserType;
+ case QuasselType::IdentityId:
+ return VariantType::UserType;
+ case QuasselType::Message:
+ return VariantType::UserType;
+ case QuasselType::MsgId:
+ return VariantType::UserType;
+ case QuasselType::NetworkId:
+ return VariantType::UserType;
+ case QuasselType::NetworkInfo:
+ return VariantType::UserType;
+ case QuasselType::Network_Server:
+ return VariantType::UserType;
+ case QuasselType::PeerPtr:
+ return VariantType::Long;
+ default:
+ return VariantType::UserType;
}
}
QString Serializers::Types::toName(Serializers::Types::QuasselType type)
{
switch (type) {
- case QuasselType::BufferId:
- return QString("BufferId");
- case QuasselType::BufferInfo:
- return QString("BufferInfo");
- case QuasselType::Identity:
- return QString("Identity");
- case QuasselType::IdentityId:
- return QString("IdentityId");
- case QuasselType::Message:
- return QString("Message");
- case QuasselType::MsgId:
- return QString("MsgId");
- case QuasselType::NetworkId:
- return QString("NetworkId");
- case QuasselType::NetworkInfo:
- return QString("NetworkInfo");
- case QuasselType::Network_Server:
- return QString("Network::Server");
- case QuasselType::PeerPtr:
- return QString("PeerPtr");
- default:
- return QString("Invalid Type");
+ case QuasselType::BufferId:
+ return QString("BufferId");
+ case QuasselType::BufferInfo:
+ return QString("BufferInfo");
+ case QuasselType::Identity:
+ return QString("Identity");
+ case QuasselType::IdentityId:
+ return QString("IdentityId");
+ case QuasselType::Message:
+ return QString("Message");
+ case QuasselType::MsgId:
+ return QString("MsgId");
+ case QuasselType::NetworkId:
+ return QString("NetworkId");
+ case QuasselType::NetworkInfo:
+ return QString("NetworkInfo");
+ case QuasselType::Network_Server:
+ return QString("Network::Server");
+ case QuasselType::PeerPtr:
+ return QString("PeerPtr");
+ default:
+ return QString("Invalid Type");
}
}
-Serializers::Types::QuasselType Serializers::Types::fromName(::QByteArray &name)
-{
- if (qstrcmp(name, "BufferId") == 0) return QuasselType::BufferId;
- else if (qstrcmp(name, "BufferInfo") == 0) return QuasselType::BufferInfo;
- else if (qstrcmp(name, "Identity") == 0) return QuasselType::Identity;
- else if (qstrcmp(name, "IdentityId") == 0) return QuasselType::IdentityId;
- else if (qstrcmp(name, "Message") == 0) return QuasselType::Message;
- else if (qstrcmp(name, "MsgId") == 0) return QuasselType::MsgId;
- else if (qstrcmp(name, "NetworkId") == 0) return QuasselType::NetworkId;
- else if (qstrcmp(name, "NetworkInfo") == 0) return QuasselType::NetworkInfo;
- else if (qstrcmp(name, "Network::Server") == 0) return QuasselType::Network_Server;
- else if (qstrcmp(name, "PeerPtr") == 0) return QuasselType::PeerPtr;
+Serializers::Types::QuasselType Serializers::Types::fromName(::QByteArray& name)
+{
+ if (qstrcmp(name, "BufferId") == 0)
+ return QuasselType::BufferId;
+ else if (qstrcmp(name, "BufferInfo") == 0)
+ return QuasselType::BufferInfo;
+ else if (qstrcmp(name, "Identity") == 0)
+ return QuasselType::Identity;
+ else if (qstrcmp(name, "IdentityId") == 0)
+ return QuasselType::IdentityId;
+ else if (qstrcmp(name, "Message") == 0)
+ return QuasselType::Message;
+ else if (qstrcmp(name, "MsgId") == 0)
+ return QuasselType::MsgId;
+ else if (qstrcmp(name, "NetworkId") == 0)
+ return QuasselType::NetworkId;
+ else if (qstrcmp(name, "NetworkInfo") == 0)
+ return QuasselType::NetworkInfo;
+ else if (qstrcmp(name, "Network::Server") == 0)
+ return QuasselType::Network_Server;
+ else if (qstrcmp(name, "PeerPtr") == 0)
+ return QuasselType::PeerPtr;
else {
qWarning() << "Type name is not valid: " << name;
return QuasselType::Invalid;