QTextStream: Fix logical error in setEncoding

We only want to enable writing BOM if we have _not_ started
writing.

Fixes: QTBUG-106279
Change-Id: Ibcbc101b931615fddb2507f01307bf9619772d7b
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
(cherry picked from commit c76f7cbbcbe68bf785e8d8cbbe641cd6c0e42834)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Mårten Nordheim 2022-09-06 17:21:40 +02:00 committed by Qt Cherry-pick Bot
parent 42c7bb44f9
commit acaa3c6a33
2 changed files with 56 additions and 1 deletions

View File

@ -2941,7 +2941,7 @@ void QTextStream::setEncoding(QStringConverter::Encoding encoding)
d->encoding = encoding;
d->toUtf16 = QStringDecoder(d->encoding);
bool generateBOM = d->hasWrittenData && d->generateBOM;
bool generateBOM = !d->hasWrittenData && d->generateBOM;
d->fromUtf16 = QStringEncoder(d->encoding,
generateBOM ? QStringEncoder::Flag::WriteBom : QStringEncoder::Flag::Default);

View File

@ -12,6 +12,7 @@
#include <QDebug>
#include <QElapsedTimer>
#include <QFile>
#include <QTemporaryFile>
#include <QStringConverter>
#include <QTcpSocket>
#include <QTemporaryDir>
@ -202,6 +203,9 @@ private slots:
void textModeOnEmptyRead();
void autodetectUnicode_data();
void autodetectUnicode();
private:
void generateLineData(bool for_QString);
void generateAllData(bool for_QString);
@ -3043,6 +3047,57 @@ void tst_QTextStream::textModeOnEmptyRead()
QVERIFY(file.isTextModeEnabled());
}
void tst_QTextStream::autodetectUnicode_data()
{
QTest::addColumn<QStringConverter::Encoding>("encoding");
QTest::newRow("Utf8") << QStringConverter::Utf8;
QTest::newRow("Utf16BE") << QStringConverter::Utf16BE;
QTest::newRow("Utf16LE") << QStringConverter::Utf16LE;
QTest::newRow("Utf32BE") << QStringConverter::Utf32BE;
QTest::newRow("Utf32LE") << QStringConverter::Utf32LE;
}
void tst_QTextStream::autodetectUnicode()
{
QFETCH(QStringConverter::Encoding, encoding);
QTemporaryFile file;
QVERIFY(file.open());
QString original("HelloWorld👋");
{
QTextStream out(&file);
out.setGenerateByteOrderMark(true);
out.setEncoding(encoding);
out << original;
}
file.seek(0);
{
QTextStream in(&file);
QString actual;
in >> actual;
QCOMPARE(actual, original);
QCOMPARE(in.encoding(), encoding);
}
file.seek(0);
// Again, but change order of calls to QTextStream...
{
QTextStream out(&file);
out.setEncoding(encoding);
out.setGenerateByteOrderMark(true);
out << original;
}
file.seek(0);
{
QTextStream in(&file);
QString actual;
in >> actual;
QCOMPARE(actual, original);
QCOMPARE(in.encoding(), encoding);
}
}
// ------------------------------------------------------------------------------