From 9bbfc8300c80bdeac2c7a68486a46f3f01f42367 Mon Sep 17 00:00:00 2001 From: Fanda Vacek Date: Mon, 18 Nov 2024 14:59:40 +0100 Subject: [PATCH] Rewrite FrameWriter::addFrame() from move to const reference --- libshvchainpack/src/socketrpcdriver.cpp | 11 ++++++++++- .../include/shv/iotqt/rpc/serialportsocket.h | 2 +- libshviotqt/include/shv/iotqt/rpc/socket.h | 9 +++++---- libshviotqt/src/rpc/serialportsocket.cpp | 7 +++++-- libshviotqt/src/rpc/socket.cpp | 14 +++++++------- libshviotqt/src/rpc/socketrpcconnection.cpp | 2 +- 6 files changed, 29 insertions(+), 16 deletions(-) diff --git a/libshvchainpack/src/socketrpcdriver.cpp b/libshvchainpack/src/socketrpcdriver.cpp index a8302a91..d59fc945 100644 --- a/libshvchainpack/src/socketrpcdriver.cpp +++ b/libshvchainpack/src/socketrpcdriver.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include @@ -62,8 +63,16 @@ void SocketRpcDriver::writeFrame(RpcFrame &&frame) nInfo() << "Write to closed socket"; return; } + using namespace shv::chainpack; auto frame_head = frame.toFrameHead(); - if (m_writeBuffer.size() + frame_head.size() + frame.data.size() < m_maxWriteBufferLength) { + std::ostringstream out; + { + ChainPackWriter wr(out); + wr.writeUIntData(frame_head.size() + frame.data.size()); + } + auto len_data = out.str(); + if (m_writeBuffer.size() + len_data.size() + frame_head.size() + frame.data.size() < m_maxWriteBufferLength) { + m_writeBuffer += len_data; m_writeBuffer += frame_head; m_writeBuffer += frame.data; flush(); diff --git a/libshviotqt/include/shv/iotqt/rpc/serialportsocket.h b/libshviotqt/include/shv/iotqt/rpc/serialportsocket.h index 4cfaf6e0..137df5a2 100644 --- a/libshviotqt/include/shv/iotqt/rpc/serialportsocket.h +++ b/libshviotqt/include/shv/iotqt/rpc/serialportsocket.h @@ -45,7 +45,7 @@ class SHVIOTQT_DECL_EXPORT SerialFrameWriter : public FrameWriter void resetCommunication() override; protected: - void addFrameData(std::string &&frame_data) override; + void addFrameData(const std::string &frame_head, const std::string &frame_data) override; private: bool m_withCrcCheck = true; }; diff --git a/libshviotqt/include/shv/iotqt/rpc/socket.h b/libshviotqt/include/shv/iotqt/rpc/socket.h index cb75e4ef..03bd054a 100644 --- a/libshviotqt/include/shv/iotqt/rpc/socket.h +++ b/libshviotqt/include/shv/iotqt/rpc/socket.h @@ -45,7 +45,7 @@ class SHVIOTQT_DECL_EXPORT FrameWriter { public: virtual ~FrameWriter() = default; - void addFrame(shv::chainpack::RpcFrame &&frame); + void addFrame(const shv::chainpack::RpcFrame &frame); virtual void resetCommunication() {} void flushToDevice(QIODevice *device); void clear(); @@ -53,7 +53,7 @@ class SHVIOTQT_DECL_EXPORT FrameWriter void flushToWebSocket(QWebSocket *socket); #endif protected: - virtual void addFrameData(std::string &&frame_data) = 0; + virtual void addFrameData(const std::string &frame_head, const std::string &frame_data) = 0; protected: QList m_messageDataToWrite; }; @@ -72,8 +72,9 @@ class SHVIOTQT_DECL_EXPORT StreamFrameWriter : public FrameWriter { public: ~StreamFrameWriter() override = default; + protected: - void addFrameData(std::string &&frame_data) override; + void addFrameData(const std::string &frame_head, const std::string &frame_data) override; }; /// wrapper class for QTcpSocket and QWebSocket @@ -105,7 +106,7 @@ class SHVIOTQT_DECL_EXPORT Socket : public QObject virtual quint16 peerPort() const = 0; std::vector takeFrames(); - void writeFrame(chainpack::RpcFrame &&frame); + void writeFrame(const chainpack::RpcFrame &frame); virtual void ignoreSslErrors() = 0; diff --git a/libshviotqt/src/rpc/serialportsocket.cpp b/libshviotqt/src/rpc/serialportsocket.cpp index 4c02f9e0..c3cf6adb 100644 --- a/libshviotqt/src/rpc/serialportsocket.cpp +++ b/libshviotqt/src/rpc/serialportsocket.cpp @@ -177,7 +177,7 @@ SerialFrameWriter::SerialFrameWriter(CrcCheck crc) { } -void SerialFrameWriter::addFrameData(string &&frame_data) +void SerialFrameWriter::addFrameData(const std::string &frame_head, const std::string &frame_data) { QByteArray data_to_write; auto write_escaped = [&data_to_write](uint8_t b) { @@ -190,6 +190,9 @@ void SerialFrameWriter::addFrameData(string &&frame_data) } }; data_to_write += static_cast(STX); + for(uint8_t b : frame_head) { + write_escaped(b); + } for(uint8_t b : frame_data) { write_escaped(b); } @@ -213,7 +216,7 @@ void SerialFrameWriter::resetCommunication() QByteArray data_to_write; data_to_write.append(static_cast(00)); - addFrameData(data_to_write.toStdString()); + addFrameData(data_to_write.toStdString(), {}); } //====================================================== diff --git a/libshviotqt/src/rpc/socket.cpp b/libshviotqt/src/rpc/socket.cpp index 9d21316f..9b61fbea 100644 --- a/libshviotqt/src/rpc/socket.cpp +++ b/libshviotqt/src/rpc/socket.cpp @@ -24,12 +24,11 @@ namespace shv::iotqt::rpc { //====================================================== // FrameWriter //====================================================== -void FrameWriter::addFrame(chainpack::RpcFrame &&frame) +void FrameWriter::addFrame(const chainpack::RpcFrame &frame) { try { - auto frame_data = frame.toFrameHead(); - frame_data += frame.data; - addFrameData(std::move(frame_data)); + auto frame_head = frame.toFrameHead(); + addFrameData(frame_head, frame.data); } catch (const std::runtime_error &e) { shvWarning() << "Error converting frame to data:" << e.what(); } @@ -171,7 +170,7 @@ QList StreamFrameReader::addData(std::string_view data) //====================================================== // StreamFrameWriter //====================================================== -void StreamFrameWriter::addFrameData(std::string &&frame_data) +void StreamFrameWriter::addFrameData(const std::string &frame_head, const std::string &frame_data) { using namespace shv::chainpack; std::ostringstream out; @@ -181,6 +180,7 @@ void StreamFrameWriter::addFrameData(std::string &&frame_data) } auto len_data = out.str(); QByteArray data(len_data.data(), len_data.size()); + data.append(frame_head.data(), frame_head.size()); data.append(frame_data.data(), frame_data.size()); m_messageDataToWrite.append(data); } @@ -256,10 +256,10 @@ std::vector Socket::takeFrames() return m_frameReader->takeFrames(); } -void Socket::writeFrame(shv::chainpack::RpcFrame &&frame) +void Socket::writeFrame(const shv::chainpack::RpcFrame &frame) { Q_ASSERT(m_frameWriter); - m_frameWriter->addFrame(std::move(frame)); + m_frameWriter->addFrame(frame); flushWriteBuffer(); } diff --git a/libshviotqt/src/rpc/socketrpcconnection.cpp b/libshviotqt/src/rpc/socketrpcconnection.cpp index 0936468f..57bf3ec6 100644 --- a/libshviotqt/src/rpc/socketrpcconnection.cpp +++ b/libshviotqt/src/rpc/socketrpcconnection.cpp @@ -113,7 +113,7 @@ bool SocketRpcConnection::isOpen() void SocketRpcConnection::writeFrame(chainpack::RpcFrame &&frame) { - socket()->writeFrame(std::move(frame)); + socket()->writeFrame(frame); } void SocketRpcConnection::sendRpcMessage(const shv::chainpack::RpcMessage &rpc_msg)