diff options
author | Martin Petersson <Martin.Petersson@nokia.com> | 2012-05-30 17:03:57 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-26 11:32:04 +0200 |
commit | bf6897edb01c0d46fda5195e36bb529dbbf7e5dc (patch) | |
tree | e2f0a207baf8ec6ea0aa7d3374e44c468f9d0651 /src/network/ssl | |
parent | 9e66ee2d59d28d61e06e5c57485f1a331b82f269 (diff) |
QtNetwork: remove double buffering on sockets
Removes the readBuffer from the QAbstractSocket since data is already
buffered in the QIODevice.
Change-Id: I4e50b791fd2852455e526fa2c07089d4d3f0b2a4
Reviewed-by: Prasanth Ullattil <prasanth.ullattil@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/network/ssl')
-rw-r--r-- | src/network/ssl/qsslsocket.cpp | 29 | ||||
-rw-r--r-- | src/network/ssl/qsslsocket_openssl.cpp | 5 |
2 files changed, 14 insertions, 20 deletions
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp index 2dee60408b..b2547487ba 100644 --- a/src/network/ssl/qsslsocket.cpp +++ b/src/network/ssl/qsslsocket.cpp @@ -707,7 +707,7 @@ qint64 QSslSocket::bytesAvailable() const Q_D(const QSslSocket); if (d->mode == UnencryptedMode) return QIODevice::bytesAvailable() + (d->plainSocket ? d->plainSocket->bytesAvailable() : 0); - return QIODevice::bytesAvailable() + d->readBuffer.size(); + return QIODevice::bytesAvailable(); } /*! @@ -764,7 +764,7 @@ bool QSslSocket::canReadLine() const Q_D(const QSslSocket); if (d->mode == UnencryptedMode) return QIODevice::canReadLine() || (d->plainSocket && d->plainSocket->canReadLine()); - return QIODevice::canReadLine() || (!d->readBuffer.isEmpty() && d->readBuffer.canReadLine()); + return QIODevice::canReadLine(); } /*! @@ -781,12 +781,8 @@ void QSslSocket::close() QTcpSocket::close(); // must be cleared, reading/writing not possible on closed socket: - d->readBuffer.clear(); + d->buffer.clear(); d->writeBuffer.clear(); - // for QTcpSocket this is already done because it uses the readBuffer/writeBuffer - // if the QIODevice it is based on - // ### FIXME QSslSocket should probably do similar instead of having - // its own readBuffer/writeBuffer } /*! @@ -797,7 +793,7 @@ bool QSslSocket::atEnd() const Q_D(const QSslSocket); if (d->mode == UnencryptedMode) return QIODevice::atEnd() && (!d->plainSocket || d->plainSocket->atEnd()); - return QIODevice::atEnd() && d->readBuffer.isEmpty(); + return QIODevice::atEnd(); } /*! @@ -1829,21 +1825,18 @@ qint64 QSslSocket::readData(char *data, qint64 maxlen) if (d->mode == UnencryptedMode && !d->autoStartHandshake) { readBytes = d->plainSocket->read(data, maxlen); } else { - do { - const char *readPtr = d->readBuffer.readPointer(); - int bytesToRead = qMin<int>(maxlen - readBytes, d->readBuffer.nextDataBlockSize()); - ::memcpy(data + readBytes, readPtr, bytesToRead); - readBytes += bytesToRead; - d->readBuffer.free(bytesToRead); - } while (!d->readBuffer.isEmpty() && readBytes < maxlen); + int bytesToRead = qMin<int>(maxlen, d->buffer.size()); + readBytes = d->buffer.read(data, bytesToRead); } + #ifdef QSSLSOCKET_DEBUG qDebug() << "QSslSocket::readData(" << (void *)data << ',' << maxlen << ") ==" << readBytes; #endif // possibly trigger another transmit() to decrypt more data from the socket - if (d->readBuffer.isEmpty() && d->plainSocket->bytesAvailable()) + if (d->buffer.isEmpty() && d->plainSocket->bytesAvailable()) { QMetaObject::invokeMethod(this, "_q_flushReadBuffer", Qt::QueuedConnection); + } return readBytes; } @@ -1907,7 +1900,7 @@ void QSslSocketPrivate::init() // that it is possible setting it before connecting // ignoreErrorsList.clear(); - readBuffer.clear(); + buffer.clear(); writeBuffer.clear(); configuration.peerCertificate.clear(); configuration.peerCertificateChain.clear(); @@ -2112,7 +2105,7 @@ void QSslSocketPrivate::createPlainSocket(QIODevice::OpenMode openMode) q, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*))); #endif - readBuffer.clear(); + buffer.clear(); writeBuffer.clear(); connectionEncrypted = false; configuration.peerCertificate.clear(); diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp index 38368583ff..83071f2c7a 100644 --- a/src/network/ssl/qsslsocket_openssl.cpp +++ b/src/network/ssl/qsslsocket_openssl.cpp @@ -953,12 +953,13 @@ void QSslSocketBackendPrivate::transmit() } // Check if we've got any data to be read from the socket. - if (!connectionEncrypted || !readBufferMaxSize || readBuffer.size() < readBufferMaxSize) + if (!connectionEncrypted || !readBufferMaxSize || buffer.size() < readBufferMaxSize) while ((pendingBytes = plainSocket->bytesAvailable()) > 0) { // Read encrypted data from the socket into a buffer. data.resize(pendingBytes); // just peek() here because q_BIO_write could write less data than expected int encryptedBytesRead = plainSocket->peek(data.data(), pendingBytes); + #ifdef QSSLSOCKET_DEBUG qDebug() << "QSslSocketBackendPrivate::transmit: read" << encryptedBytesRead << "encrypted bytes from the socket"; #endif @@ -1025,7 +1026,7 @@ void QSslSocketBackendPrivate::transmit() #ifdef QSSLSOCKET_DEBUG qDebug() << "QSslSocketBackendPrivate::transmit: decrypted" << readBytes << "bytes"; #endif - char *ptr = readBuffer.reserve(readBytes); + char *ptr = buffer.reserve(readBytes); ::memcpy(ptr, data.data(), readBytes); if (readyReadEmittedPointer) |