summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDmitry Shachnev <mitya57@gmail.com>2022-05-15 23:58:48 +0300
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-06-27 15:24:38 +0000
commitdb246244f5079e87a204d3f2d46d5992ab34e181 (patch)
tree75293f363eddc4dce79dc3dd34361e97198ea193 /src
parent77d797d6998768acfd5bfcef686974732670fa5d (diff)
Make pduFromStream work on big endian (again)
reinterpret_cast<char *>(&code) works on little endian, but not on big endian, because code is an int (4 bytes value). I fixed this bug earlier in afb7f76efafcb04e430168416d9d74113bde13bc, but it was added back in 2c0bb738e988d84f36169e0103d051745b678479. [ChangeLog][QModbusPdu] Fix reading from stream on big endian systems Change-Id: Ic432d5c86aac40ec2acdc07b4c4881967a023966 Reviewed-by: Marc Mutz <marc.mutz@qt.io> (cherry picked from commit e7ce9ac18b5a1ef33e2343d85a01bb7947d1668d) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src')
-rw-r--r--src/serialbus/qmodbuspdu.cpp21
-rw-r--r--src/serialbus/qmodbuspdu.h1
2 files changed, 20 insertions, 2 deletions
diff --git a/src/serialbus/qmodbuspdu.cpp b/src/serialbus/qmodbuspdu.cpp
index 112b73d..42548e5 100644
--- a/src/serialbus/qmodbuspdu.cpp
+++ b/src/serialbus/qmodbuspdu.cpp
@@ -128,11 +128,12 @@ static QDataStream &pduFromStream(QDataStream &stream, Type type, QModbusPdu *pd
} raii = { pdu };
QModbusPdu::FunctionCode code = QModbusPdu::FunctionCode::Invalid;
- if (stream.readRawData(reinterpret_cast<char *>(&code), sizeof(quint8)) != sizeof(quint8))
+ stream >> code;
+ if (stream.status() == QDataStream::ReadPastEnd)
return stream;
pdu->setFunctionCode(code);
- if (code == QModbusPdu::Invalid || code == QModbusPdu::UndefinedFunctionCode) // shortcut
+ if (code == QModbusPdu::Invalid) // shortcut
return stream;
constexpr const int MaxPduDataSize = 252; // in bytes
@@ -623,6 +624,22 @@ void QModbusRequest::registerDataSizeCalculator(FunctionCode fc, CalcFuncPtr cal
}
/*!
+ \internal
+
+ Reads a FunctionCode from a \a stream.
+ In stream we serialize FunctionCode as one byte, so we use a temporary char
+ variable to make the code work on both little endian and big endian systems.
+ If reading from stream fails, code will retain original value.
+*/
+QDataStream &operator>>(QDataStream &stream, QModbusPdu::FunctionCode &code)
+{
+ char buffer;
+ if (stream.readRawData(&buffer, 1) == 1)
+ code = static_cast<QModbusPdu::FunctionCode>(buffer);
+ return stream;
+}
+
+/*!
\relates QModbusRequest
Reads a \a pdu from the \a stream and returns a reference to the stream.
diff --git a/src/serialbus/qmodbuspdu.h b/src/serialbus/qmodbuspdu.h
index f299f24..2c50800 100644
--- a/src/serialbus/qmodbuspdu.h
+++ b/src/serialbus/qmodbuspdu.h
@@ -187,6 +187,7 @@ private:
};
Q_SERIALBUS_EXPORT QDebug operator<<(QDebug debug, const QModbusPdu &pdu);
Q_SERIALBUS_EXPORT QDataStream &operator<<(QDataStream &stream, const QModbusPdu &pdu);
+Q_SERIALBUS_EXPORT QDataStream &operator>>(QDataStream &stream, QModbusPdu::FunctionCode &code);
class QModbusRequest : public QModbusPdu
{