From bdd36b7095bc1ba0f781e4362fd30a519919e832 Mon Sep 17 00:00:00 2001 From: Itay Grudev Date: Mon, 20 May 2024 14:32:31 +0300 Subject: [PATCH] SingleApplicationMessage the core of the v4.0 communication --- singleapplicationmessage.cpp | 86 ++++++++++++++++++++++++++++++++++++ singleapplicationmessage.h | 69 +++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 singleapplicationmessage.cpp create mode 100644 singleapplicationmessage.h diff --git a/singleapplicationmessage.cpp b/singleapplicationmessage.cpp new file mode 100644 index 0000000..5b6c750 --- /dev/null +++ b/singleapplicationmessage.cpp @@ -0,0 +1,86 @@ +// Copyright (c) Itay Grudev 2023 +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// Permission is not granted to use this software or any of the associated files +// as sample data for the purposes of building machine learning models. +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "singleapplicationmessage.h" + +#include + +SingleApplicationMessage::SingleApplicationMessage() + : invalid( true ) +{ +} + +SingleApplicationMessage::SingleApplicationMessage( MessageType type, quint16 instanceId, QByteArray content ) + : type( type ), instanceId( instanceId ), content( content ), invalid( false ) +{} + +SingleApplicationMessage::SingleApplicationMessage( QByteArray message ) + : invalid( false ) +{ + QDataStream dataStream( &message, QIODevice::ReadOnly ); + qsizetype messageLength; + quint16 messageChecksum; + + dataStream >> type; + dataStream >> instanceId; + dataStream >> messageLength; + if( (qsizetype)(message.size() - sizeof(type) - sizeof(messageLength) - sizeof(quint16)) < messageLength ){ + invalid = true; + return; + } + content = QByteArray( messageLength, Qt::Uninitialized ); + dataStream.readRawData( content.data(), messageLength ); + dataStream >> messageChecksum; + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + const quint16 computedChecksum = qChecksum(QByteArray(message.constData(), static_cast(message.length() - sizeof(quint16)))); +#else + const quint16 computedChecksum = qChecksum(message.constData(), static_cast(message.length() - sizeof(quint16))); +#endif + + if( messageChecksum != computedChecksum ) + invalid = true; + } + +SingleApplicationMessage:: operator QByteArray() +{ + QByteArray message; + QDataStream dataStream( &message, QIODevice::WriteOnly ); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) + dataStream.setVersion(QDataStream::Qt_5_6); +#endif + + dataStream << static_cast( type ); + dataStream << instanceId; + dataStream << (qsizetype)content.size(); + dataStream << content; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + quint16 checksum = qChecksum( QByteArray( message.constData(), static_cast( message.length()))); +#else + quint16 checksum = qChecksum( message.constData(), static_cast( messageMsg.length())); +#endif + dataStream << checksum; + + return message; +} diff --git a/singleapplicationmessage.h b/singleapplicationmessage.h new file mode 100644 index 0000000..b4303e9 --- /dev/null +++ b/singleapplicationmessage.h @@ -0,0 +1,69 @@ +// Copyright (c) Itay Grudev 2023 +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// Permission is not granted to use this software or any of the associated files +// as sample data for the purposes of building machine learning models. +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef SINGLEAPPLICATIONMESSAGE_H +#define SINGLEAPPLICATIONMESSAGE_H + +#include + +struct SingleApplicationMessage { + enum MessageType : quint8 { + Acknowledge, + NewInstance, + Message, + }; + + MessageType type; + quint16 instanceId; + QByteArray content; + bool invalid; + + /** + * @brief Create an unitialized SingleApplicationMessage + * The message is initialized with invalid = true + */ + SingleApplicationMessage(); + + /** + * @brief Create a SingleApplicationMessage + * @param type + * @param instanceId + * @param content + */ + SingleApplicationMessage( MessageType type, quint16 instanceId, QByteArray content ); + + /** + * @brief Create a SingleApplicationMessage from a QByteArray containing a message + * @param message + */ + SingleApplicationMessage( QByteArray message ); + + /** + * @brief Convert a SingleApplicationMessage to a QByteArray + * @return QByteArray + */ + operator QByteArray(); +}; + + +#endif // SINGLEAPPLICATIONMESSAGE_H