From fa68a545a870778e08db48610e47cfa53c19ddbe Mon Sep 17 00:00:00 2001
From: Pawel Polanski <pawel.3.polanski@nokia.com>
Date: Fri, 20 Aug 2010 12:58:37 +0200
Subject: [PATCH] Executable's UID added to the DebuggerStartParameters. Used
 for debugging on SymbianOs

---
 src/plugins/debugger/debuggerengine.cpp       |  3 ++-
 src/plugins/debugger/debuggerengine.h         |  3 +++
 .../qt-s60/s60deployconfiguration.cpp         | 21 +++++++++++++++++++
 .../qt-s60/s60deployconfiguration.h           |  1 +
 .../qt-s60/s60devicerunconfiguration.cpp      |  3 +++
 5 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index 0e2bf0f9c11..13cd1c8cfc5 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -110,7 +110,8 @@ DebuggerStartParameters::DebuggerStartParameters()
     useTerminal(false),
     breakAtMain(false),
     toolChainType(ToolChain::UNKNOWN),
-    startMode(NoStartMode)
+    startMode(NoStartMode),
+    executableUid(0)
 {}
 
 void DebuggerStartParameters::clear()
diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h
index d3ea8851127..a4c0a7c3e5a 100644
--- a/src/plugins/debugger/debuggerengine.h
+++ b/src/plugins/debugger/debuggerengine.h
@@ -99,6 +99,9 @@ public:
     QString dumperLibrary;
     QStringList dumperLibraryLocations;
     DebuggerStartMode startMode;
+
+    // for SymbianOS debugging
+    quint32 executableUid;
 };
 
 DEBUGGER_EXPORT QDebug operator<<(QDebug str, const DebuggerStartParameters &);
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp
index 824c883407e..649a2feec31 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.cpp
@@ -252,6 +252,27 @@ QString S60DeployConfiguration::localExecutableFileName() const
     return QDir::toNativeSeparators(localExecutable);
 }
 
+quint32 S60DeployConfiguration::executableUid() const
+{
+    quint32 uid = 0;
+    QString executablePath(localExecutableFileName());
+    if (!executablePath.isEmpty()) {
+        QFile file(executablePath);
+        if (file.open(QIODevice::ReadOnly)) {
+            // executable's UID is 4 bytes starting at 8.
+            const QByteArray data = file.read(12);
+            if (data.size() == 12) {
+                const unsigned char *d = reinterpret_cast<const unsigned char*>(data.data() + 8);
+                uid = *d++;
+                uid += *d++ << 8;
+                uid += *d++ << 16;
+                uid += *d++ << 24;
+            }
+        }
+    }
+    return uid;
+}
+
 bool S60DeployConfiguration::runSmartInstaller() const
 {
     DeployConfiguration *dc = target()->activeDeployConfiguration();
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h
index 1885cbe38d5..b109ba8e7e6 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60deployconfiguration.h
@@ -77,6 +77,7 @@ public:
     QStringList packageTemplateFileNames() const;
     QString appPackageTemplateFileName() const;
     QString localExecutableFileName() const;
+    quint32 executableUid() const;
 
     QVariantMap toMap() const;
 
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
index bf268838da7..5060d799762 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp
@@ -593,6 +593,9 @@ S60DeviceDebugRunControl::S60DeviceDebugRunControl(S60DeviceRunConfiguration *rc
     m_startParams->startMode = Debugger::StartInternal;
     m_startParams->toolChainType = rc->toolChainType();
     m_startParams->executable = debugFileName;
+    m_startParams->executableUid = activeDeployConf->executableUid();
+
+    QTC_ASSERT(m_startParams->executableUid, return);
 
     // Prefer the '*.sym' file over the '.exe', which should exist at the same
     // location in debug builds
-- 
GitLab