diff --git a/singleapplication.cpp b/singleapplication.cpp index 7e153a0..09e264e 100644 --- a/singleapplication.cpp +++ b/singleapplication.cpp @@ -248,10 +248,7 @@ bool SingleApplication::sendMessage( const QByteArray &message, int timeout ) if( ! d->connectToPrimary( timeout, SingleApplicationPrivate::Reconnect ) ) return false; - d->socket->write( message ); - bool dataWritten = d->socket->waitForBytesWritten( timeout ); - d->socket->flush(); - return dataWritten; + return d->writeConfirmedMessage( timeout, message ); } /** diff --git a/singleapplication_p.cpp b/singleapplication_p.cpp index 27b688f..365799e 100644 --- a/singleapplication_p.cpp +++ b/singleapplication_p.cpp @@ -272,11 +272,31 @@ bool SingleApplicationPrivate::connectToPrimary( int msecs, ConnectionType conne #endif headerStream << static_cast ( initMsg.length() ); - socket->write( header ); - socket->write( initMsg ); - bool result = socket->waitForBytesWritten( static_cast(msecs - time.elapsed()) ); + if( !writeConfirmedMessage( static_cast(msecs - time.elapsed()), header ) ) + return false; + + if( !writeConfirmedMessage( static_cast(msecs - time.elapsed()), initMsg ) ) + return false; + + return true; +} + +void SingleApplicationPrivate::writeAck( QLocalSocket *sock ) { + sock->putChar('\n'); +} + +bool SingleApplicationPrivate::writeConfirmedMessage( int msecs, const QByteArray &msg ) +{ + socket->write( msg ); socket->flush(); - return result; + + bool result = socket->waitForReadyRead( msecs ); // await ack byte + if (result) { + socket->read( 1 ); + return true; + } + + return false; } quint16 SingleApplicationPrivate::blockChecksum() const @@ -379,9 +399,7 @@ void SingleApplicationPrivate::readInitMessageHeader( QLocalSocket *sock ) info.stage = StageBody; info.msgLen = msgLen; - if ( sock->bytesAvailable() >= (qint64) msgLen ){ - readInitMessageBody( sock ); - } + writeAck( sock ); } void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock ) @@ -448,15 +466,15 @@ void SingleApplicationPrivate::readInitMessageBody( QLocalSocket *sock ) Q_EMIT q->instanceStarted(); } - if (sock->bytesAvailable() > 0){ - this->slotDataAvailable( sock, instanceId ); - } + writeAck( sock ); } void SingleApplicationPrivate::slotDataAvailable( QLocalSocket *dataSocket, quint32 instanceId ) { Q_Q(SingleApplication); Q_EMIT q->receivedMessage( instanceId, dataSocket->readAll() ); + + writeAck( dataSocket ); } void SingleApplicationPrivate::slotClientConnectionClosed( QLocalSocket *closedSocket, quint32 instanceId ) diff --git a/singleapplication_p.h b/singleapplication_p.h index c49a46d..0777c33 100644 --- a/singleapplication_p.h +++ b/singleapplication_p.h @@ -81,6 +81,8 @@ public: QString primaryUser() const; void readInitMessageHeader(QLocalSocket *socket); void readInitMessageBody(QLocalSocket *socket); + bool writeConfirmedMessage(int msecs, const QByteArray &msg); + void writeAck(QLocalSocket *sock); static void randomSleep(); void addAppData(const QString &data); QStringList appData() const;