From 62d7ea19adf2c8977da99cb73290abc07f5138a2 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Fri, 28 Aug 2009 13:50:31 +0200
Subject: [PATCH] debugger: rewrite run.pl in C++

---
 tests/manual/trk/README     |   3 +
 tests/manual/trk/runner.cpp | 264 ++++++++++++++++++++++++++++++++++++
 tests/manual/trk/runner.pro |   9 ++
 tests/manual/trk/trk.pro    |   2 +-
 4 files changed, 277 insertions(+), 1 deletion(-)
 create mode 100755 tests/manual/trk/runner.cpp
 create mode 100644 tests/manual/trk/runner.pro

diff --git a/tests/manual/trk/README b/tests/manual/trk/README
index c6ce19808e4..ffec0715307 100644
--- a/tests/manual/trk/README
+++ b/tests/manual/trk/README
@@ -41,3 +41,6 @@ rfcomm listen /dev/rfcomm0 1 $PWD/trklauncher -v -f {}
 rfcomm listen /dev/rfcomm0 1 $PWD/run.pl  -af -av -w {}
 
 #Important options: -w wait for adapter, -af omit serial frame.
+
+cp /data5/dev/debugger/symbian-codesourcery-welsh/cs-gdb/build/gdb/gdb cs-gdb
+cp /data5/dev/trk/filebrowseapp* .
diff --git a/tests/manual/trk/runner.cpp b/tests/manual/trk/runner.cpp
new file mode 100755
index 00000000000..bafd30d1f1e
--- /dev/null
+++ b/tests/manual/trk/runner.cpp
@@ -0,0 +1,264 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include <QtCore/QDebug>
+#include <QtCore/QDir>
+#include <QtCore/QFile>
+#include <QtCore/QHash>
+#include <QtCore/QProcess>
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QTextStream>
+
+#include <QtGui/QApplication>
+
+#include <unistd.h>
+
+class Runner : public QObject
+{
+    Q_OBJECT
+
+public:
+    Runner();
+
+private:
+    void parseArguments();
+    void launchAdapter();
+    void launchTrkServer();
+    void writeGdbInit();
+    void run();
+
+    QStringList m_adapterOptions;
+    QStringList m_trkServerOptions;
+    QString m_endianness;
+    QString m_trkServerName;
+    bool m_runTrkServer;
+    bool m_isUnix;
+    int m_waitAdapter;
+    QString m_gdbServerIP;
+    QString m_gdbServerPort;
+
+    QProcess m_adapterProc;
+    QProcess m_trkServerProc;
+    QProcess m_debuggerProc;
+};
+
+Runner::Runner()
+{
+#ifdef Q_OS_UNIX
+    m_isUnix = true;
+#else
+    m_isUnix = false;
+#endif
+    m_endianness = "little";
+    m_runTrkServer = true;
+    m_waitAdapter = 0;
+}
+
+static QString usage()
+{
+   return "Usage: run.pl -w -av -aq -au -tv -tq -l [COM]\n\n"
+    "Options:\n"
+    "     -av     Adapter verbose\n"
+    "     -aq     Adapter quiet\n"
+    "     -au     Adapter turn off buffered memory read\n"
+    "     -af     Adapter turn off serial frame\n"
+    "     -w      Wait for termination of Adapter (Bluetooth)\n"
+    "     -tv     TrkServer verbose\n"
+    "     -tq     TrkServer quiet\n"
+    "\n"
+    "     trkserver simulator will be run unless COM is specified\n"
+    "\n"
+    "Bluetooth:\n"
+    "     rfcomm listen /dev/rfcomm0 1 $PWD/run.pl -av -af -w {}\n";
+}
+
+void Runner::parseArguments()
+{
+    QStringList args = qApp->arguments();
+    for (int i = 1; i < args.size(); ++i) {
+        const QString arg = args.at(i);
+        if (arg.startsWith('-')) {
+            if (arg == "-av") {
+                m_adapterOptions.append("-v");
+            } else if (arg == "-aq") {
+                m_adapterOptions.append("-q");
+            } else if (arg == "-af") {
+                m_adapterOptions.append("-f");
+            } else if (arg == "-au") {
+                m_adapterOptions.append("-u");
+            } else if (arg == "-w") {
+                m_waitAdapter = 1;
+            } else if (arg == "-tv") {
+                m_trkServerOptions.append("-v");
+            } else if (arg == "-tq") {
+                m_trkServerOptions.append("-q");
+            } else if (arg == "-h") {
+                qDebug() << usage();
+                qApp->exit(0);
+            } else {
+                qDebug() << usage();
+                qApp->exit(1);
+            }
+        } else {
+            m_trkServerName = arg;
+            m_runTrkServer = 0;
+        }
+    }
+}
+
+void Runner::launchTrkServer()
+{
+    const QString dumpPostfix = ".bin";
+
+    QString trkServerName;
+    if (m_isUnix)
+        trkServerName = QDir::currentPath() + "trkserver";
+    else
+	trkServerName = "cmd.exe";
+
+    QStringList trkServerArgs;
+    if (!m_isUnix) {
+	trkServerArgs << "/c" << "start"
+            << QDir::currentPath() + "/debug/trkserver.exe";
+    }
+
+    trkServerArgs << m_trkServerOptions;
+    trkServerArgs << m_trkServerName;
+    trkServerArgs << "TrkDump-78-6a-40-00 " + dumpPostfix;
+    trkServerArgs << "0x00402000" + dumpPostfix;
+    trkServerArgs << "0x786a4000" + dumpPostfix;
+    trkServerArgs << "0x00600000" + dumpPostfix;
+
+    qDebug() << "### Executing: " + trkServerArgs.join(" ");
+    m_trkServerProc.start(trkServerName, trkServerArgs);
+    m_trkServerProc.waitForStarted();
+}
+
+void Runner::launchAdapter()
+{
+    QString adapterName;
+    if (m_isUnix)
+        adapterName = QDir::currentPath() + "adapter";
+    else
+	adapterName = "cmd.exe";
+
+    QStringList adapterArgs;
+    if (!m_isUnix) {
+	adapterArgs << "/c" << "start"
+            << QDir::currentPath() + "/debug/adapter.exe";
+    }
+    adapterArgs << m_adapterOptions;
+    adapterArgs << "-s";
+    adapterArgs << m_trkServerName << m_gdbServerIP + ':' + m_gdbServerPort;
+
+    qDebug() << "### Executing: " + adapterArgs.join(" ");
+
+    m_adapterProc.start(adapterName, adapterArgs);
+    m_adapterProc.waitForStarted();
+    //die ('Unable to launch adapter') if $adapterpid == -1;
+
+/*
+    if ($m_waitAdapter > 0) {
+        print '### kill -USR1 ',$adapterpid,"\n";    
+        waitpid($adapterpid, 0);
+    }    
+*/
+}
+
+void Runner::writeGdbInit()
+{
+    QString gdbInitFile = ".gdbinit";
+    QFile file(gdbInitFile);
+    if (file.open(QIODevice::WriteOnly)) {
+        qDebug() << "Cannot open "<<  gdbInitFile;
+        return;
+    }
+    QTextStream ts(&file);
+    ts << "# This is generated. Changes will be lost.";
+    ts << "#set remote noack-packet on";
+    ts << "set confirm off";
+    ts << "set endian " + m_endianness;
+    ts << "#set debug remote 1";
+    ts << "#target remote $m_gdbServerIP:$m_gdbServerPort";
+    ts << "target extended-remote $m_gdbServerIP:$m_gdbServerPort";
+    ts << "#file filebrowseapp.sym";
+    ts << "add-symbol-file filebrowseapp.sym 0x786A4000";
+    ts << "symbol-file filebrowseapp.sym";
+    ts << "print E32Main";
+    ts << "break E32Main";
+    ts << "#continue";
+    ts << "#info files";
+    ts << "#file filebrowseapp.sym -readnow";
+    ts << "#add-symbol-file filebrowseapp.sym 0x786A4000";
+}
+
+void Runner::run()
+{
+    launchAdapter();
+
+    if (m_isUnix) {
+        QProcess::execute("killall -s USR adapter trkserver");
+        QProcess::execute("killall adapter trkserver");
+    }
+
+    uid_t userId = getuid();
+    if (m_trkServerName.isEmpty())
+        m_trkServerName = QString("TRKSERVER-%").arg(userId);
+
+    m_gdbServerIP = "127.0.0.1";
+    m_gdbServerPort = QString::number(2222 + userId);
+
+    if (m_isUnix) {
+        QProcess fuserProc;
+        fuserProc.start("fuser -n tcp -k " + m_gdbServerPort);
+        qDebug() << "fuser: " << fuserProc.readAllStandardOutput();
+        qDebug() << "fuser: " << fuserProc.readAllStandardError();
+    }
+
+    // Who writes that?
+    //my $tempFile = File::Spec->catfile(File::Temp::tempdir(),
+    //m_trkServerName);
+    //unlink ($tempFile) if  -f $tempFile;
+
+    if (m_runTrkServer)
+        launchTrkServer();
+    
+    writeGdbInit();
+}
+
+int main(int argc, char *argv[])
+{
+    QApplication app(argc, argv);
+    Runner runner;
+
+    return app.exec();
+}
+
+#include "runner.moc"
diff --git a/tests/manual/trk/runner.pro b/tests/manual/trk/runner.pro
new file mode 100644
index 00000000000..57315453b40
--- /dev/null
+++ b/tests/manual/trk/runner.pro
@@ -0,0 +1,9 @@
+
+TEMPLATE = app
+
+win32:CONFIG+=console
+
+HEADERS += 
+
+SOURCES += \
+    runner.cpp \
diff --git a/tests/manual/trk/trk.pro b/tests/manual/trk/trk.pro
index b4fde49cf8c..c342f389804 100644
--- a/tests/manual/trk/trk.pro
+++ b/tests/manual/trk/trk.pro
@@ -1,7 +1,7 @@
 
 TEMPLATE = subdirs
 
-SUBDIRS = trkserver adapter swapendian trklauncher.pro
+SUBDIRS = trkserver adapter swapendian runner.pro trklauncher.pro
 
 trkserver.file = trkserver.pro
 adapter.file = adapter.pro
-- 
GitLab