summaryrefslogtreecommitdiffstats
path: root/src/network/socket
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/socket')
-rw-r--r--src/network/socket/qlocalserver.cpp2
-rw-r--r--src/network/socket/qlocalsocket.h2
-rw-r--r--src/network/socket/qlocalsocket_p.h5
-rw-r--r--src/network/socket/qlocalsocket_win.cpp48
4 files changed, 42 insertions, 15 deletions
diff --git a/src/network/socket/qlocalserver.cpp b/src/network/socket/qlocalserver.cpp
index 76d61f6958..a1085f726a 100644
--- a/src/network/socket/qlocalserver.cpp
+++ b/src/network/socket/qlocalserver.cpp
@@ -184,7 +184,7 @@ QLocalServer::SocketOptions QLocalServer::socketOptions() const
/*!
Stop listening for incoming connections. Existing connections are not
- effected, but any new connections will be refused.
+ affected, but any new connections will be refused.
\sa isListening(), listen()
*/
diff --git a/src/network/socket/qlocalsocket.h b/src/network/socket/qlocalsocket.h
index 0eecab206b..da91ef0e85 100644
--- a/src/network/socket/qlocalsocket.h
+++ b/src/network/socket/qlocalsocket.h
@@ -130,7 +130,7 @@ private:
Q_PRIVATE_SLOT(d_func(), void _q_stateChanged(QAbstractSocket::SocketState))
Q_PRIVATE_SLOT(d_func(), void _q_error(QAbstractSocket::SocketError))
#elif defined(Q_OS_WIN)
- Q_PRIVATE_SLOT(d_func(), void _q_canWrite())
+ Q_PRIVATE_SLOT(d_func(), void _q_bytesWritten(qint64))
Q_PRIVATE_SLOT(d_func(), void _q_pipeClosed())
Q_PRIVATE_SLOT(d_func(), void _q_winError(ulong, const QString &))
#else
diff --git a/src/network/socket/qlocalsocket_p.h b/src/network/socket/qlocalsocket_p.h
index 56f8b590f1..0f84aeea3e 100644
--- a/src/network/socket/qlocalsocket_p.h
+++ b/src/network/socket/qlocalsocket_p.h
@@ -61,6 +61,7 @@
#if defined(QT_LOCALSOCKET_TCP)
# include "qtcpsocket.h"
#elif defined(Q_OS_WIN)
+# include <private/qringbuffer_p.h>
# include "private/qwindowspipereader_p.h"
# include "private/qwindowspipewriter_p.h"
# include <qwineventnotifier.h>
@@ -129,10 +130,12 @@ public:
~QLocalSocketPrivate();
void destroyPipeHandles();
void setErrorString(const QString &function);
- void _q_canWrite();
+ void startNextWrite();
+ void _q_bytesWritten(qint64 bytes);
void _q_pipeClosed();
void _q_winError(ulong windowsError, const QString &function);
HANDLE handle;
+ QRingBuffer writeBuffer;
QWindowsPipeWriter *pipeWriter;
QWindowsPipeReader *pipeReader;
QLocalSocket::LocalSocketError error;
diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp
index 7f9b8a7b06..245108911e 100644
--- a/src/network/socket/qlocalsocket_win.cpp
+++ b/src/network/socket/qlocalsocket_win.cpp
@@ -213,15 +213,21 @@ qint64 QLocalSocket::readData(char *data, qint64 maxSize)
}
}
-qint64 QLocalSocket::writeData(const char *data, qint64 maxSize)
+qint64 QLocalSocket::writeData(const char *data, qint64 len)
{
Q_D(QLocalSocket);
+ if (len == 0)
+ return 0;
+ char *dest = d->writeBuffer.reserve(len);
+ memcpy(dest, data, len);
if (!d->pipeWriter) {
d->pipeWriter = new QWindowsPipeWriter(d->handle, this);
- connect(d->pipeWriter, SIGNAL(canWrite()), this, SLOT(_q_canWrite()));
- connect(d->pipeWriter, SIGNAL(bytesWritten(qint64)), this, SIGNAL(bytesWritten(qint64)));
+ QObjectPrivate::connect(d->pipeWriter, &QWindowsPipeWriter::bytesWritten,
+ d, &QLocalSocketPrivate::_q_bytesWritten);
}
- return d->pipeWriter->write(data, maxSize);
+ if (!d->pipeWriter->isWriteOperationActive())
+ d->startNextWrite();
+ return len;
}
void QLocalSocket::abort()
@@ -230,6 +236,7 @@ void QLocalSocket::abort()
if (d->pipeWriter) {
delete d->pipeWriter;
d->pipeWriter = 0;
+ d->writeBuffer.clear();
}
close();
}
@@ -272,7 +279,7 @@ qint64 QLocalSocket::bytesAvailable() const
qint64 QLocalSocket::bytesToWrite() const
{
Q_D(const QLocalSocket);
- return (d->pipeWriter) ? d->pipeWriter->bytesToWrite() : 0;
+ return d->writeBuffer.size();
}
bool QLocalSocket::canReadLine() const
@@ -304,9 +311,12 @@ void QLocalSocket::close()
bool QLocalSocket::flush()
{
Q_D(QLocalSocket);
- if (d->pipeWriter)
- return d->pipeWriter->waitForWrite(0);
- return false;
+ bool written = false;
+ if (d->pipeWriter) {
+ while (d->pipeWriter->waitForWrite(0))
+ written = true;
+ }
+ return written;
}
void QLocalSocket::disconnectFromServer()
@@ -319,10 +329,11 @@ void QLocalSocket::disconnectFromServer()
// It must be destroyed before close() to prevent an infinite loop.
delete d->pipeWriter;
d->pipeWriter = 0;
+ d->writeBuffer.clear();
}
flush();
- if (d->pipeWriter && d->pipeWriter->bytesToWrite() != 0) {
+ if (bytesToWrite() != 0) {
d->state = QLocalSocket::ClosingState;
emit stateChanged(d->state);
} else {
@@ -351,11 +362,24 @@ bool QLocalSocket::setSocketDescriptor(qintptr socketDescriptor,
return true;
}
-void QLocalSocketPrivate::_q_canWrite()
+void QLocalSocketPrivate::startNextWrite()
+{
+ Q_Q(QLocalSocket);
+ if (writeBuffer.isEmpty()) {
+ if (state == QLocalSocket::ClosingState)
+ q->close();
+ } else {
+ Q_ASSERT(pipeWriter);
+ pipeWriter->write(writeBuffer.readPointer(), writeBuffer.nextDataBlockSize());
+ }
+}
+
+void QLocalSocketPrivate::_q_bytesWritten(qint64 bytes)
{
Q_Q(QLocalSocket);
- if (state == QLocalSocket::ClosingState)
- q->close();
+ writeBuffer.free(bytes);
+ startNextWrite();
+ emit q->bytesWritten(bytes);
}
qintptr QLocalSocket::socketDescriptor() const