summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlex Trotsenko <alex1973tr@gmail.com>2020-08-06 18:57:43 +0300
committerAlex Trotsenko <alex1973tr@gmail.com>2020-08-11 17:21:45 +0300
commit8f53d66e3e412911f4648e88e3e753043fcbfad8 (patch)
treea14e015a4517f0d99a137cbf3e1ad0106ce665ed /src
parenta99cee1c7b095a552c04c2aa832574a6f0f44720 (diff)
Introduce QIODevice::skipData()
QIODevice::skip() called a virtual QIODevicePrivate::skip() to implement an efficient skipping on I/O devices for the internal subclasses. The user subclasses cannot inherit QIODevicePrivate, so this functionality was not externally accessible. This patch replaces QIODevicePrivate::skip() with a virtual protected QIODevice::skipData(). While the basic implementation simply discards the data by reading into a dummy buffer, users can reimplement this function to improve the performance in their subclasses. [ChangeLog][QtCore][QIODevice] Added virtual protected skipData(). Now, subclasses can implement device-specific skipping of data. Change-Id: I9522f7f7ab9d03ac06e972a525f8ec2fa909a617 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de> Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/io/qiodevice.cpp25
-rw-r--r--src/corelib/io/qiodevice.h1
-rw-r--r--src/corelib/io/qiodevice_p.h2
-rw-r--r--src/network/socket/qabstractsocket.cpp13
-rw-r--r--src/network/socket/qabstractsocket.h1
-rw-r--r--src/network/socket/qabstractsocket_p.h3
-rw-r--r--src/network/socket/qlocalsocket.cpp5
-rw-r--r--src/network/socket/qlocalsocket.h1
-rw-r--r--src/network/socket/qlocalsocket_p.h2
-rw-r--r--src/network/socket/qlocalsocket_tcp.cpp10
-rw-r--r--src/network/socket/qlocalsocket_unix.cpp10
-rw-r--r--src/network/socket/qlocalsocket_win.cpp5
-rw-r--r--src/network/ssl/qsslsocket.cpp12
-rw-r--r--src/network/ssl/qsslsocket.h1
-rw-r--r--src/network/ssl/qsslsocket_p.h1
15 files changed, 56 insertions, 36 deletions
diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp
index 9def33ad9f..21718fede2 100644
--- a/src/corelib/io/qiodevice.cpp
+++ b/src/corelib/io/qiodevice.cpp
@@ -1915,7 +1915,7 @@ QByteArray QIODevice::peek(qint64 maxSize)
For random-access devices, skip() can be used to seek forward from the
current position. Negative \a maxSize values are not allowed.
- \sa peek(), seek(), read()
+ \sa skipData(), peek(), seek(), read()
*/
qint64 QIODevice::skip(qint64 maxSize)
{
@@ -1968,7 +1968,7 @@ qint64 QIODevice::skip(qint64 maxSize)
}
}
- const qint64 skipResult = d->skip(maxSize);
+ const qint64 skipResult = skipData(maxSize);
if (skippedSoFar == 0)
return skipResult;
@@ -2008,14 +2008,23 @@ qint64 QIODevicePrivate::skipByReading(qint64 maxSize)
}
/*!
- \internal
+ \since 6.0
+
+ Skips up to \a maxSize bytes from the device. Returns the number of bytes
+ actually skipped, or -1 on error.
+
+ This function is called by QIODevice. Consider reimplementing it
+ when creating a subclass of QIODevice.
+
+ The base implementation discards the data by reading into a dummy buffer.
+ This is slow, but works for all types of devices. Subclasses can
+ reimplement this function to improve on that.
+
+ \sa skip(), peek(), seek(), read()
*/
-qint64 QIODevicePrivate::skip(qint64 maxSize)
+qint64 QIODevice::skipData(qint64 maxSize)
{
- // Base implementation discards the data by reading into the dummy buffer.
- // It's slow, but this works for all types of devices. Subclasses can
- // reimplement this function to improve on that.
- return skipByReading(maxSize);
+ return d_func()->skipByReading(maxSize);
}
/*!
diff --git a/src/corelib/io/qiodevice.h b/src/corelib/io/qiodevice.h
index 2e4debe339..e8c8dc11bf 100644
--- a/src/corelib/io/qiodevice.h
+++ b/src/corelib/io/qiodevice.h
@@ -167,6 +167,7 @@ protected:
#endif
virtual qint64 readData(char *data, qint64 maxlen) = 0;
virtual qint64 readLineData(char *data, qint64 maxlen);
+ virtual qint64 skipData(qint64 maxSize);
virtual qint64 writeData(const char *data, qint64 len) = 0;
void setOpenMode(OpenMode openMode);
diff --git a/src/corelib/io/qiodevice_p.h b/src/corelib/io/qiodevice_p.h
index da46b983cd..d8e12d7259 100644
--- a/src/corelib/io/qiodevice_p.h
+++ b/src/corelib/io/qiodevice_p.h
@@ -175,8 +175,6 @@ public:
virtual qint64 peek(char *data, qint64 maxSize);
virtual QByteArray peek(qint64 maxSize);
qint64 skipByReading(qint64 maxSize);
- // ### Qt6: consider replacing with a protected virtual QIODevice::skipData().
- virtual qint64 skip(qint64 maxSize);
#ifdef QT_NO_QOBJECT
QIODevice *q_ptr;
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 0f9e22d131..1850265141 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -1361,20 +1361,23 @@ void QAbstractSocketPrivate::fetchConnectionParameters()
emit q->connected();
}
-/*! \internal
+/*! \reimp
*/
-qint64 QAbstractSocketPrivate::skip(qint64 maxSize)
+qint64 QAbstractSocket::skipData(qint64 maxSize)
{
+ Q_D(const QAbstractSocket);
+
// if we're not connected, return -1 indicating EOF
- if (!socketEngine || !socketEngine->isValid() || state != QAbstractSocket::ConnectedState)
+ if (!d->socketEngine || !d->socketEngine->isValid()
+ || d->state != QAbstractSocket::ConnectedState)
return -1;
// Caller, QIODevice::skip(), has ensured buffer is empty. So, wait
// for more data in buffered mode.
- if (isBuffered)
+ if (d->isBuffered)
return 0;
- return QIODevicePrivate::skip(maxSize);
+ return QIODevice::skipData(maxSize);
}
void QAbstractSocketPrivate::pauseSocketNotifiers(QAbstractSocket *socket)
diff --git a/src/network/socket/qabstractsocket.h b/src/network/socket/qabstractsocket.h
index 8df804144c..865f667d46 100644
--- a/src/network/socket/qabstractsocket.h
+++ b/src/network/socket/qabstractsocket.h
@@ -216,6 +216,7 @@ Q_SIGNALS:
protected:
qint64 readData(char *data, qint64 maxlen) override;
qint64 readLineData(char *data, qint64 maxlen) override;
+ qint64 skipData(qint64 maxSize) override;
qint64 writeData(const char *data, qint64 len) override;
void setSocketState(SocketState state);
diff --git a/src/network/socket/qabstractsocket_p.h b/src/network/socket/qabstractsocket_p.h
index 5aa69d747e..83a8afe36d 100644
--- a/src/network/socket/qabstractsocket_p.h
+++ b/src/network/socket/qabstractsocket_p.h
@@ -71,9 +71,6 @@ public:
QAbstractSocketPrivate();
virtual ~QAbstractSocketPrivate();
- // from QIODevicePrivate
- qint64 skip(qint64 maxSize) override;
-
// from QAbstractSocketEngineReceiver
inline void readNotification() override { canReadNotification(); }
inline void writeNotification() override { canWriteNotification(); }
diff --git a/src/network/socket/qlocalsocket.cpp b/src/network/socket/qlocalsocket.cpp
index ab3fcecf66..e225413c89 100644
--- a/src/network/socket/qlocalsocket.cpp
+++ b/src/network/socket/qlocalsocket.cpp
@@ -152,6 +152,11 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \fn qint64 QLocalSocket::skipData(qint64 maxSize)
+ \reimp
+*/
+
+/*!
\fn qint64 QLocalSocket::writeData(const char *data, qint64 c)
\reimp
*/
diff --git a/src/network/socket/qlocalsocket.h b/src/network/socket/qlocalsocket.h
index d45f8f239d..22763cb339 100644
--- a/src/network/socket/qlocalsocket.h
+++ b/src/network/socket/qlocalsocket.h
@@ -122,6 +122,7 @@ Q_SIGNALS:
protected:
virtual qint64 readData(char*, qint64) override;
+ qint64 skipData(qint64 maxSize) override;
virtual qint64 writeData(const char*, qint64) override;
private:
diff --git a/src/network/socket/qlocalsocket_p.h b/src/network/socket/qlocalsocket_p.h
index 0e05e4c5d7..7eff502607 100644
--- a/src/network/socket/qlocalsocket_p.h
+++ b/src/network/socket/qlocalsocket_p.h
@@ -120,7 +120,6 @@ public:
void init();
#if defined(QT_LOCALSOCKET_TCP)
- qint64 skip(qint64 maxSize) override;
QLocalUnixSocket* tcpSocket;
bool ownsTcpSocket;
void setSocket(QLocalUnixSocket*);
@@ -139,7 +138,6 @@ public:
QWindowsPipeReader *pipeReader;
QLocalSocket::LocalSocketError error;
#else
- qint64 skip(qint64 maxSize) override;
QLocalUnixSocket unixSocket;
QString generateErrorString(QLocalSocket::LocalSocketError, const QString &function) const;
void setErrorAndEmit(QLocalSocket::LocalSocketError, const QString &function);
diff --git a/src/network/socket/qlocalsocket_tcp.cpp b/src/network/socket/qlocalsocket_tcp.cpp
index 1c63d16187..2f0179f40a 100644
--- a/src/network/socket/qlocalsocket_tcp.cpp
+++ b/src/network/socket/qlocalsocket_tcp.cpp
@@ -83,11 +83,6 @@ void QLocalSocketPrivate::setSocket(QLocalUnixSocket* socket)
tcpSocket->setParent(q);
}
-qint64 QLocalSocketPrivate::skip(qint64 maxSize)
-{
- return tcpSocket->skip(maxSize);
-}
-
void QLocalSocketPrivate::_q_errorOccurred(QAbstractSocket::SocketError socketError)
{
Q_Q(QLocalSocket);
@@ -306,6 +301,11 @@ qint64 QLocalSocket::readData(char *data, qint64 c)
return d->tcpSocket->read(data, c);
}
+qint64 QLocalSocket::skipData(qint64 maxSize)
+{
+ return d_func()->tcpSocket->skip(maxSize);
+}
+
qint64 QLocalSocket::writeData(const char *data, qint64 c)
{
Q_D(QLocalSocket);
diff --git a/src/network/socket/qlocalsocket_unix.cpp b/src/network/socket/qlocalsocket_unix.cpp
index 52067a265c..6fd17a6213 100644
--- a/src/network/socket/qlocalsocket_unix.cpp
+++ b/src/network/socket/qlocalsocket_unix.cpp
@@ -87,11 +87,6 @@ void QLocalSocketPrivate::init()
unixSocket.setParent(q);
}
-qint64 QLocalSocketPrivate::skip(qint64 maxSize)
-{
- return unixSocket.skip(maxSize);
-}
-
void QLocalSocketPrivate::_q_errorOccurred(QAbstractSocket::SocketError socketError)
{
Q_Q(QLocalSocket);
@@ -398,6 +393,11 @@ qint64 QLocalSocket::readData(char *data, qint64 c)
return d->unixSocket.read(data, c);
}
+qint64 QLocalSocket::skipData(qint64 maxSize)
+{
+ return d_func()->unixSocket.skip(maxSize);
+}
+
qint64 QLocalSocket::writeData(const char *data, qint64 c)
{
Q_D(QLocalSocket);
diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp
index 48ffd87beb..b585bea625 100644
--- a/src/network/socket/qlocalsocket_win.cpp
+++ b/src/network/socket/qlocalsocket_win.cpp
@@ -204,6 +204,11 @@ qint64 QLocalSocket::readData(char *data, qint64 maxSize)
}
}
+qint64 QLocalSocket::skipData(qint64 maxSize)
+{
+ return QIODevice::skipData(maxSize);
+}
+
qint64 QLocalSocket::writeData(const char *data, qint64 len)
{
Q_D(QLocalSocket);
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp
index 66bcb79c4c..19ab903d36 100644
--- a/src/network/ssl/qsslsocket.cpp
+++ b/src/network/ssl/qsslsocket.cpp
@@ -2541,17 +2541,19 @@ QByteArray QSslSocketPrivate::peek(qint64 maxSize)
}
/*!
- \internal
+ \reimp
*/
-qint64 QSslSocketPrivate::skip(qint64 maxSize)
+qint64 QSslSocket::skipData(qint64 maxSize)
{
- if (mode == QSslSocket::UnencryptedMode && !autoStartHandshake)
- return plainSocket->skip(maxSize);
+ Q_D(QSslSocket);
+
+ if (d->mode == QSslSocket::UnencryptedMode && !d->autoStartHandshake)
+ return d->plainSocket->skip(maxSize);
// In encrypted mode, the SSL backend writes decrypted data directly into the
// QIODevice's read buffer. As this buffer is always emptied by the caller,
// we need to wait for more incoming data.
- return (state == QAbstractSocket::ConnectedState) ? Q_INT64_C(0) : Q_INT64_C(-1);
+ return (d->state == QAbstractSocket::ConnectedState) ? Q_INT64_C(0) : Q_INT64_C(-1);
}
/*!
diff --git a/src/network/ssl/qsslsocket.h b/src/network/ssl/qsslsocket.h
index b28916c951..4a576b1784 100644
--- a/src/network/ssl/qsslsocket.h
+++ b/src/network/ssl/qsslsocket.h
@@ -186,6 +186,7 @@ Q_SIGNALS:
protected:
qint64 readData(char *data, qint64 maxlen) override;
+ qint64 skipData(qint64 maxSize) override;
qint64 writeData(const char *data, qint64 len) override;
private:
diff --git a/src/network/ssl/qsslsocket_p.h b/src/network/ssl/qsslsocket_p.h
index 60d5cd1484..31b8b79302 100644
--- a/src/network/ssl/qsslsocket_p.h
+++ b/src/network/ssl/qsslsocket_p.h
@@ -190,7 +190,6 @@ public:
virtual qint64 peek(char *data, qint64 maxSize) override;
virtual QByteArray peek(qint64 maxSize) override;
- qint64 skip(qint64 maxSize) override;
bool flush() override;
// Platform specific functions