35 : QObject(parent), id(appId)
39 id = QCoreApplication::applicationFilePath();
43 prefix =
id.section(QLatin1Char(
'/'), -1);
45 prefix.remove(QRegularExpression(
"[^a-zA-Z]"));
48 QByteArray idc =
id.toUtf8();
49 quint16 idNum = qChecksum(idc.constData(), idc.size());
50 socketName = QLatin1String(
"qtsingleapp-") + prefix
51 + QLatin1Char(
'-') + QString::number(idNum, 16);
54 if (!pProcessIdToSessionId) {
55 QLibrary lib(
"kernel32");
56 pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve(
"ProcessIdToSessionId");
58 if (pProcessIdToSessionId) {
60 pProcessIdToSessionId(GetCurrentProcessId(), &sessionId);
61 socketName += QLatin1Char(
'-') + QString::number(sessionId, 16);
64 socketName += QLatin1Char(
'-') + QString::number(::getuid(), 16);
67 server =
new QLocalServer(
this);
68 QString lockName = QDir(QDir::tempPath()).absolutePath()
70 + QLatin1String(
"-lockfile");
107 for(
int i = 0; i < 2; i++) {
110 connOk = socket.waitForConnected(timeout/2);
117 struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 };
118 nanosleep(&ts, NULL);
124 QByteArray uMsg(message.toUtf8());
125 QDataStream ds(&socket);
126 ds.writeBytes(uMsg.constData(), uMsg.size());
127 bool res = socket.waitForBytesWritten(timeout);
129 res &= socket.waitForReadyRead(timeout);
131 res &= (socket.read(qstrlen(
ack)) ==
ack);
139 QLocalSocket* socket =
server->nextPendingConnection();
144 if (socket->state() == QLocalSocket::UnconnectedState) {
145 qWarning(
"QtLocalPeer: Peer disconnected");
149 if (socket->bytesAvailable() >= qint64(
sizeof(quint32)))
151 socket->waitForReadyRead();
154 QDataStream ds(socket);
158 uMsg.resize(remaining);
160 char* uMsgBuf = uMsg.data();
162 got = ds.readRawData(uMsgBuf, remaining);
165 }
while (remaining && got >= 0 && socket->waitForReadyRead(2000));
167 qWarning(
"QtLocalPeer: Message reception failed %s", socket->errorString().toLatin1().constData());
171 QString message(QString::fromUtf8(uMsg));
172 socket->write(
ack, qstrlen(
ack));
173 socket->waitForBytesWritten(1000);
174 socket->waitForDisconnected(1000);