summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/io/qiodevice.cpp16
-rw-r--r--tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp4
2 files changed, 11 insertions, 9 deletions
diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp
index 3c2da7fa85..03bf59ed9d 100644
--- a/src/corelib/io/qiodevice.cpp
+++ b/src/corelib/io/qiodevice.cpp
@@ -606,18 +606,22 @@ qint64 QIODevice::size() const
/*!
For random-access devices, this function sets the current position
to \a pos, returning true on success, or false if an error occurred.
- For sequential devices, the default behavior is to do nothing and
- return false.
+ For sequential devices, the default behavior is to produce a warning
+ and return false.
When subclassing QIODevice, you must call QIODevice::seek() at the
start of your function to ensure integrity with QIODevice's
- built-in buffer. The base implementation always returns true.
+ built-in buffer.
\sa pos(), isSequential()
*/
bool QIODevice::seek(qint64 pos)
{
Q_D(QIODevice);
+ if (d->isSequential()) {
+ qWarning("QIODevice::seek: Cannot call seek on a sequential device");
+ return false;
+ }
if (d->openMode == NotOpen) {
qWarning("QIODevice::seek: The device is not open");
return false;
@@ -633,10 +637,8 @@ bool QIODevice::seek(qint64 pos)
#endif
qint64 offset = pos - d->pos;
- if (!d->isSequential()) {
- d->pos = pos;
- d->devicePos = pos;
- }
+ d->pos = pos;
+ d->devicePos = pos;
if (offset < 0
|| offset >= qint64(d->buffer.size()))
diff --git a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp
index 444762e680..22ce512cf9 100644
--- a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp
+++ b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp
@@ -373,9 +373,9 @@ void tst_QSslSocket::constructing()
QCOMPARE(socket.readLine(0, 0), qint64(-1));
char buf[10];
QCOMPARE(socket.readLine(buf, sizeof(buf)), qint64(-1));
- QTest::ignoreMessage(QtWarningMsg, "QIODevice::seek: The device is not open");
+ QTest::ignoreMessage(QtWarningMsg, "QIODevice::seek: Cannot call seek on a sequential device");
QVERIFY(!socket.reset());
- QTest::ignoreMessage(QtWarningMsg, "QIODevice::seek: The device is not open");
+ QTest::ignoreMessage(QtWarningMsg, "QIODevice::seek: Cannot call seek on a sequential device");
QVERIFY(!socket.seek(2));
QCOMPARE(socket.size(), qint64(0));
QVERIFY(!socket.waitForBytesWritten(10));