/** * SPDX-FileCopyrightText: 2013 Albert Vaca * * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL */ #ifndef NETWORKPACKET_H #define NETWORKPACKET_H #include "networkpackettypes.h" #include #include #include #include #include #include #include "kdeconnectcore_export.h" class FileTransferJob; class KDECONNECTCORE_EXPORT NetworkPacket { Q_GADGET Q_PROPERTY( QString id READ id WRITE setId ) Q_PROPERTY( QString type READ type WRITE setType ) Q_PROPERTY( QVariantMap body READ body WRITE setBody ) Q_PROPERTY( QVariantMap payloadTransferInfo READ payloadTransferInfo WRITE setPayloadTransferInfo ) Q_PROPERTY( qint64 payloadSize READ payloadSize WRITE setPayloadSize ) public: const static int s_protocolVersion; explicit NetworkPacket(const QString& type = QStringLiteral("empty"), const QVariantMap& body = {}); NetworkPacket(const NetworkPacket& other) = default; // Copy constructor, required for QMetaType and queued signals NetworkPacket &operator=(const NetworkPacket& other) = default; static void createIdentityPacket(NetworkPacket*); QByteArray serialize() const; static bool unserialize(const QByteArray& json, NetworkPacket* out); const QString& id() const { return m_id; } const QString& type() const { return m_type; } QVariantMap& body() { return m_body; } const QVariantMap& body() const { return m_body; } //Get and set info from body. Note that id and type can not be accessed through these. template T get(const QString& key, const T& defaultValue = {}) const { return m_body.value(key,defaultValue).template value(); //Important note: Awesome template syntax is awesome } template void set(const QString& key, const T& value) { m_body[key] = QVariant(value); } bool has(const QString& key) const { return m_body.contains(key); } QSharedPointer payload() const { return m_payload; } void setPayload(const QSharedPointer& device, qint64 payloadSize) { m_payload = device; m_payloadSize = payloadSize; Q_ASSERT(m_payloadSize >= -1); } bool hasPayload() const { return (m_payloadSize != 0); } qint64 payloadSize() const { return m_payloadSize; } //-1 means it is an endless stream FileTransferJob* createPayloadTransferJob(const QUrl& destination) const; //To be called by a particular DeviceLink QVariantMap payloadTransferInfo() const { return m_payloadTransferInfo; } void setPayloadTransferInfo(const QVariantMap& map) { m_payloadTransferInfo = map; } bool hasPayloadTransferInfo() const { return !m_payloadTransferInfo.isEmpty(); } private: void setId(const QString& id) { m_id = id; } void setType(const QString& t) { m_type = t; } void setBody(const QVariantMap& b) { m_body = b; } void setPayloadSize(qint64 s) { m_payloadSize = s; } QString m_id; QString m_type; QVariantMap m_body; QSharedPointer m_payload; qint64 m_payloadSize; QVariantMap m_payloadTransferInfo; }; KDECONNECTCORE_EXPORT QDebug operator<<(QDebug s, const NetworkPacket& pkg); Q_DECLARE_METATYPE(NetworkPacket) #endif // NETWORKPACKET_H