Make QIODevice::seek() return false for sequential files.
authorMitch Curtis <mitch.curtis@nokia.com>
Tue, 29 May 2012 10:01:24 +0000 (12:01 +0200)
committerQt by Nokia <qt-info@nokia.com>
Tue, 5 Jun 2012 11:12:58 +0000 (13:12 +0200)
Task-number: QTBUG-18173
Change-Id: Ie3a96d3a6f60995b8ba7823153778869d0c2dc58
Reviewed-by: Andy Shaw <andy.shaw@digia.com>
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@nokia.com>
src/corelib/io/qiodevice.cpp
tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp

index 3c2da7f..03bf59e 100644 (file)
@@ -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()))
index 444762e..22ce512 100644 (file)
@@ -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));