From 7e0b2081efc1d829f068453502f2d902827fab68 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Tue, 18 Aug 2009 13:48:03 +0200
Subject: [PATCH] Trk: Ping mode, better argument parsing.

---
 tests/manual/trk/launcher.cpp      |  63 ++++++++++++++----
 tests/manual/trk/launcher.h        |   2 +
 tests/manual/trk/main_launcher.cpp | 100 +++++++++++++++++++++++------
 tests/manual/trk/trklauncher.pro   |   1 -
 4 files changed, 133 insertions(+), 33 deletions(-)

diff --git a/tests/manual/trk/launcher.cpp b/tests/manual/trk/launcher.cpp
index 142115abcdf..2bbec859575 100644
--- a/tests/manual/trk/launcher.cpp
+++ b/tests/manual/trk/launcher.cpp
@@ -117,6 +117,7 @@ struct LauncherPrivate {
     QString m_copySrcFileName;
     QString m_copyDstFileName;
     QString m_installFileName;
+    int m_verbose;
 };
 
 LauncherPrivate::LauncherPrivate() :
@@ -125,7 +126,8 @@ LauncherPrivate::LauncherPrivate() :
 #endif
     m_trkWriteToken(0),
     m_trkWriteBusy(false),
-    m_timerId(-1)
+    m_timerId(-1),
+    m_verbose(0)
 {
 }
 
@@ -165,6 +167,11 @@ void Launcher::setInstallFileName(const QString &name)
 
 bool Launcher::startServer(QString *errorMessage)
 {
+    if (d->m_verbose) {
+        const QString msg = QString::fromLatin1("Port=%1 Executable=%2 Package=%3 Remote Package=%4 Install file=%5")
+                            .arg(d->m_trkServerName, d->m_fileName, d->m_copySrcFileName, d->m_copyDstFileName, d->m_installFileName);
+        logMessage(msg);
+    }
     if (!openTrkPort(d->m_trkServerName, errorMessage))
         return false;
     d->m_timerId = startTimer(100);
@@ -172,7 +179,9 @@ bool Launcher::startServer(QString *errorMessage)
     sendTrkMessage(TrkConnect); // Connect
     sendTrkMessage(TrkSupported, CB(handleSupportMask));
     sendTrkMessage(TrkCpuType, CB(handleCpuType));
-    sendTrkMessage(TrkVersions); // Versions
+    sendTrkMessage(TrkVersions, CB(handleTrkVersion));
+    if (d->m_fileName.isEmpty())
+        return true;
     if (!d->m_copySrcFileName.isEmpty() && !d->m_copyDstFileName.isEmpty())
         copyFileToRemote();
     else
@@ -180,6 +189,11 @@ bool Launcher::startServer(QString *errorMessage)
     return true;
 }
 
+void Launcher::setVerbose(int v)
+{
+    d->m_verbose = v;
+}
+
 void Launcher::installAndRun()
 {
     if (!d->m_installFileName.isEmpty()) {
@@ -190,7 +204,7 @@ void Launcher::installAndRun()
 }
 void Launcher::logMessage(const QString &msg)
 {
-    if (DEBUG_TRK)
+    if (d->m_verbose)
         qDebug() << "ADAPTER: " << qPrintable(msg);
 }
 
@@ -464,6 +478,27 @@ void Launcher::handleResult(const TrkResult &result)
     }
 }
 
+void Launcher::handleTrkVersion(const TrkResult &result)
+{
+    if (result.data.size() < 5)
+        return;
+    const int trkMajor = result.data.at(1);
+    const int trkMinor = result.data.at(2);
+    const int protocolMajor = result.data.at(3);
+    const int protocolMinor = result.data.at(4);
+    // Ping mode: Log & Terminate
+    if (d->m_fileName.isEmpty()) {
+        QString msg;
+        QTextStream(&msg) << "CPU: " << d->m_session.cpuMajor << '.' << d->m_session.cpuMinor << ' '
+                << (d->m_session.bigEndian ? "big endian" : "little endian")
+                << " type size: " << d->m_session.defaultTypeSize
+                << " float size: " << d->m_session.fpTypeSize
+                << " Trk: v" << trkMajor << '.' << trkMinor << " Protocol: " << protocolMajor << '.' << protocolMinor;
+        qWarning("%s", qPrintable(msg));
+        sendTrkMessage(TrkPing, CB(waitForTrkFinished));
+    }
+}
+
 void Launcher::handleFileCreation(const TrkResult &result)
 {
     // we don't do any error handling yet, which is bad
@@ -502,12 +537,12 @@ void Launcher::handleCpuType(const TrkResult &result)
     //  Command: 0x80 Acknowledge
     //    Error: 0x00
     // [80 03 00  04 00 00 04 00 00 00]
-    d->m_session.cpuMajor = result.data[0];
-    d->m_session.cpuMinor = result.data[1];
-    d->m_session.bigEndian = result.data[2];
-    d->m_session.defaultTypeSize = result.data[3];
-    d->m_session.fpTypeSize = result.data[4];
-    d->m_session.extended1TypeSize = result.data[5];
+    d->m_session.cpuMajor = result.data.at(1);
+    d->m_session.cpuMinor = result.data.at(2);
+    d->m_session.bigEndian = result.data.at(3);
+    d->m_session.defaultTypeSize = result.data.at(4);
+    d->m_session.fpTypeSize = result.data.at(5);
+    d->m_session.extended1TypeSize = result.data.at(6);
     //d->m_session.extended2TypeSize = result.data[6];
 }
 
