summaryrefslogtreecommitdiffstats
path: root/src/corelib/serialization/qxmlstream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/serialization/qxmlstream.cpp')
-rw-r--r--src/corelib/serialization/qxmlstream.cpp18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/corelib/serialization/qxmlstream.cpp b/src/corelib/serialization/qxmlstream.cpp
index 0aeef451bdd..e68544b1cf5 100644
--- a/src/corelib/serialization/qxmlstream.cpp
+++ b/src/corelib/serialization/qxmlstream.cpp
@@ -3063,13 +3063,19 @@ void QXmlStreamWriterPrivate::indent(int level)
void QXmlStreamWriterPrivate::doWriteToDevice(QStringView s)
{
- QStringEncoder toUtf8(QStringEncoder::Utf8, QStringEncoder::Flag::Stateless);
- QByteArray bytes = toUtf8(s);
- if (toUtf8.hasError()) {
- hasEncodingError = true;
- return;
+ constexpr qsizetype MaxChunkSize = 512;
+ char buffer [3 * MaxChunkSize];
+ QStringEncoder::State state;
+ while (!s.isEmpty()) {
+ const qsizetype chunkSize = std::min(s.size(), MaxChunkSize);
+ char *end = QUtf8::convertFromUnicode(buffer, s.first(chunkSize), &state);
+ if (state.remainingChars > 0) {
+ hasEncodingError = true;
+ return;
+ }
+ doWriteToDevice(QUtf8StringView{buffer, end});
+ s = s.sliced(chunkSize);
}
- doWriteToDevice(QUtf8StringView{bytes});
}
void QXmlStreamWriterPrivate::doWriteToDevice(QUtf8StringView s)