diff options
author | Robert Loehning <[email protected]> | 2009-10-19 18:49:31 +0200 |
---|---|---|
committer | Robert Loehning <[email protected]> | 2009-10-19 18:50:26 +0200 |
commit | 0a7d402d855cf4d9ce775d3c130ae938470be1cd (patch) | |
tree | 61519c16c52922467480e1d94431c5c6577f9dc1 /src/shared | |
parent | fe2c9cc16dc35c0f55bea45046d64d0170a0bbc0 (diff) |
Trk: Ensure proper connecting and disconnecting.
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/trk/launcher.cpp | 61 | ||||
-rw-r--r-- | src/shared/trk/launcher.h | 4 |
2 files changed, 50 insertions, 15 deletions
diff --git a/src/shared/trk/launcher.cpp b/src/shared/trk/launcher.cpp index 5bd9ff5da17..78f7df6f177 100644 --- a/src/shared/trk/launcher.cpp +++ b/src/shared/trk/launcher.cpp @@ -64,10 +64,12 @@ struct LauncherPrivate { QString m_installFileName; int m_verbose; Launcher::Actions m_startupActions; + bool m_connected; }; LauncherPrivate::LauncherPrivate() : - m_verbose(0) + m_verbose(0), + m_connected(false) { } @@ -148,18 +150,27 @@ bool Launcher::startServer(QString *errorMessage) if (!d->m_device.open(d->m_trkServerName, errorMessage)) return false; d->m_device.sendTrkInitialPing(); - d->m_device.sendTrkMessage(TrkConnect); // Connect d->m_device.sendTrkMessage(TrkSupported, TrkCallback(this, &Launcher::handleSupportMask)); d->m_device.sendTrkMessage(TrkCpuType, TrkCallback(this, &Launcher::handleCpuType)); d->m_device.sendTrkMessage(TrkVersions, TrkCallback(this, &Launcher::handleTrkVersion)); + if (d->m_startupActions != ActionPingOnly) + d->m_device.sendTrkMessage(TrkConnect, TrkCallback(this, &Launcher::handleConnect)); + return true; +} +void Launcher::handleConnect(const TrkResult &result) +{ + if (result.errorCode()) { + emit canNotConnect(result.errorString()); + return; + } + d->m_connected = true; if (d->m_startupActions & ActionCopy) copyFileToRemote(); else if (d->m_startupActions & ActionInstall) installRemotePackageSilently(); else if (d->m_startupActions & ActionRun) startInferiorIfNeeded(); - return true; } void Launcher::setVerbose(int v) @@ -176,11 +187,24 @@ void Launcher::logMessage(const QString &msg) void Launcher::terminate() { - //TODO handle case where application has not been started - QByteArray ba; - appendShort(&ba, 0x0000, TargetByteOrder); - appendInt(&ba, d->m_session.pid, TargetByteOrder); - d->m_device.sendTrkMessage(TrkDeleteItem, TrkCallback(this, &Launcher::handleWaitForFinished), ba); + if (d->m_session.pid) { + QByteArray ba; + appendShort(&ba, 0x0000, TargetByteOrder); + appendInt(&ba, d->m_session.pid, TargetByteOrder); + d->m_device.sendTrkMessage(TrkDeleteItem, TrkCallback(this, &Launcher::handleRemoteProcessKilled), ba); + } else if (d->m_connected) { + if (d->m_copyState.copyFileHandle) + closeRemoteFile(true); + disconnectTrk(); + } else { + emit finished(); + } +} + +void Launcher::handleRemoteProcessKilled(const TrkResult &result) +{ + Q_UNUSED(result) + disconnectTrk(); } void Launcher::handleResult(const TrkResult &result) @@ -267,7 +291,7 @@ void Launcher::handleResult(const TrkResult &result) if (itemType == 0 // process && result.data.size() >= 10 && d->m_session.pid == extractInt(result.data.data() + 6)) { - d->m_device.sendTrkMessage(TrkDisconnect, TrkCallback(this, &Launcher::handleWaitForFinished)); + disconnectTrk(); } break; } @@ -321,7 +345,7 @@ void Launcher::handleFileCreation(const TrkResult &result) { if (result.errorCode() || result.data.size() < 6) { emit canNotCreateFile(d->m_copyState.destinationFileName, result.errorString()); - emit finished(); + disconnectTrk(); return; } const char *data = result.data.data(); @@ -339,7 +363,7 @@ void Launcher::handleCopy(const TrkResult &result) if (result.errorCode() || result.data.size() < 4) { closeRemoteFile(true); emit canNotWriteFile(d->m_copyState.destinationFileName, result.errorString()); - emit finished(); + disconnectTrk(); } else { continueCopying(extractShort(result.data.data() + 2)); } @@ -374,6 +398,8 @@ void Launcher::closeRemoteFile(bool failed) failed ? TrkCallback() : TrkCallback(this, &Launcher::handleFileCopied), ba); d->m_copyState.data.reset(); + d->m_copyState.copyFileHandle = 0; + d->m_copyState.position = 0; } void Launcher::handleFileCopied(const TrkResult &result) @@ -385,7 +411,7 @@ void Launcher::handleFileCopied(const TrkResult &result) else if (d->m_startupActions & ActionRun) startInferiorIfNeeded(); else - emit finished(); + disconnectTrk(); } void Launcher::handleCpuType(const TrkResult &result) @@ -410,7 +436,7 @@ void Launcher::handleCreateProcess(const TrkResult &result) { if (result.errorCode()) { emit canNotRun(result.errorString()); - emit finished(); + disconnectTrk(); return; } // 40 00 00] @@ -511,6 +537,11 @@ void Launcher::cleanUp() // Error: 0x00 } +void Launcher::disconnectTrk() +{ + d->m_device.sendTrkMessage(TrkDisconnect, TrkCallback(this, &Launcher::handleWaitForFinished)); +} + void Launcher::copyFileToRemote() { emit copyingStarted(); @@ -533,11 +564,11 @@ void Launcher::handleInstallPackageFinished(const TrkResult &result) { if (result.errorCode()) { emit canNotInstall(d->m_installFileName, result.errorString()); - emit finished(); + disconnectTrk(); } else if (d->m_startupActions & ActionRun) { startInferiorIfNeeded(); } else { - emit finished(); + disconnectTrk(); } } diff --git a/src/shared/trk/launcher.h b/src/shared/trk/launcher.h index aafb6e48967..a216b79fcb3 100644 --- a/src/shared/trk/launcher.h +++ b/src/shared/trk/launcher.h @@ -69,6 +69,7 @@ public: signals: void copyingStarted(); + void canNotConnect(const QString &errorMessage); void canNotCreateFile(const QString &filename, const QString &errorMessage); void canNotWriteFile(const QString &filename, const QString &errorMessage); void canNotCloseFile(const QString &filename, const QString &errorMessage); @@ -90,7 +91,10 @@ private slots: private: // kill process and breakpoints void cleanUp(); + void disconnectTrk(); + void handleRemoteProcessKilled(const TrkResult &result); + void handleConnect(const TrkResult &result); void handleFileCreation(const TrkResult &result); void handleCopy(const TrkResult &result); void continueCopying(uint lastCopiedBlockSize = 0); |