| 
									
										
										
										
											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"
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  | #include "qt4target.h"
 | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | #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"
 | 
					
						
							| 
									
										
										
										
											2010-02-05 17:34:02 +01:00
										 |  |  | #include "symbiandevicemanager.h"
 | 
					
						
							| 
									
										
										
										
											2009-11-25 18:50:20 +01:00
										 |  |  | #include "qt4buildconfiguration.h"
 | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <coreplugin/icore.h>
 | 
					
						
							|  |  |  | #include <coreplugin/messagemanager.h>
 | 
					
						
							| 
									
										
										
										
											2009-11-30 17:55:08 +01:00
										 |  |  | #include <coreplugin/progressmanager/progressmanager.h>
 | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | #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>
 | 
					
						
							|  |  |  | #include <projectexplorer/project.h>
 | 
					
						
							| 
									
										
										
										
											2009-10-01 09:56:02 +02:00
										 |  |  | #include <projectexplorer/buildconfiguration.h>
 | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  | #include <debugger/debuggermanager.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 12:48:12 +01:00
										 |  |  | #include <QtGui/QMessageBox>
 | 
					
						
							|  |  |  | #include <QtGui/QMainWindow>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | using namespace ProjectExplorer; | 
					
						
							| 
									
										
										
										
											2009-11-26 14:43:27 +01:00
										 |  |  | using namespace Qt4ProjectManager; | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | using namespace Qt4ProjectManager::Internal; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | namespace { | 
					
						
							|  |  |  | const char * const S60_DEVICE_RC_ID("Qt4ProjectManager.S60DeviceRunConfiguration"); | 
					
						
							|  |  |  | const char * const S60_DEVICE_RC_PREFIX("Qt4ProjectManager.S60DeviceRunConfiguration."); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const char * const PRO_FILE_KEY("Qt4ProjectManager.S60DeviceRunConfiguration.ProFile"); | 
					
						
							|  |  |  | const char * const SIGNING_MODE_KEY("Qt4ProjectManager.S60DeviceRunConfiguration.SigningMode"); | 
					
						
							|  |  |  | const char * const CUSTOM_SIGNATURE_PATH_KEY("Qt4ProjectManager.S60DeviceRunConfiguration.CustomSignaturePath"); | 
					
						
							|  |  |  | const char * const CUSTOM_KEY_PATH_KEY("Qt4ProjectManager.S60DeviceRunConfiguration.CustomKeyPath"); | 
					
						
							|  |  |  | const char * const SERIAL_PORT_NAME_KEY("Qt4ProjectManager.S60DeviceRunConfiguration.SerialPortName"); | 
					
						
							|  |  |  | const char * const COMMUNICATION_TYPE_KEY("Qt4ProjectManager.S60DeviceRunConfiguration.CommunicationType"); | 
					
						
							|  |  |  | const char * const COMMAND_LINE_ARGUMENTS_KEY("Qt4ProjectManager.S60DeviceRunConfiguration.CommandLineArguments"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const int    PROGRESS_PACKAGECREATED = 100; | 
					
						
							|  |  |  | const int    PROGRESS_PACKAGESIGNED = 200; | 
					
						
							|  |  |  | const int    PROGRESS_DEPLOYBASE = 200; | 
					
						
							|  |  |  | const int    PROGRESS_PACKAGEDEPLOYED = 300; | 
					
						
							|  |  |  | const int    PROGRESS_PACKAGEINSTALLED = 400; | 
					
						
							|  |  |  | const int    PROGRESS_MAX = 400; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 16:33:44 +01:00
										 |  |  | enum { debug = 0 }; | 
					
						
							| 
									
										
										
										
											2009-11-30 17:55:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-14 14:29:19 +02:00
										 |  |  | // Format information about a file
 | 
					
						
							| 
									
										
										
										
											2010-02-19 17:37:04 +01:00
										 |  |  | static inline QString msgListFile(const QString &f) | 
					
						
							| 
									
										
										
										
											2009-08-14 14:29:19 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     QString rc; | 
					
						
							|  |  |  |     const QFileInfo fi(f); | 
					
						
							|  |  |  |     QTextStream str(&rc); | 
					
						
							| 
									
										
										
										
											2010-02-19 17:37:04 +01:00
										 |  |  |     if (fi.exists()) { | 
					
						
							|  |  |  |         str << fi.size() << ' ' << fi.lastModified().toString(Qt::ISODate) << ' ' << QDir::toNativeSeparators(fi.absoluteFilePath()); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         str << "<non-existent> " << QDir::toNativeSeparators(fi.absoluteFilePath()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-14 14:29:19 +02:00
										 |  |  |     return rc; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-10-22 16:42:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | QString pathFromId(const QString &id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (!id.startsWith(QLatin1String(S60_DEVICE_RC_PREFIX))) | 
					
						
							|  |  |  |         return QString(); | 
					
						
							|  |  |  |     return id.mid(QString::fromLatin1(S60_DEVICE_RC_PREFIX).size()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString pathToId(const QString &path) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return QString::fromLatin1(S60_DEVICE_RC_PREFIX) + path; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | // ======== S60DeviceRunConfiguration
 | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  | S60DeviceRunConfiguration::S60DeviceRunConfiguration(Target *parent, const QString &proFilePath) : | 
					
						
							|  |  |  |     RunConfiguration(parent,  QLatin1String(S60_DEVICE_RC_ID)), | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  |     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")), | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2010-02-05 17:34:02 +01:00
										 |  |  |     m_serialPortName(QLatin1String(SymbianUtils::SymbianDeviceManager::linuxBlueToothDeviceRootC) + QLatin1Char('0')), | 
					
						
							| 
									
										
										
										
											2009-10-22 16:42:25 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-06-19 17:55:47 +02:00
										 |  |  |     m_signingMode(SignSelf) | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     ctor(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  | S60DeviceRunConfiguration::S60DeviceRunConfiguration(Target *target, S60DeviceRunConfiguration *source) : | 
					
						
							|  |  |  |     RunConfiguration(target, source), | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  |     m_proFilePath(source->m_proFilePath), | 
					
						
							|  |  |  |     m_cachedTargetInformationValid(false), | 
					
						
							|  |  |  |     m_serialPortName(source->m_serialPortName), | 
					
						
							|  |  |  |     m_signingMode(source->m_signingMode), | 
					
						
							|  |  |  |     m_customSignaturePath(source->m_customSignaturePath), | 
					
						
							|  |  |  |     m_customKeyPath(source->m_customKeyPath) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ctor(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void S60DeviceRunConfiguration::proFileUpdate(Qt4ProjectManager::Internal::Qt4ProFileNode *pro) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_proFilePath == pro->path()) | 
					
						
							|  |  |  |         invalidateCachedTargetInformation(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void S60DeviceRunConfiguration::ctor() | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     if (!m_proFilePath.isEmpty()) | 
					
						
							| 
									
										
										
										
											2010-01-07 18:17:24 +01:00
										 |  |  |         setDisplayName(tr("%1 on Symbian Device").arg(QFileInfo(m_proFilePath).completeBaseName())); | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2010-01-07 18:17:24 +01:00
										 |  |  |         setDisplayName(tr("QtS60DeviceRunConfiguration")); | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     connect(target(), SIGNAL(targetInformationChanged()), | 
					
						
							| 
									
										
										
										
											2009-06-22 15:51:21 +02:00
										 |  |  |             this, SLOT(invalidateCachedTargetInformation())); | 
					
						
							| 
									
										
										
										
											2009-12-03 18:37:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     connect(qt4Target()->qt4Project(), SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode*)), | 
					
						
							| 
									
										
										
										
											2009-12-03 18:37:27 +01:00
										 |  |  |             this, SLOT(proFileUpdate(Qt4ProjectManager::Internal::Qt4ProFileNode*))); | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-03 18:37:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | S60DeviceRunConfiguration::~S60DeviceRunConfiguration() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  | Qt4Target *S60DeviceRunConfiguration::qt4Target() const | 
					
						
							| 
									
										
										
										
											2009-11-26 14:43:27 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     return static_cast<Qt4Target *>(target()); | 
					
						
							| 
									
										
										
										
											2009-11-26 14:43:27 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 17:21:27 +01:00
										 |  |  | ProjectExplorer::ToolChain::ToolChainType S60DeviceRunConfiguration::toolChainType( | 
					
						
							|  |  |  |         ProjectExplorer::BuildConfiguration *configuration) const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-25 18:50:20 +01:00
										 |  |  |     if (Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(configuration)) | 
					
						
							|  |  |  |         return bc->toolChainType(); | 
					
						
							| 
									
										
										
										
											2009-10-28 17:21:27 +01:00
										 |  |  |     return ProjectExplorer::ToolChain::INVALID; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  | ProjectExplorer::ToolChain::ToolChainType S60DeviceRunConfiguration::toolChainType() const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     if (Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(target()->activeBuildConfiguration())) | 
					
						
							| 
									
										
										
										
											2009-11-25 18:50:20 +01:00
										 |  |  |         return bc->toolChainType(); | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  |     return ProjectExplorer::ToolChain::INVALID; | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 17:21:27 +01:00
										 |  |  | bool S60DeviceRunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration *configuration) const | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-17 17:38:48 +01:00
										 |  |  |     const Qt4BuildConfiguration *qt4bc = static_cast<const Qt4BuildConfiguration *>(configuration); | 
					
						
							|  |  |  |     switch (qt4bc->toolChainType()) { | 
					
						
							|  |  |  |     case ToolChain::GCCE: | 
					
						
							|  |  |  |     case ToolChain::RVCT_ARMV5: | 
					
						
							|  |  |  |     case ToolChain::RVCT_ARMV6: | 
					
						
							|  |  |  |     case ToolChain::GCCE_GNUPOC: | 
					
						
							|  |  |  |     case ToolChain::RVCT_ARMV5_GNUPOC: | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return false; | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QWidget *S60DeviceRunConfiguration::configurationWidget() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return new S60DeviceRunConfigurationWidget(this); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | QVariantMap S60DeviceRunConfiguration::toMap() const | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  |     QVariantMap map(ProjectExplorer::RunConfiguration::toMap()); | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     const QDir projectDir = QFileInfo(target()->project()->file()->fileName()).absoluteDir(); | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     map.insert(QLatin1String(PRO_FILE_KEY), projectDir.relativeFilePath(m_proFilePath)); | 
					
						
							|  |  |  |     map.insert(QLatin1String(SIGNING_MODE_KEY), (int)m_signingMode); | 
					
						
							|  |  |  |     map.insert(QLatin1String(CUSTOM_SIGNATURE_PATH_KEY), m_customSignaturePath); | 
					
						
							|  |  |  |     map.insert(QLatin1String(CUSTOM_KEY_PATH_KEY), m_customKeyPath); | 
					
						
							|  |  |  |     map.insert(QLatin1String(SERIAL_PORT_NAME_KEY), m_serialPortName); | 
					
						
							|  |  |  |     map.insert(QLatin1String(COMMAND_LINE_ARGUMENTS_KEY), m_commandLineArguments); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return map; | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | bool S60DeviceRunConfiguration::fromMap(const QVariantMap &map) | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     const QDir projectDir = QFileInfo(target()->project()->file()->fileName()).absoluteDir(); | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     m_proFilePath = projectDir.filePath(map.value(QLatin1String(PRO_FILE_KEY)).toString()); | 
					
						
							|  |  |  |     m_signingMode = static_cast<SigningMode>(map.value(QLatin1String(SIGNING_MODE_KEY)).toInt()); | 
					
						
							|  |  |  |     m_customSignaturePath = map.value(QLatin1String(CUSTOM_SIGNATURE_PATH_KEY)).toString(); | 
					
						
							|  |  |  |     m_customKeyPath = map.value(QLatin1String(CUSTOM_KEY_PATH_KEY)).toString(); | 
					
						
							|  |  |  |     m_serialPortName = map.value(QLatin1String(SERIAL_PORT_NAME_KEY)).toString().trimmed(); | 
					
						
							|  |  |  |     m_commandLineArguments = map.value(QLatin1String(COMMAND_LINE_ARGUMENTS_KEY)).toStringList(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return RunConfiguration::fromMap(map); | 
					
						
							| 
									
										
										
										
											2009-07-30 11:46:30 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString S60DeviceRunConfiguration::serialPortName() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return m_serialPortName; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void S60DeviceRunConfiguration::setSerialPortName(const QString &name) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-09 19:05:15 +01:00
										 |  |  |     const QString &candidate = name.trimmed(); | 
					
						
							|  |  |  |     if (m_serialPortName == candidate) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     m_serialPortName = candidate; | 
					
						
							|  |  |  |     emit serialPortNameChanged(); | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  | /* Grep a package file for the '.exe' file. Curently for use on Linux only
 | 
					
						
							|  |  |  |  * as the '.pkg'-files on Windows do not contain drive letters, which is not | 
					
						
							|  |  |  |  * handled here. \code | 
					
						
							|  |  |  | ; Executable and default resource files | 
					
						
							|  |  |  | "./foo.exe"    - "!:\sys\bin\foo.exe" | 
					
						
							|  |  |  | \endcode  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline QString executableFromPackageUnix(const QString &packageFileName) | 
					
						
							| 
									
										
										
										
											2009-08-14 14:29:19 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  |     QFile packageFile(packageFileName); | 
					
						
							|  |  |  |     if (!packageFile.open(QIODevice::ReadOnly|QIODevice::Text)) | 
					
						
							|  |  |  |         return QString(); | 
					
						
							|  |  |  |     QRegExp pattern(QLatin1String("^\"(.*.exe)\" *- \"!:.*.exe\"$")); | 
					
						
							|  |  |  |     QTC_ASSERT(pattern.isValid(), return QString()); | 
					
						
							|  |  |  |     foreach(const QString &line, QString::fromLocal8Bit(packageFile.readAll()).split(QLatin1Char('\n'))) | 
					
						
							|  |  |  |         if (pattern.exactMatch(line)) { | 
					
						
							|  |  |  |             // Expand relative paths by package file paths
 | 
					
						
							|  |  |  |             QString rc = pattern.cap(1); | 
					
						
							|  |  |  |             if (rc.startsWith(QLatin1String("./"))) | 
					
						
							|  |  |  |                 rc.remove(0, 2); | 
					
						
							|  |  |  |             const QFileInfo fi(rc); | 
					
						
							|  |  |  |             if (fi.isAbsolute()) | 
					
						
							|  |  |  |                 return rc; | 
					
						
							|  |  |  |             return QFileInfo(packageFileName).absolutePath() + QLatin1Char('/') + rc; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     return QString(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-10-07 17:17:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-19 17:37:04 +01:00
										 |  |  | const QtVersion *S60DeviceRunConfiguration::qtVersion() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (const BuildConfiguration *bc = target()->activeBuildConfiguration()) | 
					
						
							|  |  |  |         if (const Qt4BuildConfiguration *qt4bc = qobject_cast<const Qt4BuildConfiguration *>(bc)) | 
					
						
							|  |  |  |             return qt4bc->qtVersion(); | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  | QString S60DeviceRunConfiguration::localExecutableFileName() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QString localExecutable; | 
					
						
							|  |  |  |     switch (toolChainType()) { | 
					
						
							|  |  |  |     case ToolChain::GCCE_GNUPOC: | 
					
						
							|  |  |  |     case ToolChain::RVCT_ARMV5_GNUPOC: | 
					
						
							|  |  |  |         localExecutable = executableFromPackageUnix(packageTemplateFileName()); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     default: { | 
					
						
							| 
									
										
										
										
											2010-02-19 17:37:04 +01:00
										 |  |  |             const QtVersion *qtv = qtVersion(); | 
					
						
							|  |  |  |             QTC_ASSERT(qtv, return QString()); | 
					
						
							|  |  |  |             const S60Devices::Device device = S60Manager::instance()->deviceForQtVersion(qtv); | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  |             QTextStream(&localExecutable) << device.epocRoot << "/epoc32/release/" | 
					
						
							|  |  |  |                     << symbianPlatform() << '/' << symbianTarget() << '/' << targetName() | 
					
						
							|  |  |  |                     << ".exe"; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (debug) | 
					
						
							|  |  |  |         qDebug() << "Local executable" << localExecutable; | 
					
						
							| 
									
										
										
										
											2009-10-07 17:17:20 +02:00
										 |  |  |     return QDir::toNativeSeparators(localExecutable); | 
					
						
							| 
									
										
										
										
											2009-08-14 14:29:19 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  | QString S60DeviceRunConfiguration::signedPackage() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const_cast<S60DeviceRunConfiguration *>(this)->updateTarget(); | 
					
						
							|  |  |  |     return QDir::toNativeSeparators(m_baseFileName + QLatin1String(".sis")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-21 12:35:09 +01:00
										 |  |  | QStringList S60DeviceRunConfiguration::commandLineArguments() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return m_commandLineArguments; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void S60DeviceRunConfiguration::setCommandLineArguments(const QStringList &args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_commandLineArguments = args; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-25 10:16:54 +01:00
										 |  |  | // Fix up target specification for "make sis":
 | 
					
						
							|  |  |  | // "udeb"-> "debug", "urel" -> "release"
 | 
					
						
							|  |  |  | static inline QString fixBaseNameTarget(const QString &in) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (in == QLatin1String("udeb")) | 
					
						
							|  |  |  |         return QLatin1String("debug"); | 
					
						
							|  |  |  |     if (in == QLatin1String("urel")) | 
					
						
							|  |  |  |         return QLatin1String("release"); | 
					
						
							|  |  |  |     return in; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | void S60DeviceRunConfiguration::updateTarget() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_cachedTargetInformationValid) | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     Qt4TargetInformation info = qt4Target()->targetInformation(qt4Target()->activeBuildConfiguration(), | 
					
						
							| 
									
										
										
										
											2009-12-22 14:52:36 +01:00
										 |  |  |                                                                 m_proFilePath); | 
					
						
							|  |  |  |     if (info.error != Qt4TargetInformation::NoError) { | 
					
						
							|  |  |  |         if (info.error == Qt4TargetInformation::ProParserError) { | 
					
						
							|  |  |  |             Core::ICore::instance()->messageManager()->printToOutputPane( | 
					
						
							| 
									
										
										
										
											2010-02-10 12:16:01 +01:00
										 |  |  |                     tr("Could not parse %1. The Qt Symbian Device run configuration %2 can not be started.") | 
					
						
							| 
									
										
										
										
											2010-01-07 18:17:24 +01:00
										 |  |  |                     .arg(m_proFilePath).arg(displayName())); | 
					
						
							| 
									
										
										
										
											2009-12-22 14:52:36 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-02-02 17:09:41 +01:00
										 |  |  |         m_targetName.clear(); | 
					
						
							|  |  |  |         m_baseFileName.clear(); | 
					
						
							|  |  |  |         m_packageTemplateFileName.clear(); | 
					
						
							|  |  |  |         m_platform.clear(); | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  |         m_cachedTargetInformationValid = true; | 
					
						
							|  |  |  |         emit targetInformationChanged(); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-01-11 15:34:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-22 14:52:36 +01:00
										 |  |  |     m_targetName = info.target; | 
					
						
							| 
									
										
										
										
											2009-08-13 17:18:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-11 15:34:40 +01:00
										 |  |  |     m_baseFileName = info.workingDir + QLatin1Char('/') + m_targetName; | 
					
						
							| 
									
										
										
										
											2009-12-22 14:52:36 +01:00
										 |  |  |     m_packageTemplateFileName = m_baseFileName + QLatin1String("_template.pkg"); | 
					
						
							| 
									
										
										
										
											2009-10-07 17:17:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     Qt4BuildConfiguration *qt4bc = qt4Target()->activeBuildConfiguration(); | 
					
						
							| 
									
										
										
										
											2009-11-25 18:50:20 +01:00
										 |  |  |     switch (qt4bc->toolChainType()) { | 
					
						
							| 
									
										
										
										
											2009-11-13 15:47:35 +01:00
										 |  |  |     case ToolChain::GCCE: | 
					
						
							|  |  |  |     case ToolChain::GCCE_GNUPOC: | 
					
						
							| 
									
										
										
										
											2009-10-07 17:17:20 +02:00
										 |  |  |         m_platform = QLatin1String("gcce"); | 
					
						
							| 
									
										
										
										
											2009-11-13 15:47:35 +01:00
										 |  |  |         break; | 
					
						
							|  |  |  |     case ToolChain::RVCT_ARMV5: | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  |     case ToolChain::RVCT_ARMV5_GNUPOC: | 
					
						
							| 
									
										
										
										
											2009-10-07 17:17:20 +02:00
										 |  |  |         m_platform = QLatin1String("armv5"); | 
					
						
							| 
									
										
										
										
											2009-11-13 15:47:35 +01:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  |     default: | 
					
						
							| 
									
										
										
										
											2009-10-07 17:17:20 +02:00
										 |  |  |         m_platform = QLatin1String("armv6"); | 
					
						
							| 
									
										
										
										
											2009-11-13 15:47:35 +01:00
										 |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-12-02 17:43:43 +01:00
										 |  |  |     if (qt4bc->qmakeBuildConfiguration() & 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"); | 
					
						
							| 
									
										
										
										
											2010-02-25 10:16:54 +01:00
										 |  |  |     m_baseFileName += QLatin1Char('_') + fixBaseNameTarget(m_target) | 
					
						
							|  |  |  |                       + QLatin1Char('-') + m_platform; | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  |     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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | S60DeviceRunConfigurationFactory::S60DeviceRunConfigurationFactory(QObject *parent) : | 
					
						
							|  |  |  |     IRunConfigurationFactory(parent) | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | S60DeviceRunConfigurationFactory::~S60DeviceRunConfigurationFactory() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  | QStringList S60DeviceRunConfigurationFactory::availableCreationIds(Target *parent) const | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     Qt4Target *target = qobject_cast<Qt4Target *>(parent); | 
					
						
							|  |  |  |     if (!target || | 
					
						
							|  |  |  |         target->id() != QLatin1String(S60_DEVICE_TARGET_ID)) | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  |         return QStringList(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     return target->qt4Project()->applicationProFilePathes(QLatin1String(S60_DEVICE_RC_PREFIX)); | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | QString S60DeviceRunConfigurationFactory::displayNameForId(const QString &id) const | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  |     if (!pathFromId(id).isEmpty()) | 
					
						
							|  |  |  |         return tr("%1 on Symbian Device").arg(QFileInfo(pathFromId(id)).completeBaseName()); | 
					
						
							|  |  |  |     return QString(); | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  | bool S60DeviceRunConfigurationFactory::canCreate(Target *parent, const QString &id) const | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     Qt4Target * t(qobject_cast<Qt4Target *>(parent)); | 
					
						
							|  |  |  |     if (!t || | 
					
						
							|  |  |  |         t->id() != QLatin1String(S60_DEVICE_TARGET_ID)) | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  |         return false; | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     return t->qt4Project()->hasApplicationProFile(pathFromId(id)); | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  | RunConfiguration *S60DeviceRunConfigurationFactory::create(Target *parent, const QString &id) | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  |     if (!canCreate(parent, id)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     Qt4Target *t(static_cast<Qt4Target *>(parent)); | 
					
						
							|  |  |  |     return new S60DeviceRunConfiguration(t, pathFromId(id)); | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  | bool S60DeviceRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     Qt4Target * t(qobject_cast<Qt4Target *>(parent)); | 
					
						
							|  |  |  |     if (!t || | 
					
						
							|  |  |  |         t->id() != QLatin1String(S60_DEVICE_TARGET_ID)) | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  |         return false; | 
					
						
							|  |  |  |     QString id(ProjectExplorer::idFromMap(map)); | 
					
						
							|  |  |  |     return id == QLatin1String(S60_DEVICE_RC_ID); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  | RunConfiguration *S60DeviceRunConfigurationFactory::restore(Target *parent, const QVariantMap &map) | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (!canRestore(parent, map)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     Qt4Target *t(static_cast<Qt4Target *>(parent)); | 
					
						
							|  |  |  |     S60DeviceRunConfiguration *rc(new S60DeviceRunConfiguration(t, QString())); | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  |     if (rc->fromMap(map)) | 
					
						
							|  |  |  |         return rc; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     delete rc; | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  | bool S60DeviceRunConfigurationFactory::canClone(Target *parent, RunConfiguration *source) const | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     if (!qobject_cast<Qt4Target *>(parent)) | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  |         return false; | 
					
						
							|  |  |  |     return source->id() == QLatin1String(S60_DEVICE_RC_ID); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  | RunConfiguration *S60DeviceRunConfigurationFactory::clone(Target *parent, RunConfiguration *source) | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (!canClone(parent, source)) | 
					
						
							|  |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     Qt4Target *t = static_cast<Qt4Target *>(parent); | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  |     S60DeviceRunConfiguration * old(static_cast<S60DeviceRunConfiguration *>(source)); | 
					
						
							| 
									
										
										
										
											2010-02-08 15:50:06 +01:00
										 |  |  |     return new S60DeviceRunConfiguration(t, old); | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  | // ======== S60DeviceRunControlBase
 | 
					
						
							| 
									
										
										
										
											2009-08-17 11:47:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-08 18:37:18 +02:00
										 |  |  | S60DeviceRunControlBase::S60DeviceRunControlBase(RunConfiguration *runConfiguration) : | 
					
						
							| 
									
										
										
										
											2010-01-29 21:33:57 +01:00
										 |  |  |     RunControl(runConfiguration), | 
					
						
							| 
									
										
										
										
											2009-11-13 15:47:35 +01:00
										 |  |  |     m_toolChain(ProjectExplorer::ToolChain::INVALID), | 
					
						
							| 
									
										
										
										
											2010-02-17 17:38:48 +01:00
										 |  |  |     m_makesisProcess(new QProcess(this)), | 
					
						
							| 
									
										
										
										
											2010-02-11 12:31:59 +01:00
										 |  |  |     m_releaseDeviceAfterLauncherFinish(false), | 
					
						
							|  |  |  |     m_handleDeviceRemoval(true), | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  |     m_launcher(0) | 
					
						
							| 
									
										
										
										
											2009-11-30 17:55:08 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     // connect for automatically reporting the "finished deploy" state to the progress manager
 | 
					
						
							|  |  |  |     connect(this, SIGNAL(finished()), this, SLOT(reportDeployFinished())); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-17 17:38:48 +01:00
										 |  |  |     connect(m_makesisProcess, SIGNAL(readyReadStandardError()), | 
					
						
							| 
									
										
										
										
											2009-06-17 18:26:18 +02:00
										 |  |  |             this, SLOT(readStandardError())); | 
					
						
							| 
									
										
										
										
											2010-02-17 17:38:48 +01:00
										 |  |  |     connect(m_makesisProcess, SIGNAL(readyReadStandardOutput()), | 
					
						
							| 
									
										
										
										
											2009-06-17 18:26:18 +02:00
										 |  |  |             this, SLOT(readStandardOutput())); | 
					
						
							| 
									
										
										
										
											2010-02-17 17:38:48 +01:00
										 |  |  |     connect(m_makesisProcess, SIGNAL(error(QProcess::ProcessError)), | 
					
						
							| 
									
										
										
										
											2009-06-17 18:26:18 +02:00
										 |  |  |             this, SLOT(makesisProcessFailed())); | 
					
						
							| 
									
										
										
										
											2010-02-17 17:38:48 +01:00
										 |  |  |     connect(m_makesisProcess, SIGNAL(finished(int,QProcess::ExitStatus)), | 
					
						
							| 
									
										
										
										
											2009-06-17 18:26:18 +02:00
										 |  |  |             this, SLOT(makesisProcessFinished())); | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-08 18:37:18 +02:00
										 |  |  |     S60DeviceRunConfiguration *s60runConfig = qobject_cast<S60DeviceRunConfiguration *>(runConfiguration); | 
					
						
							| 
									
										
										
										
											2010-02-23 17:32:39 +01:00
										 |  |  |     const Qt4BuildConfiguration *activeBuildConf = s60runConfig->qt4Target()->activeBuildConfiguration(); | 
					
						
							| 
									
										
										
										
											2009-11-26 14:43:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-14 16:26:59 +02:00
										 |  |  |     QTC_ASSERT(s60runConfig, return); | 
					
						
							| 
									
										
										
										
											2009-11-13 15:47:35 +01:00
										 |  |  |     m_toolChain = s60runConfig->toolChainType(); | 
					
						
							| 
									
										
										
										
											2009-09-14 16:26:59 +02:00
										 |  |  |     m_serialPortName = s60runConfig->serialPortName(); | 
					
						
							| 
									
										
										
										
											2010-02-05 17:34:02 +01:00
										 |  |  |     m_serialPortFriendlyName = SymbianUtils::SymbianDeviceManager::instance()->friendlyNameForPort(m_serialPortName); | 
					
						
							| 
									
										
										
										
											2009-09-14 16:26:59 +02:00
										 |  |  |     m_targetName = s60runConfig->targetName(); | 
					
						
							|  |  |  |     m_baseFileName = s60runConfig->basePackageFilePath(); | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  |     m_signedPackage = s60runConfig->signedPackage(); | 
					
						
							| 
									
										
										
										
											2010-01-21 12:35:09 +01:00
										 |  |  |     m_commandLineArguments = s60runConfig->commandLineArguments(); | 
					
						
							| 
									
										
										
										
											2009-06-17 18:26:18 +02:00
										 |  |  |     m_workingDirectory = QFileInfo(m_baseFileName).absolutePath(); | 
					
						
							| 
									
										
										
										
											2009-11-25 18:50:20 +01:00
										 |  |  |     m_qtDir = activeBuildConf->qtVersion()->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(); | 
					
						
							| 
									
										
										
										
											2010-02-19 17:37:04 +01:00
										 |  |  |     if (const QtVersion *qtv = s60runConfig->qtVersion()) | 
					
						
							|  |  |  |         m_qtBinPath = qtv->versionInfo().value(QLatin1String("QT_INSTALL_BINS")); | 
					
						
							|  |  |  |     QTC_ASSERT(!m_qtBinPath.isEmpty(), return); | 
					
						
							| 
									
										
										
										
											2009-11-25 18:50:20 +01:00
										 |  |  |     const S60Devices::Device device = S60Manager::instance()->deviceForQtVersion(activeBuildConf->qtVersion()); | 
					
						
							| 
									
										
										
										
											2010-02-23 17:32:39 +01:00
										 |  |  |     // 'sis' is a make target. Set up with correct environment
 | 
					
						
							|  |  |  |     // Also add $QTDIR/bin, since it needs to find 'createpackage'.
 | 
					
						
							|  |  |  |     ProjectExplorer::ToolChain *toolchain = activeBuildConf->toolChain(); | 
					
						
							|  |  |  |     m_makeTool = toolchain->makeCommand(); | 
					
						
							|  |  |  |     ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment(); | 
					
						
							|  |  |  |     toolchain->addToEnvironment(env); | 
					
						
							|  |  |  |     env.prependOrSetPath(m_qtBinPath); | 
					
						
							|  |  |  |     m_makesisProcess->setEnvironment(env.toStringList()); | 
					
						
							| 
									
										
										
										
											2009-11-13 15:47:35 +01:00
										 |  |  |     m_executableFileName = s60runConfig->localExecutableFileName(); | 
					
						
							| 
									
										
										
										
											2009-10-07 17:17:20 +02:00
										 |  |  |     m_packageFilePath = s60runConfig->packageFileName(); | 
					
						
							|  |  |  |     m_packageFile = QFileInfo(m_packageFilePath).fileName(); | 
					
						
							| 
									
										
										
										
											2009-11-13 15:47:35 +01:00
										 |  |  |     if (debug) | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  |         qDebug() << "S60DeviceRunControlBase::CT" << m_targetName << ProjectExplorer::ToolChain::toolChainName(m_toolChain) | 
					
						
							| 
									
										
										
										
											2010-02-11 12:31:59 +01:00
										 |  |  |                  << m_serialPortName << m_workingDirectory; | 
					
						
							| 
									
										
										
										
											2009-09-09 18:42:25 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-23 18:40:46 +02:00
										 |  |  | S60DeviceRunControlBase::~S60DeviceRunControlBase() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_launcher) { | 
					
						
							|  |  |  |         m_launcher->deleteLater(); | 
					
						
							|  |  |  |         m_launcher = 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-11 12:31:59 +01:00
										 |  |  | void S60DeviceRunControlBase::setReleaseDeviceAfterLauncherFinish(bool v) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_releaseDeviceAfterLauncherFinish = v; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-23 17:32:39 +01:00
										 |  |  | QString S60DeviceRunControlBase::signSisKey() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const QString key = m_useCustomSignature ? m_customKeyPath: | 
					
						
							|  |  |  |                         m_qtDir + QLatin1String("/src/s60installs/selfsigned.key"); | 
					
						
							|  |  |  |     return QDir::toNativeSeparators(key); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString S60DeviceRunControlBase::signSisCertificate() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const QString cert = m_useCustomSignature ? m_customSignaturePath : | 
					
						
							|  |  |  |                          m_qtDir + QLatin1String("/src/s60installs/selfsigned.cer"); | 
					
						
							|  |  |  |     return QDir::toNativeSeparators(cert); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  | // Format a message with command line
 | 
					
						
							|  |  |  | static inline QString msgRun(const QString &cmd, const QStringList &args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const QChar blank = QLatin1Char(' '); | 
					
						
							|  |  |  |     return QDir::toNativeSeparators(cmd) + blank + args.join(QString(blank)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-25 10:16:54 +01:00
										 |  |  | static inline bool ensureDeleteFile(const QString &fileName, QString *errorMessage) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QFile file(fileName); | 
					
						
							|  |  |  |     if (file.exists() && !file.remove()) { | 
					
						
							|  |  |  |         *errorMessage = S60DeviceRunControlBase::tr("Unable to remove existing file '%1': %2").arg(fileName, file.errorString()); | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  | void S60DeviceRunControlBase::start() | 
					
						
							| 
									
										
										
										
											2009-09-09 18:42:25 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-30 17:55:08 +01:00
										 |  |  |     m_deployProgress = new QFutureInterface<void>; | 
					
						
							|  |  |  |     Core::ICore::instance()->progressManager()->addTask(m_deployProgress->future(), | 
					
						
							|  |  |  |                                                         tr("Deploying"), | 
					
						
							|  |  |  |                                                         QLatin1String("Symbian.Deploy")); | 
					
						
							|  |  |  |     m_deployProgress->setProgressRange(0, PROGRESS_MAX); | 
					
						
							|  |  |  |     m_deployProgress->setProgressValue(0); | 
					
						
							|  |  |  |     m_deployProgress->reportStarted(); | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  |     emit started(); | 
					
						
							| 
									
										
										
										
											2009-10-29 12:48:12 +01:00
										 |  |  |     if (m_serialPortName.isEmpty()) { | 
					
						
							|  |  |  |         error(this, tr("There is no device plugged in.")); | 
					
						
							|  |  |  |         emit finished(); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  |     emit addToOutputWindow(this, tr("Creating %1 ...").arg(m_signedPackage)); | 
					
						
							| 
									
										
										
										
											2010-02-19 17:37:04 +01:00
										 |  |  |     emit addToOutputWindow(this, tr("Executable file: %1").arg(msgListFile(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; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-02-25 10:16:54 +01:00
										 |  |  |     // Be sure to delete old files
 | 
					
						
							|  |  |  |     if (!ensureDeleteFile(m_signedPackage, &errorMessage)) { | 
					
						
							|  |  |  |         error(this, errorMessage); | 
					
						
							|  |  |  |         emit finished(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-10-08 17:23:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-13 15:47:35 +01:00
										 |  |  |     QStringList makeSisArgs; | 
					
						
							| 
									
										
										
										
											2010-02-23 17:32:39 +01:00
										 |  |  |     makeSisArgs << QLatin1String("sis") | 
					
						
							|  |  |  |             << (QLatin1String("QT_SIS_CERTIFICATE=") + signSisCertificate()) | 
					
						
							|  |  |  |             << (QLatin1String("QT_SIS_KEY=") + signSisKey()); | 
					
						
							| 
									
										
										
										
											2010-02-17 17:38:48 +01:00
										 |  |  |     m_makesisProcess->setWorkingDirectory(m_workingDirectory); | 
					
						
							| 
									
										
										
										
											2010-02-23 17:32:39 +01:00
										 |  |  |     emit addToOutputWindow(this, msgRun(m_makeTool, makeSisArgs)); | 
					
						
							| 
									
										
										
										
											2009-11-13 15:47:35 +01:00
										 |  |  |     if (debug) | 
					
						
							| 
									
										
										
										
											2010-02-23 17:32:39 +01:00
										 |  |  |         qDebug() << m_makeTool <<  makeSisArgs << m_workingDirectory; | 
					
						
							| 
									
										
										
										
											2010-02-25 10:16:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-23 17:32:39 +01:00
										 |  |  |     m_makesisProcess->start(m_makeTool, makeSisArgs, QIODevice::ReadOnly); | 
					
						
							|  |  |  |     m_makesisProcess->closeWriteChannel(); | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 12:48:12 +01:00
										 |  |  | static inline void stopProcess(QProcess *p) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const int timeOutMS = 200; | 
					
						
							|  |  |  |     if (p->state() != QProcess::Running) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     p->terminate(); | 
					
						
							|  |  |  |     if (p->waitForFinished(timeOutMS)) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     p->kill(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  | void S60DeviceRunControlBase::stop() | 
					
						
							| 
									
										
										
										
											2009-06-16 18:03:16 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-17 17:38:48 +01:00
										 |  |  |     if (m_makesisProcess) | 
					
						
							|  |  |  |         stopProcess(m_makesisProcess); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-17 17:38:48 +01:00
										 |  |  |     return m_makesisProcess->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-09-28 17:17:11 +02:00
										 |  |  | void S60DeviceRunControlBase::makesisProcessFailed() | 
					
						
							| 
									
										
										
										
											2009-06-17 19:01:41 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-23 17:32:39 +01:00
										 |  |  |     processFailed(m_makeTool, m_makesisProcess->error()); | 
					
						
							| 
									
										
										
										
											2009-06-17 19:01:41 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  | static inline bool renameFile(const QString &sourceName, const QString &targetName, | 
					
						
							|  |  |  |                               QString *errorMessage) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-19 17:37:04 +01:00
										 |  |  |     if (sourceName == targetName) | 
					
						
							|  |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2010-02-25 10:16:54 +01:00
										 |  |  |     if (!ensureDeleteFile(targetName, errorMessage)) | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  |         return false; | 
					
						
							|  |  |  |     QFile source(sourceName); | 
					
						
							|  |  |  |     if (!source.rename(targetName)) { | 
					
						
							|  |  |  |         *errorMessage = S60DeviceRunControlBase::tr("Unable to rename file '%1' to '%2': %3") | 
					
						
							|  |  |  |                         .arg(sourceName, targetName, source.errorString()); | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  | void S60DeviceRunControlBase::makesisProcessFinished() | 
					
						
							| 
									
										
										
										
											2009-06-17 19:01:41 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-17 17:38:48 +01:00
										 |  |  |     if (m_makesisProcess->exitCode() != 0) { | 
					
						
							| 
									
										
										
										
											2009-06-18 18:09:37 +02:00
										 |  |  |         error(this, tr("An error occurred while creating the package.")); | 
					
						
							| 
									
										
										
										
											2009-10-29 12:48:12 +01:00
										 |  |  |         stop(); | 
					
						
							| 
									
										
										
										
											2009-06-18 18:09:37 +02:00
										 |  |  |         emit finished(); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-11-30 17:55:08 +01:00
										 |  |  |     m_deployProgress->setProgressValue(PROGRESS_PACKAGECREATED); | 
					
						
							| 
									
										
										
										
											2010-02-19 17:37:04 +01:00
										 |  |  |     QString errorMessage; | 
					
						
							|  |  |  |     bool ok = false; | 
					
						
							| 
									
										
										
										
											2009-11-13 15:47:35 +01:00
										 |  |  |     switch (m_toolChain) { | 
					
						
							|  |  |  |     case ProjectExplorer::ToolChain::GCCE_GNUPOC: | 
					
						
							| 
									
										
										
										
											2010-02-19 17:37:04 +01:00
										 |  |  |     case ProjectExplorer::ToolChain::RVCT_ARMV5_GNUPOC: { | 
					
						
							|  |  |  |         // 'make sis' creates 'targetname.sis'. Rename to full name
 | 
					
						
							|  |  |  |         // 'targetname_armX_udeb.sis'.
 | 
					
						
							|  |  |  |         const QString oldName = m_workingDirectory + QLatin1Char('/') + m_targetName + QLatin1String(".sis"); | 
					
						
							|  |  |  |         ok = renameFile(oldName, m_signedPackage, &errorMessage); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-11-13 15:47:35 +01:00
										 |  |  |         break; | 
					
						
							|  |  |  |     default: | 
					
						
							| 
									
										
										
										
											2010-02-23 17:32:39 +01:00
										 |  |  |         // ABLD: Check on file 'targetname_armX_udeb.sis'.
 | 
					
						
							|  |  |  |         ok = QFileInfo(m_signedPackage).isFile(); | 
					
						
							|  |  |  |         if (!ok) | 
					
						
							|  |  |  |             errorMessage = tr("Failed to create '%1'").arg(m_signedPackage); | 
					
						
							| 
									
										
										
										
											2009-11-13 15:47:35 +01:00
										 |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-02-23 17:32:39 +01:00
										 |  |  |     if (ok) { | 
					
						
							|  |  |  |         startDeployment(); | 
					
						
							|  |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2010-02-19 17:37:04 +01:00
										 |  |  |         error(this, errorMessage); | 
					
						
							|  |  |  |         stop(); | 
					
						
							|  |  |  |         emit finished(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-11-13 15:47:35 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void S60DeviceRunControlBase::startDeployment() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-08-14 14:29:19 +02:00
										 |  |  |     QString errorMessage; | 
					
						
							| 
									
										
										
										
											2010-02-11 12:31:59 +01:00
										 |  |  |     bool success = false; | 
					
						
							|  |  |  |     do { | 
					
						
							|  |  |  |         connect(SymbianUtils::SymbianDeviceManager::instance(), SIGNAL(deviceRemoved(const SymbianUtils::SymbianDevice)), | 
					
						
							|  |  |  |                 this, SLOT(deviceRemoved(SymbianUtils::SymbianDevice))); | 
					
						
							|  |  |  |         m_launcher = trk::Launcher::acquireFromDeviceManager(m_serialPortName, 0, &errorMessage); | 
					
						
							|  |  |  |         if (!m_launcher) | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         connect(m_launcher, SIGNAL(finished()), this, SLOT(launcherFinished())); | 
					
						
							|  |  |  |         connect(m_launcher, SIGNAL(canNotConnect(QString)), this, SLOT(printConnectFailed(QString))); | 
					
						
							|  |  |  |         connect(m_launcher, SIGNAL(copyingStarted()), this, SLOT(printCopyingNotice())); | 
					
						
							|  |  |  |         connect(m_launcher, SIGNAL(canNotCreateFile(QString,QString)), this, SLOT(printCreateFileFailed(QString,QString))); | 
					
						
							|  |  |  |         connect(m_launcher, SIGNAL(canNotWriteFile(QString,QString)), this, SLOT(printWriteFileFailed(QString,QString))); | 
					
						
							|  |  |  |         connect(m_launcher, SIGNAL(canNotCloseFile(QString,QString)), this, SLOT(printCloseFileFailed(QString,QString))); | 
					
						
							|  |  |  |         connect(m_launcher, SIGNAL(installingStarted()), this, SLOT(printInstallingNotice())); | 
					
						
							|  |  |  |         connect(m_launcher, SIGNAL(canNotInstall(QString,QString)), this, SLOT(printInstallFailed(QString,QString))); | 
					
						
							|  |  |  |         connect(m_launcher, SIGNAL(installingFinished()), this, SLOT(printInstallingFinished())); | 
					
						
							|  |  |  |         connect(m_launcher, SIGNAL(copyProgress(int)), this, SLOT(printCopyProgress(int))); | 
					
						
							|  |  |  |         connect(m_launcher, SIGNAL(stateChanged(int)), this, SLOT(slotLauncherStateChanged(int))); | 
					
						
							|  |  |  |         connect(m_launcher, SIGNAL(processStopped(uint,uint,uint,QString)), | 
					
						
							|  |  |  |                 this, SLOT(processStopped(uint,uint,uint,QString))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         //TODO sisx destination and file path user definable
 | 
					
						
							|  |  |  |         if (!m_commandLineArguments.isEmpty()) | 
					
						
							|  |  |  |             m_launcher->setCommandLineArgs(m_commandLineArguments); | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  |         const QString copyDst = QString::fromLatin1("C:\\Data\\%1.sis").arg(QFileInfo(m_baseFileName).fileName()); | 
					
						
							| 
									
										
										
										
											2010-02-11 12:31:59 +01:00
										 |  |  |         const QString runFileName = QString::fromLatin1("C:\\sys\\bin\\%1.exe").arg(m_targetName); | 
					
						
							| 
									
										
										
										
											2010-02-18 14:47:00 +01:00
										 |  |  |         m_launcher->setCopyFileName(m_signedPackage, copyDst); | 
					
						
							| 
									
										
										
										
											2010-02-11 12:31:59 +01:00
										 |  |  |         m_launcher->setInstallFileName(copyDst); | 
					
						
							|  |  |  |         initLauncher(runFileName, m_launcher); | 
					
						
							| 
									
										
										
										
											2010-02-19 17:37:04 +01:00
										 |  |  |         emit addToOutputWindow(this, tr("Package: %1\nDeploying application to '%2'...").arg(msgListFile(m_signedPackage), m_serialPortFriendlyName)); | 
					
						
							| 
									
										
										
										
											2010-02-11 12:31:59 +01:00
										 |  |  |         // Prompt the user to start up the Blue tooth connection
 | 
					
						
							|  |  |  |         const trk::PromptStartCommunicationResult src = | 
					
						
							| 
									
										
										
										
											2009-10-26 15:37:09 +01:00
										 |  |  |             S60RunConfigBluetoothStarter::startCommunication(m_launcher->trkDevice(), | 
					
						
							| 
									
										
										
										
											2010-02-11 12:31:59 +01:00
										 |  |  |                                                              0, &errorMessage); | 
					
						
							|  |  |  |         if (src != trk::PromptStartCommunicationConnected) | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         if (!m_launcher->startServer(&errorMessage)) { | 
					
						
							|  |  |  |             errorMessage = tr("Could not connect to phone on port '%1': %2\n" | 
					
						
							|  |  |  |                               "Check if the phone is connected and App TRK is running.").arg(m_serialPortName, errorMessage); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         success = true; | 
					
						
							|  |  |  |     } while (false); | 
					
						
							| 
									
										
										
										
											2009-10-26 15:37:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-11 12:31:59 +01:00
										 |  |  |     if (!success) { | 
					
						
							|  |  |  |         if (!errorMessage.isEmpty()) | 
					
						
							|  |  |  |             error(this, errorMessage); | 
					
						
							| 
									
										
										
										
											2009-10-29 12:48:12 +01:00
										 |  |  |         stop(); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-30 17:55:08 +01:00
										 |  |  |     m_deployProgress->setProgressValue(PROGRESS_DEPLOYBASE + 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
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-30 17:55:08 +01:00
										 |  |  |     m_deployProgress->setProgressValue(PROGRESS_PACKAGEDEPLOYED); | 
					
						
							| 
									
										
										
										
											2009-07-30 10:32:50 +02:00
										 |  |  |     emit addToOutputWindow(this, tr("Installing application...")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-30 17:55:08 +01:00
										 |  |  | void S60DeviceRunControlBase::printInstallingFinished() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_deployProgress->setProgressValue(PROGRESS_PACKAGEINSTALLED); | 
					
						
							|  |  |  |     m_deployProgress->reportFinished(); | 
					
						
							|  |  |  |     delete m_deployProgress; | 
					
						
							|  |  |  |     m_deployProgress = 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-11 12:31:59 +01:00
										 |  |  |     if (m_releaseDeviceAfterLauncherFinish) { | 
					
						
							|  |  |  |         m_handleDeviceRemoval = false; | 
					
						
							|  |  |  |         trk::Launcher::releaseToDeviceManager(m_launcher); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  |     m_launcher->deleteLater(); | 
					
						
							|  |  |  |     m_launcher = 0; | 
					
						
							|  |  |  |     handleLauncherFinished(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-30 17:55:08 +01:00
										 |  |  | void S60DeviceRunControlBase::reportDeployFinished() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_deployProgress) { | 
					
						
							|  |  |  |         m_deployProgress->reportFinished(); | 
					
						
							|  |  |  |         delete m_deployProgress; | 
					
						
							|  |  |  |         m_deployProgress = 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-21 15:46:33 +01:00
										 |  |  | void S60DeviceRunControlBase::processStopped(uint pc, uint pid, uint tid, const QString& reason) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     emit addToOutputWindow(this, trk::Launcher::msgStopped(pid, tid, pc, reason)); | 
					
						
							|  |  |  |     m_launcher->terminate(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 12:48:12 +01:00
										 |  |  | QMessageBox *S60DeviceRunControlBase::createTrkWaitingMessageBox(const QString &port, QWidget *parent) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const QString title  = QCoreApplication::translate("Qt4ProjectManager::Internal::S60DeviceRunControlBase", | 
					
						
							| 
									
										
										
										
											2009-10-29 14:18:49 +01:00
										 |  |  |                                                        "Waiting for App TRK"); | 
					
						
							| 
									
										
										
										
											2009-10-29 12:48:12 +01:00
										 |  |  |     const QString text = QCoreApplication::translate("Qt4ProjectManager::Internal::S60DeviceRunControlBase", | 
					
						
							| 
									
										
										
										
											2009-10-29 14:18:49 +01:00
										 |  |  |                                                      "Please start App TRK on %1.").arg(port); | 
					
						
							| 
									
										
										
										
											2009-10-29 12:48:12 +01:00
										 |  |  |     QMessageBox *rc = new QMessageBox(QMessageBox::Information, title, text, | 
					
						
							|  |  |  |                                       QMessageBox::Cancel, parent); | 
					
						
							|  |  |  |     return rc; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void S60DeviceRunControlBase::slotLauncherStateChanged(int s) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (s == trk::Launcher::WaitingForTrk) { | 
					
						
							|  |  |  |         QMessageBox *mb = S60DeviceRunControlBase::createTrkWaitingMessageBox(m_launcher->trkServerName(), | 
					
						
							|  |  |  |                                                      Core::ICore::instance()->mainWindow()); | 
					
						
							|  |  |  |         connect(m_launcher, SIGNAL(stateChanged(int)), mb, SLOT(close())); | 
					
						
							|  |  |  |         connect(mb, SIGNAL(finished(int)), this, SLOT(slotWaitingForTrkClosed())); | 
					
						
							|  |  |  |         mb->open(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void S60DeviceRunControlBase::slotWaitingForTrkClosed() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_launcher && m_launcher->state() == trk::Launcher::WaitingForTrk) { | 
					
						
							|  |  |  |         stop(); | 
					
						
							| 
									
										
										
										
											2010-01-29 21:33:57 +01:00
										 |  |  |         error(this, tr("Canceled.")); | 
					
						
							| 
									
										
										
										
											2009-10-29 12:48:12 +01:00
										 |  |  |         emit finished(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  | 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)); | 
					
						
							| 
									
										
										
										
											2009-10-29 12:48:12 +01:00
										 |  |  |     stop(); | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  |     emit finished(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-05 15:07:47 +02:00
										 |  |  | void S60DeviceRunControlBase::printApplicationOutput(const QString &output) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     emit addToOutputWindowInline(this, output); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-11 12:31:59 +01:00
										 |  |  | void S60DeviceRunControlBase::deviceRemoved(const SymbianUtils::SymbianDevice &d) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_handleDeviceRemoval && d.portName() == m_serialPortName) { | 
					
						
							|  |  |  |         error(this, tr("The device '%1' has been disconnected").arg(d.friendlyName())); | 
					
						
							|  |  |  |         emit finished(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
 | 
					
						
							| 
									
										
										
										
											2010-01-19 13:41:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-08 18:37:18 +02:00
										 |  |  | S60DeviceRunControl::S60DeviceRunControl(ProjectExplorer::RunConfiguration *runConfiguration) : | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  |     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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-08 18:37:18 +02:00
										 |  |  | S60DeviceDebugRunControl::S60DeviceDebugRunControl(S60DeviceRunConfiguration *runConfiguration) : | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  |     S60DeviceRunControlBase(runConfiguration), | 
					
						
							|  |  |  |     m_startParams(new Debugger::DebuggerStartParameters) | 
					
						
							| 
									
										
										
										
											2009-07-24 17:17:13 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-02-11 12:31:59 +01:00
										 |  |  |     setReleaseDeviceAfterLauncherFinish(true); // Debugger controls device after install
 | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  |     Debugger::DebuggerManager *dm = Debugger::DebuggerManager::instance(); | 
					
						
							| 
									
										
										
										
											2009-10-08 18:37:18 +02:00
										 |  |  |     S60DeviceRunConfiguration *rc = qobject_cast<S60DeviceRunConfiguration *>(runConfiguration); | 
					
						
							|  |  |  |     QTC_ASSERT(dm && rc, return); | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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(); | 
					
						
							| 
									
										
										
										
											2010-01-21 12:35:09 +01:00
										 |  |  |     m_startParams->processArgs = rc->commandLineArguments(); | 
					
						
							| 
									
										
										
										
											2009-09-28 17:17:11 +02:00
										 |  |  |     m_startParams->startMode = Debugger::StartInternal; | 
					
						
							|  |  |  |     m_startParams->toolChainType = rc->toolChainType(); | 
					
						
							| 
									
										
										
										
											2009-10-08 18:37:18 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     m_localExecutableFileName = rc->localExecutableFileName(); | 
					
						
							|  |  |  |     const int lastDotPos = m_localExecutableFileName.lastIndexOf(QLatin1Char('.')); | 
					
						
							|  |  |  |     if (lastDotPos != -1) { | 
					
						
							|  |  |  |         m_startParams->symbolFileName = m_localExecutableFileName.mid(0, lastDotPos) + QLatin1String(".sym"); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											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
 | 
					
						
							| 
									
										
										
										
											2009-10-08 18:37:18 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!QFileInfo(m_startParams->symbolFileName).isFile()) { | 
					
						
							|  |  |  |         m_startParams->symbolFileName.clear(); | 
					
						
							|  |  |  |         emit addToOutputWindow(this, tr("Warning: Cannot locate the symbol file belonging to %1.").arg(m_localExecutableFileName)); | 
					
						
							| 
									
										
										
										
											2009-09-29 13:49:35 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-10-08 18:37:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-06 09:56:36 +02:00
										 |  |  |     launcher->addStartupActions(trk::Launcher::ActionCopyInstall); | 
					
						
							| 
									
										
										
										
											2010-02-11 12:31:59 +01:00
										 |  |  |     // Avoid close/open sequence in quick succession, which may cause crashs
 | 
					
						
							|  |  |  |     launcher->setCloseDevice(false); | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  | } |