Browse Source

Some improvements of requesting pid of running instance code.

adaptive-webui-19844
Vladimir Golovnev (Glassez) 11 years ago
parent
commit
dbf8675de3
  1. 6
      src/main.cpp
  2. 47
      src/qtsingleapp/qtlocalpeer.cpp
  3. 2
      src/qtsingleapp/qtlocalpeer.h
  4. 2
      src/qtsingleapp/qtsingleapplication.cpp
  5. 3
      src/qtsingleapp/qtsingleapplication.h

6
src/main.cpp

@ -75,6 +75,10 @@ Q_IMPORT_PLUGIN(qico)
#include "misc.h" #include "misc.h"
#include "preferences.h" #include "preferences.h"
#if defined(Q_OS_WIN) && !defined(QBT_HAS_GETCURRENTPID)
#error You seem to have updated QtSingleApplication without porting our custom QtSingleApplication::getRunningPid() function. Please see previous version to understate how it works.
#endif
class UsageDisplay: public QObject { class UsageDisplay: public QObject {
Q_OBJECT Q_OBJECT
@ -207,7 +211,7 @@ int main(int argc, char *argv[]) {
qDebug("qBittorrent is already running for this user."); qDebug("qBittorrent is already running for this user.");
// Read torrents given on command line // Read torrents given on command line
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
DWORD pid = app.getRunningPid(); DWORD pid = (DWORD)app.getRunningPid();
if (pid > 0) { if (pid > 0) {
BOOL b = AllowSetForegroundWindow(pid); BOOL b = AllowSetForegroundWindow(pid);
qDebug("AllowSetForegroundWindow() returns %s", b ? "TRUE" : "FALSE"); qDebug("AllowSetForegroundWindow() returns %s", b ? "TRUE" : "FALSE");

47
src/qtsingleapp/qtlocalpeer.cpp

@ -202,10 +202,12 @@ void QtLocalPeer::receiveConnection()
} }
QString message(QString::fromUtf8(uMsg)); QString message(QString::fromUtf8(uMsg));
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
if (message == "qbt://pid") if (message == "qbt://pid") {
socket->write(QByteArray::number(qApp->applicationPid())); qint64 pid = GetCurrentProcessId();
else socket->write((const char *)&pid, sizeof pid);
} else {
socket->write(ack, qstrlen(ack)); socket->write(ack, qstrlen(ack));
}
#else #else
socket->write(ack, qstrlen(ack)); socket->write(ack, qstrlen(ack));
#endif #endif
@ -219,9 +221,9 @@ void QtLocalPeer::receiveConnection()
} }
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
ulong QtLocalPeer::getRunningPid() { qint64 QtLocalPeer::getRunningPid() {
if (!isClient()) if (!isClient())
return false; return 0;
QLocalSocket socket; QLocalSocket socket;
bool connOk = false; bool connOk = false;
@ -231,32 +233,23 @@ ulong QtLocalPeer::getRunningPid() {
connOk = socket.waitForConnected(5000/2); connOk = socket.waitForConnected(5000/2);
if (connOk || i) if (connOk || i)
break; break;
Sleep(DWORD(250)); Sleep(250);
} }
if (!connOk) if (!connOk) return -1;
return false;
QByteArray uMsg("qbt://pid"); const char* msg = "qbt://pid";
QDataStream ds(&socket); QDataStream ds(&socket);
ds.writeBytes(uMsg.constData(), uMsg.size()); ds.writeBytes(msg, qstrlen(msg));
bool res = socket.waitForBytesWritten(5000); bool res = socket.waitForBytesWritten(5000) && socket.waitForReadyRead(5000);
res &= socket.waitForReadyRead(5000); if (!res) return -1;
if (!res)
return -1; DWORD pid;
while (socket.bytesAvailable() < (int)sizeof(quint32)) qint64 pid_size = sizeof pid;
while (socket.bytesAvailable() < pid_size)
socket.waitForReadyRead(); socket.waitForReadyRead();
uMsg.clear(); if (socket.read((char *)&pid, pid_size) < pid_size)
quint32 remaining = socket.bytesAvailable();
uMsg.resize(remaining);
int got = 0;
char* uMsgBuf = uMsg.data();
do {
got = ds.readRawData(uMsgBuf, remaining);
remaining -= got;
uMsgBuf += got;
} while (remaining && got >= 0 && socket.waitForReadyRead(2000));
if (got < 0)
return -1; return -1;
return uMsg.toULong(); return pid;
} }
#endif #endif

2
src/qtsingleapp/qtlocalpeer.h

@ -65,7 +65,7 @@ public:
QString applicationId() const QString applicationId() const
{ return id; } { return id; }
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
ulong getRunningPid(); qint64 getRunningPid();
#endif #endif
Q_SIGNALS: Q_SIGNALS:

2
src/qtsingleapp/qtsingleapplication.cpp

@ -351,7 +351,7 @@ void QtSingleApplication::activateWindow()
*/ */
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
ulong QtSingleApplication::getRunningPid() { qint64 QtSingleApplication::getRunningPid() {
return peer->getRunningPid(); return peer->getRunningPid();
} }
#endif #endif

3
src/qtsingleapp/qtsingleapplication.h

@ -89,7 +89,8 @@ public:
void initialize(bool dummy = true) void initialize(bool dummy = true)
{ isRunning(); Q_UNUSED(dummy) } { isRunning(); Q_UNUSED(dummy) }
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
ulong getRunningPid(); #define QBT_HAS_GETCURRENTPID
qint64 getRunningPid();
#endif #endif
public Q_SLOTS: public Q_SLOTS:

Loading…
Cancel
Save