summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@qt.io>2020-06-18 14:30:45 +0200
committerKarsten Heimrich <karsten.heimrich@qt.io>2020-06-18 16:55:07 +0200
commitaeeaa00fa083ac339d0770d633d22f203c504253 (patch)
tree1eb57c4321f6001e6e054245d08c3069c3a73b77
parent7fccdec877b1a930c00a6774b22f977613f1cdb4 (diff)
downloadqtwebsockets-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.pro6
-rw-r--r--src/websockets/qwebsocketdataprocessor.cpp39
-rw-r--r--src/websockets/qwebsocketdataprocessor_p.h7
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;