diff options
author | Karsten Heimrich <karsten.heimrich@qt.io> | 2020-06-18 14:30:45 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@qt.io> | 2020-06-18 16:55:07 +0200 |
commit | aeeaa00fa083ac339d0770d633d22f203c504253 (patch) | |
tree | 1eb57c4321f6001e6e054245d08c3069c3a73b77 | |
parent | 7fccdec877b1a930c00a6774b22f977613f1cdb4 (diff) | |
download | qtwebsockets-aeeaa00fa083ac339d0770d633d22f203c504253.tar.gz |
Port QtWebSockets from QTextCodec to QStringDecoder
Task-number: QTBUG-75665
Change-Id: I957e853aef6a4e53bf0c2a0ff4ceac80522ba00f
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
-rw-r--r-- | src/src.pro | 6 | ||||
-rw-r--r-- | src/websockets/qwebsocketdataprocessor.cpp | 39 | ||||
-rw-r--r-- | src/websockets/qwebsocketdataprocessor_p.h | 7 |
3 files changed, 16 insertions, 36 deletions
diff --git a/src/src.pro b/src/src.pro index b5d9d1b..ad1b0c7 100644 --- a/src/src.pro +++ b/src/src.pro @@ -1,7 +1,5 @@ TEMPLATE = subdirs CONFIG += ordered -qtConfig(textcodec) { - SUBDIRS += websockets - qtHaveModule(quick): SUBDIRS += imports -} +SUBDIRS += websockets +qtHaveModule(quick): SUBDIRS += imports diff --git a/src/websockets/qwebsocketdataprocessor.cpp b/src/websockets/qwebsocketdataprocessor.cpp index 0d2e927..63ef9be 100644 --- a/src/websockets/qwebsocketdataprocessor.cpp +++ b/src/websockets/qwebsocketdataprocessor.cpp @@ -60,9 +60,8 @@ #include "qwebsocketframe_p.h" #include <QtCore/QtEndian> -#include <QtCore/QTextCodec> -#include <QtCore/QTextDecoder> #include <QtCore/QDebug> +#include <QtCore/QStringDecoder> #include <limits.h> @@ -83,8 +82,8 @@ QWebSocketDataProcessor::QWebSocketDataProcessor(QObject *parent) : m_binaryMessage(), m_textMessage(), m_payloadLength(0), - m_pConverterState(nullptr), - m_pTextCodec(QTextCodec::codecForName("UTF-8")), + m_decoder(QStringDecoder(QStringDecoder::Utf8, QStringDecoder::Flag::Stateless + | QStringDecoder::Flag::ConvertInvalidToNull)), m_waitTimer(new QTimer(this)) { clear(); @@ -100,10 +99,6 @@ QWebSocketDataProcessor::QWebSocketDataProcessor(QObject *parent) : QWebSocketDataProcessor::~QWebSocketDataProcessor() { clear(); - if (m_pConverterState) { - delete m_pConverterState; - m_pConverterState = nullptr; - } } void QWebSocketDataProcessor::setMaxAllowedFrameSize(quint64 maxAllowedFrameSize) @@ -203,12 +198,9 @@ bool QWebSocketDataProcessor::process(QIODevice *pIoDevice) } if (m_opCode == QWebSocketProtocol::OpCodeText) { - QString frameTxt = m_pTextCodec->toUnicode(frame.payload().constData(), - frame.payload().size(), - m_pConverterState); - bool failed = (m_pConverterState->invalidChars != 0) - || (frame.isFinalFrame() && (m_pConverterState->remainingChars != 0)); - if (Q_UNLIKELY(failed)) { + QString frameTxt = m_decoder(frame.payload().constData(), + frame.payload().size()); + if (Q_UNLIKELY(m_decoder.hasError())) { clear(); Q_EMIT errorEncountered(QWebSocketProtocol::CloseCodeWrongDatatype, tr("Invalid UTF-8 code encountered.")); @@ -259,15 +251,7 @@ void QWebSocketDataProcessor::clear() m_binaryMessage.clear(); m_textMessage.clear(); m_payloadLength = 0; - if (m_pConverterState) { - if ((m_pConverterState->remainingChars != 0) || (m_pConverterState->invalidChars != 0)) { - delete m_pConverterState; - m_pConverterState = nullptr; - } - } - if (!m_pConverterState) - m_pConverterState = new QTextCodec::ConverterState(QTextCodec::ConvertInvalidToNull | - QTextCodec::IgnoreHeader); + m_decoder.resetState(); } /*! @@ -303,11 +287,10 @@ bool QWebSocketDataProcessor::processControlFrame(const QWebSocketFrame &frame) closeReason = tr("Invalid close code %1 detected.").arg(closeCode); } else { if (payload.size() > 2) { - QTextCodec *tc = QTextCodec::codecForName(QByteArrayLiteral("UTF-8")); - QTextCodec::ConverterState state(QTextCodec::ConvertInvalidToNull); - closeReason = tc->toUnicode(payload.constData() + 2, payload.size() - 2, &state); - const bool failed = (state.invalidChars != 0) || (state.remainingChars != 0); - if (Q_UNLIKELY(failed)) { + auto toUtf16 = QStringDecoder(QStringDecoder::Utf8, + QStringDecoder::Flag::Stateless | QStringDecoder::Flag::ConvertInvalidToNull); + closeReason = toUtf16(payload.constData() + 2, payload.size() - 2); + if (Q_UNLIKELY(toUtf16.hasError())) { closeCode = QWebSocketProtocol::CloseCodeWrongDatatype; closeReason = tr("Invalid UTF-8 code encountered."); } diff --git a/src/websockets/qwebsocketdataprocessor_p.h b/src/websockets/qwebsocketdataprocessor_p.h index d540089..5405060 100644 --- a/src/websockets/qwebsocketdataprocessor_p.h +++ b/src/websockets/qwebsocketdataprocessor_p.h @@ -54,8 +54,8 @@ #include <QtCore/QObject> #include <QtCore/QByteArray> #include <QtCore/QString> -#include <QtCore/QTextCodec> -#include <QTimer> +#include <QtCore/QStringDecoder> +#include <QtCore/QTimer> #include "qwebsocketframe_p.h" #include "qwebsocketprotocol.h" #include "qwebsocketprotocol_p.h" @@ -117,8 +117,7 @@ private: QByteArray m_binaryMessage; QString m_textMessage; quint64 m_payloadLength; - QTextCodec::ConverterState *m_pConverterState; - QTextCodec *m_pTextCodec; + QStringDecoder m_decoder; QWebSocketFrame frame; QTimer *m_waitTimer; quint64 m_maxAllowedMessageSize = MAX_MESSAGE_SIZE_IN_BYTES; |