diff options
Diffstat (limited to 'src/plugins/qt4projectmanager')
6 files changed, 160 insertions, 19 deletions
diff --git a/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt b/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt index 984c00ae08..d365bee6c5 100644 --- a/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt +++ b/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt @@ -22,10 +22,11 @@ * missing signals qtVersionChanged + toolChainChanged * handling of active run config getting disabled +* Run on device + * makesis, signsis and applicationinstaller don't report errors back + via exit code :-( + * Add compile output parser winscw at least! * WINSCW tool chain: * predefined macros - -* Deploy gcce executables - diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index a2e4e2ac32..fb2d968528 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -9,9 +9,12 @@ #include <coreplugin/icore.h> #include <coreplugin/messagemanager.h> #include <utils/qtcassert.h> +#include <utils/pathchooser.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/project.h> +#include <QtGui/QRadioButton> + using namespace ProjectExplorer; using namespace Qt4ProjectManager::Internal; @@ -19,7 +22,8 @@ using namespace Qt4ProjectManager::Internal; S60DeviceRunConfiguration::S60DeviceRunConfiguration(Project *project, const QString &proFilePath) : RunConfiguration(project), m_proFilePath(proFilePath), - m_cachedTargetInformationValid(false) + m_cachedTargetInformationValid(false), + m_signingMode(SignSelf) { if (!m_proFilePath.isEmpty()) setName(tr("%1 on Device").arg(QFileInfo(m_proFilePath).completeBaseName())); @@ -56,6 +60,9 @@ void S60DeviceRunConfiguration::save(PersistentSettingsWriter &writer) const { const QDir projectDir = QFileInfo(project()->file()->fileName()).absoluteDir(); writer.saveValue("ProFile", projectDir.relativeFilePath(m_proFilePath)); + writer.saveValue("SigningMode", (int)m_signingMode); + writer.saveValue("CustomSignaturePath", m_customSignaturePath); + writer.saveValue("CustomKeyPath", m_customKeyPath); RunConfiguration::save(writer); } @@ -64,6 +71,9 @@ void S60DeviceRunConfiguration::restore(const PersistentSettingsReader &reader) RunConfiguration::restore(reader); const QDir projectDir = QFileInfo(project()->file()->fileName()).absoluteDir(); m_proFilePath = projectDir.filePath(reader.restoreValue("ProFile").toString()); + m_signingMode = (SigningMode)reader.restoreValue("SigningMode").toInt(); + m_customSignaturePath = reader.restoreValue("CustomSignaturePath").toString(); + m_customKeyPath = reader.restoreValue("CustomKeyPath").toString(); } QString S60DeviceRunConfiguration::basePackageFilePath() const @@ -72,6 +82,36 @@ QString S60DeviceRunConfiguration::basePackageFilePath() const return m_baseFileName; } +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; +} + void S60DeviceRunConfiguration::updateTarget() { if (m_cachedTargetInformationValid) @@ -157,22 +197,70 @@ S60DeviceRunConfigurationWidget::S60DeviceRunConfigurationWidget(S60DeviceRunCon : QWidget(parent), m_runConfiguration(runConfiguration) { - QFormLayout *toplayout = new QFormLayout(); - toplayout->setMargin(0); - setLayout(toplayout); + QVBoxLayout *mainBoxLayout = new QVBoxLayout(); + mainBoxLayout->setMargin(0); + setLayout(mainBoxLayout); + QFormLayout *formLayout = new QFormLayout(); + formLayout->setMargin(0); + mainBoxLayout->addLayout(formLayout); QLabel *nameLabel = new QLabel(tr("Name:")); m_nameLineEdit = new QLineEdit(m_runConfiguration->name()); nameLabel->setBuddy(m_nameLineEdit); - toplayout->addRow(nameLabel, m_nameLineEdit); + formLayout->addRow(nameLabel, m_nameLineEdit); m_sisxFileLabel = new QLabel(m_runConfiguration->basePackageFilePath() + ".sisx"); - toplayout->addRow(tr("Install File:"), m_sisxFileLabel); + formLayout->addRow(tr("Install File:"), m_sisxFileLabel); + + QWidget *signatureWidget = new QWidget(); + QVBoxLayout *layout = new QVBoxLayout(); + signatureWidget->setLayout(layout); + mainBoxLayout->addWidget(signatureWidget); + QRadioButton *selfSign = new QRadioButton(tr("Self-sign")); + QHBoxLayout *customHBox = new QHBoxLayout(); + customHBox->setMargin(0); + QVBoxLayout *radioLayout = new QVBoxLayout(); + QRadioButton *customSignature = new QRadioButton(); + radioLayout->addWidget(customSignature); + radioLayout->addStretch(10); + customHBox->addLayout(radioLayout); + QFormLayout *customLayout = new QFormLayout(); + customLayout->setMargin(0); + customLayout->setLabelAlignment(Qt::AlignRight); + Core::Utils::PathChooser *signaturePath = new Core::Utils::PathChooser(); + signaturePath->setExpectedKind(Core::Utils::PathChooser::File); + signaturePath->setPromptDialogTitle(tr("Choose certificate file (.cer)")); + customLayout->addRow(new QLabel(tr("Custom signature:")), signaturePath); + Core::Utils::PathChooser *keyPath = new Core::Utils::PathChooser(); + keyPath->setExpectedKind(Core::Utils::PathChooser::File); + keyPath->setPromptDialogTitle(tr("Choose key file (.key / .pem)")); + customLayout->addRow(new QLabel(tr("Key file:")), keyPath); + customHBox->addLayout(customLayout); + customHBox->addStretch(10); + layout->addWidget(selfSign); + layout->addLayout(customHBox); + layout->addStretch(10); + + switch (m_runConfiguration->signingMode()) { + case S60DeviceRunConfiguration::SignSelf: + selfSign->setChecked(true); + break; + case S60DeviceRunConfiguration::SignCustom: + customSignature->setChecked(true); + break; + } + + signaturePath->setPath(m_runConfiguration->customSignaturePath()); + keyPath->setPath(m_runConfiguration->customKeyPath()); connect(m_nameLineEdit, SIGNAL(textEdited(QString)), this, SLOT(nameEdited(QString))); connect(m_runConfiguration, SIGNAL(targetInformationChanged()), this, SLOT(updateTargetInformation())); + connect(selfSign, SIGNAL(toggled(bool)), this, SLOT(selfSignToggled(bool))); + connect(customSignature, SIGNAL(toggled(bool)), this, SLOT(customSignatureToggled(bool))); + connect(signaturePath, SIGNAL(changed(QString)), this, SLOT(signaturePathChanged(QString))); + connect(keyPath, SIGNAL(changed(QString)), this, SLOT(keyPathChanged(QString))); } void S60DeviceRunConfigurationWidget::nameEdited(const QString &text) @@ -185,6 +273,28 @@ void S60DeviceRunConfigurationWidget::updateTargetInformation() m_sisxFileLabel->setText(m_runConfiguration->basePackageFilePath() + ".sisx"); } +void S60DeviceRunConfigurationWidget::selfSignToggled(bool toggle) +{ + if (toggle) + m_runConfiguration->setSigningMode(S60DeviceRunConfiguration::SignSelf); +} + +void S60DeviceRunConfigurationWidget::customSignatureToggled(bool toggle) +{ + if (toggle) + m_runConfiguration->setSigningMode(S60DeviceRunConfiguration::SignCustom); +} + +void S60DeviceRunConfigurationWidget::signaturePathChanged(const QString &path) +{ + m_runConfiguration->setCustomSignaturePath(path); +} + +void S60DeviceRunConfigurationWidget::keyPathChanged(const QString &path) +{ + m_runConfiguration->setCustomKeyPath(path); +} + // ======== S60DeviceRunConfigurationFactory S60DeviceRunConfigurationFactory::S60DeviceRunConfigurationFactory(QObject *parent) @@ -298,11 +408,14 @@ void S60DeviceRunControl::start() QSharedPointer<S60DeviceRunConfiguration> rc = runConfiguration().dynamicCast<S60DeviceRunConfiguration>(); Q_ASSERT(!rc.isNull()); - Qt4Project *project = qobject_cast<Qt4Project *>(runConfiguration()->project()); + Qt4Project *project = qobject_cast<Qt4Project *>(rc->project()); m_baseFileName = rc->basePackageFilePath(); m_workingDirectory = QFileInfo(m_baseFileName).absolutePath(); m_qtDir = project->qtVersion(project->activeBuildConfiguration())->path(); + m_useCustomSignature = (rc->signingMode() == S60DeviceRunConfiguration::SignCustom); + m_customSignaturePath = rc->customSignaturePath(); + m_customKeyPath = rc->customKeyPath(); emit started(); @@ -362,10 +475,14 @@ void S60DeviceRunControl::makesisProcessFinished() QString signsisTool = m_toolsDirectory + "/signsis.exe"; QString sisFile = QFileInfo(m_baseFileName + ".sis").fileName(); QString sisxFile = QFileInfo(m_baseFileName + ".sisx").fileName(); + QString signature = (m_useCustomSignature ? m_customSignaturePath + : m_qtDir + "/selfsigned.cer"); + QString key = (m_useCustomSignature ? m_customKeyPath + : m_qtDir + "/selfsigned.key"); QStringList arguments; arguments << sisFile - << sisxFile << QDir::toNativeSeparators(m_qtDir + "/selfsigned.cer") - << QDir::toNativeSeparators(m_qtDir + "/selfsigned.key"); + << sisxFile << QDir::toNativeSeparators(signature) + << QDir::toNativeSeparators(key); m_signsis->setWorkingDirectory(m_workingDirectory); emit addToOutputWindow(this, tr("%1 %2").arg(QDir::toNativeSeparators(signsisTool), arguments.join(tr(" ")))); m_signsis->start(signsisTool, arguments, QIODevice::ReadOnly); @@ -398,6 +515,9 @@ void S60DeviceRunControl::installProcessFailed() void S60DeviceRunControl::installProcessFinished() { + if (m_install->exitStatus() != 0) { + error(this, tr("An error occurred while creating the package.")); + } emit addToOutputWindow(this, tr("Finished.")); emit finished(); } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h index 95cf62fa69..cd3dd149e7 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h @@ -15,6 +15,11 @@ class S60DeviceRunConfiguration : public ProjectExplorer::RunConfiguration { Q_OBJECT public: + enum SigningMode { + SignSelf, + SignCustom + }; + S60DeviceRunConfiguration(ProjectExplorer::Project *project, const QString &proFilePath); ~S60DeviceRunConfiguration(); @@ -25,6 +30,12 @@ public: void restore(const ProjectExplorer::PersistentSettingsReader &reader); QString basePackageFilePath() const; + SigningMode signingMode() const; + void setSigningMode(SigningMode mode); + QString customSignaturePath() const; + void setCustomSignaturePath(const QString &path); + QString customKeyPath() const; + void setCustomKeyPath(const QString &path); signals: void targetInformationChanged(); @@ -38,6 +49,9 @@ private: QString m_proFilePath; QString m_baseFileName; bool m_cachedTargetInformationValid; + SigningMode m_signingMode; + QString m_customSignaturePath; + QString m_customKeyPath; }; class S60DeviceRunConfigurationWidget : public QWidget @@ -50,6 +64,10 @@ public: private slots: void nameEdited(const QString &text); void updateTargetInformation(); + void selfSignToggled(bool toggle); + void customSignatureToggled(bool toggle); + void signaturePathChanged(const QString &path); + void keyPathChanged(const QString &path); private: S60DeviceRunConfiguration *m_runConfiguration; @@ -108,6 +126,9 @@ private: QString m_workingDirectory; QString m_toolsDirectory; QString m_qtDir; + bool m_useCustomSignature; + QString m_customSignaturePath; + QString m_customKeyPath; QProcess *m_makesis; QProcess *m_signsis; QProcess *m_install; diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp index 7e75e1ae0f..f3dd749b69 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp @@ -69,7 +69,7 @@ Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(Qt4Project *project) connect(m_ui->shadowBuildDirEdit, SIGNAL(beforeBrowsing()), this, SLOT(onBeforeBeforeShadowBuildDirBrowsed())); - connect(m_ui->shadowBuildDirEdit, SIGNAL(changed()), + connect(m_ui->shadowBuildDirEdit, SIGNAL(changed(QString)), this, SLOT(shadowBuildLineEditTextChanged())); connect(m_ui->qtVersionComboBox, SIGNAL(currentIndexChanged(QString)), @@ -325,8 +325,7 @@ void Qt4ProjectConfigWidget::setToolChain(int index) ProjectExplorer::ToolChain::ToolChainType selectedToolChainType = m_ui->toolChainComboBox->itemData(index, Qt::UserRole).value<ProjectExplorer::ToolChain::ToolChainType>(); - m_pro->setToolChainType(m_buildConfiguration, m_ui->toolChainComboBox->itemData(index, - Qt::UserRole).value<ProjectExplorer::ToolChain::ToolChainType>()); + m_pro->setToolChainType(m_buildConfiguration, selectedToolChainType); if (m_ui->toolChainComboBox->currentIndex() != index) m_ui->toolChainComboBox->setCurrentIndex(index); } diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp index d616e4cd15..114b502fc0 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp @@ -197,7 +197,7 @@ Qt4RunConfigurationWidget::Qt4RunConfigurationWidget(Qt4RunConfiguration *qt4Run vbox->addLayout(toplayout); vbox->addWidget(box); - connect(m_workingDirectoryEdit, SIGNAL(changed()), + connect(m_workingDirectoryEdit, SIGNAL(changed(QString)), this, SLOT(setWorkingDirectory())); connect(resetButton, SIGNAL(clicked()), diff --git a/src/plugins/qt4projectmanager/qtoptionspage.cpp b/src/plugins/qt4projectmanager/qtoptionspage.cpp index 275229cfa4..34d57883f6 100644 --- a/src/plugins/qt4projectmanager/qtoptionspage.cpp +++ b/src/plugins/qt4projectmanager/qtoptionspage.cpp @@ -124,12 +124,12 @@ QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent, QList<QtVersion *> ver this, SLOT(updateCurrentQtName())); - connect(m_ui->qtPath, SIGNAL(changed()), + connect(m_ui->qtPath, SIGNAL(changed(QString)), this, SLOT(updateCurrentQtPath())); - connect(m_ui->mingwPath, SIGNAL(changed()), + connect(m_ui->mingwPath, SIGNAL(changed(QString)), this, SLOT(updateCurrentMingwDirectory())); #ifdef QTCREATOR_WITH_S60 - connect(m_ui->mwcPath, SIGNAL(changed()), + connect(m_ui->mwcPath, SIGNAL(changed(QString)), this, SLOT(updateCurrentMwcDirectory())); #endif |