diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp index 94f855f0c50..df63ff36e93 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp @@ -293,7 +293,7 @@ QString MaemoDeviceConfig::portsRegExpr() return QString::fromLatin1("((%1)(,%1)*)?").arg(listElemExpr); } -int MaemoDeviceConfig::defaultSshPort(DeviceType type) const +int MaemoDeviceConfig::defaultSshPort(DeviceType type) { return type == Physical ? DefaultSshPortHW : DefaultSshPortSim; } @@ -314,7 +314,7 @@ QString MaemoDeviceConfig::defaultPrivateKeyFilePath() + QLatin1String("/.ssh/id_rsa"); } -QString MaemoDeviceConfig::defaultUser(MaemoGlobal::MaemoVersion osVersion) const +QString MaemoDeviceConfig::defaultUser(MaemoGlobal::MaemoVersion osVersion) { switch (osVersion) { case MaemoGlobal::Maemo5: diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h index cebccc5bb15..a091677460c 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h @@ -86,6 +86,8 @@ public: static QString portsRegExpr(); static QString defaultHost(DeviceType type); static QString defaultPrivateKeyFilePath(); + static QString defaultUser(MaemoGlobal::MaemoVersion osVersion); + static int defaultSshPort(DeviceType type); static const Id InvalidId; @@ -106,9 +108,7 @@ private: static Ptr create(const ConstPtr &other); void save(QSettings &settings) const; - int defaultSshPort(DeviceType type) const; QString defaultPortsSpec(DeviceType type) const; - QString defaultUser(MaemoGlobal::MaemoVersion osVersion) const; Core::SshConnectionParameters m_sshParameters; QString m_name; diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizard.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizard.cpp index ed73dc9a62f..1433d13208b 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizard.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizard.cpp @@ -33,11 +33,13 @@ ****************************************************************************/ #include "maemodeviceconfigwizard.h" #include "ui_maemodeviceconfigwizardkeycreationpage.h" +#include "ui_maemodeviceconfigwizardkeydeploymentpage.h" #include "ui_maemodeviceconfigwizardpreviouskeysetupcheckpage.h" #include "ui_maemodeviceconfigwizardreusekeyscheckpage.h" #include "ui_maemodeviceconfigwizardstartpage.h" #include "maemodeviceconfigurations.h" +#include "maemokeydeployer.h" #include @@ -64,7 +66,7 @@ struct WizardData enum PageId { StartPageId, PreviousKeySetupCheckPageId, ReuseKeysCheckPageId, - KeyCreationPageId, KeyDeploymentPageId, FinalTestPageId + KeyCreationPageId, KeyDeploymentPageId, FinalPageId }; class MaemoDeviceConfigWizardStartPage : public QWizardPage @@ -75,8 +77,8 @@ public: : QWizardPage(parent), m_ui(new Ui::MaemoDeviceConfigWizardStartPage) { m_ui->setupUi(this); - m_ui->harmattanButton->setChecked(true); - m_ui->hwButton->setChecked(true); + setTitle(tr("General Information")); + setSubTitle(QLatin1String(" ")); // For Qt bug (background color) QButtonGroup * const buttonGroup = new QButtonGroup(this); buttonGroup->setExclusive(true); buttonGroup->addButton(m_ui->hwButton); @@ -84,6 +86,8 @@ public: m_ui->nameLineEdit->setText(QLatin1String("(New Configuration)")); connect(buttonGroup, SIGNAL(buttonClicked(int)), SLOT(handleDeviceTypeChanged())); + m_ui->harmattanButton->setChecked(true); + m_ui->hwButton->setChecked(true); handleDeviceTypeChanged(); m_ui->hostNameLineEdit->setText(MaemoDeviceConfig::defaultHost(deviceType())); connect(m_ui->nameLineEdit, SIGNAL(textChanged(QString)), this, @@ -140,7 +144,8 @@ public: m_ui(new Ui::MaemoDeviceConfigWizardCheckPreviousKeySetupPage) { m_ui->setupUi(this); - m_ui->keyWasNotSetUpButton->setChecked(true); + setTitle(tr("Device Status Check")); + setSubTitle(QLatin1String(" ")); // For Qt bug (background color) QButtonGroup * const buttonGroup = new QButtonGroup(this); buttonGroup->setExclusive(true); buttonGroup->addButton(m_ui->keyWasSetUpButton); @@ -156,6 +161,12 @@ public: return !keyBasedLoginWasSetup() || !privateKeyFilePath().isEmpty(); } + virtual void initializePage() + { + m_ui->keyWasNotSetUpButton->setChecked(true); + m_ui->privateKeyFilePathLineEdit->clear(); + } + bool keyBasedLoginWasSetup() const { return m_ui->keyWasSetUpButton->isChecked(); } @@ -183,30 +194,40 @@ public: m_ui(new Ui::MaemoDeviceConfigWizardReuseKeysCheckPage) { m_ui->setupUi(this); - m_ui->dontReuseButton->setChecked(true); + setTitle(tr("Existing Keys Check")); + setSubTitle(QLatin1String(" ")); // For Qt bug (background color) QButtonGroup * const buttonGroup = new QButtonGroup(this); buttonGroup->setExclusive(true); buttonGroup->addButton(m_ui->reuseButton); buttonGroup->addButton(m_ui->dontReuseButton); connect(buttonGroup, SIGNAL(buttonClicked(int)), SLOT(handleSelectionChanged())); - handleSelectionChanged(); connect(m_ui->privateKeyFilePathLineEdit, SIGNAL(textChanged(QString)), this, SIGNAL(completeChanged())); connect(m_ui->publicKeyFilePathLineEdit, SIGNAL(textChanged(QString)), this, SIGNAL(completeChanged())); } - virtual bool isComplete() + virtual bool isComplete() const { return !reuseKeys() || (!privateKeyFilePath().isEmpty() && !publicKeyFilePath().isEmpty()); } + virtual void initializePage() + { + m_ui->dontReuseButton->setChecked(true); + m_ui->privateKeyFilePathLineEdit->clear(); + m_ui->publicKeyFilePathLineEdit->clear(); + handleSelectionChanged(); + } + bool reuseKeys() const { return m_ui->reuseButton->isChecked(); } + QString privateKeyFilePath() const { return m_ui->privateKeyFilePathLineEdit->text().trimmed(); } + QString publicKeyFilePath() const { return m_ui->publicKeyFilePathLineEdit->text().trimmed(); } @@ -230,15 +251,14 @@ class MaemoDeviceConfigWizardKeyCreationPage : public QWizardPage public: MaemoDeviceConfigWizardKeyCreationPage(QWidget *parent) : QWizardPage(parent), - m_ui(new Ui::MaemoDeviceConfigWizardKeyCreationPage), - m_isComplete(false) + m_ui(new Ui::MaemoDeviceConfigWizardKeyCreationPage) { m_ui->setupUi(this); - const QString &homeDir - = QDesktopServices::storageLocation(QDesktopServices::HomeLocation); - m_ui->directoryLineEdit->setText(homeDir); + setTitle(tr("Key Creation")); + setSubTitle(QLatin1String(" ")); // For Qt bug (background color) connect(m_ui->directoryLineEdit, SIGNAL(textChanged(QString)), SLOT(enableOrDisableButton())); + connect(m_ui->createKeysButton, SIGNAL(clicked()), SLOT(createKeys())); } QString privateKeyFilePath() const { @@ -249,6 +269,15 @@ public: return privateKeyFilePath() + QLatin1String(".pub"); } + virtual void initializePage() + { + m_isComplete = false; + const QString &dir = QDesktopServices::storageLocation(QDesktopServices::HomeLocation) + + QLatin1String("/.ssh"); + m_ui->directoryLineEdit->setText(dir); + enableInput(); + } + virtual bool isComplete() const { return m_isComplete; } private: @@ -260,9 +289,11 @@ private: Q_SLOT void createKeys() { - const QString &dirName = m_ui->directoryLineEdit->text(); - QDir dir(dirName); - if (!dir.exists() || !QFileInfo(dirName).isWritable()) { + const QString &dirPath = m_ui->directoryLineEdit->text(); + QDir dir(dirPath); + QDir parentDir = QDir(dirPath + QLatin1String("/..")); + if ((!dir.exists() && !parentDir.mkdir(dir.dirName())) + || !QFileInfo(dirPath).isWritable()) { QMessageBox::critical(this, tr("Can't Create Keys"), tr("You have not entered a writable directory.")); return; @@ -270,23 +301,23 @@ private: m_ui->directoryLineEdit->setEnabled(false); m_ui->createKeysButton->setEnabled(false); + m_ui->statusLabel->setText(tr("Creating keys ... ")); Core::SshKeyGenerator keyGenerator; if (!keyGenerator.generateKeys(Core::SshKeyGenerator::Rsa, Core::SshKeyGenerator::OpenSsl, 1024)) { QMessageBox::critical(this, tr("Can't Create Keys"), tr("Key creation failed: %1").arg(keyGenerator.error())); - m_ui->directoryLineEdit->setEnabled(true); - m_ui->createKeysButton->setEnabled(true); + enableInput(); return; } if (!saveFile(privateKeyFilePath(), keyGenerator.privateKey()) || !saveFile(publicKeyFilePath(), keyGenerator.publicKey())) { - m_ui->directoryLineEdit->setEnabled(true); - m_ui->createKeysButton->setEnabled(true); + enableInput(); return; } + m_ui->statusLabel->setText(m_ui->statusLabel->text() + tr("Done!")); m_isComplete = true; emit completeChanged(); } @@ -305,10 +336,135 @@ private: return true; } + void enableInput() + { + m_ui->directoryLineEdit->setEnabled(true); + enableOrDisableButton(); + m_ui->statusLabel->clear(); + } + const QScopedPointer m_ui; bool m_isComplete; }; +class MaemoDeviceConfigWizardKeyDeploymentPage : public QWizardPage +{ + Q_OBJECT +public: + MaemoDeviceConfigWizardKeyDeploymentPage(const WizardData &wizardData, + QWidget *parent = 0) + : QWizardPage(parent), + m_ui(new Ui::MaemoDeviceConfigWizardKeyDeploymentPage), + m_wizardData(wizardData), + m_keyDeployer(new MaemoKeyDeployer(this)) + { + m_ui->setupUi(this); + setTitle(tr("Key Deployment")); + setSubTitle(QLatin1String(" ")); // For Qt bug (background color) + connect(m_ui->deviceAddressLineEdit, SIGNAL(textChanged(QString)), + SLOT(enableOrDisableButton())); + connect(m_ui->passwordLineEdit, SIGNAL(textChanged(QString)), + SLOT(enableOrDisableButton())); + connect(m_ui->deployButton, SIGNAL(clicked()), SLOT(deployKey())); + connect(m_keyDeployer, SIGNAL(error(QString)), + SLOT(handleKeyDeploymentError(QString))); + connect(m_keyDeployer, SIGNAL(finishedSuccessfully()), + SLOT(handleKeyDeploymentSuccess())); + } + + virtual void initializePage() + { + m_isComplete = false; + m_ui->deviceAddressLineEdit->setText(m_wizardData.hostName); + m_ui->passwordLineEdit->clear(); + enableInput(); + } + + virtual bool isComplete() const { return m_isComplete; } + + QString hostAddress() const { + return m_ui->deviceAddressLineEdit->text().trimmed(); + } + +private: + Q_SLOT void enableOrDisableButton() + { + m_ui->deployButton->setEnabled(!hostAddress().isEmpty() + && !password().isEmpty()); + } + + Q_SLOT void deployKey() + { + using namespace Core; + m_ui->deviceAddressLineEdit->setEnabled(false); + m_ui->passwordLineEdit->setEnabled(false); + m_ui->deployButton->setEnabled(false); + Core::SshConnectionParameters sshParams(SshConnectionParameters::NoProxy); + sshParams.authType = SshConnectionParameters::AuthByPwd; + sshParams.host = hostAddress(); + sshParams.port = MaemoDeviceConfig::defaultSshPort(MaemoDeviceConfig::Physical); + sshParams.pwd = password(); + sshParams.timeout = 30; + sshParams.uname = MaemoDeviceConfig::defaultUser(m_wizardData.maemoVersion); + m_ui->statusLabel->setText(tr("Deploying... ")); + m_keyDeployer->deployPublicKey(sshParams, m_wizardData.publicKeyFilePath); + } + + Q_SLOT void handleKeyDeploymentError(const QString &errorMsg) + { + QMessageBox::critical(this, tr("Key Deployment Failure"), errorMsg); + enableInput(); + } + + Q_SLOT void handleKeyDeploymentSuccess() + { + QMessageBox::information(this, tr("Key Deployment Success"), + tr("The key was successfully deployed. You may now close " + "the \"Mad Developer\" application and continue.")); + m_ui->statusLabel->setText(m_ui->statusLabel->text() + tr("Done!")); + m_isComplete = true; + emit completeChanged(); + } + + void enableInput() + { + m_ui->deviceAddressLineEdit->setEnabled(true); + m_ui->passwordLineEdit->setEnabled(true); + m_ui->statusLabel->clear(); + enableOrDisableButton(); + } + + QString password() const { + return m_ui->passwordLineEdit->text().trimmed(); + } + + + const QScopedPointer m_ui; + bool m_isComplete; + const WizardData &m_wizardData; + MaemoKeyDeployer * const m_keyDeployer; +}; + +class MaemoDeviceConfigWizardFinalPage : public QWizardPage +{ + Q_OBJECT +public: + MaemoDeviceConfigWizardFinalPage(QWidget *parent) : QWizardPage(parent) + { + setTitle(tr("Setup Finished")); + setSubTitle(QLatin1String(" ")); // For Qt bug (background color) + const QString infoText = tr("Setup is complete.\n" + "The new device configuration will now be created and a test " + "procedure will be run to check whether Qt Creator can " + "connect to the device and to provide some information " + "about its features."); + QLabel * const infoLabel = new QLabel(infoText, this); + infoLabel->setWordWrap(true); + QVBoxLayout * const layout = new QVBoxLayout(this); + layout->addWidget(infoLabel); + } +}; + } // anonymous namespace struct MaemoDeviceConfigWizardPrivate @@ -317,7 +473,9 @@ struct MaemoDeviceConfigWizardPrivate : startPage(parent), previousKeySetupPage(parent), reuseKeysCheckPage(parent), - keyCreationPage(parent) + keyCreationPage(parent), + keyDeploymentPage(wizardData, parent), + finalPage(parent) { } @@ -326,16 +484,22 @@ struct MaemoDeviceConfigWizardPrivate MaemoDeviceConfigWizardPreviousKeySetupCheckPage previousKeySetupPage; MaemoDeviceConfigWizardReuseKeysCheckPage reuseKeysCheckPage; MaemoDeviceConfigWizardKeyCreationPage keyCreationPage; + MaemoDeviceConfigWizardKeyDeploymentPage keyDeploymentPage; + MaemoDeviceConfigWizardFinalPage finalPage; }; MaemoDeviceConfigWizard::MaemoDeviceConfigWizard(QWidget *parent) : QWizard(parent), d(new MaemoDeviceConfigWizardPrivate(this)) { + setWindowTitle(tr("New Device Configuration Setup")); setPage(StartPageId, &d->startPage); setPage(PreviousKeySetupCheckPageId, &d->previousKeySetupPage); setPage(ReuseKeysCheckPageId, &d->reuseKeysCheckPage); setPage(KeyCreationPageId, &d->keyCreationPage); + setPage(KeyDeploymentPageId, &d->keyDeploymentPage); + setPage(FinalPageId, &d->finalPage); + d->finalPage.setCommitPage(true); } MaemoDeviceConfigWizard::~MaemoDeviceConfigWizard() {} @@ -351,13 +515,17 @@ int MaemoDeviceConfigWizard::nextId() const d->wizardData.deviceType = d->startPage.deviceType(); d->wizardData.hostName = d->startPage.hostName(); - // TODO: Different paths for Qemu/HW? - return PreviousKeySetupCheckPageId; + if (d->wizardData.deviceType == MaemoDeviceConfig::Simulator) { + // TODO: insert default MADDE key file paths + return FinalPageId; + } else { + return PreviousKeySetupCheckPageId; + } case PreviousKeySetupCheckPageId: if (d->previousKeySetupPage.keyBasedLoginWasSetup()) { d->wizardData.privateKeyFilePath = d->previousKeySetupPage.privateKeyFilePath(); - return FinalTestPageId; + return FinalPageId; } else { return ReuseKeysCheckPageId; } @@ -377,8 +545,8 @@ int MaemoDeviceConfigWizard::nextId() const d->wizardData.publicKeyFilePath = d->keyCreationPage.publicKeyFilePath(); return KeyDeploymentPageId; - case KeyDeploymentPageId: return FinalTestPageId; - case FinalTestPageId: return -1; + case KeyDeploymentPageId: return FinalPageId; + case FinalPageId: return -1; default: Q_ASSERT(false); return -1; diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardkeycreationpage.ui b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardkeycreationpage.ui index 8c96eb1bc17..98dae2941b9 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardkeycreationpage.ui +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardkeycreationpage.ui @@ -45,6 +45,13 @@ + + + + + + + diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardkeydeploymentpage.ui b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardkeydeploymentpage.ui new file mode 100644 index 00000000000..a9eabf26758 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardkeydeploymentpage.ui @@ -0,0 +1,159 @@ + + + MaemoDeviceConfigWizardKeyDeploymentPage + + + + 0 + 0 + 452 + 235 + + + + WizardPage + + + + + + To deploy the public key to your device, please execute the following steps: +<ul> +<li>Connect the device to your computer (unless you plan to connect via WLAN).</li> +<li>On the device, start the "Mad Developer" application.</li> +<li>In "Mad Developer", configure the device's IP address to the one shown below (or edit the field below to match the address you have configured).</li> +<li>In "Mad Developer", press "Developer Password" and enter it in the field below.</li> +<li>Click "Deploy Key"</li> + + + + Qt::RichText + + + true + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + + + Device address: + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Password: + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + Deploy Key + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardpreviouskeysetupcheckpage.ui b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardpreviouskeysetupcheckpage.ui index 57e3582130b..e64aa056ba7 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardpreviouskeysetupcheckpage.ui +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardpreviouskeysetupcheckpage.ui @@ -31,6 +31,9 @@ Qt::Horizontal + + QSizePolicy::Fixed + 40 diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardreusekeyscheckpage.ui b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardreusekeyscheckpage.ui index 59821bdb3b9..f66c06fd336 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardreusekeyscheckpage.ui +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardreusekeyscheckpage.ui @@ -31,6 +31,9 @@ Qt::Horizontal + + QSizePolicy::Fixed + 40 @@ -55,6 +58,9 @@ Qt::Horizontal + + QSizePolicy::Fixed + 40 diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardstartpage.ui b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardstartpage.ui index 8ca9b6ed6aa..bf2b5eeb3ca 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardstartpage.ui +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigwizardstartpage.ui @@ -6,7 +6,7 @@ 0 0 - 618 + 680 122 @@ -68,7 +68,7 @@ - Emulator (Qemu) + Emulator (Qemu, should be currently running) diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri b/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri index 1577399f48e..9215daef506 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri +++ b/src/plugins/qt4projectmanager/qt-maemo/qt-maemo.pri @@ -115,6 +115,7 @@ FORMS += \ $$PWD/maemodeviceconfigwizardstartpage.ui \ $$PWD/maemodeviceconfigwizardpreviouskeysetupcheckpage.ui \ $$PWD/maemodeviceconfigwizardreusekeyscheckpage.ui \ - $$PWD/maemodeviceconfigwizardkeycreationpage.ui + $$PWD/maemodeviceconfigwizardkeycreationpage.ui \ + $$PWD/maemodeviceconfigwizardkeydeploymentpage.ui RESOURCES += $$PWD/qt-maemo.qrc