2014-02-10 14:16:55 +01:00
|
|
|
/**************************************************************************
|
|
|
|
|
**
|
|
|
|
|
** Copyright (C) 2014 BlackBerry Limited. All rights reserved.
|
|
|
|
|
**
|
|
|
|
|
** Contact: BlackBerry (qt@blackberry.com)
|
|
|
|
|
** Contact: KDAB (info@kdab.com)
|
|
|
|
|
**
|
|
|
|
|
** This file is part of Qt Creator.
|
|
|
|
|
**
|
|
|
|
|
** Commercial License Usage
|
|
|
|
|
** Licensees holding valid commercial Qt licenses may use this file in
|
|
|
|
|
** accordance with the commercial license agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
|
|
|
** a written agreement between you and Digia. For licensing terms and
|
2014-10-01 13:21:18 +02:00
|
|
|
** conditions see http://www.qt.io/licensing. For further information
|
|
|
|
|
** use the contact form at http://www.qt.io/contact-us.
|
2014-02-10 14:16:55 +01:00
|
|
|
**
|
|
|
|
|
** GNU Lesser General Public License Usage
|
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
2014-10-01 13:21:18 +02:00
|
|
|
** General Public License version 2.1 or version 3 as published by the Free
|
|
|
|
|
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
|
|
|
|
|
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
|
|
|
|
|
** following information to ensure the GNU Lesser General Public License
|
|
|
|
|
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
|
|
|
|
|
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
2014-02-10 14:16:55 +01:00
|
|
|
**
|
|
|
|
|
** In addition, as a special exception, Digia gives you certain additional
|
|
|
|
|
** rights. These rights are described in the Digia Qt LGPL Exception
|
|
|
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
|
**
|
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
#include "qnxdeployqtlibrariesdialog.h"
|
|
|
|
|
#include "ui_qnxdeployqtlibrariesdialog.h"
|
2014-02-10 14:16:55 +01:00
|
|
|
|
|
|
|
|
#include "blackberryqtversion.h"
|
2014-05-27 12:46:24 +02:00
|
|
|
#include "qnxqtversion.h"
|
2014-02-10 14:16:55 +01:00
|
|
|
|
|
|
|
|
#include <projectexplorer/deployablefile.h>
|
|
|
|
|
#include <qtsupport/qtversionmanager.h>
|
|
|
|
|
#include <remotelinux/genericdirectuploadservice.h>
|
|
|
|
|
#include <ssh/sshremoteprocessrunner.h>
|
|
|
|
|
#include <utils/qtcassert.h>
|
|
|
|
|
|
|
|
|
|
#include <QDir>
|
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
|
|
|
|
|
using namespace Qnx;
|
|
|
|
|
using namespace Qnx::Internal;
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
QnxDeployQtLibrariesDialog::QnxDeployQtLibrariesDialog(
|
|
|
|
|
const ProjectExplorer::IDevice::ConstPtr &device, Target target, QWidget *parent)
|
2014-02-10 14:16:55 +01:00
|
|
|
: QDialog(parent)
|
2014-05-27 12:46:24 +02:00
|
|
|
, m_ui(new Ui::QnxDeployQtLibrariesDialog)
|
2014-02-10 14:16:55 +01:00
|
|
|
, m_device(device)
|
|
|
|
|
, m_progressCount(0)
|
|
|
|
|
, m_state(Inactive)
|
2014-05-27 12:46:24 +02:00
|
|
|
, m_target(target)
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
|
|
|
|
m_ui->setupUi(this);
|
|
|
|
|
|
|
|
|
|
QList<QtSupport::BaseQtVersion*> qtVersions = QtSupport::QtVersionManager::validVersions();
|
|
|
|
|
foreach (QtSupport::BaseQtVersion *qtVersion, qtVersions) {
|
2014-05-27 12:46:24 +02:00
|
|
|
QnxAbstractQtVersion *qnxQt;
|
|
|
|
|
if (m_target == BB10)
|
|
|
|
|
qnxQt = dynamic_cast<BlackBerryQtVersion *>(qtVersion);
|
|
|
|
|
else
|
|
|
|
|
qnxQt = dynamic_cast<QnxQtVersion *>(qtVersion);
|
|
|
|
|
|
|
|
|
|
if (!qnxQt)
|
2014-02-10 14:16:55 +01:00
|
|
|
continue;
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
m_ui->qtLibraryCombo->addItem(qnxQt->displayName(), qnxQt->uniqueId());
|
|
|
|
|
|
2014-02-10 14:16:55 +01:00
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
m_ui->basePathLabel->setText(m_target == BB10 ?
|
|
|
|
|
QLatin1String(Constants::QNX_BLACKBERRY_DEFAULT_DEPLOY_QT_BASEPATH) :
|
|
|
|
|
QString());
|
|
|
|
|
m_ui->remoteDirectory->setText(m_target == BB10 ? QLatin1String("qt") : QLatin1String("/qt"));
|
|
|
|
|
|
2014-02-10 14:16:55 +01:00
|
|
|
m_uploadService = new RemoteLinux::GenericDirectUploadService(this);
|
|
|
|
|
m_uploadService->setDevice(m_device);
|
|
|
|
|
|
|
|
|
|
connect(m_uploadService, SIGNAL(progressMessage(QString)), this, SLOT(updateProgress(QString)));
|
|
|
|
|
connect(m_uploadService, SIGNAL(progressMessage(QString)),
|
|
|
|
|
m_ui->deployLogWindow, SLOT(appendPlainText(QString)));
|
|
|
|
|
connect(m_uploadService, SIGNAL(errorMessage(QString)),
|
|
|
|
|
m_ui->deployLogWindow, SLOT(appendPlainText(QString)));
|
|
|
|
|
connect(m_uploadService, SIGNAL(warningMessage(QString)),
|
|
|
|
|
m_ui->deployLogWindow, SLOT(appendPlainText(QString)));
|
|
|
|
|
connect(m_uploadService, SIGNAL(stdOutData(QString)),
|
|
|
|
|
m_ui->deployLogWindow, SLOT(appendPlainText(QString)));
|
|
|
|
|
connect(m_uploadService, SIGNAL(stdErrData(QString)),
|
|
|
|
|
m_ui->deployLogWindow, SLOT(appendPlainText(QString)));
|
|
|
|
|
connect(m_uploadService, SIGNAL(finished()), this, SLOT(handleUploadFinished()));
|
|
|
|
|
|
|
|
|
|
m_processRunner = new QSsh::SshRemoteProcessRunner(this);
|
|
|
|
|
connect(m_processRunner, SIGNAL(connectionError()),
|
|
|
|
|
this, SLOT(handleRemoteProcessError()));
|
|
|
|
|
connect(m_processRunner, SIGNAL(processClosed(int)),
|
|
|
|
|
this, SLOT(handleRemoteProcessCompleted()));
|
|
|
|
|
|
|
|
|
|
connect(m_ui->deployButton, SIGNAL(clicked()), this, SLOT(deployLibraries()));
|
|
|
|
|
connect(m_ui->closeButton, SIGNAL(clicked()), this, SLOT(close()));
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
QnxDeployQtLibrariesDialog::~QnxDeployQtLibrariesDialog()
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
|
|
|
|
delete m_ui;
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
int QnxDeployQtLibrariesDialog::execAndDeploy(int qtVersionId, const QString &remoteDirectory)
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
|
|
|
|
m_ui->remoteDirectory->setText(remoteDirectory);
|
|
|
|
|
m_ui->qtLibraryCombo->setCurrentIndex(m_ui->qtLibraryCombo->findData(qtVersionId));
|
|
|
|
|
|
|
|
|
|
deployLibraries();
|
|
|
|
|
return exec();
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
void QnxDeployQtLibrariesDialog::closeEvent(QCloseEvent *event)
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
|
|
|
|
// A disabled Deploy button indicates the upload is still running
|
|
|
|
|
if (!m_ui->deployButton->isEnabled()) {
|
|
|
|
|
int answer = QMessageBox::question(this, windowTitle(),
|
|
|
|
|
tr("Closing the dialog will stop the deployment. "
|
|
|
|
|
"Are you sure you want to do this?"),
|
|
|
|
|
QMessageBox::Yes | QMessageBox::No);
|
|
|
|
|
if (answer == QMessageBox::No)
|
|
|
|
|
event->ignore();
|
|
|
|
|
else if (answer == QMessageBox::Yes)
|
|
|
|
|
m_uploadService->stop();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
void QnxDeployQtLibrariesDialog::deployLibraries()
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
|
|
|
|
QTC_ASSERT(m_state == Inactive, return);
|
|
|
|
|
|
|
|
|
|
if (m_ui->remoteDirectory->text().isEmpty()) {
|
|
|
|
|
QMessageBox::warning(this, windowTitle(),
|
|
|
|
|
tr("Please input a remote directory to deploy to."));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QTC_ASSERT(!m_device.isNull(), return);
|
|
|
|
|
|
|
|
|
|
m_progressCount = 0;
|
|
|
|
|
m_ui->deployProgress->setValue(0);
|
|
|
|
|
m_ui->remoteDirectory->setEnabled(false);
|
|
|
|
|
m_ui->deployButton->setEnabled(false);
|
|
|
|
|
m_ui->qtLibraryCombo->setEnabled(false);
|
|
|
|
|
m_ui->deployLogWindow->clear();
|
|
|
|
|
|
|
|
|
|
checkRemoteDirectoryExistance();
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
void QnxDeployQtLibrariesDialog::startUpload()
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
|
|
|
|
QTC_CHECK(m_state == CheckingRemoteDirectory || m_state == RemovingRemoteDirectory);
|
|
|
|
|
|
|
|
|
|
m_state = Uploading;
|
|
|
|
|
|
|
|
|
|
QList<ProjectExplorer::DeployableFile> filesToUpload = gatherFiles();
|
|
|
|
|
|
|
|
|
|
m_ui->deployProgress->setRange(0, filesToUpload.count());
|
|
|
|
|
|
|
|
|
|
m_uploadService->setDeployableFiles(filesToUpload);
|
|
|
|
|
m_uploadService->start();
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
void QnxDeployQtLibrariesDialog::updateProgress(const QString &progressMessage)
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
|
|
|
|
QTC_CHECK(m_state == Uploading);
|
|
|
|
|
|
|
|
|
|
if (!progressMessage.startsWith(QLatin1String("Uploading file")))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
++m_progressCount;
|
|
|
|
|
|
|
|
|
|
m_ui->deployProgress->setValue(m_progressCount);
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
void QnxDeployQtLibrariesDialog::handleUploadFinished()
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
|
|
|
|
m_ui->remoteDirectory->setEnabled(true);
|
|
|
|
|
m_ui->deployButton->setEnabled(true);
|
|
|
|
|
m_ui->qtLibraryCombo->setEnabled(true);
|
|
|
|
|
|
|
|
|
|
m_state = Inactive;
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
void QnxDeployQtLibrariesDialog::handleRemoteProcessError()
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
|
|
|
|
QTC_CHECK(m_state == CheckingRemoteDirectory || m_state == RemovingRemoteDirectory);
|
|
|
|
|
|
|
|
|
|
m_ui->deployLogWindow->appendPlainText(
|
|
|
|
|
tr("Connection failed: %1")
|
|
|
|
|
.arg(m_processRunner->lastConnectionErrorString()));
|
|
|
|
|
handleUploadFinished();
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
void QnxDeployQtLibrariesDialog::handleRemoteProcessCompleted()
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
|
|
|
|
QTC_CHECK(m_state == CheckingRemoteDirectory || m_state == RemovingRemoteDirectory);
|
|
|
|
|
|
|
|
|
|
if (m_state == CheckingRemoteDirectory) {
|
|
|
|
|
// Directory exists
|
|
|
|
|
if (m_processRunner->processExitCode() == 0) {
|
|
|
|
|
int answer = QMessageBox::question(this, windowTitle(),
|
2014-04-17 14:09:47 +02:00
|
|
|
tr("The remote directory \"%1\" already exists. "
|
2014-02-10 14:16:55 +01:00
|
|
|
"Deploying to that directory will remove any files "
|
|
|
|
|
"already present.\n\n"
|
|
|
|
|
"Are you sure you want to continue?")
|
|
|
|
|
.arg(fullRemoteDirectory()),
|
|
|
|
|
QMessageBox::Yes | QMessageBox::No);
|
|
|
|
|
if (answer == QMessageBox::Yes)
|
|
|
|
|
removeRemoteDirectory();
|
|
|
|
|
else
|
|
|
|
|
handleUploadFinished();
|
|
|
|
|
} else {
|
|
|
|
|
startUpload();
|
|
|
|
|
}
|
|
|
|
|
} else if (m_state == RemovingRemoteDirectory) {
|
|
|
|
|
QTC_ASSERT(m_processRunner->processExitCode() == 0, return);
|
|
|
|
|
|
|
|
|
|
startUpload();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
QList<ProjectExplorer::DeployableFile> QnxDeployQtLibrariesDialog::gatherFiles()
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
|
|
|
|
QList<ProjectExplorer::DeployableFile> result;
|
|
|
|
|
|
|
|
|
|
const int qtVersionId =
|
|
|
|
|
m_ui->qtLibraryCombo->itemData(m_ui->qtLibraryCombo->currentIndex()).toInt();
|
2014-05-27 12:46:24 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
QnxAbstractQtVersion *qtVersion;
|
|
|
|
|
if (m_target == BB10)
|
|
|
|
|
qtVersion = dynamic_cast<BlackBerryQtVersion *>(QtSupport::QtVersionManager::version(qtVersionId));
|
|
|
|
|
else
|
|
|
|
|
qtVersion = dynamic_cast<QnxQtVersion *>(QtSupport::QtVersionManager::version(qtVersionId));
|
2014-02-10 14:16:55 +01:00
|
|
|
|
|
|
|
|
QTC_ASSERT(qtVersion, return result);
|
|
|
|
|
|
2014-12-04 11:45:06 -02:00
|
|
|
if (Utils::HostOsInfo::isWindowsHost()) {
|
|
|
|
|
result.append(gatherFiles(qtVersion->versionInfo().value(QLatin1String("QT_INSTALL_LIBS")),
|
|
|
|
|
QString(), QStringList() << QLatin1String("*.so.?")));
|
|
|
|
|
result.append(gatherFiles(qtVersion->versionInfo().value(QLatin1String("QT_INSTALL_LIBS"))
|
|
|
|
|
+ QLatin1String("/fonts")));
|
|
|
|
|
} else {
|
|
|
|
|
result.append(gatherFiles(
|
|
|
|
|
qtVersion->versionInfo().value(QLatin1String("QT_INSTALL_LIBS"))));
|
|
|
|
|
}
|
|
|
|
|
|
2014-02-10 14:16:55 +01:00
|
|
|
result.append(gatherFiles(qtVersion->versionInfo().value(QLatin1String("QT_INSTALL_PLUGINS"))));
|
|
|
|
|
result.append(gatherFiles(qtVersion->versionInfo().value(QLatin1String("QT_INSTALL_IMPORTS"))));
|
|
|
|
|
result.append(gatherFiles(qtVersion->versionInfo().value(QLatin1String("QT_INSTALL_QML"))));
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
QList<ProjectExplorer::DeployableFile> QnxDeployQtLibrariesDialog::gatherFiles(
|
2014-12-04 11:45:06 -02:00
|
|
|
const QString &dirPath, const QString &baseDirPath, const QStringList &nameFilters)
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
|
|
|
|
QList<ProjectExplorer::DeployableFile> result;
|
2014-02-13 10:46:14 +01:00
|
|
|
if (dirPath.isEmpty())
|
|
|
|
|
return result;
|
|
|
|
|
|
2014-02-10 14:16:55 +01:00
|
|
|
QDir dir(dirPath);
|
2014-12-04 11:45:06 -02:00
|
|
|
QFileInfoList list = dir.entryInfoList(nameFilters,
|
|
|
|
|
QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
|
2014-02-10 14:16:55 +01:00
|
|
|
|
|
|
|
|
for (int i = 0; i < list.size(); ++i) {
|
|
|
|
|
QFileInfo fileInfo = list.at(i);
|
|
|
|
|
if (fileInfo.isDir()) {
|
|
|
|
|
result.append(gatherFiles(fileInfo.absoluteFilePath(), baseDirPath.isEmpty() ?
|
|
|
|
|
dirPath : baseDirPath));
|
|
|
|
|
} else {
|
|
|
|
|
QString remoteDir;
|
|
|
|
|
if (baseDirPath.isEmpty()) {
|
|
|
|
|
remoteDir = fullRemoteDirectory() + QLatin1Char('/') +
|
|
|
|
|
QFileInfo(dirPath).baseName();
|
|
|
|
|
} else {
|
|
|
|
|
QDir baseDir(baseDirPath);
|
|
|
|
|
baseDir.cdUp();
|
|
|
|
|
remoteDir = fullRemoteDirectory() + QLatin1Char('/') +
|
|
|
|
|
baseDir.relativeFilePath(dirPath);
|
|
|
|
|
}
|
|
|
|
|
result.append(ProjectExplorer::DeployableFile(fileInfo.absoluteFilePath(), remoteDir));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
QString QnxDeployQtLibrariesDialog::fullRemoteDirectory() const
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
2014-05-27 12:46:24 +02:00
|
|
|
QString basePath;
|
|
|
|
|
if (m_target == BB10)
|
|
|
|
|
basePath = QLatin1String(Constants::QNX_BLACKBERRY_DEFAULT_DEPLOY_QT_BASEPATH);
|
|
|
|
|
|
|
|
|
|
return basePath + m_ui->remoteDirectory->text();
|
2014-02-10 14:16:55 +01:00
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
void QnxDeployQtLibrariesDialog::checkRemoteDirectoryExistance()
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
|
|
|
|
QTC_CHECK(m_state == Inactive);
|
|
|
|
|
|
|
|
|
|
m_state = CheckingRemoteDirectory;
|
|
|
|
|
|
2014-04-17 14:09:47 +02:00
|
|
|
m_ui->deployLogWindow->appendPlainText(tr("Checking existence of \"%1\"")
|
2014-02-10 14:16:55 +01:00
|
|
|
.arg(fullRemoteDirectory()));
|
|
|
|
|
|
|
|
|
|
const QByteArray cmd = "test -d " + fullRemoteDirectory().toLatin1();
|
|
|
|
|
m_processRunner->run(cmd, m_device->sshParameters());
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-27 12:46:24 +02:00
|
|
|
void QnxDeployQtLibrariesDialog::removeRemoteDirectory()
|
2014-02-10 14:16:55 +01:00
|
|
|
{
|
|
|
|
|
QTC_CHECK(m_state == CheckingRemoteDirectory);
|
|
|
|
|
|
|
|
|
|
m_state = RemovingRemoteDirectory;
|
|
|
|
|
|
2014-04-17 14:09:47 +02:00
|
|
|
m_ui->deployLogWindow->appendPlainText(tr("Removing \"%1\"").arg(fullRemoteDirectory()));
|
2014-02-10 14:16:55 +01:00
|
|
|
|
|
|
|
|
const QByteArray cmd = "rm -rf " + fullRemoteDirectory().toLatin1();
|
|
|
|
|
m_processRunner->run(cmd, m_device->sshParameters());
|
|
|
|
|
}
|