@@ -521,10 +556,12 @@ void Launcher::handleCreateProcess(const TrkResult &result)
     d->m_session.tid = extractInt(data + 5);
     d->m_session.codeseg = extractInt(data + 9);
     d->m_session.dataseg = extractInt(data + 13);
-    logMessage(QString("    READ PID:  %1").arg(d->m_session.pid));
-    logMessage(QString("    READ TID:  %1").arg(d->m_session.tid));
-    logMessage(QString("    READ CODE: %1").arg(d->m_session.codeseg));
-    logMessage(QString("    READ DATA: %1").arg(d->m_session.dataseg));
+    if (d->m_verbose) {
+        const QString msg = QString::fromLatin1("Process id: %1 Thread id: %2 code: 0x%3 data: 0x%4").
+                            arg(d->m_session.pid).arg(d->m_session.tid).arg(d->m_session.codeseg, 0, 16).
+                            arg(d->m_session.dataseg,  0 ,16);
+        logMessage(msg);
+    }
     emit applicationRunning(d->m_session.pid);
     QByteArray ba;
     appendInt(&ba, d->m_session.pid);
diff --git a/tests/manual/trk/launcher.h b/tests/manual/trk/launcher.h
index 68cc7d9ea86..ad56bfe8312 100644
--- a/tests/manual/trk/launcher.h
+++ b/tests/manual/trk/launcher.h
@@ -51,6 +51,7 @@ public:
     void setCopyFileName(const QString &srcName, const QString &dstName);
     void setInstallFileName(const QString &name);
     bool startServer(QString *errorMessage);
+    void setVerbose(int v);
 
 signals:
     void copyingStarted();
@@ -93,6 +94,7 @@ private:
     void handleWaitForFinished(const TrkResult &result);
     void handleStop(const TrkResult &result);
     void handleSupportMask(const TrkResult &result);
+    void handleTrkVersion(const TrkResult &result);
     void waitForTrkFinished(const TrkResult &data);
 
     void handleAndReportCreateProcess(const TrkResult &result);
diff --git a/tests/manual/trk/main_launcher.cpp b/tests/manual/trk/main_launcher.cpp
index e979181ec4f..537617ea3c1 100644
--- a/tests/manual/trk/main_launcher.cpp
+++ b/tests/manual/trk/main_launcher.cpp
@@ -2,32 +2,94 @@
 
 #include <QtCore/QCoreApplication>
 #include <QtCore/QDebug>
+#include <QtCore/QStringList>
 
