summaryrefslogtreecommitdiffstats
path: root/src/corelib/serialization
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/serialization')
-rw-r--r--src/corelib/serialization/qcborstreamreader.cpp35
-rw-r--r--src/corelib/serialization/qcborvalue.cpp136
-rw-r--r--src/corelib/serialization/qcborvalue_p.h4
-rw-r--r--src/corelib/serialization/qjsonarray.cpp7
-rw-r--r--src/corelib/serialization/qjsonobject.cpp11
-rw-r--r--src/corelib/serialization/qtextstream.cpp144
-rw-r--r--src/corelib/serialization/qtextstream.h4
7 files changed, 247 insertions, 94 deletions
diff --git a/src/corelib/serialization/qcborstreamreader.cpp b/src/corelib/serialization/qcborstreamreader.cpp
index c983436606..ec385e0629 100644
--- a/src/corelib/serialization/qcborstreamreader.cpp
+++ b/src/corelib/serialization/qcborstreamreader.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2018 Intel Corporation.
+** Copyright (C) 2020 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -42,6 +42,7 @@
#define CBOR_NO_ENCODER_API
#include <private/qcborcommon_p.h>
+#include <private/qbytearray_p.h>
#include <private/qnumeric_p.h>
#include <private/qutfcodec_p.h>
#include <qdebug.h>
@@ -1055,6 +1056,10 @@ bool QCborStreamReader::next(int maxRecursion)
} else if (isString() || isByteArray()) {
auto r = _readByteArray_helper();
while (r.status == Ok) {
+ if (isString() && r.data.size() > MaxStringSize) {
+ d->handleError(CborErrorDataTooLarge);
+ break;
+ }
if (isString() && !QUtf8::isValidUtf8(r.data, r.data.size()).isValidUtf8) {
d->handleError(CborErrorInvalidUtf8TextString);
break;
@@ -1337,15 +1342,23 @@ QCborStreamReader::StringResult<QString> QCborStreamReader::_readString_helper()
result.status = r.status;
if (r.status == Ok) {
- QTextCodec::ConverterState cs;
- result.data = QUtf8::convertToUnicode(r.data, r.data.size(), &cs);
- if (cs.invalidChars == 0 && cs.remainingChars == 0)
- return result;
+ // See QUtf8::convertToUnicode() a detailed explanation of why this
+ // conversion uses the same number of words or less.
+ CborError err = CborNoError;
+ if (r.data.size() > MaxStringSize) {
+ err = CborErrorDataTooLarge;
+ } else {
+ QTextCodec::ConverterState cs;
+ result.data = QUtf8::convertToUnicode(r.data, r.data.size(), &cs);
+ if (cs.invalidChars != 0 || cs.remainingChars != 0)
+ err = CborErrorInvalidUtf8TextString;
+ }
- d->handleError(CborErrorInvalidUtf8TextString);
- result.data.clear();
- result.status = Error;
- return result;
+ if (err) {
+ d->handleError(err);
+ result.data.clear();
+ result.status = Error;
+ }
}
return result;
}
@@ -1373,6 +1386,10 @@ QCborStreamReader::StringResult<QByteArray> QCborStreamReader::_readByteArray_he
qsizetype len = _currentStringChunkSize();
if (len < 0)
return result;
+ if (len > MaxByteArraySize) {
+ d->handleError(CborErrorDataTooLarge);
+ return result;
+ }
result.data.resize(len);
auto r = readStringChunk(result.data.data(), len);
diff --git a/src/corelib/serialization/qcborvalue.cpp b/src/corelib/serialization/qcborvalue.cpp
index 5a59646233..ddc303e15d 100644
--- a/src/corelib/serialization/qcborvalue.cpp
+++ b/src/corelib/serialization/qcborvalue.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2018 Intel Corporation.
+** Copyright (C) 2020 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -53,6 +53,7 @@
#include <qendian.h>
#include <qlocale.h>
+#include <private/qbytearray_p.h>
#include <private/qnumeric_p.h>
#include <private/qsimd_p.h>
@@ -844,11 +845,6 @@ static QCborValue::Type convertToExtendedType(QCborContainerPrivate *d)
return QCborValue::Tag;
}
-#if QT_CONFIG(cborstreamreader)
-// in qcborstream.cpp
-extern void qt_cbor_stream_set_error(QCborStreamReaderPrivate *d, QCborError error);
-#endif
-
#if QT_CONFIG(cborstreamwriter)
static void writeDoubleToCbor(QCborStreamWriter &writer, double d, QCborValue::EncodingOptions opt)
{
@@ -1462,23 +1458,59 @@ static Element decodeBasicValueFromCbor(QCborStreamReader &reader)
return e;
}
-static inline QCborContainerPrivate *createContainerFromCbor(QCborStreamReader &reader)
+static inline QCborContainerPrivate *createContainerFromCbor(QCborStreamReader &reader, int remainingRecursionDepth)
{
- auto d = new QCborContainerPrivate;
- d->ref.storeRelaxed(1);
- d->decodeFromCbor(reader);
+ if (Q_UNLIKELY(remainingRecursionDepth == 0)) {
+ QCborContainerPrivate::setErrorInReader(reader, { QCborError::NestingTooDeep });
+ return nullptr;
+ }
+
+ QCborContainerPrivate *d = nullptr;
+ int mapShift = reader.isMap() ? 1 : 0;
+ if (reader.isLengthKnown()) {
+ quint64 len = reader.length();
+
+ // Clamp allocation to 1M elements (avoids crashing due to corrupt
+ // stream or loss of precision when converting from quint64 to
+ // QVector::size_type).
+ len = qMin(len, quint64(1024 * 1024 - 1));
+ if (len) {
+ d = new QCborContainerPrivate;
+ d->ref.storeRelaxed(1);
+ d->elements.reserve(qsizetype(len) << mapShift);
+ }
+ } else {
+ d = new QCborContainerPrivate;
+ d->ref.storeRelaxed(1);
+ }
+
+ reader.enterContainer();
+ if (reader.lastError() != QCborError::NoError)
+ return d;
+
+ while (reader.hasNext() && reader.lastError() == QCborError::NoError)
+ d->decodeValueFromCbor(reader, remainingRecursionDepth - 1);
+
+ if (reader.lastError() == QCborError::NoError)
+ reader.leaveContainer();
+
return d;
}
-static QCborValue taggedValueFromCbor(QCborStreamReader &reader)
+static QCborValue taggedValueFromCbor(QCborStreamReader &reader, int remainingRecursionDepth)
{
+ if (Q_UNLIKELY(remainingRecursionDepth == 0)) {
+ QCborContainerPrivate::setErrorInReader(reader, { QCborError::NestingTooDeep });
+ return QCborValue::Invalid;
+ }
+
auto d = new QCborContainerPrivate;
d->append(reader.toTag());
reader.next();
if (reader.lastError() == QCborError::NoError) {
// decode tagged value
- d->decodeValueFromCbor(reader);
+ d->decodeValueFromCbor(reader, remainingRecursionDepth - 1);
}
QCborValue::Type type;
@@ -1494,6 +1526,13 @@ static QCborValue taggedValueFromCbor(QCborStreamReader &reader)
return QCborContainerPrivate::makeValue(type, -1, d);
}
+// in qcborstream.cpp
+extern void qt_cbor_stream_set_error(QCborStreamReaderPrivate *d, QCborError error);
+inline void QCborContainerPrivate::setErrorInReader(QCborStreamReader &reader, QCborError error)
+{
+ qt_cbor_stream_set_error(reader.d.data(), error);
+}
+
void QCborContainerPrivate::decodeStringFromCbor(QCborStreamReader &reader)
{
auto addByteData_local = [this](QByteArray::size_type len) -> qint64 {
@@ -1515,6 +1554,8 @@ void QCborContainerPrivate::decodeStringFromCbor(QCborStreamReader &reader)
// and calculate the final size
if (add_overflow(offset, increment, &newSize))
return -1;
+ if (newSize > MaxByteArraySize)
+ return -1;
// since usedData <= data.size(), this can't overflow
usedData += increment;
@@ -1538,7 +1579,7 @@ void QCborContainerPrivate::decodeStringFromCbor(QCborStreamReader &reader)
return; // error
if (len != rawlen) {
// truncation
- qt_cbor_stream_set_error(reader.d.data(), { QCborError::DataTooLarge });
+ setErrorInReader(reader, { QCborError::DataTooLarge });
return;
}
@@ -1548,7 +1589,7 @@ void QCborContainerPrivate::decodeStringFromCbor(QCborStreamReader &reader)
e.value = addByteData_local(len);
if (e.value < 0) {
// overflow
- qt_cbor_stream_set_error(reader.d.data(), { QCborError::DataTooLarge });
+ setErrorInReader(reader, { QCborError::DataTooLarge });
return;
}
}
@@ -1562,7 +1603,7 @@ void QCborContainerPrivate::decodeStringFromCbor(QCborStreamReader &reader)
auto utf8result = QUtf8::isValidUtf8(dataPtr() + data.size() - len, len);
if (!utf8result.isValidUtf8) {
r.status = QCborStreamReader::Error;
- qt_cbor_stream_set_error(reader.d.data(), { QCborError::InvalidUtf8String });
+ setErrorInReader(reader, { QCborError::InvalidUtf8String });
break;
}
isAscii = isAscii && utf8result.isValidAscii;
@@ -1586,14 +1627,7 @@ void QCborContainerPrivate::decodeStringFromCbor(QCborStreamReader &reader)
// error
r.status = QCborStreamReader::Error;
- qt_cbor_stream_set_error(reader.d.data(), { QCborError::DataTooLarge });
- }
-
- if (r.status == QCborStreamReader::Error) {
- // There can only be errors if there was data to be read.
- Q_ASSERT(e.flags & Element::HasByteData);
- data.truncate(e.value);
- return;
+ setErrorInReader(reader, { QCborError::DataTooLarge });
}
// update size
@@ -1607,14 +1641,30 @@ void QCborContainerPrivate::decodeStringFromCbor(QCborStreamReader &reader)
Q_ASSERT(e.type == QCborValue::String);
e.flags |= Element::StringIsAscii;
}
+
+ // check that this UTF-8 text string can be loaded onto a QString
+ if (e.type == QCborValue::String) {
+ if (Q_UNLIKELY(b->len > MaxStringSize)) {
+ setErrorInReader(reader, { QCborError::DataTooLarge });
+ r.status = QCborStreamReader::Error;
+ }
+ }
+ }
+
+ if (r.status == QCborStreamReader::Error) {
+ // There can only be errors if there was data to be read.
+ Q_ASSERT(e.flags & Element::HasByteData);
+ data.truncate(e.value);
+ return;
}
elements.append(e);
}
-void QCborContainerPrivate::decodeValueFromCbor(QCborStreamReader &reader)
+void QCborContainerPrivate::decodeValueFromCbor(QCborStreamReader &reader, int remainingRecursionDepth)
{
- switch (reader.type()) {
+ QCborStreamReader::Type t = reader.type();
+ switch (t) {
case QCborStreamReader::UnsignedInteger:
case QCborStreamReader::NegativeInteger:
case QCborStreamReader::SimpleType:
@@ -1631,37 +1681,17 @@ void QCborContainerPrivate::decodeValueFromCbor(QCborStreamReader &reader)
case QCborStreamReader::Array:
case QCborStreamReader::Map:
+ return append(makeValue(t == QCborStreamReader::Array ? QCborValue::Array : QCborValue::Map, -1,
+ createContainerFromCbor(reader, remainingRecursionDepth),
+ MoveContainer));
+
case QCborStreamReader::Tag:
- return append(QCborValue::fromCbor(reader));
+ return append(taggedValueFromCbor(reader, remainingRecursionDepth));
case QCborStreamReader::Invalid:
return; // probably a decode error
}
}
-
-void QCborContainerPrivate::decodeFromCbor(QCborStreamReader &reader)
-{
- int mapShift = reader.isMap() ? 1 : 0;
- if (reader.isLengthKnown()) {
- quint64 len = reader.length();
-
- // Clamp allocation to 1M elements (avoids crashing due to corrupt
- // stream or loss of precision when converting from quint64 to
- // QVector::size_type).
- len = qMin(len, quint64(1024 * 1024 - 1));
- elements.reserve(qsizetype(len) << mapShift);
- }
-
- reader.enterContainer();
- if (reader.lastError() != QCborError::NoError)
- return;
-
- while (reader.hasNext() && reader.lastError() == QCborError::NoError)
- decodeValueFromCbor(reader);
-
- if (reader.lastError() == QCborError::NoError)
- reader.leaveContainer();
-}
#endif // QT_CONFIG(cborstreamreader)
/*!
@@ -2363,6 +2393,8 @@ QCborValueRef QCborValue::operator[](qint64 key)
}
#if QT_CONFIG(cborstreamreader)
+enum { MaximumRecursionDepth = 1024 };
+
/*!
Decodes one item from the CBOR stream found in \a reader and returns the
equivalent representation. This function is recursive: if the item is a map
@@ -2423,12 +2455,12 @@ QCborValue QCborValue::fromCbor(QCborStreamReader &reader)
case QCborStreamReader::Map:
result.n = -1;
result.t = reader.isArray() ? Array : Map;
- result.container = createContainerFromCbor(reader);
+ result.container = createContainerFromCbor(reader, MaximumRecursionDepth);
break;
// tag
case QCborStreamReader::Tag:
- result = taggedValueFromCbor(reader);
+ result = taggedValueFromCbor(reader, MaximumRecursionDepth);
break;
}
diff --git a/src/corelib/serialization/qcborvalue_p.h b/src/corelib/serialization/qcborvalue_p.h
index f6d9c15841..1d686f118b 100644
--- a/src/corelib/serialization/qcborvalue_p.h
+++ b/src/corelib/serialization/qcborvalue_p.h
@@ -414,9 +414,9 @@ public:
elements.remove(idx);
}
- void decodeValueFromCbor(QCborStreamReader &reader);
- void decodeFromCbor(QCborStreamReader &reader);
+ void decodeValueFromCbor(QCborStreamReader &reader, int remainiingStackDepth);
void decodeStringFromCbor(QCborStreamReader &reader);
+ static inline void setErrorInReader(QCborStreamReader &reader, QCborError error);
};
QT_END_NAMESPACE
diff --git a/src/corelib/serialization/qjsonarray.cpp b/src/corelib/serialization/qjsonarray.cpp
index 08702771a8..05138ad610 100644
--- a/src/corelib/serialization/qjsonarray.cpp
+++ b/src/corelib/serialization/qjsonarray.cpp
@@ -167,7 +167,11 @@ QJsonArray::QJsonArray(QCborContainerPrivate *array)
*/
void QJsonArray::initialize()
{
- a = nullptr;
+ // Because we're being called with uninitialized state, we can't do:
+ // a = nullptr;
+ // QExplicitlyDataSharedPointer::operator= will read the current value
+ void *ptr = &a;
+ memset(ptr, 0, sizeof(a));
}
/*!
@@ -177,7 +181,6 @@ QJsonArray::~QJsonArray() = default;
QJsonArray::QJsonArray(std::initializer_list<QJsonValue> args)
{
- initialize();
for (const auto & arg : args)
append(arg);
}
diff --git a/src/corelib/serialization/qjsonobject.cpp b/src/corelib/serialization/qjsonobject.cpp
index a6987279d3..b76e50e2d2 100644
--- a/src/corelib/serialization/qjsonobject.cpp
+++ b/src/corelib/serialization/qjsonobject.cpp
@@ -150,7 +150,11 @@ QJsonObject::QJsonObject(QCborContainerPrivate *object)
void QJsonObject::initialize()
{
- o = nullptr;
+ // Because we're being called with uninitialized state, we can't do:
+ // o = nullptr;
+ // QExplicitlyDataSharedPointer::operator= will read the current value
+ void *ptr = &o;
+ memset(ptr, 0, sizeof(o));
}
/*!
@@ -160,7 +164,6 @@ QJsonObject::~QJsonObject() = default;
QJsonObject::QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)
{
- initialize();
for (const auto &arg : args)
insert(arg.first, arg.second);
}
@@ -401,7 +404,9 @@ QJsonValue QJsonObject::operator [](const QString &key) const
#if QT_STRINGVIEW_LEVEL < 2
/*!
- Returns a reference to the value for \a key.
+ Returns a reference to the value for \a key. If there is no value with key
+ \a key in the object, one is created with a QJsonValue::Null value and then
+ returned.
The return value is of type QJsonValueRef, a helper class for QJsonArray
and QJsonObject. When you get an object of type QJsonValueRef, you can
diff --git a/src/corelib/serialization/qtextstream.cpp b/src/corelib/serialization/qtextstream.cpp
index b8137e0abd..9325cd9163 100644
--- a/src/corelib/serialization/qtextstream.cpp
+++ b/src/corelib/serialization/qtextstream.cpp
@@ -135,30 +135,30 @@ static const int QTEXTSTREAM_BUFFERSIZE = 16384;
\table
\header \li Manipulator \li Description
- \row \li \c Qt::bin \li Same as setIntegerBase(2).
- \row \li \c Qt::oct \li Same as setIntegerBase(8).
- \row \li \c Qt::dec \li Same as setIntegerBase(10).
- \row \li \c Qt::hex \li Same as setIntegerBase(16).
- \row \li \c Qt::showbase \li Same as setNumberFlags(numberFlags() | ShowBase).
- \row \li \c Qt::forcesign \li Same as setNumberFlags(numberFlags() | ForceSign).
- \row \li \c Qt::forcepoint \li Same as setNumberFlags(numberFlags() | ForcePoint).
- \row \li \c Qt::noshowbase \li Same as setNumberFlags(numberFlags() & ~ShowBase).
- \row \li \c Qt::noforcesign \li Same as setNumberFlags(numberFlags() & ~ForceSign).
- \row \li \c Qt::noforcepoint \li Same as setNumberFlags(numberFlags() & ~ForcePoint).
- \row \li \c Qt::uppercasebase \li Same as setNumberFlags(numberFlags() | UppercaseBase).
- \row \li \c Qt::uppercasedigits \li Same as setNumberFlags(numberFlags() | UppercaseDigits).
- \row \li \c Qt::lowercasebase \li Same as setNumberFlags(numberFlags() & ~UppercaseBase).
- \row \li \c Qt::lowercasedigits \li Same as setNumberFlags(numberFlags() & ~UppercaseDigits).
- \row \li \c Qt::fixed \li Same as setRealNumberNotation(FixedNotation).
- \row \li \c Qt::scientific \li Same as setRealNumberNotation(ScientificNotation).
- \row \li \c Qt::left \li Same as setFieldAlignment(AlignLeft).
- \row \li \c Qt::right \li Same as setFieldAlignment(AlignRight).
- \row \li \c Qt::center \li Same as setFieldAlignment(AlignCenter).
- \row \li \c Qt::endl \li Same as operator<<('\\n') and flush().
- \row \li \c Qt::flush \li Same as flush().
- \row \li \c Qt::reset \li Same as reset().
- \row \li \c Qt::ws \li Same as skipWhiteSpace().
- \row \li \c Qt::bom \li Same as setGenerateByteOrderMark(true).
+ \row \li Qt::bin \li Same as setIntegerBase(2).
+ \row \li Qt::oct \li Same as setIntegerBase(8).
+ \row \li Qt::dec \li Same as setIntegerBase(10).
+ \row \li Qt::hex \li Same as setIntegerBase(16).
+ \row \li Qt::showbase \li Same as setNumberFlags(numberFlags() | ShowBase).
+ \row \li Qt::forcesign \li Same as setNumberFlags(numberFlags() | ForceSign).
+ \row \li Qt::forcepoint \li Same as setNumberFlags(numberFlags() | ForcePoint).
+ \row \li Qt::noshowbase \li Same as setNumberFlags(numberFlags() & ~ShowBase).
+ \row \li Qt::noforcesign \li Same as setNumberFlags(numberFlags() & ~ForceSign).
+ \row \li Qt::noforcepoint \li Same as setNumberFlags(numberFlags() & ~ForcePoint).
+ \row \li Qt::uppercasebase \li Same as setNumberFlags(numberFlags() | UppercaseBase).
+ \row \li Qt::uppercasedigits \li Same as setNumberFlags(numberFlags() | UppercaseDigits).
+ \row \li Qt::lowercasebase \li Same as setNumberFlags(numberFlags() & ~UppercaseBase).
+ \row \li Qt::lowercasedigits \li Same as setNumberFlags(numberFlags() & ~UppercaseDigits).
+ \row \li Qt::fixed \li Same as setRealNumberNotation(FixedNotation).
+ \row \li Qt::scientific \li Same as setRealNumberNotation(ScientificNotation).
+ \row \li Qt::left \li Same as setFieldAlignment(AlignLeft).
+ \row \li Qt::right \li Same as setFieldAlignment(AlignRight).
+ \row \li Qt::center \li Same as setFieldAlignment(AlignCenter).
+ \row \li Qt::endl \li Same as operator<<('\\n') and flush().
+ \row \li Qt::flush \li Same as flush().
+ \row \li Qt::reset \li Same as reset().
+ \row \li Qt::ws \li Same as skipWhiteSpace().
+ \row \li Qt::bom \li Same as setGenerateByteOrderMark(true).
\endtable
In addition, Qt provides three global manipulators that take a
@@ -2693,8 +2693,12 @@ QTextStream &QTextStream::operator<<(const void *ptr)
namespace Qt {
/*!
+ \fn QTextStream &QTextStreamFunctions::bin(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::bin() instead.
+*/
+/*!
Calls QTextStream::setIntegerBase(2) on \a stream and returns \a
stream.
@@ -2707,8 +2711,12 @@ QTextStream &bin(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::oct(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::oct() instead.
+*/
+/*!
Calls QTextStream::setIntegerBase(8) on \a stream and returns \a
stream.
@@ -2721,8 +2729,12 @@ QTextStream &oct(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::dec(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::dec() instead.
+*/
+/*!
Calls QTextStream::setIntegerBase(10) on \a stream and returns \a
stream.
@@ -2735,8 +2747,12 @@ QTextStream &dec(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::hex(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::hex() instead.
+*/
+/*!
Calls QTextStream::setIntegerBase(16) on \a stream and returns \a
stream.
@@ -2750,8 +2766,12 @@ QTextStream &hex(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::showbase(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::showbase() instead.
+*/
+/*!
Calls QTextStream::setNumberFlags(QTextStream::numberFlags() |
QTextStream::ShowBase) on \a stream and returns \a stream.
@@ -2764,8 +2784,12 @@ QTextStream &showbase(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::forcesign(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::forcesign() instead.
+*/
+/*!
Calls QTextStream::setNumberFlags(QTextStream::numberFlags() |
QTextStream::ForceSign) on \a stream and returns \a stream.
@@ -2778,8 +2802,12 @@ QTextStream &forcesign(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::forcepoint(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::forcepoint() instead.
+*/
+/*!
Calls QTextStream::setNumberFlags(QTextStream::numberFlags() |
QTextStream::ForcePoint) on \a stream and returns \a stream.
@@ -2792,8 +2820,12 @@ QTextStream &forcepoint(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::noshowbase(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::noshowbase() instead.
+*/
+/*!
Calls QTextStream::setNumberFlags(QTextStream::numberFlags() &
~QTextStream::ShowBase) on \a stream and returns \a stream.
@@ -2806,8 +2838,12 @@ QTextStream &noshowbase(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::noforcesign(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::noforcesign() instead.
+*/
+/*!
Calls QTextStream::setNumberFlags(QTextStream::numberFlags() &
~QTextStream::ForceSign) on \a stream and returns \a stream.
@@ -2820,8 +2856,12 @@ QTextStream &noforcesign(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::noforcepoint(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::noforcepoint() instead.
+*/
+/*!
Calls QTextStream::setNumberFlags(QTextStream::numberFlags() &
~QTextStream::ForcePoint) on \a stream and returns \a stream.
@@ -2834,8 +2874,12 @@ QTextStream &noforcepoint(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::uppercasebase(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::uppercasebase() instead.
+*/
+/*!
Calls QTextStream::setNumberFlags(QTextStream::numberFlags() |
QTextStream::UppercaseBase) on \a stream and returns \a stream.
@@ -2848,8 +2892,12 @@ QTextStream &uppercasebase(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::uppercasedigits(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::uppercasedigits() instead.
+*/
+/*!
Calls QTextStream::setNumberFlags(QTextStream::numberFlags() |
QTextStream::UppercaseDigits) on \a stream and returns \a stream.
@@ -2862,8 +2910,12 @@ QTextStream &uppercasedigits(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::lowercasebase(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::lowercasebase() instead.
+*/
+/*!
Calls QTextStream::setNumberFlags(QTextStream::numberFlags() &
~QTextStream::UppercaseBase) on \a stream and returns \a stream.
@@ -2876,8 +2928,12 @@ QTextStream &lowercasebase(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::lowercasedigits(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::lowercasedigits() instead.
+*/
+/*!
Calls QTextStream::setNumberFlags(QTextStream::numberFlags() &
~QTextStream::UppercaseDigits) on \a stream and returns \a stream.
@@ -2890,8 +2946,12 @@ QTextStream &lowercasedigits(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::fixed(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::fixed() instead.
+*/
+/*!
Calls QTextStream::setRealNumberNotation(QTextStream::FixedNotation)
on \a stream and returns \a stream.
@@ -2904,8 +2964,12 @@ QTextStream &fixed(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::scientific(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::scientific() instead.
+*/
+/*!
Calls QTextStream::setRealNumberNotation(QTextStream::ScientificNotation)
on \a stream and returns \a stream.
@@ -2918,8 +2982,12 @@ QTextStream &scientific(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::left(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::left() instead.
+*/
+/*!
Calls QTextStream::setFieldAlignment(QTextStream::AlignLeft)
on \a stream and returns \a stream.
@@ -2932,8 +3000,12 @@ QTextStream &left(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::right(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::right() instead.
+*/
+/*!
Calls QTextStream::setFieldAlignment(QTextStream::AlignRight)
on \a stream and returns \a stream.
@@ -2946,8 +3018,12 @@ QTextStream &right(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::center(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::center() instead.
+*/
+/*!
Calls QTextStream::setFieldAlignment(QTextStream::AlignCenter)
on \a stream and returns \a stream.
@@ -2960,8 +3036,12 @@ QTextStream &center(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::endl(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::endl() instead.
+*/
+/*!
Writes '\\n' to the \a stream and flushes the stream.
Equivalent to
@@ -2979,8 +3059,12 @@ QTextStream &endl(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::flush(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::flush() instead.
+*/
+/*!
Calls QTextStream::flush() on \a stream and returns \a stream.
\sa endl(), reset(), {QTextStream manipulators}
@@ -2992,8 +3076,12 @@ QTextStream &flush(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::reset(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::reset() instead.
+*/
+/*!
Calls QTextStream::reset() on \a stream and returns \a stream.
\sa flush(), {QTextStream manipulators}
@@ -3005,8 +3093,12 @@ QTextStream &reset(QTextStream &stream)
}
/*!
+ \fn QTextStream &QTextStreamFunctions::ws(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::ws() instead.
+*/
+/*!
Calls \l {QTextStream::}{skipWhiteSpace()} on \a stream and returns \a stream.
\sa {QTextStream manipulators}
@@ -3044,8 +3136,12 @@ QTextStream &ws(QTextStream &stream)
namespace Qt {
/*!
+ \fn QTextStream &QTextStreamFunctions::bom(QTextStream &stream)
\relates QTextStream
+ \obsolete Use Qt::bom() instead.
+*/
+/*!
Toggles insertion of the Byte Order Mark on \a stream when QTextStream is
used with a UTF codec.
diff --git a/src/corelib/serialization/qtextstream.h b/src/corelib/serialization/qtextstream.h
index 6f93826d8a..0d8a9a548e 100644
--- a/src/corelib/serialization/qtextstream.h
+++ b/src/corelib/serialization/qtextstream.h
@@ -268,7 +268,7 @@ Q_CORE_EXPORT QTextStream &ws(QTextStream &s);
} // namespace Qt
-#if QT_DEPRECATED_SINCE(5, 15) && !defined(Q_QDOC)
+#if QT_DEPRECATED_SINCE(5, 15)
// This namespace only exists for 'using namespace' declarations.
namespace QTextStreamFunctions {
Q_CORE_EXPORT QT_DEPRECATED_X("Use Qt::bin") QTextStream &bin(QTextStream &s);
@@ -303,7 +303,7 @@ QT_WARNING_DISABLE_CLANG("-Wheader-hygiene")
// conflicting definitions compiler errors.
using namespace QTextStreamFunctions;
QT_WARNING_POP
-#endif // QT_DEPRECATED_SINCE(5, 15) && !defined(Q_QDOC)
+#endif // QT_DEPRECATED_SINCE(5, 15)
inline QTextStreamManipulator qSetFieldWidth(int width)
{