aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xexamples/basic/main.cpp2
-rw-r--r--examples/calculator/main.cpp2
-rwxr-xr-xexamples/sending_arguments/main.cpp2
-rw-r--r--singleapplication.cpp67
4 files changed, 45 insertions, 28 deletions
diff --git a/examples/basic/main.cpp b/examples/basic/main.cpp
index 4787d1c..1841902 100755
--- a/examples/basic/main.cpp
+++ b/examples/basic/main.cpp
@@ -1,4 +1,4 @@
-#include <SingleApplication.h>
+#include <singleapplication.h>
int main(int argc, char *argv[])
{
diff --git a/examples/calculator/main.cpp b/examples/calculator/main.cpp
index 32d8811..d45438f 100644
--- a/examples/calculator/main.cpp
+++ b/examples/calculator/main.cpp
@@ -50,7 +50,7 @@
#include <QApplication>
-#include <SingleApplication.h>
+#include <singleapplication.h>
#include "calculator.h"
diff --git a/examples/sending_arguments/main.cpp b/examples/sending_arguments/main.cpp
index 8368036..d90b250 100755
--- a/examples/sending_arguments/main.cpp
+++ b/examples/sending_arguments/main.cpp
@@ -1,4 +1,4 @@
-#include <SingleApplication.h>
+#include <singleapplication.h>
#include "messagereceiver.h"
int main(int argc, char *argv[])
diff --git a/singleapplication.cpp b/singleapplication.cpp
index c74d6db..a333a62 100644
--- a/singleapplication.cpp
+++ b/singleapplication.cpp
@@ -216,6 +216,13 @@ void SingleApplicationPrivate::connectToPrimary( int msecs, ConnectionType conne
quint16 checksum = qChecksum(initMsg.constData(), static_cast<quint32>(initMsg.length()));
writeStream << checksum;
+ // The header indicates the message length that follows
+ QByteArray header;
+ QDataStream headerStream(&header, QIODevice::WriteOnly);
+ headerStream.setVersion(QDataStream::Qt_5_6);
+ headerStream << (quint64) initMsg.length();
+
+ socket->write( header );
socket->write( initMsg );
socket->flush();
socket->waitForBytesWritten( msecs );
@@ -274,31 +281,41 @@ void SingleApplicationPrivate::slotConnectionEstablished()
quint32 instanceId = 0;
ConnectionType connectionType = InvalidConnection;
if( nextConnSocket->waitForReadyRead( 100 ) ) {
- // read all data from message in same order/format as written
- QByteArray msgBytes = nextConnSocket->read(nextConnSocket->bytesAvailable() - static_cast<qint64>(sizeof(quint16)));
- QByteArray checksumBytes = nextConnSocket->read(sizeof(quint16));
- QDataStream readStream(msgBytes);
- readStream.setVersion(QDataStream::Qt_5_6);
-
- // server name
- QByteArray latin1Name;
- readStream >> latin1Name;
- // connectioon type
- quint8 connType = InvalidConnection;
- readStream >> connType;
- connectionType = static_cast<ConnectionType>(connType);
- // instance id
- readStream >> instanceId;
- // checksum
- quint16 msgChecksum = 0;
- QDataStream checksumStream(checksumBytes);
- checksumStream.setVersion(QDataStream::Qt_5_6);
- checksumStream >> msgChecksum;
-
- const quint16 actualChecksum = qChecksum(msgBytes.constData(), static_cast<quint32>(msgBytes.length()));
-
- if (readStream.status() != QDataStream::Ok || QLatin1String(latin1Name) != blockServerName || msgChecksum != actualChecksum) {
- connectionType = InvalidConnection;
+ // read the fields in same order and format as written
+ QDataStream headerStream(nextConnSocket);
+ headerStream.setVersion(QDataStream::Qt_5_6);
+
+ // Read the header to know the message length
+ quint64 msgLen = 0;
+ headerStream >> msgLen;
+
+ if (msgLen >= sizeof(quint16)) {
+ // Read the message body
+ QByteArray msgBytes = nextConnSocket->read(msgLen);
+ QDataStream readStream(msgBytes);
+ readStream.setVersion(QDataStream::Qt_5_6);
+
+ // server name
+ QByteArray latin1Name;
+ readStream >> latin1Name;
+
+ // connection type
+ quint8 connType = InvalidConnection;
+ readStream >> connType;
+ connectionType = static_cast<ConnectionType>(connType);
+
+ // instance id
+ readStream >> instanceId;
+
+ // checksum
+ quint16 msgChecksum = 0;
+ readStream >> msgChecksum;
+
+ const quint16 actualChecksum = qChecksum(msgBytes.constData(), static_cast<quint32>(msgBytes.length() - sizeof(quint16)));
+
+ if (readStream.status() != QDataStream::Ok || QLatin1String(latin1Name) != blockServerName || msgChecksum != actualChecksum) {
+ connectionType = InvalidConnection;
+ }
}
}