-int main(int argc, char *argv[])
+static const char *usageC =
+"\nUsage: %1 <trk_port_name> [-v] [-i remote_sis_file | -I local_sis_file remote_sis_file] <remote_executable_name>\n"
+"\nOptions:\n    -v verbose\n\n"
+"\nPing:\n"
+"%1 COM5\n"
+"\nRemote launch:\n"
+"%1 COM5 C:\\sys\\bin\\test.exe\n"
+"\nInstallation and remote launch:\n"
+"%1 COM5 -i C:\\Data\\test_gcce_udeb.sisx C:\\sys\\bin\\test.exe\n"
+"\nCopy from local file, installation and remote launch:\n"
+"%1 COM5 -I C:\\Projects\\test\\test_gcce_udeb.sisx C:\\Data\\test_gcce_udeb.sisx C:\\sys\\bin\\test.exe\n";
+
+static void usage()
 {
-    if ((argc != 3 && argc != 5 && argc != 6)
-            || (argc == 5 && QString(argv[2]) != "-i")
-            || (argc == 6 && QString(argv[2]) != "-I")) {
-        qDebug() << "Usage: " << argv[0] << "<trk_port_name> [-i remote_sis_file | -I local_sis_file remote_sis_file] <remote_executable_name>";
-        qDebug() << "for example" << argv[0] << "COM5 C:\\sys\\bin\\test.exe";
-        qDebug() << "           " << argv[0] << "COM5 -i C:\\Data\\test_gcce_udeb.sisx C:\\sys\\bin\\test.exe";
-        qDebug() << "           " << argv[0] << "COM5 -I C:\\Projects\\test\\test_gcce_udeb.sisx C:\\Data\\test_gcce_udeb.sisx C:\\sys\\bin\\test.exe";
-        return 1;
+    const QString msg = QString::fromLatin1(usageC).arg(QCoreApplication::applicationName());
+    qWarning("%s", qPrintable(msg));
+}
+
+static bool parseArguments(const QStringList &arguments, trk::Launcher &launcher)
+{
+    // Parse away options
+    bool install = false;
+    bool customInstall = false;
+    const int argCount = arguments.size();
+    int verbosity = 0;
+    int a = 1;
+    for ( ; a < argCount; a++) {
+        const QString option = arguments.at(a);
+        if (!option.startsWith(QLatin1Char('-')))
+            break;
+        if (option.size() != 2)
+            return  false;
+        switch (option.at(1).toAscii()) {
+        case 'v':
+            verbosity++;
+            break;
+        case 'i':
+            install = true;
+            break;
+        case 'I':
+            customInstall = true;
+            break;
+        default:
+            return false;
+        }
     }
 
+    launcher.setVerbose(verbosity);
+    // Evaluate arguments
+    const int remainingArgsCount = argCount - a;
+    if (remainingArgsCount == 1 && !install && !customInstall) {
+        launcher.setTrkServerName(arguments.at(a)); // ping
+        return true;
+    }
+    if (remainingArgsCount == 2 && !install && !customInstall) {
+        // remote exec
+        launcher.setTrkServerName(arguments.at(a)); // ping
+        launcher.setFileName(arguments.at(a + 1));
+        return true;
+    }
+    if (remainingArgsCount == 3 && install && !customInstall) {
+        launcher.setTrkServerName(arguments.at(a)); // ping
+        launcher.setInstallFileName(arguments.at(a + 1));
+        launcher.setFileName(arguments.at(a + 2));
+        return true;
+    }
+    if (remainingArgsCount == 4 && !install && customInstall) {
+        launcher.setTrkServerName(arguments.at(a)); // ping
+        launcher.setCopyFileName(arguments.at(a + 1), arguments.at(a + 2));
+        launcher.setInstallFileName(arguments.at(a + 2));
+        launcher.setFileName(arguments.at(a + 3));
+        return true;
+    }
+    return false;
+}
+
+int main(int argc, char *argv[])
+{
     QCoreApplication app(argc, argv);
+    QCoreApplication::setApplicationName(QLatin1String("trklauncher"));
+    QCoreApplication::setOrganizationName(QLatin1String("Nokia"));
 
     trk::Launcher launcher;
-    launcher.setTrkServerName(argv[1]);
-    if (argc == 3) {
-        launcher.setFileName(argv[2]);
-    } else if (argc == 5) {
-        launcher.setInstallFileName(argv[3]);
-        launcher.setFileName(argv[4]);
-    } else {
-        launcher.setCopyFileName(argv[3], argv[4]);
-        launcher.setInstallFileName(argv[4]);
-        launcher.setFileName(argv[5]);
+    if (!parseArguments(app.arguments(), launcher)) {
+        usage();
+        return 1;
     }
     QObject::connect(&launcher, SIGNAL(finished()), &app, SLOT(quit()));
     QString errorMessage;
diff --git a/tests/manual/trk/trklauncher.pro b/tests/manual/trk/trklauncher.pro
index 662797d8b47..c30c72900fe 100644
--- a/tests/manual/trk/trklauncher.pro
+++ b/tests/manual/trk/trklauncher.pro
@@ -1,6 +1,5 @@
 TEMPLATE = app
 QT = core
 include($$PWD/trklauncher.pri)
-DEFINES += DEBUG_TRK=1
 win32:CONFIG += console
 SOURCES += main_launcher.cpp
-- 
GitLab