Deprecate QDataStream::readBytes(char *&, uint &) instead of removing it

We cannot remove the overload using QT_REMOVED_SINCE, because a qint64
lvalue in the new overload will not bind to an uint& parameter, so the
old code would not compile.

Deprecate the old overload, and add a unit-test that makes sure that
it still behaves correctly.

This commit also introduces the new deprecation macros that are
required to do the deprecation in Qt 6.11.

Amends fd48ce0b73

Found in 6.7 API review

Pick-to: 6.7
Change-Id: I02893bfbe040df736f8e746384e0261a0f0041d3
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
Ivan Solovev 2024-01-30 11:35:31 +01:00
parent 0aaf7092cd
commit cbc6ee0eb9
5 changed files with 58 additions and 15 deletions

View File

@ -706,20 +706,6 @@ bool QDateTime::precedes(const QDateTime &other) const
#include "qdatastream.h"
QDataStream &QDataStream::readBytes(char *&s, uint &l)
{
qint64 length = 0;
(void)readBytes(s, length);
if (length != qint64(uint(length))) {
setStatus(ReadCorruptData); // Cannot store length in l
delete[] s;
l = 0;
return *this;
}
l = uint(length);
return *this;
}
QDataStream &QDataStream::writeBytes(const char *s, uint len)
{
return writeBytes(s, qint64(len));

View File

@ -211,6 +211,14 @@ QT_BEGIN_NAMESPACE
# define QT_DEPRECATED_VERSION_6_10
#endif
#if QT_WARN_DEPRECATED_UP_TO >= QT_VERSION_CHECK(6, 11, 0)
# define QT_DEPRECATED_VERSION_X_6_11(text) QT_DEPRECATED_X(text)
# define QT_DEPRECATED_VERSION_6_11 QT_DEPRECATED
#else
# define QT_DEPRECATED_VERSION_X_6_11(text)
# define QT_DEPRECATED_VERSION_6_11
#endif
#define QT_DEPRECATED_VERSION_X_5(minor, text) QT_DEPRECATED_VERSION_X_5_##minor(text)
#define QT_DEPRECATED_VERSION_X(major, minor, text) QT_DEPRECATED_VERSION_X_##major##_##minor(text)
@ -313,6 +321,12 @@ QT_BEGIN_NAMESPACE
# define QT_IF_DEPRECATED_SINCE_6_10(whenTrue, whenFalse) whenTrue
#endif
#if QT_DEPRECATED_SINCE(6, 11)
# define QT_IF_DEPRECATED_SINCE_6_11(whenTrue, whenFalse) whenFalse
#else
# define QT_IF_DEPRECATED_SINCE_6_11(whenTrue, whenFalse) whenTrue
#endif
#ifdef __cplusplus
// A tag to help mark stuff deprecated (cf. QStringViewLiteral)
namespace QtPrivate {

View File

@ -1037,7 +1037,29 @@ QDataStream &QDataStream::operator>>(char32_t &c)
return *this;
}
#if QT_DEPRECATED_SINCE(6, 11)
/*
\deprecated [6.11] Use an overload that takes qint64 length instead.
*/
QDataStream &QDataStream::readBytes(char *&s, uint &l)
{
qint64 length = 0;
(void)readBytes(s, length);
if (length != qint64(uint(length))) {
setStatus(SizeLimitExceeded); // Cannot store length in l
delete[] s;
l = 0;
return *this;
}
l = uint(length);
return *this;
}
#endif // QT_DEPRECATED_SINCE(6, 11)
/*!
\since 6.7
Reads the buffer \a s from the stream and returns a reference to
the stream.

View File

@ -177,8 +177,11 @@ public:
QDataStream &operator<<(char32_t c);
QDataStream &operator<<(const volatile void *) = delete;
#if QT_CORE_REMOVED_SINCE(6, 7)
#if QT_DEPRECATED_SINCE(6, 11)
QT_DEPRECATED_VERSION_X_6_11("Use an overload that takes qint64 length.")
QDataStream &readBytes(char *&, uint &len);
#endif
#if QT_CORE_REMOVED_SINCE(6, 7)
QDataStream &writeBytes(const char *, uint len);
int skipRawData(int len);
int readRawData(char *, int len);

View File

@ -2840,6 +2840,24 @@ void tst_QDataStream::status_charptr_QByteArray()
QCOMPARE(int(stream.status()), expectedStatus);
delete [] buf;
}
#if QT_DEPRECATED_SINCE(6, 11)
QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
{
// check that old overload still works as expected
QDataStream stream(&data, QIODevice::ReadOnly);
char *buf;
auto cleanup = qScopeGuard([&buf] {
delete [] buf;
});
uint len;
stream.readBytes(buf, len);
QCOMPARE(len, expectedString.size());
QCOMPARE(QByteArray(buf, len), expectedString);
QCOMPARE(int(stream.status()), expectedStatus);
}
QT_WARNING_POP
#endif // QT_DEPRECATED_SINCE(6, 11)
{
QDataStream stream(&data, QIODevice::ReadOnly);
QByteArray buf;