2009-07-20 10:17:30 +02:00
/**************************************************************************
* *
* * 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
2009-08-14 09:30:56 +02:00
* * contact the sales department at http : //qt.nokia.com/contact.
2009-07-20 10:17:30 +02:00
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-06-16 18:03:16 +02:00
# include "s60devicerunconfiguration.h"
2009-10-21 16:48:46 +02:00
# include "s60devicerunconfigurationwidget.h"
2009-06-16 18:03:16 +02:00
# include "qt4project.h"
# include "qtversionmanager.h"
# include "profilereader.h"
# include "s60manager.h"
# include "s60devices.h"
2009-10-23 18:00:20 +02:00
# include "s60runconfigbluetoothstarter.h"
# include "bluetoothlistener_gui.h"
2009-10-22 16:42:25 +02:00
# include "serialdevicelister.h"
2009-06-16 18:03:16 +02:00
# include <coreplugin/icore.h>
# include <coreplugin/messagemanager.h>
# include <utils/qtcassert.h>
2009-06-19 17:55:47 +02:00
# include <utils/pathchooser.h>
2009-06-16 18:03:16 +02:00
# include <projectexplorer/projectexplorerconstants.h>
2009-09-29 11:39:55 +02:00
# include <projectexplorer/persistentsettings.h>
2009-06-16 18:03:16 +02:00
# include <projectexplorer/project.h>
2009-10-01 09:56:02 +02:00
# include <projectexplorer/buildconfiguration.h>
# include <projectexplorer/persistentsettings.h>
2009-06-16 18:03:16 +02:00
2009-09-28 17:17:11 +02:00
# include <debugger/debuggermanager.h>
2009-06-16 18:03:16 +02:00
using namespace ProjectExplorer ;
using namespace Qt4ProjectManager : : Internal ;
2009-08-14 14:29:19 +02:00
// Format information about a file
static QString lsFile ( const QString & f )
{
QString rc ;
const QFileInfo fi ( f ) ;
QTextStream str ( & rc ) ;
str < < fi . size ( ) < < ' ' < < fi . lastModified ( ) . toString ( Qt : : ISODate ) < < ' ' < < QDir : : toNativeSeparators ( fi . absoluteFilePath ( ) ) ;
return rc ;
}
2009-10-22 16:42:25 +02:00
2009-06-16 18:03:16 +02:00
// ======== S60DeviceRunConfiguration
S60DeviceRunConfiguration : : S60DeviceRunConfiguration ( Project * project , const QString & proFilePath )
: RunConfiguration ( project ) ,
m_proFilePath ( proFilePath ) ,
2009-06-19 17:55:47 +02:00
m_cachedTargetInformationValid ( false ) ,
2009-10-22 16:42:25 +02:00
# ifdef Q_OS_WIN
m_serialPortName ( QLatin1String ( " COM5 " ) ) ,
m_communicationType ( SerialPortCommunication ) ,
# else
m_serialPortName ( QLatin1String ( SerialDeviceLister : : linuxBlueToothDeviceRootC ) + QLatin1Char ( ' 0 ' ) ) ,
m_communicationType ( BlueToothCommunication ) ,
# endif
2009-06-19 17:55:47 +02:00
m_signingMode ( SignSelf )
2009-06-16 18:03:16 +02:00
{
if ( ! m_proFilePath . isEmpty ( ) )
2009-10-09 18:42:38 +02:00
setName ( tr ( " %1 on Symbian Device " ) . arg ( QFileInfo ( m_proFilePath ) . completeBaseName ( ) ) ) ;
2009-06-16 18:03:16 +02:00
else
setName ( tr ( " QtS60DeviceRunConfiguration " ) ) ;
connect ( project , SIGNAL ( activeBuildConfigurationChanged ( ) ) ,
this , SLOT ( invalidateCachedTargetInformation ( ) ) ) ;
2009-06-22 15:51:21 +02:00
connect ( project , SIGNAL ( targetInformationChanged ( ) ) ,
this , SLOT ( invalidateCachedTargetInformation ( ) ) ) ;
2009-06-16 18:03:16 +02:00
}
S60DeviceRunConfiguration : : ~ S60DeviceRunConfiguration ( )
{
}
QString S60DeviceRunConfiguration : : type ( ) const
{
2009-09-28 17:17:11 +02:00
return QLatin1String ( " Qt4ProjectManager.DeviceRunConfiguration " ) ;
}
ProjectExplorer : : ToolChain : : ToolChainType S60DeviceRunConfiguration : : toolChainType ( ) const
{
if ( const Qt4Project * pro = qobject_cast < const Qt4Project * > ( project ( ) ) )
return pro - > toolChainType ( pro - > activeBuildConfiguration ( ) ) ;
return ProjectExplorer : : ToolChain : : INVALID ;
2009-06-16 18:03:16 +02:00
}
bool S60DeviceRunConfiguration : : isEnabled ( ) const
{
2009-09-28 17:17:11 +02:00
const ToolChain : : ToolChainType type = toolChainType ( ) ;
2009-08-05 17:06:52 +02:00
return type = = ToolChain : : GCCE | | type = = ToolChain : : RVCT_ARMV5 | | type = = ToolChain : : RVCT_ARMV6 ;
2009-06-16 18:03:16 +02:00
}
QWidget * S60DeviceRunConfiguration : : configurationWidget ( )
{
return new S60DeviceRunConfigurationWidget ( this ) ;
}
void S60DeviceRunConfiguration : : save ( PersistentSettingsWriter & writer ) const
{
const QDir projectDir = QFileInfo ( project ( ) - > file ( ) - > fileName ( ) ) . absoluteDir ( ) ;
writer . saveValue ( " ProFile " , projectDir . relativeFilePath ( m_proFilePath ) ) ;
2009-06-19 17:55:47 +02:00
writer . saveValue ( " SigningMode " , ( int ) m_signingMode ) ;
writer . saveValue ( " CustomSignaturePath " , m_customSignaturePath ) ;
writer . saveValue ( " CustomKeyPath " , m_customKeyPath ) ;
2009-07-30 11:46:30 +02:00
writer . saveValue ( " SerialPortName " , m_serialPortName ) ;
2009-10-22 16:42:25 +02:00
writer . saveValue ( " CommunicationType " , m_communicationType ) ;
2009-06-16 18:03:16 +02:00
RunConfiguration : : save ( writer ) ;
}
void S60DeviceRunConfiguration : : restore ( const PersistentSettingsReader & reader )
{
RunConfiguration : : restore ( reader ) ;
const QDir projectDir = QFileInfo ( project ( ) - > file ( ) - > fileName ( ) ) . absoluteDir ( ) ;
m_proFilePath = projectDir . filePath ( reader . restoreValue ( " ProFile " ) . toString ( ) ) ;
2009-06-19 17:55:47 +02:00
m_signingMode = ( SigningMode ) reader . restoreValue ( " SigningMode " ) . toInt ( ) ;
m_customSignaturePath = reader . restoreValue ( " CustomSignaturePath " ) . toString ( ) ;
m_customKeyPath = reader . restoreValue ( " CustomKeyPath " ) . toString ( ) ;
2009-07-30 11:46:30 +02:00
m_serialPortName = reader . restoreValue ( " SerialPortName " ) . toString ( ) . trimmed ( ) ;
2009-10-22 16:42:25 +02:00
m_communicationType = reader . restoreValue ( " CommunicationType " ) . toInt ( ) ;
2009-07-30 11:46:30 +02:00
}
QString S60DeviceRunConfiguration : : serialPortName ( ) const
{
return m_serialPortName ;
}
void S60DeviceRunConfiguration : : setSerialPortName ( const QString & name )
{
m_serialPortName = name . trimmed ( ) ;
2009-06-16 18:03:16 +02:00
}
2009-10-22 16:42:25 +02:00
int S60DeviceRunConfiguration : : communicationType ( ) const
{
return m_communicationType ;
}
void S60DeviceRunConfiguration : : setCommunicationType ( int t )
{
m_communicationType = t ;
}
2009-07-24 17:17:13 +02:00
QString S60DeviceRunConfiguration : : targetName ( ) const
{
const_cast < S60DeviceRunConfiguration * > ( this ) - > updateTarget ( ) ;
return m_targetName ;
}
2009-06-17 18:26:18 +02:00
QString S60DeviceRunConfiguration : : basePackageFilePath ( ) const
2009-06-16 18:03:16 +02:00
{
const_cast < S60DeviceRunConfiguration * > ( this ) - > updateTarget ( ) ;
2009-06-17 18:26:18 +02:00
return m_baseFileName ;
2009-06-16 18:03:16 +02:00
}
2009-10-07 17:17:20 +02:00
QString S60DeviceRunConfiguration : : symbianPlatform ( ) const
{
const_cast < S60DeviceRunConfiguration * > ( this ) - > updateTarget ( ) ;
return m_platform ;
}
QString S60DeviceRunConfiguration : : symbianTarget ( ) const
{
const_cast < S60DeviceRunConfiguration * > ( this ) - > updateTarget ( ) ;
return m_target ;
}
QString S60DeviceRunConfiguration : : packageTemplateFileName ( ) const
{
const_cast < S60DeviceRunConfiguration * > ( this ) - > updateTarget ( ) ;
return m_packageTemplateFileName ;
}
2009-06-19 17:55:47 +02:00
S60DeviceRunConfiguration : : SigningMode S60DeviceRunConfiguration : : signingMode ( ) const
{
return m_signingMode ;
}
void S60DeviceRunConfiguration : : setSigningMode ( SigningMode mode )
{
m_signingMode = mode ;
}
QString S60DeviceRunConfiguration : : customSignaturePath ( ) const
{
return m_customSignaturePath ;
}
void S60DeviceRunConfiguration : : setCustomSignaturePath ( const QString & path )
{
m_customSignaturePath = path ;
}
QString S60DeviceRunConfiguration : : customKeyPath ( ) const
{
return m_customKeyPath ;
}
void S60DeviceRunConfiguration : : setCustomKeyPath ( const QString & path )
{
m_customKeyPath = path ;
}
2009-08-14 14:29:19 +02:00
QString S60DeviceRunConfiguration : : packageFileName ( ) const
{
QString rc = basePackageFilePath ( ) ;
if ( ! rc . isEmpty ( ) )
rc + = QLatin1String ( " .pkg " ) ;
return rc ;
}
2009-09-29 13:49:35 +02:00
QString S60DeviceRunConfiguration : : localExecutableFileName ( ) const
2009-08-14 14:29:19 +02:00
{
2009-10-07 17:17:20 +02:00
Qt4Project * qt4project = qobject_cast < Qt4Project * > ( project ( ) ) ;
S60Devices : : Device device = S60Manager : : instance ( ) - > deviceForQtVersion (
qt4project - > qtVersion ( qt4project - > activeBuildConfiguration ( ) ) ) ;
QString localExecutable = device . epocRoot ;
localExecutable + = QString : : fromLatin1 ( " /epoc32/release/%1/%2/%3.exe " )
. arg ( symbianPlatform ( ) ) . arg ( symbianTarget ( ) ) . arg ( targetName ( ) ) ;
qDebug ( ) < < localExecutable ;
return QDir : : toNativeSeparators ( localExecutable ) ;
2009-08-14 14:29:19 +02:00
}
2009-06-16 18:03:16 +02:00
void S60DeviceRunConfiguration : : updateTarget ( )
{
if ( m_cachedTargetInformationValid )
return ;
Qt4Project * pro = static_cast < Qt4Project * > ( project ( ) ) ;
Qt4PriFileNode * priFileNode = static_cast < Qt4Project * > ( project ( ) ) - > rootProjectNode ( ) - > findProFileFor ( m_proFilePath ) ;
if ( ! priFileNode ) {
2009-06-17 18:26:18 +02:00
m_baseFileName = QString : : null ;
2009-06-16 18:03:16 +02:00
m_cachedTargetInformationValid = true ;
emit targetInformationChanged ( ) ;
return ;
}
QtVersion * qtVersion = pro - > qtVersion ( pro - > activeBuildConfiguration ( ) ) ;
ProFileReader * reader = priFileNode - > createProFileReader ( ) ;
reader - > setCumulative ( false ) ;
reader - > setQtVersion ( qtVersion ) ;
// Find out what flags we pass on to qmake, this code is duplicated in the qmake step
QtVersion : : QmakeBuildConfig defaultBuildConfiguration = qtVersion - > defaultBuildConfig ( ) ;
2009-10-01 09:56:02 +02:00
QtVersion : : QmakeBuildConfig projectBuildConfiguration = QtVersion : : QmakeBuildConfig ( pro - > activeBuildConfiguration ( )
- > value ( " buildConfiguration " ) . toInt ( ) ) ;
2009-06-16 18:03:16 +02:00
QStringList addedUserConfigArguments ;
QStringList removedUserConfigArguments ;
if ( ( defaultBuildConfiguration & QtVersion : : BuildAll ) & & ! ( projectBuildConfiguration & QtVersion : : BuildAll ) )
removedUserConfigArguments < < " debug_and_release " ;
if ( ! ( defaultBuildConfiguration & QtVersion : : BuildAll ) & & ( projectBuildConfiguration & QtVersion : : BuildAll ) )
addedUserConfigArguments < < " debug_and_release " ;
if ( ( defaultBuildConfiguration & QtVersion : : DebugBuild ) & & ! ( projectBuildConfiguration & QtVersion : : DebugBuild ) )
addedUserConfigArguments < < " release " ;
if ( ! ( defaultBuildConfiguration & QtVersion : : DebugBuild ) & & ( projectBuildConfiguration & QtVersion : : DebugBuild ) )
addedUserConfigArguments < < " debug " ;
reader - > setUserConfigCmdArgs ( addedUserConfigArguments , removedUserConfigArguments ) ;
if ( ! reader - > readProFile ( m_proFilePath ) ) {
delete reader ;
Core : : ICore : : instance ( ) - > messageManager ( ) - > printToOutputPane ( tr ( " Could not parse %1. The QtS60 Device run configuration %2 can not be started. " ) . arg ( m_proFilePath ) . arg ( name ( ) ) ) ;
return ;
}
2009-06-17 18:26:18 +02:00
// Extract data
const QDir baseProjectDirectory = QFileInfo ( project ( ) - > file ( ) - > fileName ( ) ) . absoluteDir ( ) ;
const QString relSubDir = baseProjectDirectory . relativeFilePath ( QFileInfo ( m_proFilePath ) . path ( ) ) ;
const QDir baseBuildDirectory = project ( ) - > buildDirectory ( project ( ) - > activeBuildConfiguration ( ) ) ;
const QString baseDir = baseBuildDirectory . absoluteFilePath ( relSubDir ) ;
// Directory
QString m_workingDir ;
if ( reader - > contains ( " DESTDIR " ) ) {
m_workingDir = reader - > value ( " DESTDIR " ) ;
if ( QDir : : isRelativePath ( m_workingDir ) ) {
m_workingDir = baseDir + QLatin1Char ( ' / ' ) + m_workingDir ;
}
} else {
m_workingDir = baseDir ;
}
2009-06-16 18:03:16 +02:00
2009-07-24 17:17:13 +02:00
m_targetName = reader - > value ( " TARGET " ) ;
2009-08-13 17:18:18 +02:00
if ( m_targetName . isEmpty ( ) )
m_targetName = QFileInfo ( m_proFilePath ) . baseName ( ) ;
2009-07-24 17:17:13 +02:00
m_baseFileName = QDir : : cleanPath ( m_workingDir + QLatin1Char ( ' / ' ) + m_targetName ) ;
2009-10-07 17:17:20 +02:00
m_packageTemplateFileName = QDir : : cleanPath (
m_workingDir + QLatin1Char ( ' / ' ) + m_targetName + QLatin1String ( " _template.pkg " ) ) ;
ToolChain : : ToolChainType toolchain = pro - > toolChainType ( pro - > activeBuildConfiguration ( ) ) ;
if ( toolchain = = ToolChain : : GCCE )
m_platform = QLatin1String ( " gcce " ) ;
else if ( toolchain = = ToolChain : : RVCT_ARMV5 )
m_platform = QLatin1String ( " armv5 " ) ;
2009-06-17 18:26:18 +02:00
else
2009-10-07 17:17:20 +02:00
m_platform = QLatin1String ( " armv6 " ) ;
2009-06-17 18:26:18 +02:00
if ( projectBuildConfiguration & QtVersion : : DebugBuild )
2009-10-07 17:17:20 +02:00
m_target = QLatin1String ( " udeb " ) ;
2009-06-17 18:26:18 +02:00
else
2009-10-07 17:17:20 +02:00
m_target = QLatin1String ( " urel " ) ;
m_baseFileName + = QLatin1Char ( ' _ ' ) + m_platform + QLatin1Char ( ' _ ' ) + m_target ;
2009-06-16 18:03:16 +02:00
delete reader ;
m_cachedTargetInformationValid = true ;
emit targetInformationChanged ( ) ;
}
void S60DeviceRunConfiguration : : invalidateCachedTargetInformation ( )
{
m_cachedTargetInformationValid = false ;
emit targetInformationChanged ( ) ;
}
2009-06-19 17:55:47 +02:00
2009-06-16 18:03:16 +02:00
// ======== S60DeviceRunConfigurationFactory
S60DeviceRunConfigurationFactory : : S60DeviceRunConfigurationFactory ( QObject * parent )
: IRunConfigurationFactory ( parent )
{
}
S60DeviceRunConfigurationFactory : : ~ S60DeviceRunConfigurationFactory ( )
{
}
bool S60DeviceRunConfigurationFactory : : canRestore ( const QString & type ) const
{
return type = = " Qt4ProjectManager.DeviceRunConfiguration " ;
}
QStringList S60DeviceRunConfigurationFactory : : availableCreationTypes ( Project * pro ) const
{
Qt4Project * qt4project = qobject_cast < Qt4Project * > ( pro ) ;
if ( qt4project ) {
QStringList applicationProFiles ;
QList < Qt4ProFileNode * > list = qt4project - > applicationProFiles ( ) ;
foreach ( Qt4ProFileNode * node , list ) {
2009-10-09 15:00:11 +02:00
applicationProFiles . append ( " QtSymbianDeviceRunConfiguration. " + node - > path ( ) ) ;
2009-06-16 18:03:16 +02:00
}
return applicationProFiles ;
} else {
return QStringList ( ) ;
}
}
QString S60DeviceRunConfigurationFactory : : displayNameForType ( const QString & type ) const
{
2009-10-09 15:00:11 +02:00
QString fileName = type . mid ( QString ( " QtSymbianDeviceRunConfiguration. " ) . size ( ) ) ;
return tr ( " %1 on Symbian Device " ) . arg ( QFileInfo ( fileName ) . completeBaseName ( ) ) ;
2009-06-16 18:03:16 +02:00
}
QSharedPointer < RunConfiguration > S60DeviceRunConfigurationFactory : : create ( Project * project , const QString & type )
{
Qt4Project * p = qobject_cast < Qt4Project * > ( project ) ;
Q_ASSERT ( p ) ;
2009-10-09 16:28:29 +02:00
if ( type . startsWith ( " QtSymbianDeviceRunConfiguration. " ) ) {
2009-10-09 15:00:11 +02:00
QString fileName = type . mid ( QString ( " QtSymbianDeviceRunConfiguration. " ) . size ( ) ) ;
2009-06-16 18:03:16 +02:00
return QSharedPointer < RunConfiguration > ( new S60DeviceRunConfiguration ( p , fileName ) ) ;
}
Q_ASSERT ( type = = " Qt4ProjectManager.DeviceRunConfiguration " ) ;
// The right path is set in restoreSettings
QSharedPointer < RunConfiguration > rc ( new S60DeviceRunConfiguration ( p , QString : : null ) ) ;
return rc ;
}
2009-09-28 17:17:11 +02:00
// ======== S60DeviceRunControlBase
2009-08-17 11:47:17 +02:00
2009-09-28 17:17:11 +02:00
S60DeviceRunControlBase : : S60DeviceRunControlBase ( const QSharedPointer < RunConfiguration > & runConfiguration ) :
RunControl ( runConfiguration ) ,
m_makesis ( new QProcess ( this ) ) ,
m_signsis ( new QProcess ( this ) ) ,
m_launcher ( 0 )
{
2009-06-17 18:26:18 +02:00
connect ( m_makesis , SIGNAL ( readyReadStandardError ( ) ) ,
this , SLOT ( readStandardError ( ) ) ) ;
connect ( m_makesis , SIGNAL ( readyReadStandardOutput ( ) ) ,
this , SLOT ( readStandardOutput ( ) ) ) ;
connect ( m_makesis , SIGNAL ( error ( QProcess : : ProcessError ) ) ,
this , SLOT ( makesisProcessFailed ( ) ) ) ;
connect ( m_makesis , SIGNAL ( finished ( int , QProcess : : ExitStatus ) ) ,
this , SLOT ( makesisProcessFinished ( ) ) ) ;
2009-09-28 17:17:11 +02:00
2009-06-17 19:01:41 +02:00
connect ( m_signsis , SIGNAL ( readyReadStandardError ( ) ) ,
this , SLOT ( readStandardError ( ) ) ) ;
connect ( m_signsis , SIGNAL ( readyReadStandardOutput ( ) ) ,
this , SLOT ( readStandardOutput ( ) ) ) ;
connect ( m_signsis , SIGNAL ( error ( QProcess : : ProcessError ) ) ,
this , SLOT ( signsisProcessFailed ( ) ) ) ;
connect ( m_signsis , SIGNAL ( finished ( int , QProcess : : ExitStatus ) ) ,
this , SLOT ( signsisProcessFinished ( ) ) ) ;
2009-06-16 18:03:16 +02:00
2009-09-09 18:42:25 +02:00
Qt4Project * project = qobject_cast < Qt4Project * > ( runConfiguration - > project ( ) ) ;
2009-08-14 14:29:19 +02:00
QTC_ASSERT ( project , return ) ;
2009-06-17 19:01:41 +02:00
2009-09-14 17:44:48 +02:00
QSharedPointer < S60DeviceRunConfiguration > s60runConfig = runConfiguration . objectCast < S60DeviceRunConfiguration > ( ) ;
2009-09-14 16:26:59 +02:00
QTC_ASSERT ( s60runConfig , return ) ;
m_serialPortName = s60runConfig - > serialPortName ( ) ;
2009-08-04 11:16:48 +02:00
m_serialPortFriendlyName = S60Manager : : instance ( ) - > serialDeviceLister ( ) - > friendlyNameForPort ( m_serialPortName ) ;
2009-10-22 16:42:25 +02:00
m_communicationType = s60runConfig - > communicationType ( ) ;
2009-09-14 16:26:59 +02:00
m_targetName = s60runConfig - > targetName ( ) ;
m_baseFileName = s60runConfig - > basePackageFilePath ( ) ;
2009-10-07 17:17:20 +02:00
m_symbianPlatform = s60runConfig - > symbianPlatform ( ) ;
m_symbianTarget = s60runConfig - > symbianTarget ( ) ;
m_packageTemplateFile = s60runConfig - > packageTemplateFileName ( ) ;
2009-06-17 18:26:18 +02:00
m_workingDirectory = QFileInfo ( m_baseFileName ) . absolutePath ( ) ;
2009-09-03 19:16:22 +02:00
m_qtDir = project - > qtVersion ( project - > activeBuildConfiguration ( ) ) - > versionInfo ( ) . value ( " QT_INSTALL_DATA " ) ;
2009-09-14 16:26:59 +02:00
m_useCustomSignature = ( s60runConfig - > signingMode ( ) = = S60DeviceRunConfiguration : : SignCustom ) ;
m_customSignaturePath = s60runConfig - > customSignaturePath ( ) ;
m_customKeyPath = s60runConfig - > customKeyPath ( ) ;
2009-09-09 18:42:25 +02:00
m_toolsDirectory = S60Manager : : instance ( ) - > deviceForQtVersion (
project - > qtVersion ( project - > activeBuildConfiguration ( ) ) ) . toolsRoot
+ " /epoc32/tools " ;
2009-09-29 13:49:35 +02:00
m_executableFileName = lsFile ( s60runConfig - > localExecutableFileName ( ) ) ;
2009-09-14 16:26:59 +02:00
m_makesisTool = m_toolsDirectory + " /makesis.exe " ;
2009-10-07 17:17:20 +02:00
m_packageFilePath = s60runConfig - > packageFileName ( ) ;
m_packageFile = QFileInfo ( m_packageFilePath ) . fileName ( ) ;
2009-09-09 18:42:25 +02:00
}
2009-06-16 18:03:16 +02:00
2009-09-28 17:17:11 +02:00
void S60DeviceRunControlBase : : start ( )
2009-09-09 18:42:25 +02:00
{
2009-06-16 18:03:16 +02:00
emit started ( ) ;
2009-06-17 18:26:18 +02:00
emit addToOutputWindow ( this , tr ( " Creating %1.sisx ... " ) . arg ( QDir : : toNativeSeparators ( m_baseFileName ) ) ) ;
2009-09-09 18:42:25 +02:00
emit addToOutputWindow ( this , tr ( " Executable file: %1 " ) . arg ( m_executableFileName ) ) ;
2009-06-17 18:26:18 +02:00
2009-10-08 17:23:27 +02:00
QString errorMessage ;
QString settingsCategory ;
QString settingsPage ;
if ( ! checkConfiguration ( & errorMessage , & settingsCategory , & settingsPage ) ) {
error ( this , errorMessage ) ;
emit finished ( ) ;
2009-10-09 15:00:11 +02:00
Core : : ICore : : instance ( ) - > showWarningWithOptions ( tr ( " Debugger for Symbian Platform " ) ,
errorMessage , QString ( ) ,
2009-10-08 17:23:27 +02:00
settingsCategory , settingsPage ) ;
return ;
}
if ( ! createPackageFileFromTemplate ( & errorMessage ) ) {
error ( this , errorMessage ) ;
emit finished ( ) ;
2009-10-07 17:17:20 +02:00
return ;
2009-10-08 17:23:27 +02:00
}
2009-06-17 18:26:18 +02:00
m_makesis - > setWorkingDirectory ( m_workingDirectory ) ;
2009-09-14 16:26:59 +02:00
emit addToOutputWindow ( this , tr ( " %1 %2 " ) . arg ( QDir : : toNativeSeparators ( m_makesisTool ) , m_packageFile ) ) ;
m_makesis - > start ( m_makesisTool , QStringList ( m_packageFile ) , QIODevice : : ReadOnly ) ;
2009-06-16 18:03:16 +02:00
}
2009-09-28 17:17:11 +02:00
void S60DeviceRunControlBase : : stop ( )
2009-06-16 18:03:16 +02:00
{
2009-07-24 17:17:13 +02:00
m_makesis - > kill ( ) ;
m_signsis - > kill ( ) ;
2009-08-14 14:29:19 +02:00
if ( m_launcher )
m_launcher - > terminate ( ) ;
2009-06-16 18:03:16 +02:00
}
2009-09-28 17:17:11 +02:00
bool S60DeviceRunControlBase : : isRunning ( ) const
2009-06-16 18:03:16 +02:00
{
2009-06-17 18:26:18 +02:00
return m_makesis - > state ( ) ! = QProcess : : NotRunning ;
2009-06-16 18:03:16 +02:00
}
2009-09-28 17:17:11 +02:00
void S60DeviceRunControlBase : : readStandardError ( )
2009-06-16 18:03:16 +02:00
{
2009-06-17 18:26:18 +02:00
QProcess * process = static_cast < QProcess * > ( sender ( ) ) ;
QByteArray data = process - > readAllStandardError ( ) ;
emit addToOutputWindowInline ( this , QString : : fromLocal8Bit ( data . constData ( ) , data . length ( ) ) ) ;
2009-06-16 18:03:16 +02:00
}
2009-09-28 17:17:11 +02:00
void S60DeviceRunControlBase : : readStandardOutput ( )
2009-06-16 18:03:16 +02:00
{
2009-06-17 18:26:18 +02:00
QProcess * process = static_cast < QProcess * > ( sender ( ) ) ;
QByteArray data = process - > readAllStandardOutput ( ) ;
emit addToOutputWindowInline ( this , QString : : fromLocal8Bit ( data . constData ( ) , data . length ( ) ) ) ;
}
2009-10-08 17:23:27 +02:00
bool S60DeviceRunControlBase : : createPackageFileFromTemplate ( QString * errorMessage )
2009-10-07 17:17:20 +02:00
{
QFile packageTemplate ( m_packageTemplateFile ) ;
if ( ! packageTemplate . open ( QIODevice : : ReadOnly ) ) {
2009-10-08 17:23:27 +02:00
* errorMessage = tr ( " Could not read template package file '%1' " ) . arg ( QDir : : toNativeSeparators ( m_packageTemplateFile ) ) ;
2009-10-07 17:17:20 +02:00
return false ;
}
QString contents = packageTemplate . readAll ( ) ;
packageTemplate . close ( ) ;
contents . replace ( QLatin1String ( " $(PLATFORM) " ) , m_symbianPlatform ) ;
contents . replace ( QLatin1String ( " $(TARGET) " ) , m_symbianTarget ) ;
QFile packageFile ( m_packageFilePath ) ;
if ( ! packageFile . open ( QIODevice : : WriteOnly ) ) {
2009-10-08 17:23:27 +02:00
* errorMessage = tr ( " Could not write package file '%1' " ) . arg ( QDir : : toNativeSeparators ( m_packageFilePath ) ) ;
2009-10-07 17:17:20 +02:00
return false ;
}
packageFile . write ( contents . toLocal8Bit ( ) ) ;
packageFile . close ( ) ;
return true ;
}
2009-09-28 17:17:11 +02:00
void S60DeviceRunControlBase : : makesisProcessFailed ( )
2009-06-17 19:01:41 +02:00
{
processFailed ( " makesis.exe " , m_makesis - > error ( ) ) ;
}
2009-09-28 17:17:11 +02:00
void S60DeviceRunControlBase : : makesisProcessFinished ( )
2009-06-17 19:01:41 +02:00
{
2009-07-23 14:30:30 +02:00
if ( m_makesis - > exitCode ( ) ! = 0 ) {
2009-06-18 18:09:37 +02:00
error ( this , tr ( " An error occurred while creating the package. " ) ) ;
emit finished ( ) ;
return ;
}
2009-10-07 17:17:20 +02:00
QString signsisTool = m_toolsDirectory + QLatin1String ( " /signsis.exe " ) ;
QString sisFile = QFileInfo ( m_baseFileName + QLatin1String ( " .sis " ) ) . fileName ( ) ;
QString sisxFile = QFileInfo ( m_baseFileName + QLatin1String ( " .sisx " ) ) . fileName ( ) ;
2009-06-19 17:55:47 +02:00
QString signature = ( m_useCustomSignature ? m_customSignaturePath
2009-10-07 17:17:20 +02:00
: m_qtDir + QLatin1String ( " /src/s60installs/selfsigned.cer " ) ) ;
2009-06-19 17:55:47 +02:00
QString key = ( m_useCustomSignature ? m_customKeyPath
2009-10-07 17:17:20 +02:00
: m_qtDir + QLatin1String ( " /src/s60installs/selfsigned.key " ) ) ;
2009-06-17 19:01:41 +02:00
QStringList arguments ;
2009-06-18 18:09:37 +02:00
arguments < < sisFile
2009-06-19 17:55:47 +02:00
< < sisxFile < < QDir : : toNativeSeparators ( signature )
< < QDir : : toNativeSeparators ( key ) ;
2009-06-17 19:01:41 +02:00
m_signsis - > setWorkingDirectory ( m_workingDirectory ) ;
2009-08-19 12:32:23 +02:00
emit addToOutputWindow ( this , tr ( " %1 %2 " ) . arg ( QDir : : toNativeSeparators ( signsisTool ) , arguments . join ( QString ( QLatin1Char ( ' ' ) ) ) ) ) ;
2009-06-17 19:01:41 +02:00
m_signsis - > start ( signsisTool , arguments , QIODevice : : ReadOnly ) ;
}
2009-09-28 17:17:11 +02:00
void S60DeviceRunControlBase : : signsisProcessFailed ( )
2009-06-17 19:01:41 +02:00
{
processFailed ( " signsis.exe " , m_signsis - > error ( ) ) ;
}
2009-09-28 17:17:11 +02:00
void S60DeviceRunControlBase : : signsisProcessFinished ( )
2009-06-18 18:09:37 +02:00
{
2009-07-23 14:30:30 +02:00
if ( m_signsis - > exitCode ( ) ! = 0 ) {
2009-06-18 18:09:37 +02:00
error ( this , tr ( " An error occurred while creating the package. " ) ) ;
emit finished ( ) ;
return ;
}
2009-10-06 09:56:36 +02:00
m_launcher = new trk : : Launcher ( ) ;
2009-09-28 17:17:11 +02:00
connect ( m_launcher , SIGNAL ( finished ( ) ) , this , SLOT ( launcherFinished ( ) ) ) ;
2009-10-19 19:18:44 +02:00
connect ( m_launcher , SIGNAL ( canNotConnect ( QString ) ) , this , SLOT ( printConnectFailed ( QString ) ) ) ;
2009-08-14 14:29:19 +02:00
connect ( m_launcher , SIGNAL ( copyingStarted ( ) ) , this , SLOT ( printCopyingNotice ( ) ) ) ;
2009-09-28 16:56:31 +02:00
connect ( m_launcher , SIGNAL ( canNotCreateFile ( QString , QString ) ) , this , SLOT ( printCreateFileFailed ( QString , QString ) ) ) ;
2009-10-05 15:22:58 +02:00
connect ( m_launcher , SIGNAL ( canNotWriteFile ( QString , QString ) ) , this , SLOT ( printWriteFileFailed ( QString , QString ) ) ) ;
2009-10-06 12:29:43 +02:00
connect ( m_launcher , SIGNAL ( canNotCloseFile ( QString , QString ) ) , this , SLOT ( printCloseFileFailed ( QString , QString ) ) ) ;
2009-08-14 14:29:19 +02:00
connect ( m_launcher , SIGNAL ( installingStarted ( ) ) , this , SLOT ( printInstallingNotice ( ) ) ) ;
2009-10-05 19:32:59 +02:00
connect ( m_launcher , SIGNAL ( canNotInstall ( QString , QString ) ) , this , SLOT ( printInstallFailed ( QString , QString ) ) ) ;
2009-08-26 17:35:36 +02:00
connect ( m_launcher , SIGNAL ( copyProgress ( int ) ) , this , SLOT ( printCopyProgress ( int ) ) ) ;
2009-07-30 10:32:50 +02:00
2009-07-30 11:46:30 +02:00
//TODO sisx destination and file path user definable
2009-08-14 14:29:19 +02:00
m_launcher - > setTrkServerName ( m_serialPortName ) ;
2009-10-22 16:42:25 +02:00
m_launcher - > setSerialFrame ( m_communicationType = = SerialPortCommunication ) ;
2009-07-29 20:21:02 +02:00
const QString copySrc ( m_baseFileName + " .sisx " ) ;
const QString copyDst = QString ( " C: \\ Data \\ %1.sisx " ) . arg ( QFileInfo ( m_baseFileName ) . fileName ( ) ) ;
const QString runFileName = QString ( " C: \\ sys \\ bin \\ %1.exe " ) . arg ( m_targetName ) ;
2009-08-14 14:29:19 +02:00
m_launcher - > setCopyFileName ( copySrc , copyDst ) ;
m_launcher - > setInstallFileName ( copyDst ) ;
2009-09-28 17:17:11 +02:00
initLauncher ( runFileName , m_launcher ) ;
2009-08-14 14:29:19 +02:00
emit addToOutputWindow ( this , tr ( " Package: %1 \n Deploying application to '%2'... " ) . arg ( lsFile ( copySrc ) , m_serialPortFriendlyName ) ) ;
QString errorMessage ;
2009-10-23 18:00:20 +02:00
// Prompt the user to start up the Blue tooth connection
if ( m_communicationType = = BlueToothCommunication ) {
S60RunConfigBluetoothStarter starter ( m_launcher - > trkDevice ( ) ) ;
switch ( trk : : startBluetoothGui ( starter , 0 , & errorMessage ) ) {
case trk : : BluetoothGuiConnected :
break ;
case trk : : BluetoothGuiCanceled :
case trk : : BluetoothGuiError :
delete m_launcher ;
m_launcher = 0 ;
error ( this , errorMessage ) ;
emit finished ( ) ;
return ;
} ;
}
2009-08-14 14:29:19 +02:00
if ( ! m_launcher - > startServer ( & errorMessage ) ) {
delete m_launcher ;
m_launcher = 0 ;
error ( this , tr ( " Could not connect to phone on port '%1': %2 \n "
" Check if the phone is connected and the TRK application is running. " ) . arg ( m_serialPortName , errorMessage ) ) ;
2009-07-30 11:46:30 +02:00
emit finished ( ) ;
}
2009-07-24 17:17:13 +02:00
}
2009-09-28 17:17:11 +02:00
void S60DeviceRunControlBase : : printCreateFileFailed ( const QString & filename , const QString & errorMessage )
2009-07-30 10:32:50 +02:00
{
2009-09-28 17:17:11 +02:00
emit addToOutputWindow ( this , tr ( " Could not create file %1 on device: %2 " ) . arg ( filename , errorMessage ) ) ;
2009-08-26 17:35:36 +02:00
}
2009-10-05 15:22:58 +02:00
void S60DeviceRunControlBase : : printWriteFileFailed ( const QString & filename , const QString & errorMessage )
{
emit addToOutputWindow ( this , tr ( " Could not write to file %1 on device: %2 " ) . arg ( filename , errorMessage ) ) ;
}
2009-10-06 12:29:43 +02:00
void S60DeviceRunControlBase : : printCloseFileFailed ( const QString & filename , const QString & errorMessage )
{
const QString msg = tr ( " Could not close file %1 on device: %2. It will be closed when App TRK is closed. " ) ;
emit addToOutputWindow ( this , msg . arg ( filename , errorMessage ) ) ;
}
2009-10-19 19:18:44 +02:00
void S60DeviceRunControlBase : : printConnectFailed ( const QString & errorMessage )
{
emit addToOutputWindow ( this , tr ( " Could not connect to App TRK on device: %1. Restarting App TRK might help. " ) . arg ( errorMessage ) ) ;
}
2009-09-28 17:17:11 +02:00
void S60DeviceRunControlBase : : printCopyingNotice ( )
2009-09-28 16:56:31 +02:00
{
2009-09-28 17:17:11 +02:00
emit addToOutputWindow ( this , tr ( " Copying install file... " ) ) ;
2009-09-28 16:56:31 +02:00
}
2009-09-28 17:17:11 +02:00
void S60DeviceRunControlBase : : printCopyProgress ( int progress )
2009-08-26 17:35:36 +02:00
{
emit addToOutputWindow ( this , tr ( " %1% copied. " ) . arg ( progress ) ) ;
2009-07-30 10:32:50 +02:00
}
2009-09-28 17:17:11 +02:00
void S60DeviceRunControlBase : : printInstallingNotice ( )
2009-07-30 10:32:50 +02:00
{
emit addToOutputWindow ( this , tr ( " Installing application... " ) ) ;
}
2009-10-05 19:32:59 +02:00
void S60DeviceRunControlBase : : printInstallFailed ( const QString & filename , const QString & errorMessage )
{
emit addToOutputWindow ( this , tr ( " Could not install from package %1 on device: %2 " ) . arg ( filename , errorMessage ) ) ;
}
2009-09-28 17:17:11 +02:00
void S60DeviceRunControlBase : : launcherFinished ( )
{
m_launcher - > deleteLater ( ) ;
m_launcher = 0 ;
handleLauncherFinished ( ) ;
}
void S60DeviceRunControlBase : : processFailed ( const QString & program , QProcess : : ProcessError errorCode )
{
QString errorString ;
switch ( errorCode ) {
case QProcess : : FailedToStart :
errorString = tr ( " Failed to start %1. " ) ;
break ;
case QProcess : : Crashed :
errorString = tr ( " %1 has unexpectedly finished. " ) ;
break ;
default :
errorString = tr ( " An error has occurred while running %1. " ) ;
}
error ( this , errorString . arg ( program ) ) ;
emit finished ( ) ;
}
2009-10-05 15:07:47 +02:00
void S60DeviceRunControlBase : : printApplicationOutput ( const QString & output )
{
emit addToOutputWindowInline ( this , output ) ;
}
2009-10-08 17:23:27 +02:00
bool S60DeviceRunControlBase : : checkConfiguration ( QString * /* errorMessage */ ,
QString * /* settingsCategory */ ,
QString * /* settingsPage */ ) const
{
return true ;
}
2009-09-28 17:17:11 +02:00
// =============== S60DeviceRunControl
S60DeviceRunControl : : S60DeviceRunControl ( const QSharedPointer < ProjectExplorer : : RunConfiguration > & runConfiguration ) :
S60DeviceRunControlBase ( runConfiguration )
{
}
void S60DeviceRunControl : : initLauncher ( const QString & executable , trk : : Launcher * launcher )
{
connect ( launcher , SIGNAL ( startingApplication ( ) ) , this , SLOT ( printStartingNotice ( ) ) ) ;
connect ( launcher , SIGNAL ( applicationRunning ( uint ) ) , this , SLOT ( printRunNotice ( uint ) ) ) ;
connect ( launcher , SIGNAL ( canNotRun ( QString ) ) , this , SLOT ( printRunFailNotice ( QString ) ) ) ;
connect ( launcher , SIGNAL ( applicationOutputReceived ( QString ) ) , this , SLOT ( printApplicationOutput ( QString ) ) ) ;
2009-10-06 09:56:36 +02:00
launcher - > addStartupActions ( trk : : Launcher : : ActionCopyInstallRun ) ;
2009-09-28 17:17:11 +02:00
launcher - > setFileName ( executable ) ;
}
void S60DeviceRunControl : : handleLauncherFinished ( )
{
emit finished ( ) ;
emit addToOutputWindow ( this , tr ( " Finished. " ) ) ;
}
2009-07-30 10:32:50 +02:00
void S60DeviceRunControl : : printStartingNotice ( )
{
2009-08-04 18:49:10 +02:00
emit addToOutputWindow ( this , tr ( " Starting application... " ) ) ;
2009-07-30 10:32:50 +02:00
}
void S60DeviceRunControl : : printRunNotice ( uint pid )
{
2009-08-04 15:58:30 +02:00
emit addToOutputWindow ( this , tr ( " Application running with pid %1. " ) . arg ( pid ) ) ;
2009-07-30 10:32:50 +02:00
}
2009-09-28 10:57:03 +02:00
void S60DeviceRunControl : : printRunFailNotice ( const QString & errorMessage ) {
emit addToOutputWindow ( this , tr ( " Could not start application: %1 " ) . arg ( errorMessage ) ) ;
}
2009-09-28 17:17:11 +02:00
// ======== S60DeviceDebugRunControl
S60DeviceDebugRunControl : : S60DeviceDebugRunControl ( const QSharedPointer < ProjectExplorer : : RunConfiguration > & runConfiguration ) :
S60DeviceRunControlBase ( runConfiguration ) ,
m_startParams ( new Debugger : : DebuggerStartParameters )
2009-07-24 17:17:13 +02:00
{
2009-09-28 17:17:11 +02:00
Debugger : : DebuggerManager * dm = Debugger : : DebuggerManager : : instance ( ) ;
const QSharedPointer < S60DeviceRunConfiguration > rc = runConfiguration . objectCast < S60DeviceRunConfiguration > ( ) ;
QTC_ASSERT ( dm & & ! rc . isNull ( ) , return ) ;
connect ( dm , SIGNAL ( debuggingFinished ( ) ) ,
this , SLOT ( debuggingFinished ( ) ) , Qt : : QueuedConnection ) ;
connect ( dm , SIGNAL ( applicationOutputAvailable ( QString ) ) ,
2009-10-05 15:07:47 +02:00
this , SLOT ( printApplicationOutput ( QString ) ) ,
2009-09-28 17:17:11 +02:00
Qt : : QueuedConnection ) ;
m_startParams - > remoteChannel = rc - > serialPortName ( ) ;
2009-10-22 16:42:25 +02:00
m_startParams - > remoteChannelType = rc - > communicationType ( ) ;
2009-09-28 17:17:11 +02:00
m_startParams - > startMode = Debugger : : StartInternal ;
m_startParams - > toolChainType = rc - > toolChainType ( ) ;
2009-06-17 19:01:41 +02:00
}
2009-09-28 17:17:11 +02:00
void S60DeviceDebugRunControl : : stop ( )
2009-06-17 18:26:18 +02:00
{
2009-09-28 17:17:11 +02:00
S60DeviceRunControlBase : : stop ( ) ;
Debugger : : DebuggerManager * dm = Debugger : : DebuggerManager : : instance ( ) ;
QTC_ASSERT ( dm , return )
if ( dm - > state ( ) = = Debugger : : DebuggerNotReady )
dm - > exitDebugger ( ) ;
}
S60DeviceDebugRunControl : : ~ S60DeviceDebugRunControl ( )
{
}
2009-10-06 09:56:36 +02:00
void S60DeviceDebugRunControl : : initLauncher ( const QString & executable , trk : : Launcher * launcher )
2009-09-28 17:17:11 +02:00
{
// No setting an executable on the launcher causes it to deploy only
m_startParams - > executable = executable ;
2009-09-29 13:49:35 +02:00
// Prefer the '*.sym' file over the '.exe', which should exist at the same
// location in debug builds
const QSharedPointer < S60DeviceRunConfiguration > rc = runConfiguration ( ) . objectCast < S60DeviceRunConfiguration > ( ) ;
const QString localExecutableFileName = rc - > localExecutableFileName ( ) ;
const int lastDotPos = localExecutableFileName . lastIndexOf ( QLatin1Char ( ' . ' ) ) ;
if ( lastDotPos ! = - 1 ) {
m_startParams - > symbolFileName = localExecutableFileName . mid ( 0 , lastDotPos ) + QLatin1String ( " .sym " ) ;
if ( ! QFileInfo ( m_startParams - > symbolFileName ) . isFile ( ) ) {
m_startParams - > symbolFileName . clear ( ) ;
emit addToOutputWindow ( this , tr ( " Warning: Cannot locate the symbol file belonging to %1. " ) . arg ( localExecutableFileName ) ) ;
}
}
2009-10-06 09:56:36 +02:00
launcher - > addStartupActions ( trk : : Launcher : : ActionCopyInstall ) ;
2009-09-28 17:17:11 +02:00
}
void S60DeviceDebugRunControl : : handleLauncherFinished ( )
{
emit addToOutputWindow ( this , tr ( " Launching debugger... " ) ) ;
Debugger : : DebuggerManager : : instance ( ) - > startNewDebugger ( m_startParams ) ;
}
void S60DeviceDebugRunControl : : debuggingFinished ( )
{
emit addToOutputWindow ( this , tr ( " Debugging finished. " ) ) ;
2009-07-30 11:46:30 +02:00
emit finished ( ) ;
2009-06-16 18:03:16 +02:00
}
2009-10-08 17:23:27 +02:00
bool S60DeviceDebugRunControl : : checkConfiguration ( QString * errorMessage ,
QString * settingsCategory ,
QString * settingsPage ) const
{
return Debugger : : DebuggerManager : : instance ( ) - > checkDebugConfiguration ( m_startParams - > toolChainType ,
errorMessage ,
settingsCategory ,
settingsPage ) ;
}