diff options
Diffstat (limited to 'src/corelib/serialization')
-rw-r--r-- | src/corelib/serialization/qcborstreamreader.cpp | 35 | ||||
-rw-r--r-- | src/corelib/serialization/qcborvalue.cpp | 136 | ||||
-rw-r--r-- | src/corelib/serialization/qcborvalue_p.h | 4 | ||||
-rw-r--r-- | src/corelib/serialization/qjsonarray.cpp | 7 | ||||
-rw-r--r-- | src/corelib/serialization/qjsonobject.cpp | 11 | ||||
-rw-r--r-- | src/corelib/serialization/qtextstream.cpp | 144 | ||||
-rw-r--r-- | src/corelib/serialization/qtextstream.h | 4 |
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 ¢er(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) { |