Commit 0a7d402d authored by Robert Loehning's avatar Robert Loehning
Browse files

Trk: Ensure proper connecting and disconnecting.

parent fe2c9cc1
......@@ -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();
}
}
......
......@@ -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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment